From 9c5e3889cb7fddbf4d4010facad7adf31a816a58 Mon Sep 17 00:00:00 2001 From: viacheslav anzhiganov Date: Fri, 24 Jan 2025 14:59:06 +0300 Subject: [PATCH] init --- README.md | 19 ++++++++++++ koji-forgejo-webook.py | 67 ++++++++++++++++++++++++++++++++++++++++++ reequirements.txt | 1 + 3 files changed, 87 insertions(+) create mode 100644 koji-forgejo-webook.py create mode 100644 reequirements.txt diff --git a/README.md b/README.md index 4ea5933..e08e63b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,21 @@ # koji-forgejo-webhook +## install + +### pip + +```shell +pip install -r requirements.txt +``` + +### rpm + +```shell +dnf install python3-flask +``` + +## run + +```shell +python3 koji-forgejo-webook.py +``` \ No newline at end of file diff --git a/koji-forgejo-webook.py b/koji-forgejo-webook.py new file mode 100644 index 0000000..584bc50 --- /dev/null +++ b/koji-forgejo-webook.py @@ -0,0 +1,67 @@ +import json +import hashlib +import hmac +import logging +from flask import Flask, request, abort + +app = Flask(__name__) + +class ForgejoWebhookProcessor: + def __init__(self, secret_key): + self.secret_key = secret_key + + def validate_webhook(self, payload, signature): + """Validate webhook signature""" + computed_signature = hmac.new( + self.secret_key.encode('utf-8'), + payload.encode('utf-8'), + hashlib.sha256 + ).hexdigest() + + return hmac.compare_digest(computed_signature, signature) + + def process_webhook(self, payload): + """Process webhook payload""" + try: + data = json.loads(payload) + + # Extract key webhook information + repository = data.get('repository', {}) + commits = data.get('commits', []) + ref = data.get('ref', '') + + # Log basic webhook details + logging.info(f"Repository: {repository.get('full_name')}") + logging.info(f"Branch: {ref}") + logging.info(f"Number of Commits: {len(commits)}") + + # Custom processing logic here + for commit in commits: + logging.info(f"Commit: {commit.get('id')}") + logging.info(f"Message: {commit.get('message')}") + + except json.JSONDecodeError: + logging.error("Invalid JSON payload") + abort(400) + + +@app.route('/forgejo-webhook', methods=['POST']) +def webhook(): + processor = ForgejoWebhookProcessor('your_secret_key') + + # Get payload and signature + payload = request.get_data(as_text=True) + signature = request.headers.get('X-Forgejo-Signature', '') + + # Validate webhook + if not processor.validate_webhook(payload, signature): + abort(403) + + # Process webhook + processor.process_webhook(payload) + + return 'Webhook processed', 200 + +if __name__ == '__main__': + logging.basicConfig(level=logging.INFO) + app.run(host="0.0.0.0", port=5001) \ No newline at end of file diff --git a/reequirements.txt b/reequirements.txt new file mode 100644 index 0000000..8ab6294 --- /dev/null +++ b/reequirements.txt @@ -0,0 +1 @@ +flask \ No newline at end of file