From 99a9761901b43d6c29990d337f11a1373a7e3c36 Mon Sep 17 00:00:00 2001 From: mscadm Date: Mon, 13 Jul 2026 15:16:46 +0000 Subject: [PATCH] feat: /setup/new nach erster Registrierung sperren (Ersteinrichtung einmalig) --- app.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/app.py b/app.py index a5d3493..2fde133 100644 --- a/app.py +++ b/app.py @@ -234,6 +234,15 @@ def _shell(active_path, title, body_html, extra_head=""): # ── Ersteinrichtung (neuer Mandant) ──────────────────────────────────────────── @app.route("/setup/new", methods=["GET", "POST"]) def setup_new(): + # Die Ersteinrichtung ist ein einmaliger Vorgang: sobald irgendein + # Mandant existiert, ist die Registrierung neuer Organisationen ueber + # diese Route dauerhaft gesperrt (Nutzer-Vorgabe 2026-07-13: "/setup/new + # darf nur einmal funktionieren"). Weitere Mandanten koennen danach nur + # noch durch einen Administrator ueber die Datenbank/ein internes + # Verfahren angelegt werden, nicht mehr per offenem Self-Service-Formular. + if db.any_tenant_exists(): + return redirect(url_for("login", already_setup="1")) + error = None # Vorbelegung: bei GET die Standardwerte, bei einem fehlgeschlagenen POST # die vom Nutzer eingegebenen Werte (ausser Passwoerter -- die bleiben aus @@ -341,6 +350,8 @@ def login(): notice = None if request.args.get("registered"): notice = "Organisation angelegt. Bitte melde dich mit deinem Admin-Konto an." + elif request.args.get("already_setup"): + notice = "Die Ersteinrichtung wurde bereits abgeschlossen. Bitte melde dich mit deinem bestehenden Konto an." if request.method == "POST": email = request.form.get("email", "").strip().lower() pw = request.form.get("password", "") @@ -360,6 +371,11 @@ def login(): error = "E-Mail oder Passwort falsch." err_html = "

%s

" % html.escape(error) if error else "" notice_html = "

%s

" % html.escape(notice) if notice else "" + # Der Registrierungs-Link wird nur angezeigt, solange die Ersteinrichtung + # noch nicht abgeschlossen ist -- danach ist /setup/new gesperrt, ein + # Link dorthin waere ein toter Verweis (Nutzer-Vorgabe 2026-07-13). + setup_link_html = ('
Neue Organisation? ' + 'Jetzt einrichten
') if not db.any_tenant_exists() else "" return """ Anmelden -- ITSM%s @@ -369,8 +385,8 @@ def login(): -
Neue Organisation? Jetzt einrichten
-""" % (_CSS_TAG, err_html, notice_html) +%s +""" % (_CSS_TAG, err_html, notice_html, setup_link_html) @app.route("/logout")