Files
2026-05-20 13:30:10 +02:00

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
Admin/index.php
Admin/controller/IndexController.php
Admin/controller/SharedController.php
Admin/controller/LoginController.php
Admin/.htaccess
.htaccess
ok
## Goal Zlokalizowac i usunac przyczyne bledu ERR_TOO_MANY_REDIRECTS przy wejsciu na https://zurawik.pl/Admin tak, aby niezalogowany uzytkownik dostawal strone logowania (LoginController), a zalogowany - dashboard panelu (StructureController).

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.md z opisem przyczyny i sposobu naprawy.
  • Aktualizacja .paul/codebase/quality_risks.md o ewentualne nowe ryzyka ujawnione przy diagnozie.
## Project Docs @.paul/PROJECT.md @.paul/STATE.md @.paul/codebase/architecture.md @.paul/codebase/db_schema.md @.paul/codebase/impact_map.md @.paul/codebase/quality_risks.md

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 (wyklucza Admin z rewrite), Admin/.htaccess (rewrite do index.php).

Duplicate / Hardcoded Risks

  • Admin/controller/StructureController.php_ i SimpleArticle_/ to backupy/duplikaty - patrz quality_risks.md. Diagnoza musi uwazac, ktory plik jest faktycznie ladowany (autoloader Core::LoadClass).
  • URL_MAIN hardkodowany na https:// w core/config/Admin/path.config.php:22 - utrudnia debugowanie problemow protokolu. Odlozone (patrz Deferrals).
  • Admin/index.php:33-36 zawiera hardkodowane id struktur (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 prodPass w core/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>
Brak SPECIAL-FLOWS.md - sekcja pomijana.

<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).
- [ ] `curl -I -L --max-redirs 5 https://zurawik.pl/Admin` zwraca koncowy `200 OK`. - [ ] `curl -I -L --max-redirs 5 https://zurawik.pl/Admin/Structure/` (z sesja) zwraca `200 OK`. - [ ] `git diff` ograniczony do plikow z `files_modified`. - [ ] `error_log` w roocie nie zawiera powtarzajacych sie wpisow po naprawie. - [ ] Brak tymczasowych logow diagnostycznych w kodzie po Task 2. - [ ] Quality Radar - ryzyka z `impact_scan` zaadresowane lub jawnie odlozone.

<success_criteria>

  • AC-1, AC-2, AC-3, AC-4 spelnione.
  • SUMMARY.md zawiera diagnoze, opis naprawy, smoke test i ewentualne nowe ryzyka.
  • .paul/codebase/quality_risks.md zaktualizowane, jezeli diagnoza ujawnila nowe ryzyka (np. brak rejestracji trasy LOGIN, SelfUrl() niewspoldzialajacy z proxy). </success_criteria>
SUMMARY.md path: `.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md`