update
This commit is contained in:
13
.htaccess
13
.htaccess
@@ -1,4 +1,17 @@
|
||||
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
25
.paul/PROJECT.md
Normal 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
47
.paul/STATE.md
Normal 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
|
||||
21
.paul/changelog/2026-05-20.md
Normal file
21
.paul/changelog/2026-05-20.md
Normal 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`
|
||||
90
.paul/codebase/architecture.md
Normal file
90
.paul/codebase/architecture.md
Normal 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)
|
||||
```
|
||||
63
.paul/codebase/conventions.md
Normal file
63
.paul/codebase/conventions.md
Normal 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.
|
||||
93
.paul/codebase/db_schema.md
Normal file
93
.paul/codebase/db_schema.md
Normal 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.
|
||||
115
.paul/codebase/impact_map.md
Normal file
115
.paul/codebase/impact_map.md
Normal 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/`).
|
||||
69
.paul/codebase/integrations.md
Normal file
69
.paul/codebase/integrations.md
Normal 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/`.
|
||||
59
.paul/codebase/quality_risks.md
Normal file
59
.paul/codebase/quality_risks.md
Normal 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
52
.paul/codebase/stack.md
Normal 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
35
.paul/codebase/testing.md
Normal 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`).
|
||||
50
.paul/codebase/tooling_status.md
Normal file
50
.paul/codebase/tooling_status.md
Normal 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
55
.paul/config.md
Normal 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*
|
||||
231
.paul/plans/20260520-1213-admin-too-many-redirects/PLAN.md
Normal file
231
.paul/plans/20260520-1213-admin-too-many-redirects/PLAN.md
Normal 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>
|
||||
105
.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md
Normal file
105
.paul/plans/20260520-1213-admin-too-many-redirects/SUMMARY.md
Normal 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.
|
||||
@@ -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())));
|
||||
|
||||
15
Admin/template/partial/Index/Error404.tpl
Normal file
15
Admin/template/partial/Index/Error404.tpl
Normal 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>
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
Reference in New Issue
Block a user