fix(auth): SMTP-Fehler wie Erfolg behandeln (Konten-Seitenkanal, F13) #47

Merged
cschlaefke merged 4 commits from fix/37-smtp-neutral into main 2026-11-03 11:58:11 +00:00
Owner

Zusammenfassung

Schließt den App-seitigen Konten-Seitenkanal aus #37: Bei SMTP-Ausfall liefert GoTrue für bekannte und unbekannte Adressen unterschiedliche Status (Spike aus #38). Die App zeigte dafür ein Fehler-Banner und verriet damit ein Konto. Entscheidung F13 (Chris, 2026-11-03): neutrale Seite im Client. Bei signUp, recover und resend wirkt jede Antwort mit HTTP-Status >= 500 wie Erfolg („Prüfe dein Postfach“), identischer Text, keine Adresse, kein Banner.

Closes #37

Spec: docs/specs/1-auth-registrierung-anmeldung.md (F13, § 4.4, R17)

Änderungen

  • auth_failure_mapper.dart: Status >= 500 bei signUp/requestPasswordReset/resend -> unexpected; Fehler ohne Status bleibt network. signIn unberührt.
  • resend_origin.dart: Positivlisten (Allowlist) für sichtbare Fehler. Sichtbar bleiben Eingabefehler (invalidEmail, weakPassword, registrationRejected mit bekanntem Grund), network und rateLimited (429). Alles andere ist neutral.
  • Login-Resend (Entscheidung Orchestrator, bitte bestätigen): unexpected bleibt dort sichtbar („Erneut versuchen“), weil das Konto durch das richtige Passwort schon bewiesen ist und Neutralisieren nur einen echten SMTP-Ausfall verdeckt. emailSendLimited zeigt dort weiter den Drosselungshinweis.
  • Logging: unverändert über den zentralen Logger (Operation, Art, Status, Code; keine E-Mail).
  • Doku: Spec F13/R17, Release-Checkliste docs/auth-konfiguration.md (Alarm auf SMTP-Fehler als Release-Blocker).

Akzeptanz / Tests

  • Bekannte Adresse mit SMTP-500, unbekannte Adresse, Mail-Limit und Erfolg zeigen exakt dieselben sichtbaren Texte (Forgot-, Register-Screen, CheckEmail-Resend)
  • Eingabefehler, Offline und 429 bleiben sichtbar (Allowlist-Tests)
  • Repository-Test: AuthRetryableFetchException(500) aus Fake-Client -> unexpected für signUp/resend/resetPasswordForEmail; signIn 500/502/504 bleibt network
  • API-E2E: Body-Format der Trigger-Fehler age_*/terms_* (krit02-03-validierung)
  • 510 Tests grün, dart format/flutter analyze ohne Befund, Playwright api lokal 59 grün

Review

code-reviewer: kein Blocker. Behoben (3805c71): Spec-Widerspruch zur Rolle der Trigger-Meldung, registrationRejected nur mit bekanntem Grund sichtbar, veraltete Doku, Integrationstest, Login-Resend (S4).

Risiken / offen

  • #46 (Release-Blocker): SMTP-Timeout (Server nimmt Verbindung an, antwortet nicht). Ein reiner Client-Timeout ohne Status bliebe network und damit sichtbar. Spike und Timeout-Festlegung dort.
  • Bei echtem SMTP-Ausfall bekommt der Nutzer keinen Hinweis; das Monitoring ist nur dokumentiert, nicht eingerichtet (devops, D1).
  • Die rohe API verrät den Unterschied weiterhin (R17, wie bei F12 akzeptiert).
  • Gateway-502/503/504 mit Status wirken jetzt ebenfalls wie Erfolg (bewusste Nebenwirkung).
  • Nicht getestet: Android/iOS, echter Browser und Screenreader.

🤖 Generated with Claude Code

## Zusammenfassung Schließt den App-seitigen Konten-Seitenkanal aus #37: Bei SMTP-Ausfall liefert GoTrue für bekannte und unbekannte Adressen unterschiedliche Status (Spike aus #38). Die App zeigte dafür ein Fehler-Banner und verriet damit ein Konto. Entscheidung F13 (Chris, 2026-11-03): **neutrale Seite im Client**. Bei `signUp`, `recover` und `resend` wirkt jede Antwort mit HTTP-Status >= 500 wie Erfolg („Prüfe dein Postfach“), identischer Text, keine Adresse, kein Banner. Closes #37 Spec: `docs/specs/1-auth-registrierung-anmeldung.md` (F13, § 4.4, R17) ## Änderungen - `auth_failure_mapper.dart`: Status >= 500 bei `signUp`/`requestPasswordReset`/`resend` -> `unexpected`; Fehler ohne Status bleibt `network`. `signIn` unberührt. - `resend_origin.dart`: Positivlisten (Allowlist) für sichtbare Fehler. Sichtbar bleiben Eingabefehler (`invalidEmail`, `weakPassword`, `registrationRejected` mit bekanntem Grund), `network` und `rateLimited` (429). Alles andere ist neutral. - **Login-Resend (Entscheidung Orchestrator, bitte bestätigen):** `unexpected` bleibt dort sichtbar („Erneut versuchen“), weil das Konto durch das richtige Passwort schon bewiesen ist und Neutralisieren nur einen echten SMTP-Ausfall verdeckt. `emailSendLimited` zeigt dort weiter den Drosselungshinweis. - Logging: unverändert über den zentralen Logger (Operation, Art, Status, Code; keine E-Mail). - Doku: Spec F13/R17, Release-Checkliste `docs/auth-konfiguration.md` (Alarm auf SMTP-Fehler als Release-Blocker). ## Akzeptanz / Tests - [x] Bekannte Adresse mit SMTP-500, unbekannte Adresse, Mail-Limit und Erfolg zeigen exakt dieselben sichtbaren Texte (Forgot-, Register-Screen, CheckEmail-Resend) - [x] Eingabefehler, Offline und 429 bleiben sichtbar (Allowlist-Tests) - [x] Repository-Test: `AuthRetryableFetchException(500)` aus Fake-Client -> `unexpected` für `signUp`/`resend`/`resetPasswordForEmail`; `signIn` 500/502/504 bleibt `network` - [x] API-E2E: Body-Format der Trigger-Fehler `age_*`/`terms_*` (`krit02-03-validierung`) - 510 Tests grün, `dart format`/`flutter analyze` ohne Befund, Playwright `api` lokal 59 grün ## Review `code-reviewer`: kein Blocker. Behoben (`3805c71`): Spec-Widerspruch zur Rolle der Trigger-Meldung, `registrationRejected` nur mit bekanntem Grund sichtbar, veraltete Doku, Integrationstest, Login-Resend (S4). ## Risiken / offen - **#46 (Release-Blocker):** SMTP-Timeout (Server nimmt Verbindung an, antwortet nicht). Ein reiner Client-Timeout ohne Status bliebe `network` und damit sichtbar. Spike und Timeout-Festlegung dort. - Bei echtem SMTP-Ausfall bekommt der Nutzer keinen Hinweis; das Monitoring ist nur dokumentiert, nicht eingerichtet (devops, D1). - Die rohe API verrät den Unterschied weiterhin (R17, wie bei F12 akzeptiert). - Gateway-502/503/504 mit Status wirken jetzt ebenfalls wie Erfolg (bewusste Nebenwirkung). - Nicht getestet: Android/iOS, echter Browser und Screenreader. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cschlaefke added 3 commits 2026-11-03 11:25:57 +00:00
Refs #37

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

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fix(auth): address review findings for smtp-neutral handling
Some checks failed
CI / flutter (pull_request) Failing after 44s
CI / web-build (pull_request) Successful in 51s
CI / supabase (pull_request) Successful in 3s
CI / supabase-tests (pull_request) Successful in 29s
CI / e2e (pull_request) Successful in 2m44s
3805c71225
Refs #37

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke added 1 commit 2026-11-03 11:38:44 +00:00
chore(auth): regenerate generated files after doc comment changes
All checks were successful
CI / flutter (pull_request) Successful in 1m13s
CI / web-build (pull_request) Successful in 59s
CI / supabase (pull_request) Successful in 3s
CI / supabase-tests (pull_request) Successful in 31s
CI / e2e (pull_request) Successful in 2m54s
97222ebb5b
Refs #37

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

Review- und CI-Ergebnis (Fix #37, F13)

CI (Commit 97222eb): alle 5 Jobs grün – flutter (1m13s), web-build (59s), supabase (3s), supabase-tests (31s), e2e (2m54s).

Der erste Lauf (3805c71) war im Job flutter rot, weil nach Änderungen an Doc-Kommentaren die generierten Dateien nicht aktuell waren (CI-Prüfung „Generierte Dateien nicht aktuell“). build_runner neu gefahren, nur Kommentare in drei generierten Dateien geändert (97222eb).

Code-Review (Agent code-reviewer): kein Blocker. Behoben in 3805c71: Spec-Widerspruch zur Rolle der Trigger-Meldung, registrationRejected nur mit bekanntem Grund sichtbar, veraltete Doku/Kommentare, Integrationstest (AuthRetryableFetchException(500) bis unexpected), API-E2E-Tests für das Body-Format von age_*/terms_*, Login-Resend (S4).

Bitte bestätigen (Entscheidung des Orchestrators): Im Login-Resend bleibt ein SMTP-Fehler sichtbar („Erneut versuchen“), weil das Konto dort durch das richtige Passwort schon bewiesen ist. Neutral bleibt es bei „Passwort vergessen“, Registrierung und CheckEmail-Resend.

Offen:

  • #46 (Release-Blocker): SMTP-Timeout / Hänge-Fall, Gateway-Timeouts, Monitoring auf Gateway-5xx.
  • Monitoring auf SMTP-Fehler nur dokumentiert, nicht eingerichtet (devops, D1).
  • Nicht getestet: Android/iOS, echter Browser und Screenreader.

Merge durch Chris. Mit dem Merge ist Issue #37 geschlossen.

## Review- und CI-Ergebnis (Fix #37, F13) **CI (Commit `97222eb`):** alle 5 Jobs grün – `flutter` (1m13s), `web-build` (59s), `supabase` (3s), `supabase-tests` (31s), `e2e` (2m54s). Der erste Lauf (`3805c71`) war im Job `flutter` rot, weil nach Änderungen an Doc-Kommentaren die generierten Dateien nicht aktuell waren (CI-Prüfung „Generierte Dateien nicht aktuell“). `build_runner` neu gefahren, nur Kommentare in drei generierten Dateien geändert (`97222eb`). **Code-Review (Agent `code-reviewer`):** kein Blocker. Behoben in `3805c71`: Spec-Widerspruch zur Rolle der Trigger-Meldung, `registrationRejected` nur mit bekanntem Grund sichtbar, veraltete Doku/Kommentare, Integrationstest (`AuthRetryableFetchException(500)` bis `unexpected`), API-E2E-Tests für das Body-Format von `age_*`/`terms_*`, Login-Resend (S4). **Bitte bestätigen (Entscheidung des Orchestrators):** Im Login-Resend bleibt ein SMTP-Fehler sichtbar („Erneut versuchen“), weil das Konto dort durch das richtige Passwort schon bewiesen ist. Neutral bleibt es bei „Passwort vergessen“, Registrierung und CheckEmail-Resend. **Offen:** - #46 (Release-Blocker): SMTP-Timeout / Hänge-Fall, Gateway-Timeouts, Monitoring auf Gateway-5xx. - Monitoring auf SMTP-Fehler nur dokumentiert, nicht eingerichtet (devops, D1). - Nicht getestet: Android/iOS, echter Browser und Screenreader. Merge durch Chris. Mit dem Merge ist Issue #37 geschlossen.
cschlaefke merged commit d8f47f0827 into main 2026-11-03 11:58:11 +00:00
cschlaefke deleted branch fix/37-smtp-neutral 2026-11-03 11:58:11 +00:00
Sign in to join this conversation.
No description provided.