diff options
| author | Leonardo Bishop <me@leonardobishop.net> | 2026-01-16 17:09:18 +0000 |
|---|---|---|
| committer | Leonardo Bishop <me@leonardobishop.net> | 2026-01-16 17:09:18 +0000 |
| commit | 3c92a2e5fc0e1d04c8ec8199db319d3a575fcfe5 (patch) | |
| tree | 150474ac1f2a60c18420527e9580e1bf3aff7f62 /admin.py | |
Diffstat (limited to 'admin.py')
| -rw-r--r-- | admin.py | 62 |
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")) |
