From 2c1ad4a2622e1cf49d4919d7dacfc5bf35f08264 Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Wed, 20 May 2026 08:33:59 +0200 Subject: [PATCH] fix(auth): naprawa strony /login (subtitle, inline remember, auto-login z cookie) - usuniety subtitle "Zaloguj sie, aby przejsc..." z widoku - "Zapamietaj mnie (30 dni)" w jednej linii (selektor .form-field.remember-field) - AuthController::showLogin woluje loginFromRememberToken() -> uzytkownik z waznym cookie remember (30 dni) jest auto-logowany po wygasnieciu sesji PHP zamiast ogladac formularz logowania PLAN: .paul/plans/20260520-1200-fix-login-page-and-remember-me/ Co-Authored-By: Claude Opus 4.7 (1M context) --- .paul/STATE.md | 4 +- .paul/codebase/tech_changelog.md | 16 ++ .paul/governance/governance_2026-05-20.jsonl | 7 + .../PLAN.md | 225 ++++++++++++++++++ .../SUMMARY.md | 67 ++++++ public/assets/css/login.css | 2 +- resources/lang/pl.php | 2 +- resources/scss/login.scss | 2 +- resources/views/auth/login.php | 1 - src/Modules/Auth/AuthController.php | 2 +- 10 files changed, 321 insertions(+), 7 deletions(-) create mode 100644 .paul/governance/governance_2026-05-20.jsonl create mode 100644 .paul/plans/20260520-1200-fix-login-page-and-remember-me/PLAN.md create mode 100644 .paul/plans/20260520-1200-fix-login-page-and-remember-me/SUMMARY.md diff --git a/.paul/STATE.md b/.paul/STATE.md index 0da641d..bea2c1a 100644 --- a/.paul/STATE.md +++ b/.paul/STATE.md @@ -1,10 +1,10 @@ # STATE — orderPRO **Tryb:** plan-first -**Ostatnia aktualizacja:** 2026-05-19 +**Ostatnia aktualizacja:** 2026-05-20 ## Aktywna praca -UNIFY zakonczony dla `.paul/plans/20260519-1730-refactor-delivery-status/`. Petla zamknieta, brak aktywnego planu. +UNIFY zakonczony dla `.paul/plans/20260520-1200-fix-login-page-and-remember-me/`. Petla zamknieta. Strona `/login`: usuniety subtitle, checkbox "Zapamiętaj mnie (30 dni)" w jednej linii (selektor `.form-field.remember-field`), `AuthController::showLogin` woluje `loginFromRememberToken()` -> uzytkownik z waznym cookie (30 dni) wraca automatycznie na `/settings/users` po wygasnieciu sesji. SUMMARY: `.paul/plans/20260520-1200-fix-login-page-and-remember-me/SUMMARY.md`. ``` PLAN ──▶ APPLY ──▶ UNIFY diff --git a/.paul/codebase/tech_changelog.md b/.paul/codebase/tech_changelog.md index 038bd48..de16d5c 100644 --- a/.paul/codebase/tech_changelog.md +++ b/.paul/codebase/tech_changelog.md @@ -2,6 +2,22 @@ Chronologiczny log zmian technicznych (co i dlaczego). Najnowsze na gorze. +## 2026-05-20 — Strona logowania: usuniecie subtitle, inline "Zapamietaj mnie (30 dni)", auto-login z cookie + +### Co +- `resources/views/auth/login.php`: usuniety element `` (linia 5). +2. W `resources/lang/pl.php` (klucz `auth.login.remember_me`) zmien wartosc z `'Zapamietaj mnie'` na `'Zapamietaj mnie (30 dni)'`. Klucza `auth.login.subtitle` nie usuwamy (zachowanie wstecznej kompatybilnosci slownika). +3. Sprawdz, ze nie ma innych miejsc renderujacych `auth.login.subtitle` poza `login.php` (rg). + + php -l resources/views/auth/login.php; rg "auth\.login\.(subtitle|remember_me)" resources/ -n + AC-1, AC-2 (czesc tekstowa) + + + + Task 2: SCSS + rebuild CSS - checkbox w jednej linii + resources/scss/login.scss, public/assets/css/login.css + +1. W `resources/scss/login.scss` dodaj override specyficznosci dla `.remember-field`, aby pokonal regule `.form-field { display: grid }` zdefiniowana ponizej. Najprostsza forma: zmien selektor `.remember-field` na `.form-field.remember-field` (dwie klasy = wyzsza specyficznosc; struktura HTML juz ma obie klasy: `class="form-field form-field--inline remember-field"`). +2. Upewnij sie, ze blok zachowuje `display: flex; align-items: center; gap: 8px;` oraz style dla `input[type="checkbox"]` i `.field-label`. +3. Przebuduj CSS: `npm run build:css` (lub recznie `sass --style=compressed --no-source-map resources/scss/login.scss public/assets/css/login.css`). Jezeli `npm`/`sass` niedostepne w srodowisku agenta - zrob recznie analogiczna zmiane w `public/assets/css/login.css` (selektor `.form-field.remember-field { display: flex; align-items: center; gap: 8px; }` z zachowaniem reszty). + + rg "remember-field" resources/scss/login.scss public/assets/css/login.css -n; otwarcie `/login` w przegladarce i wizualna weryfikacja (smoke). + AC-2 + + + + Task 3: Auto-logowanie z remember tokenem na `/login` + src/Modules/Auth/AuthController.php + +W `AuthController::showLogin` przed renderem dodaj proba auto-loginu z cookie: + +```php +public function showLogin(Request $request): Response +{ + if ($this->auth->check() || $this->auth->loginFromRememberToken()) { + return Response::redirect('/settings/users'); + } + // ... existing render +} +``` + +Nie zmieniaj `login()` ani `logout()`. Pozostaw obecna logike `Flash::get(...)` bez zmian. + + php -l src/Modules/Auth/AuthController.php; ewentualny smoke: zaloguj z checkboxem, wyczysc cookie sesyjne (PHPSESSID), wejdz na `/login` -> powinno przekierowac na `/settings/users`. + AC-3 + + + + Task 4: Weryfikacja parametrow cookie remember (read-only) + src/Modules/Auth/AuthService.php + +Bez modyfikacji kodu: potwierdz, ze `REMEMBER_DAYS = 30` i parametry cookie (`httponly`, `samesite=Lax`, `secure` zalezne od HTTPS) sa zgodne z AC-4. Jezeli `$_SERVER['HTTPS']` nie jest dostepne za reverse proxy - odnotowac jako known issue (nie zmieniamy w tym planie). + + rg "REMEMBER_DAYS|REMEMBER_COOKIE|setcookie" src/Modules/Auth/AuthService.php -n + AC-4 + + + + + +## Do Not Change +- `AuthService::attempt`, `AuthService::createRememberToken`, `AuthService::loginFromRememberToken`, `AuthService::logout` - bez zmian behawioralnych. +- `AuthMiddleware` - bez zmian. +- `UserRepository::updateRememberToken`, `findByRememberToken` - bez zmian. +- Schemat tabeli `users.remember_token` - bez zmian (migracja `000081`). +- Inne widoki (`settings/*`) nawet jesli uzywaja `.form-field--inline` - nie ruszamy ich, zmiana SCSS jest dla `.form-field.remember-field` (selektor kompozytowy uzywany tylko na stronie logowania). +- Pozostale klucze tlumaczen w `pl.php` poza `auth.login.remember_me`. + +## Scope Limits +- Brak rotacji remember tokenu po uzyciu (odlozone). +- Brak nowych migracji. +- Brak nowych komponentow widokow. +- Brak zmian w `routes/web.php`. +- Synchronizacja literalu "30" miedzy `REMEMBER_DAYS` a tekstem PL jest manualna - jezeli ktos zmieni `REMEMBER_DAYS`, trzeba odswiezyc tlumaczenie (akceptowalne ryzyko). + + + +- [ ] `php -l resources/views/auth/login.php` - OK. +- [ ] `php -l src/Modules/Auth/AuthController.php` - OK. +- [ ] `rg "login-subtitle" resources/views/auth/login.php` - brak trafien. +- [ ] `rg "Zapamietaj mnie \(30 dni\)" resources/lang/pl.php` - 1 trafienie. +- [ ] `rg ".form-field.remember-field" resources/scss/login.scss public/assets/css/login.css` - po jednym trafieniu. +- [ ] Smoke manualny `/login`: brak subtitle, checkbox + label w jednej linii, dopisek "(30 dni)". +- [ ] Smoke manualny: zaloguj z checkboxem -> wyczysc tylko PHPSESSID -> wejdz `/login` -> redirect na `/settings/users`. +- [ ] Quality Radar - brak nowych ryzyk; literal "30" odnotowany w Boundaries. + + + +- [ ] AC-1, AC-2, AC-3, AC-4 spelnione. +- [ ] Weryfikacja przebiegla bez bledow. +- [ ] Zaktualizowany `tech_changelog.md` w fazie UNIFY (nie w APPLY) z notatka o naprawie strony logowania. + + + +SUMMARY.md path: `.paul/plans/20260520-1200-fix-login-page-and-remember-me/SUMMARY.md` + diff --git a/.paul/plans/20260520-1200-fix-login-page-and-remember-me/SUMMARY.md b/.paul/plans/20260520-1200-fix-login-page-and-remember-me/SUMMARY.md new file mode 100644 index 0000000..a6442bb --- /dev/null +++ b/.paul/plans/20260520-1200-fix-login-page-and-remember-me/SUMMARY.md @@ -0,0 +1,67 @@ +--- +plan_id: 20260520-1200-fix-login-page-and-remember-me +title: Strona logowania - usuniecie subtitle, inline checkbox "Zapamietaj mnie" (30 dni) + naprawa auto-logowania +status: completed +completed: 2026-05-20 +quality_radar: ok +--- + +## Cel +Poprawa UX i dzialania strony `/login`: +1. usuniecie zbednego podtytulu, +2. ustawienie etykiety checkboxa "Zapamietaj mnie" w jednej linii z dopiskiem "(30 dni)", +3. naprawa auto-logowania z cookie `remember_token` przy wejsciu na `/login` po wygasnieciu sesji. + +## Wynik + +| Acceptance Criterion | Status | +|---|---| +| AC-1 Usuniecie podtytulu | ✅ | +| AC-2 Checkbox + label w jednej linii, dopisek "(30 dni)" | ✅ | +| AC-3 Auto-login z remember tokenem na `/login` | ✅ | +| AC-4 Persistencja cookie 30 dni (`REMEMBER_DAYS=30`, httponly, SameSite=Lax) | ✅ (read-only weryfikacja) | + +## Zmienione pliki + +| Plik | Zmiana | +|---|---| +| `resources/views/auth/login.php` | usuniety ` diff --git a/src/Modules/Auth/AuthController.php b/src/Modules/Auth/AuthController.php index 854e4ff..810d8b6 100644 --- a/src/Modules/Auth/AuthController.php +++ b/src/Modules/Auth/AuthController.php @@ -21,7 +21,7 @@ final class AuthController public function showLogin(Request $request): Response { - if ($this->auth->check()) { + if ($this->auth->check() || $this->auth->loginFromRememberToken()) { return Response::redirect('/settings/users'); }