feat(auth): KTO-01 Registrierung (01a) – Screens, Auth-Domäne, Formular-Komponenten (2/4) #34

Merged
cschlaefke merged 5 commits from feature/1-01a-registrierung into main 2026-11-03 07:56:15 +00:00
Owner

Zusammenfassung

Registrierung für #1 (KTO-01, PR 01a): Formular-Komponenten (core/widgets), Auth-Domäne und -Daten (Validatoren, AuthFailure, Repository, Router-Redirects, Passwortliste) und die Screens Register, CheckEmail und EmailLink (Bestätigung). Login (01b) und Passwort-Reset (01c) folgen. Dieser PR schließt #1 nicht.

Refs #1

Spec: docs/specs/1-auth-registrierung-anmeldung.md

Akzeptanzkriterien (Anteil 01a)

  • 1 Konto anlegen + Bestätigungsmail (RegisterScreen, CheckEmailScreen)
  • 2 Mindestalter nicht bestätigt → Ablehnung mit Grund am Feld
  • 3 Passwort < 10 Zeichen oder in der Liste häufiger Passwörter → Erklärung am Feld
  • 4 Bereits registrierte Adresse → identische Reaktion, kein Hinweis auf Konto (auch bei Mail-Limit, F12)
  • 5, 6, 7 Anmelden (01b)
  • 8, 9 Passwort zurücksetzen (01c)
  • 10 Anzeigename 1–30 Codepoints, Trim wie Server (trim_ws), U+200B abgelehnt
  • 11 (Clientanteil) Sprache wird mitgesendet, Fallback Englisch

Abdeckungsmatrix

AK Test(s)
1 register_controller_test, register_screen_test, check_email_* (KTO-01 Kriterium 1)
2 Controller- und Widget-Tests Alterscheckbox
3 password_policy_test, common_password_list_test, Widget-Tests
4 Mapping-Test (200 + leere identities, emailSendLimited), Widget-Test mit exaktem Textvergleich
10 display_name_rule_test (Emoji, NBSP, Tab, BOM, U+3000, U+200B), Widget-Tests
11 terms_version und Locale im signUp-Aufruf
Querschnitt a11y-Guidelines, textScaler 2.0, de/en, Hell/Dunkel je Screen; Rechtstext-Links als isLink-Semantics

326 Tests grün. Kein Playwright/E2E in diesem PR (T3/D2 folgen als eigener PR, Regressionstest AUTH-CFG-24, Drosselungstest Krit. 7).

Definition of Done

  • dart format, flutter analyze ohne Befund, flutter test grün (lokal), Web-Build baut
  • l10n DE/EN, keine hartkodierten Strings
  • Barrierefreiheit: Semantics, Kontraste, Touch-Ziele, Rechtstext-Links für Screenreader
  • Doku: Spec (§ 5.5/5.6/10), docs/design/auth-screens.md, docs/design-system.md
  • Android/iOS nicht gebaut (nur Web); url_launcher bringt native Plugins
  • Nicht im echten Browser/Screenreader geprüft (nur Widget-/Semantics-Tests)

Review

code-reviewer: 2 Blocker (Lizenzentscheidung Passwortliste, Rechtstext-Links für Screenreader im Web) und mehrere wichtige Punkte (URL-Schema, Doppel-Submit, Transportfehler-Erkennung, Lizenztext zur Laufzeit, extra in History, Live-Region) sind behoben.

Hinweise für den Review

  • Platzhalter-Routen: /login, /forgot-password, /reset-password sind bis 01b/01c leere Seiten. 01a sollte nicht ohne 01b ausgeliefert werden.
  • Passwortliste: SecLists (MIT), 10.000 Einträge, Herkunft in app/assets/security/README.md, Entscheidung durch Chris am 2026-11-03.
  • Neues Direktpaket: package:http 1.6.0 (stand schon transitiv im Lock), url_launcher 6.3.3.
  • Offen/Folge: gotrue loggt im Debug-Modus Session-Daten auf finest (Folge-Issue, betrifft Fundament); validation_failed → invalidEmail evtl. auch für zu lange Passwörter (T3 klärt); SMTP-Ausfall beim signUp als Restrisiko-Seitenkanal.
  • Recovery-Guard: tokenRefreshed/signedIn heben den Recovery-Status nicht auf (Abweichung vom Spec-Wortlaut, dokumentiert in § 5.5/10). Redirect von /reset-password nach userUpdated muss 01c lösen.

So testest du es lokal

supabase start -x studio,imgproxy,edge-runtime,logflare,vector && supabase db reset
cp app/env/dev.example.json app/env/dev.json   # SUPABASE_ANON_KEY aus `supabase status` eintragen
cd app && flutter run -d chrome --web-port 3000 --dart-define-from-file=env/dev.json
# http://localhost:3000/register, Mails: http://127.0.0.1:54324 (Mailpit)

🤖 Generated with Claude Code

## Zusammenfassung Registrierung für #1 (KTO-01, PR 01a): Formular-Komponenten (`core/widgets`), Auth-Domäne und -Daten (Validatoren, `AuthFailure`, Repository, Router-Redirects, Passwortliste) und die Screens Register, CheckEmail und EmailLink (Bestätigung). Login (01b) und Passwort-Reset (01c) folgen. Dieser PR schließt #1 nicht. Refs #1 Spec: `docs/specs/1-auth-registrierung-anmeldung.md` ## Akzeptanzkriterien (Anteil 01a) - [x] **1** Konto anlegen + Bestätigungsmail (RegisterScreen, CheckEmailScreen) - [x] **2** Mindestalter nicht bestätigt → Ablehnung mit Grund am Feld - [x] **3** Passwort < 10 Zeichen oder in der Liste häufiger Passwörter → Erklärung am Feld - [x] **4** Bereits registrierte Adresse → identische Reaktion, kein Hinweis auf Konto (auch bei Mail-Limit, F12) - [ ] **5, 6, 7** Anmelden (01b) - [ ] **8, 9** Passwort zurücksetzen (01c) - [x] **10** Anzeigename 1–30 Codepoints, Trim wie Server (`trim_ws`), U+200B abgelehnt - [x] **11** (Clientanteil) Sprache wird mitgesendet, Fallback Englisch ## Abdeckungsmatrix | AK | Test(s) | |---|---| | 1 | `register_controller_test`, `register_screen_test`, `check_email_*` (KTO-01 Kriterium 1) | | 2 | Controller- und Widget-Tests Alterscheckbox | | 3 | `password_policy_test`, `common_password_list_test`, Widget-Tests | | 4 | Mapping-Test (200 + leere `identities`, `emailSendLimited`), Widget-Test mit exaktem Textvergleich | | 10 | `display_name_rule_test` (Emoji, NBSP, Tab, BOM, U+3000, U+200B), Widget-Tests | | 11 | `terms_version` und Locale im `signUp`-Aufruf | | Querschnitt | a11y-Guidelines, `textScaler` 2.0, de/en, Hell/Dunkel je Screen; Rechtstext-Links als `isLink`-Semantics | 326 Tests grün. Kein Playwright/E2E in diesem PR (T3/D2 folgen als eigener PR, Regressionstest AUTH-CFG-24, Drosselungstest Krit. 7). ## Definition of Done - [x] `dart format`, `flutter analyze` ohne Befund, `flutter test` grün (lokal), Web-Build baut - [x] l10n DE/EN, keine hartkodierten Strings - [x] Barrierefreiheit: Semantics, Kontraste, Touch-Ziele, Rechtstext-Links für Screenreader - [x] Doku: Spec (§ 5.5/5.6/10), `docs/design/auth-screens.md`, `docs/design-system.md` - [ ] Android/iOS nicht gebaut (nur Web); `url_launcher` bringt native Plugins - [ ] Nicht im echten Browser/Screenreader geprüft (nur Widget-/Semantics-Tests) ## Review `code-reviewer`: 2 Blocker (Lizenzentscheidung Passwortliste, Rechtstext-Links für Screenreader im Web) und mehrere wichtige Punkte (URL-Schema, Doppel-Submit, Transportfehler-Erkennung, Lizenztext zur Laufzeit, `extra` in History, Live-Region) sind behoben. ## Hinweise für den Review - **Platzhalter-Routen:** `/login`, `/forgot-password`, `/reset-password` sind bis 01b/01c leere Seiten. 01a sollte nicht ohne 01b ausgeliefert werden. - **Passwortliste:** SecLists (MIT), 10.000 Einträge, Herkunft in `app/assets/security/README.md`, Entscheidung durch Chris am 2026-11-03. - **Neues Direktpaket:** `package:http` 1.6.0 (stand schon transitiv im Lock), `url_launcher` 6.3.3. - **Offen/Folge:** gotrue loggt im Debug-Modus Session-Daten auf `finest` (Folge-Issue, betrifft Fundament); `validation_failed` → `invalidEmail` evtl. auch für zu lange Passwörter (T3 klärt); SMTP-Ausfall beim `signUp` als Restrisiko-Seitenkanal. - **Recovery-Guard:** `tokenRefreshed`/`signedIn` heben den Recovery-Status nicht auf (Abweichung vom Spec-Wortlaut, dokumentiert in § 5.5/10). Redirect von `/reset-password` nach `userUpdated` muss 01c lösen. ## So testest du es lokal ```bash supabase start -x studio,imgproxy,edge-runtime,logflare,vector && supabase db reset cp app/env/dev.example.json app/env/dev.json # SUPABASE_ANON_KEY aus `supabase status` eintragen cd app && flutter run -d chrome --web-port 3000 --dart-define-from-file=env/dev.json # http://localhost:3000/register, Mails: http://127.0.0.1:54324 (Mailpit) ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cschlaefke added 5 commits 2026-11-02 23:47:59 +00:00
Refs #1

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

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

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Implements KTO-01 criteria 1-4, 10 and 11 (client part).

Refs #1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fix(auth): address review findings for registration
All checks were successful
CI / flutter (pull_request) Successful in 1m16s
CI / web-build (pull_request) Successful in 53s
CI / supabase (pull_request) Successful in 3s
CI / supabase-tests (pull_request) Successful in 32s
239d0e1ac2
- expose legal links to screen readers on web
- allow only http(s) legal URLs, prevent double submit
- detect transport errors without runtimeType, keep extra in memory
- ship third-party license text, document decisions

Refs #1

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Owner

Review- und CI-Ergebnis (01a Registrierung)

CI (Commit 239d0e1): alle 4 Jobs grün – flutter (1m16s), web-build (53s), supabase (3s), supabase-tests (32s).

Code-Review (Agent code-reviewer): 2 Blocker und mehrere wichtige Punkte gefunden und im Commit 239d0e1 behoben (u. a. trim_ws/Unicode-Whitespace, Mail-Template bei nicht-String-Locale, unsichtbarer Fokusring am FilledButton, Android-INTERNET-Permission, iOS-Lokalisierungen, Rechtstexte-Links für Screenreader im Web, Doppel-Submit, Transportfehler-Erkennung, SITE_URL-Produktionsdefault).

Bitte beachten:

  • Platzhalter-Routen /login, /forgot-password, /reset-password sind leer – 01a darf nicht ohne 01b/01c ausgeliefert werden.
  • Keine E2E-Tests (Playwright, T3) in diesem PR; folgen separat.
  • Nicht getestet: echte Browser-/Screenreader-Prüfung, Android und iOS auf Geräten.
  • Rechtstexte und rechtliche Prüfung (Altersabfrage) vor Release durch Chris.

Merge durch Chris.

## Review- und CI-Ergebnis (01a Registrierung) **CI (Commit `239d0e1`):** alle 4 Jobs grün – `flutter` (1m16s), `web-build` (53s), `supabase` (3s), `supabase-tests` (32s). **Code-Review (Agent `code-reviewer`):** 2 Blocker und mehrere wichtige Punkte gefunden und im Commit `239d0e1` behoben (u. a. trim_ws/Unicode-Whitespace, Mail-Template bei nicht-String-Locale, unsichtbarer Fokusring am FilledButton, Android-INTERNET-Permission, iOS-Lokalisierungen, Rechtstexte-Links für Screenreader im Web, Doppel-Submit, Transportfehler-Erkennung, SITE_URL-Produktionsdefault). **Bitte beachten:** - Platzhalter-Routen `/login`, `/forgot-password`, `/reset-password` sind leer – 01a darf nicht ohne 01b/01c ausgeliefert werden. - Keine E2E-Tests (Playwright, T3) in diesem PR; folgen separat. - Nicht getestet: echte Browser-/Screenreader-Prüfung, Android und iOS auf Geräten. - Rechtstexte und rechtliche Prüfung (Altersabfrage) vor Release durch Chris. Merge durch Chris.
cschlaefke added the
status/ready-for-merge
label 2026-11-03 07:55:41 +00:00
cschlaefke merged commit fa7238a2ef into main 2026-11-03 07:56:15 +00:00
cschlaefke deleted branch feature/1-01a-registrierung 2026-11-03 07:56:16 +00:00
Sign in to join this conversation.
No description provided.