CodePress/TODO.md
Edwin Noorlander 7728336fa3 Update TODO.md with admin features roadmap and AGENTS.md with current project state
TODO.md: Add Markdown editor, plugin enable/disable, plugin API,
file uploads, map management, activity log, and more admin features.
Remove resolved items (extract/AuthController/CSRF - replaced by new admin).
AGENTS.md: Document full project structure including admin-console,
add AI model info (claude-opus-4-6), admin routing, security practices.
2026-02-16 17:12:45 +01:00

5.9 KiB

CodePress CMS - Verbeteringen TODO

Kritiek

  • Path traversal fix - str_replace('../') in getPage() is te omzeilen. Gebruik realpath() met prefix-check (CodePressCMS.php:313)
  • JWT secret fallback - Standaard 'your-secret-key-change-in-production' maakt tokens forgeable (admin-console/config/app.php:11)
  • executePhpFile() onveilig - Open include wrapper zonder pad-restrictie (CMSAPI.php:164)
  • Plugin auto-loading - Elke map in plugins/ wordt blind geladen zonder allowlist of validatie (PluginManager.php:40)

Hoog

  • IP spoofing - X-Forwarded-For header wordt blind vertrouwd in MQTTTracker (MQTTTracker.php:211)
  • Debug hardcoded - 'debug' => true hardcoded in admin config (admin-console/config/app.php:6)
  • Cookie security - Cookies zonder Secure/HttpOnly/SameSite flags (MQTTTracker.php:70)
  • autoLinkPageTitles() - Regex kan geneste <a> tags produceren (CodePressCMS.php:587)
  • MQTT wachtwoord - Credentials in plain text JSON (MQTTTracker.php:37)

Medium

  • Dead code - Dubbele is_dir() check, tweede blok onbereikbaar (CodePressCMS.php:328-333)
  • htmlspecialchars() op bestandspad - Corrumpeert bestandslookups in getPage() en getContentType() (CodePressCMS.php:311, 1294)
  • Ongebruikte methode - scanForPageNames() wordt nergens aangeroepen (CodePressCMS.php:658-679)
  • Orphaned docblock - Dubbel docblock zonder bijbehorende methode (CodePressCMS.php:607-611)
  • Extra </div> - Sluit een tag die nooit geopend is in getDirectoryListing() (CodePressCMS.php:996)
  • Dubbele require_once - PluginManager/CMSAPI geladen in zowel index.php als constructor (CodePressCMS.php:49-50)
  • require_once autoload - Autoloader opnieuw geladen in parseMarkdown() (CodePressCMS.php:513)
  • Breadcrumb titels ongeescaped - $title direct in HTML zonder htmlspecialchars() (CodePressCMS.php:1197)
  • Zoekresultaat-URLs missen &lang= - Taalparameter ontbreekt (CodePressCMS.php:264)
  • Operator precedence bug - !$x ?? true evalueert als (!$x) ?? true (MQTTTracker.php:131)
  • Taalwisselaar verliest pagina - Wisselen van taal navigeert altijd naar homepage (header.mustache:22)
  • ctime is geen creatietijd op Linux - stat() ctime is inode-wijzigingstijd (CodePressCMS.php:400)
  • getGuidePage() dupliceert markdown parsing - Zelfde CommonMark setup als parseMarkdown() (CodePressCMS.php:854)
  • HTMLBlock ontbrekende </div> - Niet-gesloten tags bij null-check (HTMLBlock.php:68)
  • formatDisplayName() redundante logica - Dubbele checks en overtollige str_replace (CodePressCMS.php:688)

Laag

  • Hardcoded 'Ga naar' - Niet vertaalbaar in autoLinkPageTitles() (CodePressCMS.php:587)
  • HTML lang attribuut - <html lang="en"> hardcoded i.p.v. dynamisch (layout.mustache:2)
  • console.log in productie - Debug log in app.js (app.js:54)
  • Event listener leak - N globale click listeners in forEach loop (app.js:85)
  • Sidebar toggle aria - Ontbrekende aria-label en aria-expanded (CodePressCMS.php:1171)
  • Taalprefix hardcoded - Alleen nl|en i.p.v. dynamisch uit config (CodePressCMS.php:691, 190)
  • Geen type hints - Ontbrekende type declarations op properties en methoden
  • Public properties - $config, $currentLanguage, $searchResults zouden private moeten zijn
  • Inline CSS - ~250 regels statische CSS in template i.p.v. extern bestand
  • style.css is Bootstrap - Bestandsnaam is misleidend, Bootstrap wordt mogelijk dubbel geladen
  • Geen error handling op file_get_contents() - Meerdere calls zonder return-check
  • Logger slikt fouten - @file_put_contents() met error suppression
  • Logger tail() leest heel bestand - Geheugenprobleem bij grote logbestanden
  • Externe links missen rel="noreferrer"
  • Zoekformulier mist aria-label
  • mobile.css override Bootstrap utilities met !important

Admin Console - Nieuwe features

Hoog

  • Markdown editor - WYSIWYG/split-view Markdown editor integreren in content-edit (bijv. EasyMDE, SimpleMDE, of Toast UI Editor). Live preview, toolbar met opmaakknoppen, drag & drop afbeeldingen
  • Plugin activeren/deactiveren - Toggle knop per plugin in admin Plugins pagina. Schrijft enabled: true/false naar plugin config.json. PluginManager moet enabled status respecteren bij het laden
  • Plugin API - Uitgebreide API voor plugins zodat ze kunnen inhaken op CMS events (hooks/filters). Denk aan: onPageLoad, onBeforeRender, onAfterRender, onSearch, onMenuBuild. Plugins moeten sidebar content, head tags, en footer scripts kunnen injecteren

Medium

  • Plugin configuratie editor - Per-plugin config.json bewerken vanuit admin panel
  • Bestand uploaden - Afbeeldingen en bestanden uploaden via admin Content pagina
  • Map aanmaken/verwijderen - Directory management in admin Content pagina
  • Admin activity log - Logboek van alle admin acties (wie deed wat wanneer) met viewer in dashboard
  • Wachtwoord wijzigen eigen account - Apart formulier voor ingelogde gebruiker om eigen wachtwoord te wijzigen (met huidig wachtwoord verificatie)
  • Admin thema - Admin sidebar kleur overnemen van site thema config (header_color)

Laag

  • Content preview - Live preview van Markdown/HTML content naast de editor
  • Content versioning - Simpele file-based backup bij elke save (bijv. .bak bestanden)
  • Zoeken in admin - Zoekfunctie binnen de admin content browser
  • Drag & drop - Bestanden herordenen/verplaatsen via drag & drop
  • Keyboard shortcuts - Ctrl+S om op te slaan in editor, Ctrl+N voor nieuw bestand
  • Dark mode - Admin panel dark mode toggle
  • Responsive admin - Admin sidebar inklapbaar op mobiel (nu is het gestacked)