summaryrefslogtreecommitdiffstats
path: root/admin.py
diff options
context:
space:
mode:
authorLeonardo Bishop <me@leonardobishop.net>2026-01-16 17:09:18 +0000
committerLeonardo Bishop <me@leonardobishop.net>2026-01-16 17:09:18 +0000
commit3c92a2e5fc0e1d04c8ec8199db319d3a575fcfe5 (patch)
tree150474ac1f2a60c18420527e9580e1bf3aff7f62 /admin.py
Initial commitHEADmaster
Diffstat (limited to 'admin.py')
-rw-r--r--admin.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/admin.py b/admin.py
new file mode 100644
index 0000000..699958b
--- /dev/null
+++ b/admin.py
@@ -0,0 +1,62 @@
+import secrets
+from flask import Blueprint, render_template, request, redirect, url_for
+from CTFd.utils.decorators import admins_only
+from .models import db, OIDCClient, OIDCKey
+from .crypto import generate_rsa_key
+from .config import get_config, set_config
+
+oidc_admin_blueprint = Blueprint(
+ "oidc_admin",
+ __name__,
+ url_prefix="/admin/oidc",
+ template_folder="templates",
+)
+
+
+@oidc_admin_blueprint.route("/", methods=["GET"])
+@admins_only
+def index():
+ clients = OIDCClient.query.all()
+ keys = OIDCKey.query.order_by(OIDCKey.created.desc()).all()
+ baseUrl = get_config("base_url", "")
+ return render_template("index.html", clients=clients, keys=keys, baseUrl=baseUrl)
+
+
+@oidc_admin_blueprint.route("/config", methods=["POST"])
+@admins_only
+def config():
+ set_config("base_url", request.form["base_url"])
+ return redirect(url_for("oidc_admin.index"))
+
+
+@oidc_admin_blueprint.route("/clients", methods=["POST"])
+@admins_only
+def clients():
+ client = OIDCClient(
+ client_id=request.form["client_id"],
+ client_secret=secrets.token_urlsafe(32),
+ redirect_uris=request.form["redirect_uris"],
+ )
+ db.session.add(client)
+
+ private_pem, public_pem = generate_rsa_key()
+
+ oidc_key = OIDCKey(
+ kid=secrets.token_urlsafe(16),
+ private_pem=private_pem.decode(),
+ public_pem=public_pem.decode(),
+ client_id=client.client_id,
+ )
+ db.session.add(oidc_key)
+ db.session.commit()
+
+ return redirect(url_for("oidc_admin.index"))
+
+
+@oidc_admin_blueprint.route("/clients/<client_id>/delete", methods=["POST"])
+@admins_only
+def delete_client(client_id):
+ client = OIDCClient.query.get_or_404(client_id)
+ db.session.delete(client)
+ db.session.commit()
+ return redirect(url_for("oidc_admin.index"))