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 = ('