{ "task_id": "AUTH-MICROSOFT-REMEMBER-001", "summary": "Implementiere steuerbares Auto-Remember fuer erfolgreiche Microsoft-Logins mit globalem Default + Tenant-Override (inherit/force_on/force_off) und fuehre eine globale, konfigurierbare Remember-Token-TTL (in Tagen) fuer alle Remember-Tokens ein. Ziel-Runtime-Kontext: agent-system/runs/AUTH-MICROSOFT-REMEMBER-001/plan.json.", "assumptions": [ "Bestehendes Default-Verhalten bleibt unveraendert, bis Konfiguration aktiv gesetzt wird (globaler Auto-Remember-Default = aus).", "Die neue Remember-TTL gilt fuer alle Remember-Tokens (lokaler Login und Microsoft-basierter Remember-Token).", "Es werden keine API-Endpunkte oder OpenAPI-Vertraege geaendert; Scope ist Web-Auth + Admin-Settings/Tenant-UI + Service/Repository.", "Microsoft-OIDC-Handshake bleibt unveraendert; erweitert wird nur das Verhalten nach erfolgreichem Login." ], "scope": { "in": [ "Globales Settings-Modell fuer Microsoft Auto-Remember Default (bool) und Remember-Token-TTL in Tagen (int) inkl. Validation/Fallbacks.", "Tenant-spezifischer Microsoft-Override mit drei Zustaenden: inherit, force_on, force_off.", "Microsoft-Callback-Flow: Remember-Token wird bei erfolgreicher Microsoft-Anmeldung gemaess effektiver Policy gesetzt.", "RememberMeService-Lifetime auf konfigurierbare TTL umstellen (statt fixer 30 Tage).", "Admin-Settings-UI und Tenant-SSO-UI um neue Steuerungsfelder erweitern inkl. i18n de/en.", "Idempotente DB-Updates in db/updates fuer bestehende Installationen sowie Anpassung von db/init/init.sql fuer Fresh-Install.", "Automatisierte Tests und Quality-Gates fuer neue Logik, Settings-Validierung, Policy-Prioritaet und UI/Contract-Integritaet." ], "out": [ "Aenderungen an Session Idle/Absolute Timeout-Logik.", "Aenderungen an OIDC Discovery/Token Exchange/JWT Validierung.", "Neues API-Interface fuer diese Konfiguration.", "Aenderungen am bestehenden lokalen Remember-Checkbox-UX im Login-Formular.", "Breite Refactors ausserhalb Auth/Settings/Tenant-SSO." ] }, "guardrails": { "required_guard_ids": [ "GR-CORE-001", "GR-CORE-003", "GR-CORE-005", "GR-CORE-010", "GR-CORE-011", "GR-CORE-012", "GR-SEC-001", "GR-SEC-002", "GR-SEC-003", "GR-UI-009", "GR-UI-010", "GR-UI-013", "GR-UI-015", "GR-TEST-001", "GR-TEST-002", "GR-LANG-002" ], "required_quality_gate_ids": [ "QG-001", "QG-002", "QG-003", "QG-005", "QG-006" ] }, "success_criteria": [ { "id": "SC-001", "criterion": "Globale Settings fuer Microsoft Auto-Remember Default und Remember-Token-TTL sind im Settings-Layer implementiert, validiert und mit stabilen Fallbacks verfuegbar (Default: Auto-Remember aus, TTL 30 Tage)." }, { "id": "SC-002", "criterion": "Tenant-Override fuer Microsoft Auto-Remember ist als 3-stufiges Modell (inherit/force_on/force_off) durchgaengig gespeichert, editierbar und im Runtime-Verhalten wirksam." }, { "id": "SC-003", "criterion": "Bei erfolgreicher Microsoft-Anmeldung wird genau dann ein Remember-Token gesetzt, wenn die effektive Policy dies erlaubt; bei force_off oder global aus + inherit wird kein Token gesetzt." }, { "id": "SC-004", "criterion": "RememberMeService nutzt die konfigurierbare TTL fuer Token-Erstellung und Token-Rotation; die feste 30-Tage-Konstante steuert das Verhalten nicht mehr." }, { "id": "SC-005", "criterion": "Admin-Settings- und Tenant-SSO-Formulare enthalten die neuen Felder barrierearm und vollständig lokalisiert (de/en), ohne AuthZ-/CSRF-/PRG-Regression." }, { "id": "SC-006", "criterion": "Neue und angepasste PHPUnit-Tests decken Settings-Validierung, Tenant-Prioritaet und Remember-Policy-Verhalten ab; alle Pflicht-Gates QG-001/002/003/005/006 sind mit Evidenz PASS." } ], "implementation_steps": [ { "id": "S1", "title": "Datenmodell und Settings-Keys festlegen", "description": "Fuehre zwei globale Settings-Keys ein: microsoft_auto_remember_default (bool, default 0) und remember_token_lifetime_days (int, default 30). Erweitere tenant_auth_microsoft um ein tri-state-faehiges Feld fuer Tenant-Override (NULL=inherit, 1=force_on, 0=force_off). Erstelle idempotentes SQL-Update in db/updates mit Guards fuer bestehende Installationen und aktualisiere db/init/init.sql fuer Neuinstallationen.", "guard_refs": [ "GR-CORE-010", "GR-CORE-011", "GR-SEC-003" ] }, { "id": "S2", "title": "Settings-Gateway fuer Login-Persistenz implementieren", "description": "Implementiere einen dedizierten Settings-Gateway fuer Login-Persistenz (bool + TTL inkl. Grenzen, z. B. 1..365 Tage) auf Basis von SettingsMetadataGateway. Binde ihn in SettingServicesFactory ein und expose die Read-Methoden ueber AuthSettingsGateway fuer Auth-Services.", "guard_refs": [ "GR-CORE-001", "GR-TEST-002", "GR-CORE-011" ] }, { "id": "S3", "title": "Tenant-Sso-Service auf Override-Policy erweitern", "description": "Erweitere TenantMicrosoftAuthRepository Select/Upsert um das neue Override-Feld und normalisiere im TenantSsoService die Eingabe auf inherit/force_on/force_off. Implementiere eine eindeutige Policy-Resolution-Methode shouldAutoRememberOnMicrosoftLogin(tenantId) mit Prioritaet: force_on > force_off > global default bei inherit.", "guard_refs": [ "GR-CORE-001", "GR-SEC-003", "GR-TEST-001", "GR-TEST-002" ] }, { "id": "S4", "title": "Admin-Settings-Flow erweitern", "description": "Ergaenze AdminSettingsService buildPageData und updateFromAdmin um die neuen globalen Felder inkl. Validierung, Fehlerkeys und Persistenz. Erweitere pages/admin/settings/index(default).phtml um UI-Felder fuer globalen Microsoft-Auto-Remember-Default und Remember-TTL (nummerisch). Halte CSRF-Pruefung und PRG-Fluss unveraendert.", "guard_refs": [ "GR-SEC-001", "GR-CORE-012", "GR-UI-009", "GR-UI-010", "GR-UI-015" ] }, { "id": "S5", "title": "Tenant-SSO-UI und AuthZ-Feldschutz erweitern", "description": "Ergaenze pages/admin/tenants/_form.phtml um ein 3-stufiges Auswahlfeld fuer Microsoft Auto-Remember Override (inherit/force_on/force_off) innerhalb des SSO-Bereichs. Erweitere create/edit-Flows fuer Formular-Repopulation und erweitere TenantAuthorizationPolicy::containsSsoFields um das neue Feld, damit unberechtigte SSO-Aenderungen weiterhin serverseitig blockiert werden.", "guard_refs": [ "GR-CORE-005", "GR-SEC-001", "GR-UI-009", "GR-UI-013", "GR-UI-015" ] }, { "id": "S6", "title": "RememberMeService auf dynamische TTL umstellen", "description": "Entferne die harte Lifetime-Konstante als verhaltensbestimmende Quelle und nutze statt dessen den neuen Settings-Wert fuer rememberUser() und Token-Rotation in autoLoginFromCookie(). Stelle sicher, dass ungueltige Werte nicht zu unendlichen oder negativen Laufzeiten fuehren (Gateway-validierte Grenzen + Fallback).", "guard_refs": [ "GR-CORE-001", "GR-TEST-001", "GR-TEST-002" ] }, { "id": "S7", "title": "Microsoft-Callback um Policy-gesteuertes Remember erweitern", "description": "Erweitere pages/auth/microsoft/callback().php nach erfolgreichem loginUserById um policy-gesteuerten Aufruf von rememberUser(userId), basierend auf der effektiven TenantSsoService-Policy. Fehlerpfade, Redirects und bestehendes Session-Timestamp-Verhalten bleiben unveraendert.", "guard_refs": [ "GR-CORE-003", "GR-SEC-001", "GR-CORE-005" ] }, { "id": "S8", "title": "Tests erweitern und Gates absichern", "description": "Erweitere/erstelle PHPUnit-Tests fuer Settings-Gateway, AdminSettingsService, TenantSsoService, TenantAuthorizationPolicy und RememberMeService mit Fokus auf Defaults, Grenzen, Prioritaetsauflosung und side effects. Fuehre Pflicht-Gates aus und dokumentiere Evidenz pro SC-ID.", "guard_refs": [ "GR-TEST-001", "GR-TEST-002", "GR-LANG-002", "GR-UI-009" ] } ], "tests": [ "Neuer Test: tests/Service/Settings/SettingsLoginPersistenceGatewayTest.php fuer bool+TTL Fallback, Validierungsgrenzen und Persistenz.", "Erweiterung: tests/Service/Settings/AdminSettingsServiceSessionPolicyTest.php um neue Felder microsoft_auto_remember_default und remember_token_lifetime_days (gueltig/ungueltig).", "Erweiterung: tests/Service/Auth/TenantSsoServiceTest.php fuer Override-Normalisierung und effektive Policy-Prioritaet (force_on/force_off/inherit+global).", "Erweiterung: tests/Service/Access/TenantAuthorizationPolicyTest.php um neuen SSO-Feldschutz fuer microsoft_auto_remember_mode.", "Erweiterung: tests/Service/Auth/RememberMeServiceTest.php fuer dynamische TTL in rememberUser() und Token-Rotation.", "QG-001: docker compose exec php vendor/bin/phpunit", "QG-002: docker compose exec php vendor/bin/phpstan analyse -c phpstan.neon --no-progress", "QG-003: docker compose exec php vendor/bin/phpunit tests/Architecture/CoreStarterkitContractTest.php", "QG-005: Manueller Browser-Smoke fuer Admin Settings + Tenant SSO + Microsoft Login Callback (keine neuen JS-Fehler, kein A11y-Regressionsverhalten).", "QG-006: docker compose exec php composer cs:check" ], "acceptance_checks": [ "SC-001: In Settings-Layer sind microsoft_auto_remember_default und remember_token_lifetime_days mit dokumentierten Defaults/Fallbacks verfuegbar und in buildPageData sichtbar.", "SC-002: Tenant-Form speichert und laedt den 3-stufigen Override stabil; effective policy entspricht exakt der Prioritaetsregel.", "SC-003: Microsoft-Callback setzt Remember-Token nur bei effektiver Policy=true und nie in Fehler-/Denied-Pfaden.", "SC-004: Remember-Tokens erhalten expires_at entsprechend konfigurierter TTL (nicht mehr fest 30 Tage) in Erzeugung und Rotation.", "SC-005: Neue sichtbare Texte laufen ueber t() und sind in i18n/default_de.json und i18n/default_en.json vorhanden; CSRF/PRG/AuthZ-Verhalten bleibt intakt.", "SC-006: Alle geplanten Testfaelle laufen stabil und QG-001/002/003/005/006 sind mit PASS dokumentiert." ], "ux_notes": { "affected_patterns": [ "Admin settings cards in pages/admin/settings/index(default).phtml", "Tenant SSO section in pages/admin/tenants/_form.phtml", "Existing tenant SSO toggle behavior in web/js/components/app-tenant-sso-toggle.js" ], "ui_states_required": [ "loading", "empty", "error", "success" ], "a11y_touchpoints": [ "Neue Checkbox/Number-Input in globalen Einstellungen (Labels, Hilfe, Fehleranzeige).", "Neues tri-state Feld im Tenant-SSO-Formular (semantische Feldbezeichnung und Keyboard-Bedienbarkeit).", "Fehlerdarstellung via bestehende notice/form-error Muster ohne Fokus-Regression." ] }, "risks": [ { "risk": "Falsch konfigurierte TTL kann zu ungewollt langen Persistenzzeiten fuehren.", "mitigation": "Strikte Validierungsgrenzen im Settings-Gateway (z. B. 1..365), klarer Default 30 und Admin-Validierungsfehler bei ungueltigen Werten." }, { "risk": "DB-Migration fuer bestehende Installationen kann fehlschlagen oder nicht idempotent sein.", "mitigation": "Idempotentes db/updates Script mit information_schema-Guard und Contract-Pruefung ueber DatabaseUpdatesContractTest + QG-003." }, { "risk": "Tri-state Semantik kann in UI und Persistenz inkonsistent werden.", "mitigation": "Einheitliche Normalisierung im Service, explizite Mapping-Regeln (NULL/1/0) und gezielte Unit-Tests fuer jeden Zustand." }, { "risk": "Callback-Erweiterung koennte unbeabsichtigt Erfolgs-/Fehlerfluesse beeinflussen.", "mitigation": "Token-Set nur nach erfolgreichem loginUserById und unveraenderte Redirect-/Flash-Fehlerpfade; manueller SSO-Smoke in QG-005." } ] }