13 KiB
plan_id, title, storage, legacy_phase, created, status, type, autonomous, delegation, files_modified, quality_radar
| plan_id | title | storage | legacy_phase | created | status | type | autonomous | delegation | files_modified | quality_radar | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 20260520-1213-admin-too-many-redirects | Diagnoza i naprawa ERR_TOO_MANY_REDIRECTS na /Admin | plan-first | null | 2026-05-20T12:13:00 | planned | execute | false | auto |
|
ok |
Purpose
Panel administracyjny jest obecnie niedostepny - blokuje to wszelkie operacje redakcyjne (Structure, Product, HomeSite, SimpleArticle). Bez dostepu do /Admin redaktorzy nie moga zarzadzac trescia ani konfiguracja w setup.
Output
- Naprawiony przeplyw routingu/redirectu w
Admin/(kod lub konfiguracja serwera/htaccess). - Krotki raport w
SUMMARY.mdz opisem przyczyny i sposobu naprawy. - Aktualizacja
.paul/codebase/quality_risks.mdo ewentualne nowe ryzyka ujawnione przy diagnozie.
Source Files
@Admin/index.php @Admin/.htaccess @.htaccess @Admin/controller/IndexController.php @Admin/controller/LoginController.php @Admin/controller/SharedController.php @Admin/controller/StructureController.php @Admin/module/AuthDAL.mod.php @core/class/Router.class.php @core/class/FrontController.class.php @core/class/MainController.class.php @core/class/SessionProxy.class.php @core/core.php @core/config/Admin/path.config.php
- Wstepna hipoteza: `Admin/controller/IndexController.php:23` zawsze wywoluje `AddRedirect(URL_MAIN.'/Structure/')`, a w `Admin/index.php:43` ustawione jest `Router::$controllerMethodSeek = false`. Bez auto-mapowania URL `/Admin/Structure/` moze nie trafic do `StructureController`, wracac do `IndexController`, ktory ponawia redirect - klasyczna petla. - Drugorzedna hipoteza: niespojnosc protokolu (`https://` w `URL_MAIN` vs. brak `HTTPS=on` za reverse proxy/Cloudflare) prowadzaca do oscylacji HTTP<->HTTPS na poziomie serwera. - Trzecia hipoteza: brak `cookie_secure`/`cookie_domain` powoduje gubienie sesji - kazde zadanie startuje jako niezalogowane, a `SharedController::Auth` w `:172` przekierowuje na `LOGIN`, ktora to trasa nie jest zarejestrowana w `Admin/index.php` i moze generowac URL kierujacy z powrotem do `/Admin/`. - Diagnoza w Tasku 1 ma rozstrzygnac, ktora hipoteza jest prawdziwa, zanim wprowadzimy zmiane w kodzie.<impact_scan>
Quality Radar
Status: ok (codebase-memory-mcp) Tools: codebase-memory-mcp (lekki tryb); jscpd/ast-grep disabled by policy.
Affected Areas
- Bootstrap admina:
Admin/index.php,core/core.php,core/class/FrontController.class.php,core/class/Router.class.php. - Kontrolery autoryzacji/wejscia:
Admin/controller/IndexController.php,Admin/controller/LoginController.php,Admin/controller/SharedController.php(Auth),Admin/controller/StructureController.php. - Modul autoryzacji:
Admin/module/AuthDAL.mod.php,module/AuthDAL.mod.php. - Konfiguracja URL:
core/config/Admin/path.config.php(URL_MAIN=https://zurawik.pl/Admin). - Reguly serwera: root
.htaccess(wykluczaAdminz rewrite),Admin/.htaccess(rewrite doindex.php).
Duplicate / Hardcoded Risks
Admin/controller/StructureController.php_iSimpleArticle_/to backupy/duplikaty - patrzquality_risks.md. Diagnoza musi uwazac, ktory plik jest faktycznie ladowany (autoloaderCore::LoadClass).URL_MAINhardkodowany nahttps://wcore/config/Admin/path.config.php:22- utrudnia debugowanie problemow protokolu. Odlozone (patrz Deferrals).Admin/index.php:33-36zawiera hardkodowaneidstruktur (18/52/30/40) - nie ma zwiazku z biezacym bledem, odlozone.
Explicit Deferrals
- Wyciagniecie tras admina do
Admin/routes.php- poza zakresem, oddzielny plan. - Rotacja poswiadczen
prodPasswcore/config/Strona/db.config.php- krytyczne, ale niezwiazane z petla redirectow; do osobnego planu bezpieczenstwa. - Refaktor
SelfUrl()(core/core.php:305) na detekcje proxy (HTTP_X_FORWARDED_PROTO) - rozwazyc w fazie naprawy, ale nie blokuje planu jesli problem lezy w routingu. </impact_scan>
<acceptance_criteria>
AC-1: Zidentyfikowana przyczyna petli
Given panel /Admin zwraca ERR_TOO_MANY_REDIRECTS w przegladarce
When wykonamy diagnoze sledzac sekwencje HTTP (curl -I -L --max-redirs 20) oraz logi serwera/PHP
Then w SUMMARY.md udokumentowano dokladnie, ktora warstwa (Router / IndexController / SharedController::Auth / .htaccess / proxy HTTPS) wywoluje petle oraz na podstawie ktorego pliku i linii
AC-2: Wejscie na /Admin konczy sie najwyzej jednym redirectem do zalogowanego dashboardu lub strony logowania
Given uzytkownik nie posiada waznej sesji admina
When otwiera https://zurawik.pl/Admin
Then przegladarka otrzymuje 1-2 przekierowania (max), koncowy status 200, a renderowany szablon to widok logowania (`Admin/template/login.tpl` lub odpowiednik)
And `curl -I -L --max-redirs 5 https://zurawik.pl/Admin` zwraca koncowy `HTTP/1.1 200 OK` bez wpadania w limit przekierowan
AC-3: Zalogowanie skutkuje wejsciem do panelu bez nowej petli
Given poprawne dane logowania admina (test na srodowisku stagingowym lub konto testowe)
When uzytkownik wykona POST do akcji logowania
Then nastepuje pojedyncze przekierowanie do `Structure/Index` i renderuje sie widok panelu, bez kolejnych petli
AC-4: Brak regresji w innych trasach admina
Given naprawa zostala wdrozona
When wykonamy smoke test glownych tras: `/Admin/Structure/`, `/Admin/customer/gallery/pl`, `/Admin/Product/`, `/Admin/Login/`
Then kazda zwraca 200 (po zalogowaniu) lub redirect do logowania (gdy brak sesji) - nie petle
</acceptance_criteria>
Task 1: Diagnoza - odtworzenie petli i identyfikacja warstwy (brak modyfikacji kodu na tym etapie) 1. Lokalnie/na stagingu (jezeli mozliwe) lub na produkcji w trybie obserwacji: - `curl -I -L --max-redirs 20 https://zurawik.pl/Admin` i zapisac pelny `Location:` chain w `SUMMARY.md`. - Powtorzyc dla `https://zurawik.pl/Admin/` i `https://zurawik.pl/Admin/Structure/`. - Sprawdzic `https://zurawik.pl/Admin/Login/` (czy strona logowania ladowala sie bezposrednio). 2. Tymczasowo wlaczyc szczegolowe logowanie: - w `Admin/index.php` (przed `$front->Dispatch()`) dorzucic `MFLog::Info('REQ ' . $_SERVER['REQUEST_URI'] . ' SCHEME=' . ($_SERVER['HTTPS'] ?? 'off') . ' XFP=' . ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '-'))` (lub uzyc istniejacego loggera log4php). Po diagnozie - usunac. - przejrzec `error_log` w roocie projektu pod katem powtarzajacych sie wpisow w trakcie odtwarzania petli. 3. Rozstrzygnac, ktora hipoteza zachodzi: - (H1) `Router::$controllerMethodSeek = false` + brak trasy `/Structure/` -> `IndexController` ponawia `AddRedirect` (`Admin/controller/IndexController.php:23`). - (H2) Petla na warstwie HTTPS (Cloudflare/proxy) - `SelfUrl()` widzi http, redirect do https, proxy zwraca http. - (H3) Sesja nie persistuje (cookie path/secure) - kazde zadanie zaczyna sie jako niezalogowane, `SharedController::Auth` (`Admin/controller/SharedController.php:172`) wysyla na trase `LOGIN`, ktora nie jest zarejestrowana w `Admin/index.php` -> `Router::GenerateUrl('LOGIN', ...)` zwraca URL prowadzacy z powrotem do `/Admin`. - (H4) Reguly `.htaccess` (root vs `Admin/.htaccess`) - sprawdzic, czy hosting nie ma dodatkowych globalnych regul (force www, force https) w panelu hostingu, ktore tworza petle z PHP. 4. Wynik diagnozy zapisac w sekcji "Diagnoza" pliku `.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md` z dokladnymi cytatami z logow/curla. Sekwencja `Location` z curla zapisana; jedna z hipotez H1-H4 potwierdzona z odwolaniem do pliku i linii. AC-1 Checkpoint: zatwierdzenie diagnozy i kierunku naprawy Przedstawic uzytkownikowi wynik Tasku 1 i zaproponowac wariant naprawy (poniewaz kazda hipoteza wymaga innej zmiany): - H1 -> usunac/zmodyfikowac `AddRedirect` w `IndexController::IndexAction` na renderowanie dashboardu albo przelaczyc `Router::$controllerMethodSeek = true`, albo zarejestrowac jawna trase `Structure/Index`. - H2 -> zmodyfikowac `SelfUrl()` i/lub dodac w `Admin/index.php` detekcje `HTTP_X_FORWARDED_PROTO`; ewentualnie wylaczyc force-https na poziomie hostingu. - H3 -> zarejestrowac trase `LOGIN` w `Admin/index.php` (`Router::AddRoute('LOGIN', 'Login/Index', array('controller'=>'LoginController','method'=>'Index'))`) i naprawic konfiguracje sesji (cookie domain/secure) w `core/class/SessionProxy.class.php` lub `Admin/index.php` przed `session_start()`. - H4 -> poprawic `.htaccess` (root lub Admin), wylaczyc reguly hostingu. Uzytkownik wybiera wariant przed przejsciem do Tasku 2. Uzytkownik potwierdzil wybrany wariant. AC-1 (potwierdzenie kierunku) Task 2: Wdrozenie naprawy zgodnie z wybranym wariantem Admin/index.php, Admin/controller/IndexController.php, Admin/controller/SharedController.php, Admin/.htaccess, .htaccess, core/core.php (tylko jezeli wariant H2) Wdrozyc minimalna zmiane wynikajaca z Checkpointu. Zasady: - Modyfikacje musza byc lokalne i odwracalne (jedna konkretna funkcja/trasa/regula). - Nie ruszac kontrolerow innych domen (Product, HomeSite, SimpleArticle) - poza zakresem. - Nie wprowadzac drugiego zrodla prawdy (np. dodatkowych stalych URL). - Usunac tymczasowe logowanie z Tasku 1. - Jezeli wariant wymaga rejestracji trasy `LOGIN`, dodac ja w bloku `Router::AddRoute(...)` w `Admin/index.php` razem z istniejacymi trasami (linie 30-36), z komentarzem WHY (jednolinijkowy). - Jezeli wariant wymaga zmiany `SelfUrl()` lub detekcji `X-Forwarded-Proto`, zmiana ma byc w jednym miejscu (`core/core.php:305`) i nie zmieniac zachowania dla srodowisk bez proxy. `git diff` pokazuje wylacznie pliki z `files_modified`; lokalny test `curl -I -L https://zurawik.pl/Admin` konczy sie kodem 200. AC-2 Task 3: Smoke test panelu po naprawie (brak modyfikacji kodu) 1. Bez sesji: `curl -I -L --max-redirs 5 https://zurawik.pl/Admin` -> oczekiwane 200 (strona logowania) lub redirect do `/Admin/Login/`. 2. Z waznym ciasteczkiem sesji (po zalogowaniu w przegladarce): odwiedzic `/Admin`, `/Admin/Structure/`, `/Admin/customer/gallery/pl`, `/Admin/Product/`. Oczekiwany kod 200 i renderowanie szablonu. 3. Sprawdzic `error_log` w roocie - brak nowych powtarzajacych sie bledow. 4. Wyniki dopisac do `SUMMARY.md` (sekcja "Smoke test po naprawie"). Wszystkie testy z punktu 1-2 zwracaja 200 bez petli przekierowan. AC-3, AC-4 ## Do Not Change - `core/class/Router.class.php`, `core/class/FrontController.class.php` i inne klasy `core/class/*` - poza zakresem chyba ze diagnoza wskaze konkretny blad w `core/class/*`; wtedy zmiana wymaga osobnego ustalenia z uzytkownikiem. - Logika autoryzacji w `Admin/module/AuthDAL.mod.php` - nie zmieniamy hashowania ani struktury sesji. - Plikow z prefiksem `*_`, `*.bak`, `*.php_` (`StructureController.php_`, `SimpleArticle_/`, `MainController.class.php.bak`, `Router.class.php.bak`) - to legacy duplikaty, nie ruszamy w tym planie. - Konfiguracji bazy (`core/config/*/db.config.php`). - `index.php` (publiczny) i kontrolerow w `controller/` - poza zakresem.Scope Limits
- Plan dotyczy wylacznie petli przekierowan na
/Admin. Nie obejmuje rotacji hasel, refaktoru routes admina do osobnego pliku, ani modernizacji Smarty/CKEditor. - Nie wdrazamy mechanizmu "remember me", nie zmieniamy logiki
AuthDAL::Login. - Nie wdrazamy nowych testow automatycznych (projekt nie ma frameworka testowego - patrz
.paul/codebase/testing.md).
<success_criteria>
- AC-1, AC-2, AC-3, AC-4 spelnione.
SUMMARY.mdzawiera diagnoze, opis naprawy, smoke test i ewentualne nowe ryzyka..paul/codebase/quality_risks.mdzaktualizowane, jezeli diagnoza ujawnila nowe ryzyka (np. brak rejestracji trasyLOGIN,SelfUrl()niewspoldzialajacy z proxy). </success_criteria>