From 22c886b8f47a78eaf6eb3d34ae2740c11f34030d Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Wed, 20 May 2026 13:30:10 +0200 Subject: [PATCH] update --- .htaccess | 15 +- .paul/PROJECT.md | 25 ++ .paul/STATE.md | 47 ++++ .paul/changelog/2026-05-20.md | 21 ++ .paul/codebase/architecture.md | 90 +++++++ .paul/codebase/conventions.md | 63 +++++ .paul/codebase/db_schema.md | 93 +++++++ .paul/codebase/impact_map.md | 115 +++++++++ .paul/codebase/integrations.md | 69 ++++++ .paul/codebase/quality_risks.md | 59 +++++ .paul/codebase/stack.md | 52 ++++ .paul/codebase/testing.md | 35 +++ .paul/codebase/tooling_status.md | 50 ++++ .paul/config.md | 55 +++++ .../PLAN.md | 231 ++++++++++++++++++ .../SUMMARY.md | 105 ++++++++ Admin/index.php | 4 + Admin/template/partial/Index/Error404.tpl | 15 ++ core/ErrorHandler.php | 9 +- core/config/Admin/db.config.php | 8 +- 20 files changed, 1154 insertions(+), 7 deletions(-) create mode 100644 .paul/PROJECT.md create mode 100644 .paul/STATE.md create mode 100644 .paul/changelog/2026-05-20.md create mode 100644 .paul/codebase/architecture.md create mode 100644 .paul/codebase/conventions.md create mode 100644 .paul/codebase/db_schema.md create mode 100644 .paul/codebase/impact_map.md create mode 100644 .paul/codebase/integrations.md create mode 100644 .paul/codebase/quality_risks.md create mode 100644 .paul/codebase/stack.md create mode 100644 .paul/codebase/testing.md create mode 100644 .paul/codebase/tooling_status.md create mode 100644 .paul/config.md create mode 100644 .paul/plans/20260520-1213-admin-too-many-redirects/PLAN.md create mode 100644 .paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md create mode 100644 Admin/template/partial/Index/Error404.tpl diff --git a/.htaccess b/.htaccess index 236b1b7..a5fa0d9 100644 --- a/.htaccess +++ b/.htaccess @@ -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 diff --git a/.paul/PROJECT.md b/.paul/PROJECT.md new file mode 100644 index 0000000..10a4614 --- /dev/null +++ b/.paul/PROJECT.md @@ -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 ``. +- Sciezki, identyfikatory kodu i klucze konfiguracyjne pozostaja bez tlumaczenia. diff --git a/.paul/STATE.md b/.paul/STATE.md new file mode 100644 index 0000000..e1c9795 --- /dev/null +++ b/.paul/STATE.md @@ -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 diff --git a/.paul/changelog/2026-05-20.md b/.paul/changelog/2026-05-20.md new file mode 100644 index 0000000..ffbe44b --- /dev/null +++ b/.paul/changelog/2026-05-20.md @@ -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` diff --git a/.paul/codebase/architecture.md b/.paul/codebase/architecture.md new file mode 100644 index 0000000..1e899a2 --- /dev/null +++ b/.paul/codebase/architecture.md @@ -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) +``` diff --git a/.paul/codebase/conventions.md b/.paul/codebase/conventions.md new file mode 100644 index 0000000..fe29335 --- /dev/null +++ b/.paul/codebase/conventions.md @@ -0,0 +1,63 @@ +# Conventions + +**Wygenerowano:** 2026-05-20 (`$paul-map-codebase`) + +## Nazewnictwo plikow + +- Klasy infrastrukturalne: `core/class/.class.php` (PascalCase + sufiks `.class.php`). +- Modele: `core/model/.class.php` (encja) + `core/model/DAL.class.php` (DAL). +- Modele domenowe oznaczane prefiksem `Mf` (np. `MfProduct`, `MfHomeSite`, `MfArticle`) lub `Fk` (np. `FkMaps`, `FkCurrency`, `FkGlossary`) — historyczne konwencje dwoch obszarow. +- Moduly: `.mod.php` w `module/` lub `Admin/module/`. +- Kontrolery: `Controller.php` w `controller/` lub `Admin/controller/`. +- Szablony Smarty: `template/partial//.tpl`. + +## Konwencje PHP + +- `` 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(, , )`. +- 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//`. +- 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//`. +- 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 ``). +- Identyfikatory kodu, sciezki, klucze konfiguracji i komendy pozostaja bez tlumaczenia. diff --git a/.paul/codebase/db_schema.md b/.paul/codebase/db_schema.md new file mode 100644 index 0000000..db96a37 --- /dev/null +++ b/.paul/codebase/db_schema.md @@ -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. diff --git a/.paul/codebase/impact_map.md b/.paul/codebase/impact_map.md new file mode 100644 index 0000000..1ce3d02 --- /dev/null +++ b/.paul/codebase/impact_map.md @@ -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//` (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/`, `/Admin/Structure/Copy/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//path.config.php` — zmiana sciezek lamie autoloader. +- `.htaccess` (root, `Admin/`, `core/`, `template/`). diff --git a/.paul/codebase/integrations.md b/.paul/codebase/integrations.md new file mode 100644 index 0000000..a50cddf --- /dev/null +++ b/.paul/codebase/integrations.md @@ -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//`, `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/`. diff --git a/.paul/codebase/quality_risks.md b/.paul/codebase/quality_risks.md new file mode 100644 index 0000000..e3532d4 --- /dev/null +++ b/.paul/codebase/quality_risks.md @@ -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//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. diff --git a/.paul/codebase/stack.md b/.paul/codebase/stack.md new file mode 100644 index 0000000..e97617b --- /dev/null +++ b/.paul/codebase/stack.md @@ -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. diff --git a/.paul/codebase/testing.md b/.paul/codebase/testing.md new file mode 100644 index 0000000..5d0019b --- /dev/null +++ b/.paul/codebase/testing.md @@ -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`). diff --git a/.paul/codebase/tooling_status.md b/.paul/codebase/tooling_status.md new file mode 100644 index 0000000..20e4199 --- /dev/null +++ b/.paul/codebase/tooling_status.md @@ -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. diff --git a/.paul/config.md b/.paul/config.md new file mode 100644 index 0000000..5c9961c --- /dev/null +++ b/.paul/config.md @@ -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* diff --git a/.paul/plans/20260520-1213-admin-too-many-redirects/PLAN.md b/.paul/plans/20260520-1213-admin-too-many-redirects/PLAN.md new file mode 100644 index 0000000..ef1ad55 --- /dev/null +++ b/.paul/plans/20260520-1213-admin-too-many-redirects/PLAN.md @@ -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 +--- + + +## 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. + + + +## 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. + + + +Brak SPECIAL-FLOWS.md - sekcja pomijana. + + + + +## 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 +``` + + + + + + + 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. + + + +- [ ] 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). + + + +SUMMARY.md path: `.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md` + diff --git a/.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md b/.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md new file mode 100644 index 0000000..5517e72 --- /dev/null +++ b/.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md @@ -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. diff --git a/Admin/index.php b/Admin/index.php index b4019f0..3540db8 100644 --- a/Admin/index.php +++ b/Admin/index.php @@ -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()))); diff --git a/Admin/template/partial/Index/Error404.tpl b/Admin/template/partial/Index/Error404.tpl new file mode 100644 index 0000000..2d5b108 --- /dev/null +++ b/Admin/template/partial/Index/Error404.tpl @@ -0,0 +1,15 @@ +
+
+
+ +
+
+

404

+

Brak strony w panelu administracyjnym

+

Wroc do panelu

+
+
+
+
+
+
diff --git a/core/ErrorHandler.php b/core/ErrorHandler.php index 319b737..49f2ffe 100644 --- a/core/ErrorHandler.php +++ b/core/ErrorHandler.php @@ -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 "Unknown error type: [$errno] $errstr
\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 "
Nie obsluzony wyjatek: " , $exception->getMessage(), "\n".getenv('HTTP_REFERER'); diff --git a/core/config/Admin/db.config.php b/core/config/Admin/db.config.php index 7cefc73..14286da 100644 --- a/core/config/Admin/db.config.php +++ b/core/config/Admin/db.config.php @@ -1,13 +1,13 @@