Files
zurawik.pl/.paul/codebase/quality_risks.md
2026-05-20 13:30:10 +02:00

4.8 KiB

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:97setlocale(LC_TIME, 'pl_PL', 'pl', 'Polish_Poland.28592') zakodowane na sztywno.
  • core/core.php:133cache_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.