From f3e925a01852d9eaf21854d3fd53636dacb60999 Mon Sep 17 00:00:00 2001 From: MrMeeb Date: Mon, 6 May 2024 11:49:35 +0000 Subject: [PATCH] Add webfinger.py --- webfinger.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 webfinger.py diff --git a/webfinger.py b/webfinger.py new file mode 100644 index 0000000..e989a38 --- /dev/null +++ b/webfinger.py @@ -0,0 +1,72 @@ + +from http.server import BaseHTTPRequestHandler, HTTPServer +from urllib.parse import urlparse, parse_qs +import json +import os + +class WebFingerHandler(BaseHTTPRequestHandler): + def do_GET(self): + if self.path.startswith('/.well-known/webfinger'): + parsed_url = urlparse(self.path) + query_params = parse_qs(parsed_url.query) + + if 'resource' in query_params: + resource = query_params['resource'][0] + + if resource.startswith('acct:'): + email = resource[5:] + issuer_url = os.environ["ISSUER_URL"] + response_data = { + "subject": resource, + "links": [ + { + "rel": "http://openid.net/specs/connect/1.0/issuer", + "href": issuer_url + }, + { + "rel": "authorization_endpoint", + "href": issuer_url + "oauth2/authorize" + }, + { + "rel": "token_endpoint", + "href": issuer_url + "oauth2/token" + }, + { + "rel": "userinfo_endpoint", + "href": issuer_url + "userinfo" + }, + { + "rel": "jwks_uri", + "href": issuer_url + "jwks" + } + ] + } + self.send_response(200) + self.send_header("Content-type", "application/json") + self.end_headers() + self.wfile.write(json.dumps(response_data).encode()) + return + + if self.path.startswith('/health'): + self.send_response(200) + response_data = { + "health": "ok" + } + self.send_header("Content-type", "application/json") + self.end_headers() + self.wfile.write(json.dumps(response_data).encode()) + return + + self.send_response(404) + self.end_headers() + self.wfile.write(b"Resource not found") + +def run_server(server_class=HTTPServer, handler_class=WebFingerHandler, port=8000): + server_address = ('', port) + httpd = server_class(server_address, handler_class) + print("Issuer URL is " + os.environ["ISSUER_URL"]) + print(f"Starting WebFinger server on port {port}") + httpd.serve_forever() + +if __name__ == '__main__': + run_server() \ No newline at end of file