Wizard: User erst beim Abschliessen, Reihenfolge Sprache/Design/Modus, Reset im Einzelmodus
Image bauen und in die Registry schieben / build (push) Successful in 6s

- Benutzer wird erst beim 'Einrichtung abschliessen' angelegt (POST
  /api/register im wizardFinish); bis dahin frei umentscheidbar, im Modus-
  Schritt Hinweis + Live-Validierung (Finish deaktiviert bis ausgefuellt)
- Reihenfolge: Sprache -> Darstellung (Theme/OLED/Akzent) -> Modus
  (Einzel/Mehrbenutzer); Onboarding bleibt Sprache -> Darstellung
- Sprach-Schritt: Repo-Link + Kurztext zum Starten (nutzt den Raum)
- Wizard-Modal: min-height statt fixer Hoehe -> Modus-Schritt mit Formular
  wird nicht mehr abgeschnitten
- Server-Reset auch im Einzelmodus moeglich (nur Bestaetigungstext,
  kein Passwort noetig); Reset-Sektion erscheint dann entsprechend
- Tests: 167 Checks gruen (39+18+52+32+26)
This commit is contained in:
AI-Agent committed 2026-10-02 19:57:59 +00:00
1 parent 655316278a
commit 135425c781
6 files changed
+141 -108

No files matched your search

+17 -14
View File
@@ -1466,21 +1466,24 @@ class Handler(BaseHTTPRequestHandler):
uid = self._require_user()
if uid is None:
return
if uid != 1:
self._send(403, json.dumps({"error": "nur der erste Benutzer"}),
"application/json; charset=utf-8")
return
data = self._read_json()
con = db()
row = con.execute("SELECT * FROM users WHERE id=?",
(uid,)).fetchone()
con.close()
if not row or not _verify_pw(data.get("password", ""),
row["salt"], row["password_hash"]):
self._send(400, json.dumps(
{"error": "Aktuelles Passwort ist falsch"}),
"application/json; charset=utf-8")
return
if uid != OPEN_USER:
# Mehrbenutzermodus: nur der Owner, mit Passwort
if uid != 1:
self._send(403, json.dumps({"error": "nur der erste Benutzer"}),
"application/json; charset=utf-8")
return
con = db()
row = con.execute("SELECT * FROM users WHERE id=?",
(uid,)).fetchone()
con.close()
if not row or not _verify_pw(data.get("password", ""),
row["salt"], row["password_hash"]):
self._send(400, json.dumps(
{"error": "Aktuelles Passwort ist falsch"}),
"application/json; charset=utf-8")
return
# Einzelmodus (offen): kein Passwort noetig, nur Bestaetigungstext
if _clean_str(data.get("confirm")) != "RESET":
self._send(400, json.dumps(
{"error": "Bestätigungstext ist falsch"}),