apiVersion: v1 kind: ConfigMap metadata: name: xlog-caddy namespace: crossbell data: Caddyfile: | { storage redis { } on_demand_tls { ask http://localhost:5000/ } } xlog.page, *.xlog.page { tls jeff@rss3.io { dns cloudflare {env.CF_API_TOKEN} } reverse_proxy 127.0.0.1:3000 } :8080 { metrics } :80, :443 { tls jeff@rss3.io { on_demand } reverse_proxy 127.0.0.1:3000 } --- apiVersion: v1 kind: ConfigMap metadata: name: xlog-caddy-validator namespace: crossbell data: app.py: | import requests from flask import Flask, request, Response app = Flask(__name__) @app.route("/") def check_domain(): domain = request.args.get("domain") if not domain: return Response(status=404) if domain.endswith('.xlog.page') or domain == "xlog.page": return Response(status=200) # get TXT res = requests.get("https://cloudflare-dns.com/dns-query", params={ "name": f"_xlog-challenge.{domain}", "type": "TXT", }, headers={"Accept": "application/dns-json"}) if res.status_code != 200: return Response(status=res.status_code) answer = res.json().get("Answer") or [{}] tenant = answer[0].get("data", "").replace('"', "") if not tenant: return Response(status=404) # check crossbell res = requests.get(f"https://indexer.crossbell.io/v1/handles/{tenant}/character") if res.status_code != 200: return Response(status=404) attributes = res.json().get("metadata", {}).get("content", {}).get("attributes", []) for d in attributes: print(d) if d.get("trait_type") == "xlog_custom_domain" and d.get("value") == domain: return Response(status=200) return Response(status=404)