| quick-260917-gyd |
01 |
auth |
| next.js |
| middleware |
| jwt |
| i18n |
| vitest |
|
|
| safe-next.ts: buildNextParam()/sanitizeNextPath() als reine, getestete Funktionen fuer den Ruecksprung-Parameter (Open-Redirect-Schutz) |
| fetchSessionState() in auth-actions.ts: klassifiziert die Sitzung (authenticated/unauthenticated/unavailable) und loescht das Cookie nur bei nachweislich toter Sitzung |
| Header-Waechter erkennt tote Sitzung und leitet auf /login?next=… um, bleibt bei API-Ausfall still |
| Einstellungen → Widgets vollstaendig uebersetzt (i18n statt hartkodiertem Englisch) |
|
|
| tokens |
tasks |
commits |
| 6602 |
3 |
3 |
|
4778824c73 |
| added |
patterns |
|
|
| safe-next.ts: reine Funktionen ohne Node-/DOM-APIs, damit ein Modul sowohl von der Edge-Middleware als auch vom Client importiert werden kann |
| fetchSessionState() klassifiziert API-Antworten in drei Zustaende (authenticated/unauthenticated/unavailable) statt eines binaeren Erfolg/Misserfolg, um Abmelde-Schleifen bei API-Ausfaellen zu vermeiden |
|
|
| created |
modified |
| apps/web/src/lib/safe-next.ts |
| apps/web/src/lib/safe-next.test.ts |
| apps/web/src/lib/auth-actions.test.ts |
| apps/web/src/components/layout/header.test.tsx |
|
| apps/web/src/middleware.ts |
| apps/web/src/app/(auth)/login/page.tsx |
| apps/web/src/lib/auth-actions.ts |
| apps/web/src/components/layout/header.tsx |
| apps/web/src/app/(portal)/settings/dashboard/page.tsx |
| apps/web/src/messages/de.json |
| apps/web/src/messages/en.json |
| CHANGELOG.md |
|
|
| fetchCurrentUser() bleibt unveraendert (Signatur und Verhalten) — change-password/page.tsx, account-settings-form.tsx und deren Test-Mock haengen davon ab; fetchSessionState() ist additiv daneben entstanden, mit akzeptierter kleiner Code-Duplikation der fetch-Zeilen |
| Cookie-Loeschung bei toter Sitzung passiert ausschliesslich in der Server Action fetchSessionState() (cookieStore.delete() ist nur dort erlaubt), der Header liest nur den klassifizierten Zustand und navigiert |
| login/page.tsx liest next erst beim Absenden aus window.location.search statt per useSearchParams(), weil der Hook in Next 15 eine Suspense-Grenze braucht und sonst next build fuer die statisch vorgerenderte Login-Seite abbricht |
|
| Sitzungswaechter-Muster: dreiwertige Klassifikation (authenticated/unauthenticated/unavailable) statt AuthUser | null, damit ein API-Ausfall nicht als tote Sitzung fehlinterpretiert wird |
|
|
| id |
description |
requirement |
verification |
human_judgment |
| D1 |
Middleware haengt next-Parameter (Pfad + Query ohne _rsc) an beide Login-Umleitungen an; nicht fuer / und /login… |
QUICK-260917-GYD |
| kind |
ref |
status |
| unit |
apps/web/src/lib/safe-next.test.ts (9 Faelle) |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D2 |
Anmeldeseite springt nach Erfolg auf den bereinigten next-Wert; unsichere Werte fallen auf / zurueck |
QUICK-260917-GYD |
| kind |
ref |
status |
| unit |
apps/web/src/lib/safe-next.test.ts (sanitizeNextPath-Faelle) |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D3 |
fetchSessionState() loescht das Cookie nur bei 401/403/leerer 200-Antwort, meldet 5xx/Netzwerkfehler als unavailable ohne Cookie-Loeschung |
QUICK-260917-GYD |
| kind |
ref |
status |
| unit |
apps/web/src/lib/auth-actions.test.ts (8 Faelle) |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D4 |
Header leitet bei toter Sitzung per Vollnavigation auf /login?next=… um und bleibt bei API-Ausfall still (Avatar zeigt weiterhin ?) |
QUICK-260917-GYD |
| kind |
ref |
status |
| unit |
apps/web/src/components/layout/header.test.tsx (4 Faelle) |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D5 |
Einstellungen → Widgets zeigt Lade- und Leerhinweis ueber i18n (de/en) statt hartkodiertem Englisch |
QUICK-260917-GYD |
| kind |
ref |
status |
| other |
grep-Gates auf settings/dashboard/page.tsx + de.json/en.json settings.widgets.empty (Task-3-verify) |
pass |
|
|
false |
|
| id |
description |
verification |
human_judgment |
rationale |
| D6 |
Browser-Nachweis: ohne Sitzung /settings/general/desktop aufrufen → Login-URL traegt next, nach Anmeldung landet man auf der Desktop-Seite; Sitzungscookie mit nicht mehr existierender Benutzer-ID → Umleitung zur Anmeldeseite statt ?-Avatar |
|
true |
Erfordert einen echten Browser-Lauf gegen die laufende API/DB (Orchestrator-Aufgabe, nicht Teil dieses Ausfuehrungsplans laut <verification>-Sektion des Plans) |
|
|
7min |
2026-09-17 |
complete |