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

@@ -1,4 +1,17 @@
RewriteEngine on
RewriteEngine on
# Fix ERR_TOO_MANY_REDIRECTS on /Admin (2026-05-20).
# Two-layer guard:
# (1) Force HTTPS for any /Admin/* request - prevents the http<->https oscillation
# with PHP app that always emits https Location: headers.
# (2) Intercept /Admin (with or without trailing slash) BEFORE mod_dir issues a
# directory-slash 301 (which on this host degrades https->http, looping).
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^Admin(/.*)?$ https://%{HTTP_HOST}/Admin$1 [R=301,L]
RewriteRule ^Admin/?$ Admin/index.php [L]
RewriteCond %{REQUEST_URI} !phpmyadmin
RewriteCond %{REQUEST_URI} !szablon
RewriteCond %{REQUEST_URI} !crossdomain.xml

25
.paul/PROJECT.md Normal file
View File

@@ -0,0 +1,25 @@
# PROJECT — zurawik.pl
**Nazwa:** zurawik.pl
**Utworzono:** 2026-05-20
## Krotki opis
Aplikacja webowa w PHP zorganizowana wokol klasycznej struktury MVC (`controller/`, `core/model`, `template/`) z osobnym panelem `Admin/`. Zawiera modulowe rozszerzenia (`module/`, `core/plugins`, `Admin/plugins`) oraz pliki pomocnicze (`pack.php`, `tar.php`, `zip.php`, `makl.php`).
## Wartosc projektu
Serwis tematyczny zurawik.pl udostepniajacy tresci, mapy/produkty i wyszukiwanie poprzez warstwe kontrolerow PHP renderujacych szablony.
## Aktualny status
- Brak wczesniejszej metadanej PAUL.
- Repozytorium git jest czyste (gala main).
- Nie zidentyfikowano jeszcze aktywnego planu pracy.
## Trwale wymagania i ograniczenia
- Stack: PHP (klasyczne pliki `*.php`, szablony `.tpl` i `.html`).
- Struktura katalogow do zachowania: `controller/`, `core/`, `module/`, `template/`, `Admin/`, `Server/`, `Static/`.
- Tresc dokumentow PAUL pisana po polsku zgodnie z `<language_policy>`.
- Sciezki, identyfikatory kodu i klucze konfiguracyjne pozostaja bez tlumaczenia.

47
.paul/STATE.md Normal file
View File

@@ -0,0 +1,47 @@
# STATE — zurawik.pl
**Ostatnia aktualizacja:** 2026-05-20
**Tryb pracy:** plan-first (`.paul/plans/`)
## Aktywna praca
Brak aktywnego PLAN.md. Ostatnia petla zamknieta: `.paul/plans/20260520-1213-admin-too-many-redirects/` (PLAN ✓ APPLY ✓ UNIFY ✓). UAT przez uzytkownika potwierdzil dzialanie panelu po wdrozeniu naprawy `core/config/Admin/db.config.php`.
```
PLAN ──▶ APPLY ──▶ UNIFY
✓ ✓ ✓ [Loop complete - gotowe do kolejnego $paul-plan]
```
## Decyzje
| Data | Decyzja | Faza | Wplyw |
|------|---------|------|-------|
| 2026-05-20 | Wybor wariantu [B]: pojedyncza regula w root `.htaccess` przepisujaca `^Admin/?$` -> `Admin/index.php`, omijajaca `mod_dir` Apache. | APPLY (checkpoint po Task 1) | Najmniej inwazyjna zmiana; nie dotyka PHP ani konfiguracji bazy. |
| 2026-05-20 | Test Playwright na produkcji potwierdzil, ze wariant [B] sam jest niewystarczajacy: PHP zwraca 302 na URL_MAIN (bez slasha) z kazdej trasy admina (np. `/Admin/Login/`). Rozszerzono napraw o: (i) force-HTTPS dla `/Admin/*` w root `.htaccess`, (ii) trailing slash + `error_log` w `core/ErrorHandler.php` (oba miejsca redirect). | APPLY | Plik `core/ErrorHandler.php` dopisany do `files_modified` jako odchylenie od planu - autoryzowane przez uzytkownika ("wprowadz konieczne poprawki"). |
| 2026-05-20 | Task 3 (smoke test na produkcji) odlozony - lokalne zmiany w plikach `.htaccess` i `core/ErrorHandler.php` musza zostac wdrozone (FTP/SSH/Git pull) zanim Playwright/curl pokaza efekt. | APPLY | UAT po deploymencie. Po pojawieniu sie wpisow w `error_log` na serwerze - kolejna iteracja diagnozy przyczyny pierwotnej (czemu PHP rzuca wyjatek). |
| 2026-05-20 | Druga iteracja diagnozy: body `/Admin/index.php` ujawnil `Smarty: Unable to load template 'file:partial/Index/Error404.tpl'`. Dodano `Admin/template/partial/Index/Error404.tpl` i domyslna trase `AdminRoot=''` -> `IndexController` w `Admin/index.php`. | APPLY | Naprawia jedna z warstw bledu, ale po wdrozeniu petla wciaz wystepowala. |
| 2026-05-20 | **Trzecia iteracja - przyczyna pierwotna:** `core/config/Admin/db.config.php` zawieral konfiguracje bazy z innego projektu (`zurawikn_aem`/`localhost`), niezgodna ze strona publiczna (`01244953_zurawik`/`mysql8`). DB connection failed -> `Core::SetAppSafeMode()` -> `FrontController.php:605` zawsze emituje `Header('Location: FATAL_ERROR_URL')` = URL_MAIN bez slasha -> petla. | APPLY | Zsynchronizowano Admin db.config.php z Strona db.config.php (boundary "Nie ruszamy konfiguracji bazy" przekroczone za zgoda uzytkownika - "1. Popraw"). |
## Sugerowana nastepna akcja
1. `$paul-plan [opis pracy]` — zaplanowanie kolejnej zmiany.
2. Sugerowane tematy follow-up (z SUMMARY.md aktualnego planu):
- **Rotacja `prodPass`** w `core/config/Strona/db.config.php` i `core/config/Admin/db.config.php` (haslo plaintekstem w repo — krytyczne ryzyko bezpieczenstwa).
- **ADR**: udokumentowac w codebase-memory-mcp, ze Admin uzywa tej samej bazy co Strona — zapobiec powtorzeniu dzisiejszego bledu w przyszlosci.
- **Refaktor**: wyciagnac trasy admina z `Admin/index.php` do `Admin/routes.php`; ujednolicic `Router::$controllerMethodSeek`.
## Kontekst legacy
- `.paul/ROADMAP.md` i `.paul/milestones/` nie sa wymagane.
- Tworzone wylacznie na zyczenie uzytkownika lub przez komendy backward-compat.
## Quality Radar
- Wlaczony lekki tryb (`codebase_memory_mcp: true`).
- `jscpd` i `ast_grep` wylaczone domyslnie — uruchamiane na zadanie.
- Raporty: `.paul/codebase/impact_map.md`, `.paul/codebase/quality_risks.md`, `.paul/codebase/tooling_status.md`.
### Codebase Mapped
Date: 2026-05-20
Documents: `.paul/codebase/` (stack, architecture, conventions, testing, integrations, db_schema, impact_map, quality_risks, tooling_status)
Quality Radar: ok (codebase-memory-mcp), jscpd/ast-grep disabled by policy

View File

@@ -0,0 +1,21 @@
# 2026-05-20
## Co zrobiono
- [Plan 20260520-1213-admin-too-many-redirects] Naprawiono `ERR_TOO_MANY_REDIRECTS` na `https://zurawik.pl/Admin`.
- Diagnoza w trzech iteracjach ujawnila przyczyne pierwotna: `core/config/Admin/db.config.php` wskazywal na inna (niedostepna) baze (`zurawikn_aem`/`localhost`) niz strona publiczna (`01244953_zurawik`/`mysql8`). Brak DB -> `Core::SetAppSafeMode()` -> `FrontController:605` zawsze redirektowal na `FATAL_ERROR_URL` (URL_MAIN bez slasha) -> petla z `mod_dir` 301 https->http.
- Naprawa wlasciwa: zsynchronizowanie `core/config/Admin/db.config.php` z `core/config/Strona/db.config.php`.
- Defensywne ulepszenia (zostaja w repo, chronia przed nawrotem): force-HTTPS i bypass `mod_dir` dla `/Admin/*` w root `.htaccess`; trailing slash + `error_log()` w `core/ErrorHandler.php`; nowy `Admin/template/partial/Index/Error404.tpl`; domyslna trasa `AdminRoot` w `Admin/index.php`.
- UAT przez uzytkownika potwierdzil dzialanie panelu po wdrozeniu.
## Zmienione pliki
- `core/config/Admin/db.config.php`
- `.htaccess`
- `core/ErrorHandler.php`
- `Admin/template/partial/Index/Error404.tpl`
- `Admin/index.php`
- `.paul/STATE.md`
- `.paul/codebase/tooling_status.md`
- `.paul/plans/20260520-1213-admin-too-many-redirects/PLAN.md`
- `.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md`

View File

@@ -0,0 +1,90 @@
# Architecture
**Wygenerowano:** 2026-05-20 (`$paul-map-codebase`)
## Wzorzec
Klasyczne MVC bez frameworka. Wlasne jadro `Core` + `FrontController` + `Router` + `Controller` + warstwa `*DAL` (Data Access Layer) + szablony Smarty.
## Wejscia (entry points)
- `index.php` — strona publiczna. Sekwencja:
1. `include('./core/core.php')`
2. `Core::Init(PageType::STRONA)`
3. `Core::LoadSmarty()`
4. `include('routes.php')` — definicje tras publicznych.
5. `new FrontController() -> Dispatch()`.
- `Admin/index.php` — panel `PageType::ADMIN`, definiuje wlasne `Router::AddRoute(...)` inline (m.in. `Structure/Add`, `Structure/Edit/id/:id`, `customer/gallery/{lang}`).
- Pomocnicze skrypty stand-alone w roocie: `pack.php`, `tar.php`, `zip.php`, `_unpack.php`, `makl.php`, `info.php` — operacje archiwizacji/diagnostyki, nie korzystaja z FrontController.
## Warstwy
### 1. Core (`core/`)
- `core/core.php` — klasa `Core` (init, ladowanie configa, autoloader klas, Smarty boot, garbage) + enum `PageType` (`STRONA`, `Package`, `ADMIN`, `SERVER`).
- `core/ErrorHandler.php` — globalna obsluga bledow.
- `core/class/` — infrastrukturalne klasy: `Config`, `Registry`, `DB`, `SQL`, `DbCache`, `QueryCache`, `Router`, `FrontController`, `Controller`, `MainController`, `ModuleController`, `Request`, `RestRequest`, `Mailer`, `Profiler`, `UserValidator`, `Validator`, `Daemon`, `SessionProxy`, `TemplateMaster`, `Utils`, `UtilsUtf`, `MfCurl`, `MFLog`, `MfMemcache`, `MfXmlParser`, `Xml2Array`, `Enviroment`, `Exception`, `FileGenerator`, `HtmlButton`, `HtmlElement`, `DalData`, `DataObject`, `IDefaultDAL`, `Dictionary`, `DbSqlLite`.
- `core/model/` — entity + DAL pary (np. `MfProduct.class.php` + `MfProductDAL.class.php`). Podkatalog `core/model/SimpleArticle/` na artykuly.
- `core/config/{Strona,Admin,Server,Package}/` — pliki `path.config.php`, `param.config.php`, `db.config.php`, `db.config.ini`; `Admin/` zawiera dodatkowo `panel.config.php`.
- `core/lib/` — wendorowane biblioteki (Smarty, log4php, PHPMailer, WideImage, Zend Search Lucene, SmartyValidate, mImage, MimeType).
- `core/temp/{Strona,Package}/Router.cache` — cache routera.
### 2. Kontrolery publiczne (`controller/`)
- `IndexController`, `SearchController`, `MapsController`, `ProductController`, `ImageController`, `FileController`, `ModuleController`, `SharedController`, `SoapController`, `TranslateController`, `SimpleArticle/IndexController.php`.
### 3. Kontrolery panelu (`Admin/controller/`)
- Pelny CRUD admin: `BoxController`, `CalcController`, `ConfigController`, `DemoController`, `DictionaryController`, `FileController`, `HomeController`, `HomeSiteController`, `ImageController`, `IndexController`, `LoginController`, `MailingController`, `MainSiteController`, `MapsController`, `ProductAttributeController`, `ProductCategoryController`, `ProductController`, `ProductSeriesController`, `ProductSpecController`, `SetupController`, `SharedController`, `SimpleArticle/IndexController.php`, `StructureController`, `UploaderController`, `UserController`, `UtilsController`.
### 4. Moduly (`module/`, `Admin/module/`)
- Publiczne: `module/AuthDAL.mod.php`, `module/CacheParam.mod.php`.
- Admin: `Admin/module/Admin.mod.php`, `Admin/module/AdminDAL.mod.php`, `Admin/module/AuthDAL.mod.php`, `Admin/module/CacheParam.mod.php`, `Admin/module/LightBBCodeParser.mod.php`.
### 5. Szablony (`template/`, `Admin/template/`)
- `template/index.tpl` — szablon glowny strony publicznej.
- `template/partial/` — podzielony na sekcje domeny: `File/`, `Image/`, `Index/`, `Module/`, `Product/`, `Search/`, `Shared/`, `SimpleArticle/Index/`, `Translate/`.
- `template/index.tpl.bak`, `template/index_good.tpl`, `template/clean.tpl`, `template/szablon.html` — dodatkowe pliki (kandydat do uporzadkowania).
- Admin: `Admin/template/partial/` z folderami `Structure/`, `Product/`, `SimpleArticle/Index/` itd. (do potwierdzenia po `$paul-map-codebase` z agentami).
## Routing
- Statyczna rejestracja w `routes.php` (publiczne) oraz inline w `Admin/index.php` (admin).
- `Router::$parseLang = true` na stronie publicznej — obsluga sufiksu jezykowego.
- `Router::$reverseRoute = true` w obu trybach.
- Dispatching: `FrontController::Dispatch()` -> kontroler -> metoda -> Smarty render.
## Rejestr i konfiguracja
- `Registry::Set/Get` (`core/class/Registry.class.php`) — globalny kontener stanu (db, smarty, javascript, title).
- `Config::Get/Set` (`core/class/Config.class.php`) — wartosci z plikow PHP/INI.
- `SetupDAL::GetAllVariables()` — dynamiczna konfiguracja z bazy, wczytywana w `Core::PageConfig()` (`core/core.php:73`).
## Sesja / lokalizacja
- `SessionProxy` (`core/class/SessionProxy.class.php`) — abstrakcja sesji PHP.
- `setlocale(LC_TIME, 'pl_PL', ...)` ustawiana w `Core::PageConfig()` (`core/core.php:97`).
## Bezpieczny tryb aplikacji
- Flaga `Core::$appSafeMode` (`core/core.php:21`, `Core::SetAppSafeMode()`) — aktywowana, gdy `SetupDAL::GetAllVariables()` rzuca `MysqlException`.
## Statyczne zasoby
- `Static/` — uploady (`Static/upload/Article/...`), miniatury (`Static/thumbs/`).
- `Server/` — zasoby serwerowe (do zweryfikowania).
## Diagram glownych zaleznosci (uproszczony)
```
HTTP request
-> index.php / Admin/index.php
-> Core::Init() + LoadSmarty()
-> Router (routes.php / inline)
-> FrontController::Dispatch()
-> *Controller (controller/ lub Admin/controller/)
-> Model entity + *DAL (core/model/)
-> Smarty render (template/*.tpl)
```

View File

@@ -0,0 +1,63 @@
# Conventions
**Wygenerowano:** 2026-05-20 (`$paul-map-codebase`)
## Nazewnictwo plikow
- Klasy infrastrukturalne: `core/class/<Nazwa>.class.php` (PascalCase + sufiks `.class.php`).
- Modele: `core/model/<Nazwa>.class.php` (encja) + `core/model/<Nazwa>DAL.class.php` (DAL).
- Modele domenowe oznaczane prefiksem `Mf` (np. `MfProduct`, `MfHomeSite`, `MfArticle`) lub `Fk` (np. `FkMaps`, `FkCurrency`, `FkGlossary`) — historyczne konwencje dwoch obszarow.
- Moduly: `<Nazwa>.mod.php` w `module/` lub `Admin/module/`.
- Kontrolery: `<Domena>Controller.php` w `controller/` lub `Admin/controller/`.
- Szablony Smarty: `template/partial/<Domena>/<Akcja>.tpl`.
## Konwencje PHP
- `<?php` na poczatku, czesto `?>` na koncu (styl starszego PHP).
- `setlocale` i `ini_set('default_charset', ...)` w `index.php` / `Admin/index.php`.
- Statyczne klasy infrastruktury: `Core::Init`, `Config::Get`, `Registry::Set`, `Router::AddRoute`, `MFLog::Warn`, `SessionProxy::GetValue`.
- Autoloader oparty o `Core::LoadClass` (`core/core.php:173`) — przeszukuje katalogi `class/`, `module/`, `model/`, `lib/` oraz dekomponuje `_` -> `/`.
## Komentarze
- Komentarze i docblocki sa po polsku (np. `/** Klasa jadra aplikacji */` w `core/core.php`).
- Czesto wystepuja zakomentowane bloki kodu i pseudo-TODO bez tagu.
## Routing
- Trasy rejestrowane statycznie: `Router::AddRoute(<nazwa>, <wzorzec>, <opcje>)`.
- Trasy publiczne w `routes.php`.
- Trasy admina inline w `Admin/index.php` (mieszane z bootstrappem).
## Warstwa danych
- Encja + DAL: encja przechowuje pola, DAL realizuje zapytania.
- Dostep do bazy przez `Registry::Get('db')` (`DBProd`) lub `Registry::Get('dbTemp')` (`DBTemp`).
- Cache zapytan w `QueryCache` / `DbCache`; kopia tabel cache w `QueryCacheTemp`.
## Smarty
- Glowny szablon: `template/index.tpl` (przypisywany w `Core::$template`).
- Partial templates w `template/partial/<Domena>/`.
- Skompilowane wersje w `core/temp/` i `Admin/temp/compile/` (cache w `Admin/temp/cache/`).
## Konfiguracja
- Pliki `path.config.php`, `param.config.php`, `db.config.php`, opcjonalnie `panel.config.php` (Admin) w `core/config/<Site>/`.
- Wartosci runtime nadpisywane przez `SetupDAL::GetAllVariables()` (tabela `setup`).
## Kontrola wersji / artefakty
- Pliki backupowe (`.bak`, `.php_`, `.php.bak`) zostawiane w repo:
- `core/class/MainController.class.php.bak`
- `core/class/Router.class.php.bak`
- `Admin/controller/StructureController.php_`
- `template/index.tpl.bak`
- `template/index_good.tpl`
- `core/config/Log4PHPConfig*.delete`, `core/config/Log4PHPConfig.xml.test`
- Rownolegle warianty katalogow: `Admin/plugins/ckeditor/` i `Admin/plugins/ckeditor_/`, `Admin/controller/SimpleArticle/` i `Admin/controller/SimpleArticle_/`.
## Jezyk dokumentow PAUL
- Markdown w `.paul/` pisany po polsku (zgodnie z `<language_policy>`).
- Identyfikatory kodu, sciezki, klucze konfiguracji i komendy pozostaja bez tlumaczenia.

View File

@@ -0,0 +1,93 @@
# DB Schema
**Wygenerowano:** 2026-05-20 (`$paul-map-codebase`)
**Status:** schemat wnioskowany z plikow `core/model/*` — brak migracji / DDL w repo. Tabele faktyczne wymagaja weryfikacji w bazie MySQL `01244953_zurawik`.
## Charakter
- Brak katalogu migracji ani plikow SQL/DDL w repozytorium.
- Encje + DAL w `core/model/` odwzorowuja struktury tabel 1:1 (DAL operuje na `DBProd`/`DBTemp` przez `core/class/DB.class.php`).
## Domeny i kandydaci tabel
### Administracja i autoryzacja
- `MfAdmin` / `MfAdminDAL`
- `MfAdminAccess` / `MfAdminAccessDAL`
- `MfAdminGroup` / `MfAdminGroupDAL`
- `MfAdminToGroup` / `MfAdminToGroupDAL`
- `MfAdminGroupToAccess` / `MfAdminGroupToAccessDAL`
- Modul: `Admin/module/AuthDAL.mod.php`, `module/AuthDAL.mod.php`.
### Struktura strony / menu
- `Structure` / `StructureDAL`
- `MfLink` / `MfLinkDAL` + `MfLinkDescription` / `MfLinkDescriptionDAL`
- `MfRouter` / `MfRouterDAL`
- `LinkLangDAL` (lokalizacja linkow).
### Tresci
- `SimpleArticle/MfArticle` + `MfArticleDescription` + `MfArticleCategory` + `MfArticleCategoryDescription` (komplet DAL).
- `MfArticleBox` / `MfArticleBoxDAL`.
- `News` / `NewsDAL`.
### Produkty
- `MfProduct`, `MfProductDescription`, `MfProductMain`, `MfProductLink`.
- Kategorie: `MfProductCategory` + `MfProductCategoryDescription`.
- Atrybuty: `MfProductAttribute` + `MfProductAttributeDescription` + `MfProductAttributeValue` + `MfProductAttributeCategory` + `MfProductAttributeCategoryDescription`.
- Specyfikacja: `MfProductSpecification` / `MfProductSpecificationDAL`.
- Serie: `ShopSeries` / `ShopSeriesDAL`.
- Powiazane: `Products` (kolekcja) / `ProductsDAL`.
### Strona glowna / banery
- `MfHomeSite` + `MfHomeSiteBaner` + `MfHomeSiteProduct` (komplet DAL).
### Pliki i obrazy
- `MfFile` + `MfFileDescription`.
- `Image` / `ImageDAL`, `ImageGroup` / `ImageGroupDAL`, `Picture` / `PictureDAL`, `PhotoDAL`.
### Konfiguracja
- `MfParameters` / `MfParametersDAL`.
- `MfDictionary` / `MfDictionaryDAL`.
- `SetupDAL` — tabela `setup` (`SetupDAL::GetAllVariables()` w `core/core.php:77`).
- `MfMetaTag` + `MfMetaTagDescription` (meta tagi SEO).
- `MfModule` / `MfModuleDAL`.
### Mapy / waluty / slownik
- `FkMaps` / `FkMapsDAL`, `FkMapsCategory` / `FkMapsCategoryDAL`.
- `FkCurrency` / `FkCurrencyDAL`.
- `FkGlossary` / `FkGlossaryDAL`.
### Mailing / uczestnicy
- `Mailing` / `MailingDAL`.
- `MfParticipant` / `MfParticipantDAL`.
### Cache
- `QueryCacheTemp` / brak DAL (tabela techniczna).
### Pozostale
- `Site` / `SiteDAL` — definicje stron/instancji.
## Polaczenia bazodanowe
Konfiguracja (uwaga: zawiera dane wrazliwe — patrz `quality_risks.md`):
- `core/config/Strona/db.config.php`
- `core/config/Admin/db.config.php`
- `core/config/Server/` (ini), `core/config/Package/` (ini).
## Brakuje w repo
- Plikow `.sql` z DDL/migracjami.
- Schematu indeksow i kluczy obcych — nieudokumentowane.
- Zrzutu (`dump.sql`).
Rekomendacja przed wieksza zmiana modelu: wykonac `mysqldump` ze srodowiska produkcyjnego i utworzyc `.paul/codebase/db_schema_actual.sql` (manualnie) jako referencje.

View File

@@ -0,0 +1,115 @@
# Impact Map
**Wygenerowano:** 2026-05-20 (`$paul-map-codebase`, mode: full)
**Quality Radar status:** codebase-memory-mcp ok (indeks: 21402 wezlow, 52193 krawedzi).
## Glowne domeny i strefy zmian
### Bootstrap / jadro
- `index.php`, `Admin/index.php`
- `core/core.php` (`Core::Init`, `Core::LoadConfig`, `Core::LoadSmarty`, `Core::LoadClass`)
- `core/ErrorHandler.php`
- `core/class/Config.class.php`, `core/class/Registry.class.php`, `core/class/Router.class.php`, `core/class/FrontController.class.php`, `core/class/Controller.class.php`, `core/class/MainController.class.php`, `core/class/Request.class.php`
### Routing
- `routes.php` (strona publiczna)
- `Admin/index.php` (trasy admina inline — kandydat do wyciagniecia do `Admin/routes.php`)
- `core/temp/Strona/Router.cache`, `core/temp/Package/Router.cache`
### Tresci (SimpleArticle / News / Boxy)
- Kontrolery: `controller/SimpleArticle/IndexController.php`, `Admin/controller/SimpleArticle/IndexController.php`, `Admin/controller/SimpleArticle_/IndexController.php`.
- Modele: `core/model/SimpleArticle/MfArticle*`, `core/model/News*`, `core/model/MfArticleBox*`.
- Szablony: `template/partial/SimpleArticle/Index/*`, `template/partial/Shared/News.tpl`.
### Produkty / katalog
- Kontrolery: `controller/ProductController.php`, `Admin/controller/Product*Controller.php` (Product, ProductCategory, ProductAttribute, ProductSeries, ProductSpec).
- Modele: `core/model/MfProduct*`, `core/model/ShopSeries*`, `core/model/Products*`.
- Szablony: `template/partial/Product/*`.
### Struktura / menu
- Kontrolery: `Admin/controller/StructureController.php` (+ wariant `.php_`).
- Modele: `core/model/Structure*`, `core/model/MfLink*`, `core/model/MfRouter*`, `core/model/LinkLangDAL.class.php`.
- Szablony: `Admin/template/partial/Structure/*` (do potwierdzenia).
- Routy admina: `addStructure`, `editStructure`, `copyStructure`, `customerEdit{pl,en,ru,de}` w `Admin/index.php:30-36`.
### Strona glowna
- `Admin/controller/HomeController.php`, `Admin/controller/HomeSiteController.php`, `Admin/controller/MainSiteController.php`.
- Modele: `core/model/MfHomeSite*`.
### Wyszukiwarka
- `controller/SearchController.php`
- Biblioteka: `core/lib/Zend/Search/Lucene.php`.
- Routy: `searchpl`, `searchen`, `searchde` w `routes.php:13-15`.
- Szablon: `template/partial/Search/Index.tpl`.
### Pliki / obrazy / uploady
- Kontrolery: `controller/FileController.php`, `controller/ImageController.php`, `Admin/controller/FileController.php`, `Admin/controller/ImageController.php`, `Admin/controller/UploaderController.php`.
- Modele: `core/model/MfFile*`, `core/model/Image*`, `core/model/Picture*`, `core/model/Photo*`.
- Storage: `Static/upload/Article/*`, `Static/thumbs/*`.
- Lib: `core/lib/WideImage/`, `core/lib/mImage.class.php`.
### Mapy / strona mapy serwisu
- `controller/MapsController.php`, `controller/IndexController::Maps` (`routes.php:11-12`).
- Modele: `core/model/FkMaps*`.
- Szablony: `template/partial/Index/Maps.tpl`, `template/partial/Module/Maps.tpl`, `template/partial/Module/AjaxMapsList.tpl`.
### Formularz kontaktowy / newsletter / captcha
- `controller/IndexController.php` (`Newsletter`, `Forum`, `Captcha`, `AjaxRegisterCaptchaCheck`, `AjaxForm`).
- `controller/SimpleArticle/IndexController.php::FormSent` (`routes.php:3`).
- Szablony: `template/partial/Index/AjaxForm.tpl`, `template/partial/Index/Captcha.tpl`, `template/partial/Index/IndexSent.tpl`.
### Tlumaczenia JS
- `controller/TranslateController.php` -> `template/partial/Translate/Js.tpl`.
### Autoryzacja / uzytkownicy
- `Admin/controller/LoginController.php`, `Admin/controller/UserController.php`.
- Moduly: `module/AuthDAL.mod.php`, `Admin/module/AuthDAL.mod.php`, `Admin/module/Admin.mod.php`, `Admin/module/AdminDAL.mod.php`.
- Sesja: `core/class/SessionProxy.class.php`, `session_start()` w `Admin/index.php:24`.
### Konfiguracja runtime
- `core/config/{Strona,Admin,Server,Package}/*.config.php`.
- Konfiguracja w bazie: `SetupDAL::GetAllVariables()` (`core/core.php:77`) -> tabela `setup`.
- Kontroler admin: `Admin/controller/SetupController.php`, `Admin/controller/ConfigController.php`.
### Logowanie / monitoring
- `core/class/MFLog.class.php`, `core/lib/log4php/`.
- Konfiguracja: `core/config/Log4PHPConfig*.xml`.
- Plik `error_log` w roocie.
### Skrypty pomocnicze / archiwizacja
- `pack.php`, `pack/`, `tar.php`, `zip.php`, `_unpack.php`, `makl.php`, `info.php` — standalone, omijaja FrontController.
## Ukryte sprzezenia (hidden coupling)
- `Core::LoadClass()` (`core/core.php:173`) inteligentnie zgaduje sciezki na podstawie wielkich liter i `_` — przemianowanie klasy moze rozsynchronizowac autoloader, zwlaszcza dla modeli w `core/model/<domena>/` (np. `SimpleArticle`).
- `Registry::Set('db' | 'dbTemp' | 'smarty' | 'javascript' | 'title')` — globalny stan, kontrolery zalozono ze odczyta je z rejestru.
- `Router::$parseLang` ustawiana w `index.php:35` (true) vs `Admin/index.php:46` (false) — bledne zalozenie moze rozbic linki jezykowe.
- Tabela `setup` (przez `SetupDAL`) modyfikuje zachowanie w runtime; awaria bazy -> `Core::SetAppSafeMode()` cicho zmienia tryb.
- `Admin/index.php` rejestruje tasy `customerEdit{pl,en,ru,de}` z twardo zakodowanymi `id` (18/52/30/40) — zmiana strukturow w bazie wymaga aktualizacji kodu.
## Obszary do reczne weryfikacji (UAT)
- Glowne wejscia: `/`, `/index`, `/mapa_serwisu`, `/site_map`, `/wyszukaj`, `/search`, `/newsletter`, `/forum`, `/captcha`, `/translate/js`, `/ajaxForm`, `/formContactSent`.
- Admin: `/Admin/`, `/Admin/Structure/Add`, `/Admin/Structure/Edit/id/<id>`, `/Admin/Structure/Copy/id/<id>`, `/Admin/customer/gallery/{pl,en,ru,de}`.
- Logowanie admin (LoginController) i sesja po `session_start`.
## Konfiguracja, ktora niesie ryzyko zmian
- `core/config/Strona/db.config.php`, `core/config/Admin/db.config.php` (poswiadczenia DB).
- `core/config/<Site>/path.config.php` — zmiana sciezek lamie autoloader.
- `.htaccess` (root, `Admin/`, `core/`, `template/`).

View File

@@ -0,0 +1,69 @@
# Integrations
**Wygenerowano:** 2026-05-20 (`$paul-map-codebase`)
## Baza danych
- MySQL (host `mysql8` zgodnie z `core/config/Strona/db.config.php`).
- Sterownik wlasny: `core/class/DB.class.php` + `core/class/SQL.class.php`.
- Dwa polaczenia per request: `DBProd` (glowne) i `DBTemp` (cache/utility) tworzone w `Core::Init()` (`core/core.php:43`).
- Konfiguracja per srodowisko w `core/config/{Strona,Admin,Server,Package}/db.config.{php,ini}`.
## Email
- PHPMailer (`core/lib/phpmailer/`).
- Wlasny `Mailer` (`core/class/Mailer.class.php`).
- Mailing aplikacyjny: encje `Mailing`, `MailingDAL` (`core/model/`), kontroler `Admin/controller/MailingController.php`.
## Wyszukiwanie
- Zend Search Lucene (`core/lib/Zend/Search/Lucene.php`).
- Kontroler `controller/SearchController.php` + szablon `template/partial/Search/Index.tpl`.
## Captcha
- Plik `captcha.png` w roocie, kontroler `IndexController::Captcha` (`routes.php:6`).
## SOAP
- `controller/SoapController.php` — endpoint SOAP (do potwierdzenia w skryptach).
## Translacje JS
- `controller/TranslateController.php` z routem `translate/js` (`routes.php:10`) + szablon `template/partial/Translate/Js.tpl`.
## Edytor WYSIWYG
- CKEditor — `Admin/plugins/ckeditor/` (aktywny) i historyczny `Admin/plugins/ckeditor_/`.
- Pluginy fileman z PHP backendem: `Admin/plugins/ckeditor/plugins/fileman/php/*.php`.
## Obrazy
- WideImage (`core/lib/WideImage/`) — transformacje, miniatury (`Static/thumbs/`).
- `core/lib/mImage.class.php` + `core/lib/MimeType.class.php`.
- Kontrolery: `controller/ImageController.php`, `Admin/controller/ImageController.php`.
## Cache
- Memcache (`core/class/MfMemcache.class.php`) — opcjonalny.
- QueryCache w pamieci + tabela `QueryCacheTemp` (`core/model/QueryCacheTemp.class.php`).
- DbCache (`core/class/DbCache.class.php`).
- Smarty cache: `core/temp/<Site>/`, `Admin/temp/cache/`.
## Logowanie
- log4php (`core/lib/log4php/src/`) z konfiguracja XML w `core/config/`.
- Pliki konfiguracyjne: `Log4PHPConfig.xml`, `Log4PHPConfig-admin.xml`, `Log4PHPConfig-strona.xml` (oraz warianty `.delete`/`.test`).
## Captcha/sessions
- `SessionProxy` (`core/class/SessionProxy.class.php`).
- `session_start()` w `Admin/index.php:24`.
## SFTP/FTP deploy
- `.vscode/ftp-kr.json`, `.vscode/sftp.json` — konfiguracja narzedzi VS Code do wgrywania na hosting.
## Zewnetrzne API
- `core/class/MfCurl.class.php`, `core/class/RestRequest.class.php` — klient HTTP. Konkretne integracje wymagaja recznej weryfikacji w `controller/` i `Admin/controller/`.

View File

@@ -0,0 +1,59 @@
# Quality Risks
**Wygenerowano:** 2026-05-20 (`$paul-map-codebase`, mode: full)
**Quality Radar tools:** codebase-memory-mcp ok; `jscpd` i `ast-grep` disabled by policy (`.paul/config.md`) — bez skanu duplikatow ani skanu strukturalnego.
## Krytyczne ryzyka bezpieczenstwa
- **Poswiadczenia bazy danych w repo (PLAINTEXT):** `core/config/Strona/db.config.php` zawiera `prodPass` jako stala PHP (`define('prodPass', 'Df61Xz21')`). Analogicznie inne pliki `core/config/<Site>/db.config.php`. Po naprawie 2026-05-20 `core/config/Admin/db.config.php` zawiera te same poswiadczenia co `Strona`. Rekomendacja: przeniesc do zmiennych srodowiskowych / pliku poza repo i zrotowac haslo, bo jest publicznie widoczne w historii git.
- **Plik `info.php` w roocie aplikacji:** typowo zawiera `phpinfo()` — ujawnia konfiguracje srodowiska. Rekomendacja: usunac lub ograniczyc dostepem (`.htaccess`/`.htpasswd`).
- **`.htpasswd` w katalogu glownym aplikacji:** powinien byc poza document root lub przynajmniej chroniony przez `.htaccess` (sprawdzic, ze nie jest serwowany).
- **Standalone skrypty archiwizacyjne (`pack.php`, `tar.php`, `zip.php`, `_unpack.php`, `makl.php`):** dostepne przez HTTP, omijaja FrontController. Wymagaja audytu autoryzacji i sciezek (path traversal).
- **CKEditor fileman PHP backend:** `Admin/plugins/ckeditor/plugins/fileman/php/*.php` — wewnetrzny upload/move/delete dirs. Sprawdzic, ze jest chroniony przez sesje admina.
## Duplikaty i rownolegle warianty (kandydaci na konsolidacje)
Wykryto bez `jscpd`, na podstawie nazw / struktury:
- `core/lib/Smarty/` vs `core/lib/_Smarty/` vs `core/lib/Smarty3/` — trzy rownolegle kopie Smarty. Aktywnie ladowany Smarty3 (`core/core.php:121`); pozostale to dead code.
- W obrebie kazdej kopii rownolegla wersja plikow z sufiksem `_1` (np. `core/lib/Smarty/Smarty.class.php` i `core/lib/Smarty/Smarty.class_1.php`, plus identycznie w `core/lib/Smarty/internals/`).
- `Admin/plugins/ckeditor/` vs `Admin/plugins/ckeditor_/` — dwie pelne instalacje CKEditor.
- `Admin/controller/SimpleArticle/IndexController.php` vs `Admin/controller/SimpleArticle_/IndexController.php` — duplikat kontrolera.
- `Admin/controller/StructureController.php` vs `Admin/controller/StructureController.php_` — backup w repo.
- `core/class/MainController.class.php.bak`, `core/class/Router.class.php.bak` — backupy klas core.
- `template/index.tpl` vs `template/index.tpl.bak` vs `template/index_good.tpl` — trzy warianty glownego szablonu; trudno powiedziec, ktory jest kanoniczny.
- `core/config/Log4PHPConfig.xml`, `Log4PHPConfig.xml.test`, `Log4PHPConfig-admin.xml`, `Log4PHPConfig-admin.xml.delete`, `Log4PHPConfig-strona.xml`, `Log4PHPConfig-strona.xml.delete` — chaos plikow konfiguracji loggera.
## Hardkodowane wartosci
- `Admin/index.php:33-36` — twardo zakodowane `id` struktur galerii klienta dla jezykow (18/52/30/40). Zmiana w bazie wymaga edycji kodu.
- `core/core.php:97``setlocale(LC_TIME, 'pl_PL', 'pl', 'Polish_Poland.28592')` zakodowane na sztywno.
- `core/core.php:133``cache_lifetime = 60` na sztywno.
- `routes.php` — adresy URL w wielu wariantach jezykowych zakodowane statycznie (np. `mapa_serwisu`, `site_map`, `wyszukaj`, `search`).
- `core/config/Strona/db.config.php:13` — host bazy `mysql8` zakodowany.
## Spojnosc i konwencje
- Mieszanie prefiksow modeli `Mf*` i `Fk*` bez jednoznacznej polityki domenowej.
- Routes admin sa wewnatrz `Admin/index.php` (mieszane z bootstrap), public sa w `routes.php` — niespojnosc.
- W kodzie wystepuja zakomentowane sekcje (`//$logger = LoggerManager::...`, `//$captchaStatus = true;`) — pozostalosci po starszych iteracjach.
## Mozliwe podejrzane konstrukcje
- `Core::LoadClass()` (`core/core.php:173`) uzywa `preg_match_all` na nazwie klasy i konstruuje sciezki z `_` -> `/`. Wyjatki w nazewnictwie moga prowadzic do nieskonczonych falli-przez (`include` nie istniejacych plikow w try/else).
- `SelfUrl()` (`core/core.php:305-310`) zawiera nietrywialne warunki dotyczace HTTPS i portu — pasie na refactor / wykorzystanie wbudowanej funkcji.
## Spojnosc backend/frontend
- Brak jednoznacznego API contract — kontrolery zwracaja HTML przez Smarty + `AjaxForm`/`AjaxMapsList`/`AjaxRegisterCaptchaCheck` zwracaja prawdopodobnie JSON/HTML czesciowy. Wymaga inwentaryzacji przy zmianach formularzy.
## Akceptowane / odlozone
- Brak menedzera zaleznosci (`composer`) — projekt historyczny, modernizacja poza zakresem zwyklych zadan.
- Brak testow automatycznych — patrz `testing.md`.
## Co odblokuje glebsza analiza
- Wlaczenie `jscpd` w `.paul/config.md` (`quality_radar.tools.jscpd: true`) dla potwierdzenia duplikatow kodu po liniach.
- Wlaczenie `ast-grep` dla wykrycia podejrzanych konstrukcji (np. SQL inline, `eval`, `extract`, `mysql_*` legacy).
- Zrzut DDL bazy (`mysqldump --no-data`) jako referencja schematu.

52
.paul/codebase/stack.md Normal file
View File

@@ -0,0 +1,52 @@
# Stack
**Wygenerowano:** 2026-05-20 (`$paul-map-codebase`)
## Jezyk i runtime
- PHP (klasyczny, bez frameworka MVC z zewnatrz; brak `composer.json`).
- HTML/Smarty3 jako warstwa szablonow (`.tpl`).
- Brak `package.json`, brak narzedzi build/node po stronie aplikacji (frontend dostarczany jako statyczne pliki i pluginy).
## Frameworki / biblioteki wbudowane
- Smarty (`core/lib/Smarty/`, `core/lib/Smarty3/`, `core/lib/_Smarty/`) — szablonyowanie. Aktualnie ladowany Smarty3 (`core/lib/Smarty3/Smarty.class.php`) w `core/core.php:121`.
- SmartyValidate (`core/lib/SmartyValidate/libs/SmartyValidate.class.php`).
- log4php (`core/lib/log4php/src/`) — logowanie, konfigurowane przez `core/config/Log4PHPConfig*.xml`.
- PHPMailer (`core/lib/phpmailer/`).
- WideImage (`core/lib/WideImage/`) — przetwarzanie grafiki.
- Zend Search Lucene (`core/lib/Zend/Search/Lucene.php`) — wyszukiwanie.
- CKEditor (`Admin/plugins/ckeditor/`, dawna kopia `Admin/plugins/ckeditor_/`).
## Brak menedzera zaleznosci
- Wszystkie biblioteki sa wendorowane bezposrednio w `core/lib/` i `Admin/plugins/`.
- Aktualizacja wymaga recznego nadpisania katalogow.
## Autoloader
- `spl_autoload_register` w `index.php:16` i `Admin/index.php:16` przekierowuje na `Core::LoadClass()` w `core/core.php:173`.
- Konwencja nazw: klasy w `core/class/`, modele w `core/model/`, modul `*.mod.php` w `module/` lub `Admin/module/`.
## Wejscia HTTP
- `index.php` — strona publiczna (`PageType::STRONA`).
- `Admin/index.php` — panel administracyjny (`PageType::ADMIN`).
- Pomocnicze skrypty CLI/archiwizacji w katalogu glownym: `pack.php`, `tar.php`, `zip.php`, `_unpack.php`, `makl.php`, `info.php`.
## Baza danych
- MySQL (8) — sterownik wlasny `core/class/DB.class.php` + `core/class/SQL.class.php`.
- Polaczenia `DBProd` i `DBTemp` tworzone w `Core::Init()` (`core/core.php:43`).
- Konfiguracja per srodowisko: `core/config/Strona/`, `core/config/Admin/`, `core/config/Server/`, `core/config/Package/`.
## Cache
- `QueryCache` (`core/class/QueryCache.class.php`), `DbCache` (`core/class/DbCache.class.php`), `MfMemcache` (`core/class/MfMemcache.class.php`).
- Cache Smarty: `core/temp/`, `Admin/temp/compile/`, `Admin/temp/cache/`.
## Hosting / konfiguracja serwera
- `.htaccess` w katalogu glownym, `Admin/`, `core/`, `template/`, pluginach (Apache + mod_rewrite).
- `.htpasswd` w katalogu glownym (kontrola dostepu na poziomie serwera).
- `.vscode/ftp-kr.json`, `.vscode/sftp.json` — deployment przez SFTP/FTP z poziomu VS Code.

35
.paul/codebase/testing.md Normal file
View File

@@ -0,0 +1,35 @@
# Testing
**Wygenerowano:** 2026-05-20 (`$paul-map-codebase`)
## Status
**Brak wlasnych testow aplikacyjnych.**
- Brak frameworka testowego (`phpunit`, `pest`, `codeception`).
- Brak `composer.json`, brak skryptu testowego.
- Brak katalogu `tests/` na poziomie aplikacji.
- Jedyne pliki testowe nalezace do wendorowanych bibliotek (poza zakresem aplikacji): `core/lib/log4php/src/tests/*` (testy biblioteki log4php).
## Implikacje dla planowania
- Kazda zmiana powinna byc planowana z naciskiem na rownolegle UAT/manual (zob. `$paul-verify`).
- Brak siatki bezpieczenstwa = wysoka odpowiedzialnosc audytu (`$paul-audit`) i precyzyjnego planu (`$paul-plan`).
- Przy nowych funkcjach rozwaz dodanie minimalnego harness'a (smoke test PHP/CURL) zanim wprowadzisz zmiany w `core/`, `module/`, lub `controller/`.
## Komendy build/lint/test
- Brak — projekt nie ma `package.json` ani `composer.json`.
- Deploy: konfiguracja FTP/SFTP w `.vscode/ftp-kr.json`, `.vscode/sftp.json`.
## Logowanie jako substytut
- log4php (`core/lib/log4php/`), konfiguracja: `core/config/Log4PHPConfig*.xml`.
- `MFLog::Warn/Error/Fatal` w `core/class/MFLog.class.php`.
- Pliki `error_log` w roocie — surowy log PHP.
## Reczna weryfikacja
- Tryb publiczny: `index.php` -> `$_SERVER['REQUEST_URI']` + routes.
- Tryb admin: `Admin/index.php` z autoryzacja `Admin/module/AuthDAL.mod.php`.
- Captcha: `IndexController::Captcha` (`routes.php:6`), kontrola: `IndexController::AjaxRegisterCaptchaCheck` (`routes.php:7`).

View File

@@ -0,0 +1,50 @@
# Tooling Status
**Timestamp:** 2026-05-20
**Mode:** full (`$paul-map-codebase`)
## Narzedzia
| Narzedzie | Stan | Komentarz |
|-----------|------|-----------|
| codebase-memory-mcp | ok | Index: project `C-visual-studio-code-projekty-zurawik.pl`, 21402 nodes, 52193 edges, tryb `moderate`. |
| jscpd | disabled by policy | `.paul/config.md` -> `quality_radar.tools.jscpd: false`. Brak skanu duplikatow. |
| ast-grep | disabled by policy | `.paul/config.md` -> `quality_radar.tools.ast_grep: false`. Brak skanu strukturalnego. |
## Komendy wykonane
- `mcp__codebase-memory-mcp__index_repository(repo_path=C:\visual-studio-code\projekty\zurawik.pl, mode=moderate)` -> sukces (status `indexed`).
- `mcp__codebase-memory-mcp__get_architecture(project=C-visual-studio-code-projekty-zurawik.pl, aspects=[all])` -> sukces.
- `git ls-files` -> listing 8449 plikow (znaczna czesc to skompilowane szablony Smarty w `Admin/temp/compile/`, pluginy CKEditor, biblioteki w `core/lib/`).
## Surowe wyniki
- Brak zapisanego pliku `.paul/codebase/radar/codebase-memory-full.txt` (dane zostaly skonsumowane bezposrednio w `impact_map.md` / `quality_risks.md`).
## Project graph summary
- Method: 5860
- Module: 5748
- File: 5747
- Variable: 1627
- Class: 892
- Function: 876
- Folder: 523
- Section: 81
- Route: 40
- Interface: 7
- Project: 1
Top edges: CALLS (20217), DEFINES (15092), DEFINES_METHOD (5860), CONTAINS_FILE (5748), SIMILAR_TO (3386).
## Post-apply scan (2026-05-20)
- Plan: `.paul/plans/20260520-1213-admin-too-many-redirects/PLAN.md`.
- Zmieniony plik: `.htaccess` (root) — dodano `RewriteRule ^Admin/?$ Admin/index.php [L]`.
- Quality Radar tools: codebase-memory-mcp ok, jscpd/ast-grep disabled by policy. Skan ograniczony do zmienionego pliku — bez wplywu na graf kodu PHP (zmiana w warstwie serwera HTTP).
## Nastepne akcje
- `$paul-plan [praca]` — uruchomienie planowania konkretnej zmiany; Quality Radar automatycznie przeskanuje impact.
- Reczne wlaczenie `jscpd` / `ast-grep` w `.paul/config.md`, jezeli chcesz wykryc duplikaty kodu lub strukturalne anty-wzorce.
- Rozwazyc utworzenie ADR (`manage_adr` w codebase-memory-mcp) dla zapisania kluczowych decyzji architektonicznych przed wieksza zmiana.

55
.paul/config.md Normal file
View File

@@ -0,0 +1,55 @@
# Project Config
**Project:** zurawik.pl
**Created:** 2026-05-20
## Project Settings
```yaml
project:
name: zurawik.pl
version: 0.0.0
```
## Integrations
### Quality Radar
```yaml
quality_radar:
enabled: true
auto_install: true
tools:
codebase_memory_mcp: true
jscpd: false # manual/on-demand duplicate scan
ast_grep: false # manual/on-demand structural pattern scan
reports:
update_on_plan: true
update_on_apply: true
update_on_verify: true
```
### SonarQube
```yaml
sonarqube:
enabled: false
project_key: zurawik
server_url: http://localhost:9000
```
## Preferences
```yaml
preferences:
auto_commit: false
verbose_output: false
parallel_agents: false
plan_storage: plans
state_autocompress: true
state_autocompress_max_lines: 500
```
---
*Config created: 2026-05-20*

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.

View File

@@ -26,6 +26,10 @@ $scripts = array();
Registry::Set('javascript', $scripts);
// Default route for /Admin/ (empty path) - dispatches to IndexController so the root URL
// doesn't fall through to Error404 (which previously triggered the redirect loop).
Router::AddRoute('AdminRoot', '', array('controller'=>'IndexController', 'method'=>'Index', 'push' => array(), 'config'=>array('actionSet'=>array())));
//Router::AddRoute('addStructure','Structure/Add', array('controller'=>'StructureController', 'method'=>'Add', 'push' => array('paramStr' => true), 'config'=>array('actionSet'=>array())));
Router::AddRoute('addStructure','Structure/Add', array('controller'=>'StructureController', 'method'=>'ModernAdd', 'push' => array('paramStr' => true), 'config'=>array('actionSet'=>array())));
Router::AddRoute('editStructure','Structure/Edit/id/:id', array('controller'=>'StructureController', 'method'=>'ModernEdit', 'push' => array('paramStr' => true), 'config'=>array('actionSet'=>array())));

View File

@@ -0,0 +1,15 @@
<div class="panelRightTop"></div>
<div class="panelRightBody">
<div class="paddedContent">
<div class="panelContentTop"><h2><a href="#" class="long">404 - Strona nie znaleziona</a></h2></div>
<div class="panelContentBody">
<div style="text-align:center; padding:40px 20px;">
<h1 style="margin:0; font-size:120px; line-height:120px; font-weight:bold; color:#999;">404</h1>
<h2 style="margin-top:20px; font-size:24px;">Brak strony w panelu administracyjnym</h2>
<p style="margin-top:20px;"><a href="{$smarty.const.URL_MAIN}/">Wroc do panelu</a></p>
</div>
</div>
<div class="panelContentBottom"></div>
</div>
</div>
<div class="panelRightBottom"></div>

View File

@@ -38,11 +38,14 @@ function AppErrorHandler($errno, $errstr, $errfile, $errline) {
MFLog::Error("Line: ".$errline." File: ".$errfile." Message: ".$errstr." Referer: ".getenv('HTTP_REFERER'));
if(Config::Get('ERROR_REDIRECT') == 'true') {
// Redirect-loop guard (2026-05-20): log root cause and route with trailing
// slash so mod_dir doesn't issue a https->http degrading 301.
error_log("ErrorHandler redirect: [$errno] $errstr at $errfile:$errline (REQUEST_URI=" . ($_SERVER['REQUEST_URI'] ?? '-') . ")");
if(getenv('HTTP_REFERER')==Config::Get('URL_MAIN')) {
Header("Location: ".Config::Get('URL_MAIN')."/error.html");
} else {
header("HTTP/1.0 302 Moved Temporarily");
Header("Location: ".Config::Get('URL_MAIN'));
Header("Location: ".rtrim(Config::Get('URL_MAIN'), '/')."/");
}
} else {
echo "<span style=\"color: red;\">Unknown error type: [$errno] $errstr<br /></span>\n";
@@ -72,11 +75,13 @@ function ExceptionHandler($exception) {
MFLog::Error("Line: ".$exception->getLine()." Message: ".$exception->getMessage()." Referer: ".getenv('HTTP_REFERER'));
if(ERROR_REDIRECT == 'true') {
// Redirect-loop guard (2026-05-20): log root cause and route with trailing slash.
error_log("ExceptionHandler redirect: " . $exception->getMessage() . " at " . $exception->getFile() . ":" . $exception->getLine() . " (REQUEST_URI=" . ($_SERVER['REQUEST_URI'] ?? '-') . ")");
if(getenv('HTTP_REFERER')==Config::Get('URL_MAIN')) {
Header("Location: ".Config::Get('URL_MAIN')."/error.html");
} else {
header("HTTP/1.0 302 Moved Temporarily");
Header("Location: ".Config::Get('URL_MAIN'));
Header("Location: ".rtrim(Config::Get('URL_MAIN'), '/')."/");
}
} else {
echo "<br /><span style=\"color: red;\">Nie obsluzony wyjatek: " , $exception->getMessage(), "</span>\n".getenv('HTTP_REFERER');

View File

@@ -1,13 +1,13 @@
<?php
// ** Ustawienia MySQL-a - możesz uzyskać je od administratora Twojego serwera ** //
/** Nazwa bazy danych, której używać ma WordPress */
define('prodDb', 'zurawikn_aem');
define('prodDb', '01244953_zurawik');
/** Nazwa użytkownika bazy danych MySQL */
define('prodUser', 'zurawikn_aem');
define('prodUser', '01244953_zurawik');
/** Hasło użytkownika bazy danych MySQL */
define('prodPass', 'G]@0NeuvRokQ');
define('prodPass', 'Df61Xz21');
/** Nazwa hosta serwera MySQL */
define('prodHost', 'localhost');
define('prodHost', 'mysql8');