feat(auth): KTO-01 Backend – Registrierungsregeln, Auth-Konfiguration, Mailvorlagen (1/4) #33

Merged
cschlaefke merged 7 commits from feature/1-auth-registrierung-anmeldung into main 2026-11-02 22:57:49 +00:00
Owner

Zusammenfassung

Backend-Teil von #1 (KTO-01): Migration mit Registrierungsregeln, Supabase-Auth-Konfiguration (AUTH-CFG-01…25), Mailvorlagen de/en, Betriebsdoku, Spike-Ergebnisse und die freigegebene Spec. Die Frontend-PRs 01a Registrierung, 01b Anmelden und 01c Passwort zurücksetzen folgen. Dieser PR schließt #1 deshalb nicht.

Refs #1

Spec: docs/specs/1-auth-registrierung-anmeldung.md (freigegeben 2026-11-02, angepasst an docs/specs/1-auth-spike-ergebnisse.md)

Umgesetzt (Backend-Anteile der Akzeptanzkriterien)

  • KTO-01 Kriterium 1 – Konto + Bestätigungsmail (Config, Vorlage)
  • KTO-01 Kriterium 2 – Mindestalter wird serverseitig erzwungen (age_confirmation_required)
  • KTO-01 Kriterium 3 – Passwort mindestens 10 Zeichen (Config AUTH-CFG-04); Liste häufiger Passwörter folgt im Client (01a)
  • KTO-01 Kriterium 4 – Enumerationsschutz (AUTH-CFG-24, Regressionstest folgt in T2)
  • KTO-01 Kriterium 5, 6 – Frontend (01b)
  • [~] KTO-01 Kriterium 7 – Drosselung dokumentiert (AUTH-CFG-10…13), Test in CI folgt (D2/T3)
  • [~] KTO-01 Kriterium 8, 9 – Linkgültigkeit 1 h (AUTH-CFG-07), Reset-Flow im Frontend (01c)
  • KTO-01 Kriterium 10 – Anzeigename 1–30 Codepoints, Unicode-Leerraum wird getrimmt (trim_ws)
  • KTO-01 Kriterium 11 – Mails in Profilsprache, Fallback Englisch

Abdeckungsmatrix

AK Test(s)
1, 11 05_auth_registration: Locale-Sync, Fallback en; Mailpit-Prüfung (manuell, in Spike dokumentiert)
2 05_auth_registration: Alter fehlt/false, JSON-Boolean
10 05_auth_registration: leer, nur Tab/\n/NBSP, 30/31 Codepoints (Emoji), Trim, JSON-Typ
QUE-04 / Sicherheit terms_version/terms_accepted_at für authenticated nicht änderbar, Funktionsrechte, anon ohne Ausführrecht

156 pgTAP-Tests in 6 Dateien (60 in 05_auth_registration).

Definition of Done

  • Migration + RLS/Grants + Policy-Tests (additiv, keine alte Migration geändert)
  • pgTAP-Tests grün (lokal)
  • Doku aktualisiert (docs/auth-konfiguration.md, docs/datenmodell-r1.md, supabase/README.md, Spec)
  • Flutter/l10n/Barrierefreiheit: nicht betroffen (Frontend folgt)

Review

code-reviewer: ein Blocker (Unicode-Leerraum im Anzeigenamen) und vier wichtige Punkte (Locale-Typ in Vorlagen, JSON-Boolean-Tests, Env-Block, veralteter Spec-Satz) sind behoben, dazu die Nice-to-haves.

Offen / für Chris

  • U+200B (Zero Width Space) ist als Anzeigename erlaubt; sperren? (fachlich)
  • Stagingwert für double_confirm_changes (AUTH-CFG-23) ist nur der CLI-Standard, Entscheidung in KTO-11.
  • Ungeprüft: Env-Namen der Benachrichtigungs-Mails (AUTH-CFG-25 u. a.) gegen das Image, Betreff-Verzweigung im Self-Hosting.
  • Release-Blocker: D1 (Gateway, SMTP), Rechtstexte.

So testest du es lokal

supabase start -x studio,imgproxy,edge-runtime,logflare,vector
supabase db reset
supabase test db
# Mails ansehen: http://127.0.0.1:54324 (Mailpit)
supabase stop --no-backup

🤖 Generated with Claude Code

## Zusammenfassung Backend-Teil von #1 (KTO-01): Migration mit Registrierungsregeln, Supabase-Auth-Konfiguration (AUTH-CFG-01…25), Mailvorlagen de/en, Betriebsdoku, Spike-Ergebnisse und die freigegebene Spec. Die Frontend-PRs 01a Registrierung, 01b Anmelden und 01c Passwort zurücksetzen folgen. Dieser PR schließt #1 deshalb nicht. Refs #1 Spec: `docs/specs/1-auth-registrierung-anmeldung.md` (freigegeben 2026-11-02, angepasst an `docs/specs/1-auth-spike-ergebnisse.md`) ## Umgesetzt (Backend-Anteile der Akzeptanzkriterien) - [x] KTO-01 Kriterium 1 – Konto + Bestätigungsmail (Config, Vorlage) - [x] KTO-01 Kriterium 2 – Mindestalter wird serverseitig erzwungen (`age_confirmation_required`) - [x] KTO-01 Kriterium 3 – Passwort mindestens 10 Zeichen (Config AUTH-CFG-04); Liste häufiger Passwörter folgt im Client (01a) - [x] KTO-01 Kriterium 4 – Enumerationsschutz (AUTH-CFG-24, Regressionstest folgt in T2) - [ ] KTO-01 Kriterium 5, 6 – Frontend (01b) - [~] KTO-01 Kriterium 7 – Drosselung dokumentiert (AUTH-CFG-10…13), Test in CI folgt (D2/T3) - [~] KTO-01 Kriterium 8, 9 – Linkgültigkeit 1 h (AUTH-CFG-07), Reset-Flow im Frontend (01c) - [x] KTO-01 Kriterium 10 – Anzeigename 1–30 Codepoints, Unicode-Leerraum wird getrimmt (`trim_ws`) - [x] KTO-01 Kriterium 11 – Mails in Profilsprache, Fallback Englisch ## Abdeckungsmatrix | AK | Test(s) | |---|---| | 1, 11 | `05_auth_registration`: Locale-Sync, Fallback `en`; Mailpit-Prüfung (manuell, in Spike dokumentiert) | | 2 | `05_auth_registration`: Alter fehlt/false, JSON-Boolean | | 10 | `05_auth_registration`: leer, nur Tab/`\n`/NBSP, 30/31 Codepoints (Emoji), Trim, JSON-Typ | | QUE-04 / Sicherheit | `terms_version`/`terms_accepted_at` für `authenticated` nicht änderbar, Funktionsrechte, `anon` ohne Ausführrecht | 156 pgTAP-Tests in 6 Dateien (60 in `05_auth_registration`). ## Definition of Done - [x] Migration + RLS/Grants + Policy-Tests (additiv, keine alte Migration geändert) - [x] pgTAP-Tests grün (lokal) - [x] Doku aktualisiert (`docs/auth-konfiguration.md`, `docs/datenmodell-r1.md`, `supabase/README.md`, Spec) - [ ] Flutter/l10n/Barrierefreiheit: nicht betroffen (Frontend folgt) ## Review `code-reviewer`: ein Blocker (Unicode-Leerraum im Anzeigenamen) und vier wichtige Punkte (Locale-Typ in Vorlagen, JSON-Boolean-Tests, Env-Block, veralteter Spec-Satz) sind behoben, dazu die Nice-to-haves. ## Offen / für Chris - U+200B (Zero Width Space) ist als Anzeigename erlaubt; sperren? (fachlich) - Stagingwert für `double_confirm_changes` (AUTH-CFG-23) ist nur der CLI-Standard, Entscheidung in KTO-11. - Ungeprüft: Env-Namen der Benachrichtigungs-Mails (AUTH-CFG-25 u. a.) gegen das Image, Betreff-Verzweigung im Self-Hosting. - Release-Blocker: D1 (Gateway, SMTP), Rechtstexte. ## So testest du es lokal ```bash supabase start -x studio,imgproxy,edge-runtime,logflare,vector supabase db reset supabase test db # Mails ansehen: http://127.0.0.1:54324 (Mailpit) supabase stop --no-backup ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cschlaefke added 6 commits 2026-11-02 22:48:14 +00:00
Refs #1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Adds display name validation, terms_version, locale sync trigger and
pgTAP tests (KTO-01 criteria 1, 2, 10, 11). Includes GoTrue spike results.

Refs #1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Adds AUTH-CFG settings, confirmation/recovery templates and
docs/auth-konfiguration.md (KTO-01 criteria 1, 3, 4, 7, 8, 11).

Refs #1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Refs #1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fix(db): trim all Unicode whitespace in display name, harden templates
All checks were successful
CI / flutter (pull_request) Successful in 1m3s
CI / web-build (pull_request) Successful in 58s
CI / supabase (pull_request) Successful in 3s
CI / supabase-tests (pull_request) Successful in 34s
fb0f4b9d3f
- add public.trim_ws mirroring Dart String.trim
- require JSON string metadata, tolerate non-string locale in templates
- add tests, align docs with review

Refs #1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke added 1 commit 2026-11-02 22:51:59 +00:00
feat(db): reject U+200B in display names
All checks were successful
CI / flutter (pull_request) Successful in 1m3s
CI / web-build (pull_request) Successful in 54s
CI / supabase (pull_request) Successful in 3s
CI / supabase-tests (pull_request) Successful in 34s
9f36cd0c33
Refs #1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke added the
status/ready-for-merge
label 2026-11-02 22:57:07 +00:00
Author
Owner

Review (code-reviewer) und CI – Stand 9f36cd0

CI grün (Run 15): flutter, web-build, supabase, supabase-tests.

Review: 1 Blocker und 4 wichtige Punkte, alle behoben:

  • Blocker: Anzeigename nur aus Unicode-Leerraum wurde angenommen → public.trim_ws (Dart-trim()-Liste), Constraint und Trigger angepasst, Tests ergänzt
  • Mailvorlagen brachen bei nicht-String-locale (HTTP 500) → printf "%v" an allen sechs Stellen
  • Tests mit JSON-Booleans (age_confirmed), Env-Block (AUTH-CFG-25), veralteter Spec-Satz
  • Nice-to-haves: JSON-Typprüfung der Metadaten, Negativtests für anon/Locale-Sync, Vorlagenkommentare
  • Auf Chris' Entscheidung zusätzlich: U+200B im Anzeigenamen gesperrt (Constraint profiles_display_name_no_zwsp)

163 pgTAP-Tests in 6 Dateien (67 in 05_auth_registration).

Offen / Hinweise:

  • Spec nennt noch an einigen Stellen btrim statt trim_ws (wird mit dem Spec-Update vor 01a bereinigt)
  • AUTH-CFG-23 (double_confirm_changes): Stagingwert = CLI-Standard, Entscheidung in KTO-11
  • Ungeprüft: Env-Namen der Benachrichtigungs-Mails (AUTH-CFG-25 u. a.), Betreff-Verzweigung im Self-Hosting
  • Release-Blocker (nicht Merge-Blocker): D1 (Gateway, SMTP), Rechtstexte

Bereit zum Merge durch Chris. Danach folgen die Frontend-PRs 01a bis 01c.

**Review (code-reviewer) und CI** – Stand `9f36cd0` **CI grün** (Run 15): `flutter`, `web-build`, `supabase`, `supabase-tests`. **Review:** 1 Blocker und 4 wichtige Punkte, alle behoben: - Blocker: Anzeigename nur aus Unicode-Leerraum wurde angenommen → `public.trim_ws` (Dart-`trim()`-Liste), Constraint und Trigger angepasst, Tests ergänzt - Mailvorlagen brachen bei nicht-String-`locale` (HTTP 500) → `printf "%v"` an allen sechs Stellen - Tests mit JSON-Booleans (`age_confirmed`), Env-Block (AUTH-CFG-25), veralteter Spec-Satz - Nice-to-haves: JSON-Typprüfung der Metadaten, Negativtests für `anon`/Locale-Sync, Vorlagenkommentare - Auf Chris' Entscheidung zusätzlich: U+200B im Anzeigenamen gesperrt (Constraint `profiles_display_name_no_zwsp`) 163 pgTAP-Tests in 6 Dateien (67 in `05_auth_registration`). **Offen / Hinweise:** - Spec nennt noch an einigen Stellen `btrim` statt `trim_ws` (wird mit dem Spec-Update vor 01a bereinigt) - AUTH-CFG-23 (`double_confirm_changes`): Stagingwert = CLI-Standard, Entscheidung in KTO-11 - Ungeprüft: Env-Namen der Benachrichtigungs-Mails (AUTH-CFG-25 u. a.), Betreff-Verzweigung im Self-Hosting - Release-Blocker (nicht Merge-Blocker): D1 (Gateway, SMTP), Rechtstexte Bereit zum Merge durch Chris. Danach folgen die Frontend-PRs 01a bis 01c.
cschlaefke merged commit 6891b7cb03 into main 2026-11-02 22:57:49 +00:00
cschlaefke deleted branch feature/1-auth-registrierung-anmeldung 2026-11-02 22:57:50 +00:00
Sign in to join this conversation.
No description provided.