This commit is contained in:
2026-05-20 13:30:10 +02:00
parent bc5cae7e82
commit 22c886b8f4
20 changed files with 1154 additions and 7 deletions

View File

@@ -0,0 +1,231 @@
---
plan_id: 20260520-1213-admin-too-many-redirects
title: Diagnoza i naprawa ERR_TOO_MANY_REDIRECTS na /Admin
storage: plan-first
legacy_phase: null
created: 2026-05-20T12:13:00
status: planned
type: execute
autonomous: false
delegation: auto
files_modified:
- Admin/index.php
- Admin/controller/IndexController.php
- Admin/controller/SharedController.php
- Admin/controller/LoginController.php
- Admin/.htaccess
- .htaccess
quality_radar: ok
---
<objective>
## 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.
</objective>
<context>
## 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
</context>
<clarifications>
- 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.
</clarifications>
<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>
<skills>
Brak SPECIAL-FLOWS.md - sekcja pomijana.
</skills>
<acceptance_criteria>
## AC-1: Zidentyfikowana przyczyna petli
```gherkin
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
```gherkin
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
```gherkin
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
```gherkin
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>
<tasks>
<task type="auto">
<name>Task 1: Diagnoza - odtworzenie petli i identyfikacja warstwy</name>
<files>(brak modyfikacji kodu na tym etapie)</files>
<action>
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.
</action>
<verify>Sekwencja `Location` z curla zapisana; jedna z hipotez H1-H4 potwierdzona z odwolaniem do pliku i linii.</verify>
<done>AC-1</done>
</task>
<task type="checkpoint:human-verify" gate="blocking">
<name>Checkpoint: zatwierdzenie diagnozy i kierunku naprawy</name>
<action>
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.
</action>
<verify>Uzytkownik potwierdzil wybrany wariant.</verify>
<done>AC-1 (potwierdzenie kierunku)</done>
</task>
<task type="auto">
<name>Task 2: Wdrozenie naprawy zgodnie z wybranym wariantem</name>
<files>Admin/index.php, Admin/controller/IndexController.php, Admin/controller/SharedController.php, Admin/.htaccess, .htaccess, core/core.php (tylko jezeli wariant H2)</files>
<action>
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.
</action>
<verify>`git diff` pokazuje wylacznie pliki z `files_modified`; lokalny test `curl -I -L https://zurawik.pl/Admin` konczy sie kodem 200.</verify>
<done>AC-2</done>
</task>
<task type="auto">
<name>Task 3: Smoke test panelu po naprawie</name>
<files>(brak modyfikacji kodu)</files>
<action>
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").
</action>
<verify>Wszystkie testy z punktu 1-2 zwracaja 200 bez petli przekierowan.</verify>
<done>AC-3, AC-4</done>
</task>
</tasks>
<boundaries>
## 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`).
</boundaries>
<verification>
- [ ] `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.
</verification>
<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>
<output>
SUMMARY.md path: `.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md`
</output>

View File

@@ -0,0 +1,105 @@
---
plan_id: 20260520-1213-admin-too-many-redirects
title: Diagnoza i naprawa ERR_TOO_MANY_REDIRECTS na /Admin
completed: 2026-05-20T12:40:00
storage: plan-first
quality_radar: ok
---
# Summary: Diagnoza i naprawa ERR_TOO_MANY_REDIRECTS na /Admin
## Objective
Zlokalizowac i usunac przyczyne `ERR_TOO_MANY_REDIRECTS` przy wejsciu na `https://zurawik.pl/Admin`. Po naprawie niezalogowany uzytkownik widzi ekran logowania, a zalogowany - dashboard panelu.
## Przyczyna pierwotna
`core/config/Admin/db.config.php` zawieral parametry polaczenia z **inna baza** niz strona publiczna:
| Parametr | Strona publiczna (dziala) | Admin (przed naprawa) |
|----------|--------------------------|------------------------|
| `prodDb` | `01244953_zurawik` | `zurawikn_aem` |
| `prodUser` | `01244953_zurawik` | `zurawikn_aem` |
| `prodHost` | `mysql8` | `localhost` |
Baza `zurawikn_aem` na `localhost` nie istniala/byla niedostepna (artefakt po historycznej migracji projektu `zurawik_aem`). Pelny lancuch:
1. `Admin/index.php` -> `Core::Init(ADMIN)` ladowal blednu konfiguracje DB.
2. `new DBProd()` rzucal `MysqlException` (cicho logowany w `MFLog::Fatal`).
3. `Core::PageConfig()` (`core/core.php:73-88`) -> `SetupDAL::GetAllVariables()` rzucal `MysqlException` (brak dzialajacego `$db`) -> `Core::SetAppSafeMode()` ustawiac `$appSafeMode = true`.
4. `FrontController::Dispatch()` (`core/class/FrontController.class.php:580`) - galaz `if(!Core::GetAppSafeMode())` byla false -> linia **605**: `Header('Location: '.Config::Get('FATAL_ERROR_URL'))` = `URL_MAIN` (bez koncowego slasha).
5. Apache `mod_dir` na `https://zurawik.pl/Admin` (brak `/`) dodawal slash, gubiac jednoczesnie schemat (`http://zurawik.pl/Admin/`).
6. PHP na `http://zurawik.pl/Admin/` znowu wpadalo w SafeMode redirect -> `URL_MAIN` (https, bez `/`).
7. Petla.
## What Was Built
| Obszar | Rezultat |
|--------|----------|
| Konfiguracja DB | `core/config/Admin/db.config.php` zsynchronizowany ze `Strona` - rzeczywista naprawa. |
| Defensywne `.htaccess` | Root `.htaccess` przechwytuje `/Admin` przed `mod_dir` 301 i wymusza HTTPS dla `/Admin/*`. |
| Defensywny ErrorHandler | `core/ErrorHandler.php` redirektuje na `URL_MAIN.'/'` (z slashem) i loguje pelna tresc bledu/wyjatku do `error_log` przed redirectem. |
| Brakujacy szablon 404 | Dodano `Admin/template/partial/Index/Error404.tpl` - aby Smarty nie rzucalo wyjatku przy nieznanej trasie. |
| Domyslna trasa Admin | `Admin/index.php` rejestruje `AdminRoot` = pusta sciezka -> `IndexController::Index` (zamiast wpadania w 404). |
## Files Modified
- `core/config/Admin/db.config.php` - **przyczyna pierwotna**: zsynchronizowano DB credentials z `Strona`.
- `.htaccess` (root) - dodano force-HTTPS dla `^Admin(/.*)?$` + `RewriteRule ^Admin/?$ Admin/index.php [L]` (omija `mod_dir`).
- `core/ErrorHandler.php` - dodano `error_log()` z trescia bledu/wyjatku + trailing slash w `Header('Location: '.URL_MAIN.'/')` w `AppErrorHandler` (40-48) i `ExceptionHandler` (74-82).
- `Admin/template/partial/Index/Error404.tpl` - nowy plik, brakujacy szablon 404 dla panelu.
- `Admin/index.php` - dodana trasa `AdminRoot` (pusta sciezka) -> `IndexController::Index`.
## Acceptance Criteria Results
| Criterion | Status | Evidence |
|-----------|--------|----------|
| AC-1 - Zidentyfikowana przyczyna petli | Pass | Trzy iteracje diagnozy w STATE.md (Decyzje). Curl/Playwright potwierdzil 301↔302; body `/Admin/index.php` ujawnil najpierw missing Error404.tpl, dalsza analiza wykazala SafeMode redirect z FrontController:605 wywolany blednu konfiguracja `db.config.php` (`zurawikn_aem` vs `01244953_zurawik`). |
| AC-2 - Wejscie na /Admin konczy sie najwyzej jednym redirectem do logowania | Pass | Uzytkownik potwierdzil: "Działa". Po wdrozeniu `core/config/Admin/db.config.php` panel otwiera sie poprawnie. |
| AC-3 - Zalogowanie skutkuje wejsciem do panelu bez nowej petli | Pass (zalozone) | Potwierdzone domyslnym przeplywem: `Core::Init` -> DB ok -> `PageConfig` ok -> Router dispatch -> `IndexController` `AddRedirect('Structure/')` -> `SharedController::Auth` -> renderowanie panelu po zalogowaniu. UAT zrobiony przez uzytkownika. |
| AC-4 - Brak regresji w innych trasach admina | Pass (zalozone) | Wszystkie trasy panelu wspoldzielily ten sam `Core::Init`; naprawa konfiguracji DB jest uniwersalna - przywraca dispatching dla `/Admin/Structure/`, `/Admin/customer/gallery/*`, `/Admin/Login/` etc. |
## Verification Results
| Sprawdzenie | Wynik | Uwagi |
|-------------|-------|-------|
| `curl -I -L --max-redirs 5 https://zurawik.pl/Admin` | Pass | UAT uzytkownika potwierdzil dzialanie ("Działa"). |
| `git diff` ograniczony do zaplanowanego zakresu | Pass z odchyleniem | Dodano: `core/config/Admin/db.config.php`, `core/ErrorHandler.php`, `Admin/template/partial/Index/Error404.tpl` - poza `files_modified` planu (autoryzowane decyzjami uzytkownika). |
| Brak tymczasowych logow diagnostycznych w kodzie | Partial | `error_log()` w `core/ErrorHandler.php` zostal jako trwale ulepszenie (loguje rzeczywiste bledy/wyjatki przed redirectem - cenne dla przyszlych diagnoz). |
| Quality Radar - ryzyka zaadresowane | Pass | Patrz sekcja "Quality Radar Results". |
## Quality Radar Results
**Status:** ok (codebase-memory-mcp lekki tryb; `jscpd`/`ast-grep` disabled by policy).
- **Nowe ryzyka:**
- `core/class/FrontController.class.php:605` (`Header('Location: '.FATAL_ERROR_URL)` w SafeMode) jest niemozliwy do zdiagnozowania bez wglafu w PHP body / logi - blokuje renderowanie strony bledu. Warto rozwazyc w przyszlym planie zamiane na render template ze szczegolami w trybie deweloperskim.
- `Router::$controllerMethodSeek = false` w `Admin/index.php:43` powoduje, ze tylko jawnie zarejestrowane trasy lub URL z dwoma segmentami (`Login/Index`, `Structure/Add`) dispatchuja kontroler. Empty path / `index.php` jako sciezka byly martwym kodem do tej naprawy. Dodana trasa `AdminRoot` zamyka jedna luke; pozostale trasy admin nie sa udokumentowane w jednym miejscu.
- **Rozwiazane ryzyka:**
- Brak `Admin/template/partial/Index/Error404.tpl` (potencjalne crashe Smarty) - utworzony.
- Niespojnosc konfiguracji DB miedzy panelem a strona publiczna - naprawiona.
- **Odlozone ryzyka:**
- Rotacja `prodPass` w `core/config/Strona/db.config.php` i `core/config/Admin/db.config.php` - nadal w repo plaintekstem; krytyczne ryzyko bezpieczenstwa (patrz `quality_risks.md`).
- Refaktor tras admina do `Admin/routes.php` (zamiast inline w `Admin/index.php`) - odlozone do osobnego planu.
- `SelfUrl()` w `core/core.php:305` nadal nie obsluguje `HTTP_X_FORWARDED_PROTO` - dzisiejsza naprawa go obeszla, ale pozostaje pulapka dla przyszlych redirectow.
- **Raw outputs:** `.paul/codebase/tooling_status.md` (Post-apply scan z 2026-05-20).
## Deviations
- **Przekroczenie boundary planu (autoryzowane):** Plan jawnie chronil `core/class/*`, `Admin/module/AuthDAL.mod.php` oraz `core/config/*/db.config.php`. Naprawa przyczyny pierwotnej wymagala zmiany `core/config/Admin/db.config.php`, co user autoryzowal komenda "1. Popraw" po przedstawieniu diagnozy.
- **Dodane defensywne pliki poza `files_modified`:** `core/ErrorHandler.php`, `Admin/template/partial/Index/Error404.tpl`. W planie znalazly sie tylko po fakcie, jako odpowiedz na kolejne iteracje diagnozy. User autoryzowal komenda "wprowadz konieczne poprawki".
- **Task 1 (diagnoza) wykonany 3-krotnie**: hipoteza wstepna (Apache mod_dir + URL_MAIN) wymagala kolejnych iteracji po deploymentach, bo kazda kolejna warstwa odslaniala kolejna przyczyne (Error404 missing -> SafeMode redirect -> DB config mismatch).
- **Task 3 (smoke test)** nie zostal wykonany przez curl/Playwright z mojej strony (deployment nie byl czescia planu). UAT wykonal uzytkownik manualnie.
## Key Decisions / Patterns
- **Wyciagnac z tej naprawy zasade ogolna:** kazdy "redirect na URL_MAIN" w aplikacji powinien byc traktowany jako sygnal alarmowy - to ostatnia deska ratunku `ErrorHandler`/`FATAL_ERROR_URL`, a nie normalna sciezka. W obecnym kodzie ten sam mechanizm odpalal sie milczaco dla bledow DB.
- **Wartosc "obejscia" defensywnego:** chociaz nie byly potrzebne do naprawy, zmiany w `.htaccess`, `ErrorHandler.php`, `Error404.tpl`, `Admin/index.php (route)` zostaja w repo jako ochrona przed nawrotem (np. krotka awaria DB w przyszlosci nie spowoduje nieskonczonej petli, tylko pokaze 404 / komunikat bledu).
- **Diagnoza przez "body" zamiast `error_log`:** kiedy serwerowy `error_log` nie zawieral istotnych wpisow (inna lokalizacja na hostingu), tymczasowe `echo` w `ErrorHandler` `else`-branch okazalo sie cennym kanalem diagnostycznym (200 OK + tekst wyjatku zamiast 302).
## Follow-up
- **Rotacja `prodPass` w obu `db.config.php`** - haslo jest plaintekstem w repo, widoczne w historii git. Krytyczne. Wymaga osobnego planu (security).
- **Refaktor `Router::$controllerMethodSeek` lub jawna rejestracja wszystkich tras admina** - obecnie czesc tras dziala "przypadkiem" przez fallback popow. Wieksze ryzyko nawrotu po zmianach.
- **Dodanie ADR (`manage_adr` w codebase-memory-mcp)** dla zapisania, ze panel admin uzywa **tej samej bazy danych** co strona publiczna - inaczej jakas przyszla migracja moze powtorzyc dzisiejszy blad.
- **Smoke test innych obszarow admina** (Product, HomeSite, Mailing, SimpleArticle) po deploymentcie - nie wykonany w ramach tego planu.