From 7c6ca3b5a47463f2b68e8d0de11c10de2349247a Mon Sep 17 00:00:00 2001 From: Jakob Scheid Date: Tue, 12 May 2026 18:56:34 +0200 Subject: [PATCH] Add Gitea API router --- src/jcloud_deployment_server/api/main.py | 22 ++++++++- .../integrations/gitea/api/webhooks.py | 47 +++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 src/jcloud_deployment_server/integrations/gitea/api/webhooks.py diff --git a/src/jcloud_deployment_server/api/main.py b/src/jcloud_deployment_server/api/main.py index 8f647fb..f46f81f 100644 --- a/src/jcloud_deployment_server/api/main.py +++ b/src/jcloud_deployment_server/api/main.py @@ -12,16 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -from fastapi import FastAPI +from fastapi import FastAPI, Header import os import uvicorn import ipaddress import jcloud_config_parser import logging from .arguments import parse_args -from .config import load_config, process_host_and_port +from .config import load_config, process_host_and_port, process_gitea_config from .logging import setup_logging from ..integrations.gitea.middlewares.signature import GiteaSignatureMiddleware +from ..integrations.gitea.middlewares.check_enabled import GiteaCheckEnabledMiddleware +from ..integrations.gitea.api.webhooks import make_router import sys def main(): @@ -38,6 +40,8 @@ def main(): logger_info.logger ) + gitea_config = process_gitea_config(configuration, logger_info.logger) + # Initialize FastAPI app = FastAPI( docs_url=configuration.docs.swagger, @@ -45,6 +49,20 @@ def main(): openapi_url=configuration.docs.openapi ) + if gitea_config.webhook_secret_file_path is not None: + app.add_middleware( + GiteaSignatureMiddleware, + secret = gitea_config.webhook_secret_file_path.read_bytes(), + logger = logger_info.logger + ) # empty secret is an example value! + app.add_middleware( + GiteaCheckEnabledMiddleware, + configuration = configuration, + logger = logger_info.logger + ) + + app.include_router(make_router(gitea_config.webhook_secret_file_path is not None)) + uvicorn.run( app, host = host, diff --git a/src/jcloud_deployment_server/integrations/gitea/api/webhooks.py b/src/jcloud_deployment_server/integrations/gitea/api/webhooks.py new file mode 100644 index 0000000..947edf8 --- /dev/null +++ b/src/jcloud_deployment_server/integrations/gitea/api/webhooks.py @@ -0,0 +1,47 @@ +# Copyright 2026 jCloud + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from fastapi import APIRouter, Header +from ..models.release import Release + +def make_router(secret_enabled: bool = False) -> APIRouter: + ''' + Returns the Gitea webhook router. + + :param secret_enabled: Whether the secret is enabled. + :type secret_enabled: bool + + :return: The router. + :rtype: APIRouter + ''' + + router = APIRouter() + + + if secret_enabled: + x_gitea_signature_header_default = ... + else: + x_gitea_signature_header_default = None + + @router.post('/gitea/webhook') + async def gitea_webhook(release: Release, x_gitea_signature = Header(x_gitea_signature_header_default)): + ''' + Processes a Gitea webhook. + + Works only if Gitea is enabled. + ''' + + raise NotImplementedError() + + return router \ No newline at end of file