Matrix Docker Ansible eploy
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

56 lines
1.9 KiB

  1. # SPDX-FileCopyrightText: 2026 Slavi Pantaleev
  2. #
  3. # SPDX-License-Identifier: AGPL-3.0-or-later
  4. """Small HTTPS Matrix federation OpenID userinfo fixture for Molecule."""
  5. import json
  6. import ssl
  7. from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
  8. from urllib.parse import parse_qs, urlparse
  9. KNOWN_TOKENS = {
  10. "known-openid-token": "@alice:matrix-openid-fixture:8443",
  11. "full-access-openid-token": "@bob:full-access.molecule.local:8443",
  12. }
  13. REQUESTS = []
  14. class OpenIDHandler(BaseHTTPRequestHandler):
  15. def send_json(self, status, document):
  16. body = json.dumps(document, separators=(",", ":")).encode()
  17. self.send_response(status)
  18. self.send_header("Content-Type", "application/json")
  19. self.send_header("Content-Length", str(len(body)))
  20. self.end_headers()
  21. self.wfile.write(body)
  22. def do_GET(self): # noqa: N802 - BaseHTTPRequestHandler API
  23. parsed = urlparse(self.path)
  24. if parsed.path == "/_molecule/requests":
  25. self.send_json(200, {"requests": REQUESTS})
  26. return
  27. if parsed.path != "/_matrix/federation/v1/openid/userinfo":
  28. self.send_json(404, {"errcode": "M_NOT_FOUND"})
  29. return
  30. token = parse_qs(parsed.query).get("access_token", [""])[0]
  31. REQUESTS.append({"path": parsed.path, "access_token": token})
  32. if token in KNOWN_TOKENS:
  33. self.send_json(200, {"sub": KNOWN_TOKENS[token]})
  34. return
  35. self.send_json(401, {"errcode": "M_UNAUTHORIZED", "error": "unknown token"})
  36. def log_message(self, message, *args):
  37. print("openid-fixture:", message % args, flush=True)
  38. server = ThreadingHTTPServer(("0.0.0.0", 8443), OpenIDHandler)
  39. tls_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
  40. tls_context.load_cert_chain("/fixture/cert.pem", "/fixture/key.pem")
  41. server.socket = tls_context.wrap_socket(server.socket, server_side=True)
  42. server.serve_forever()