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.
5.9 KiB
5.9 KiB
CodePress CMS - Verbeteringen TODO
Kritiek
- Path traversal fix -
str_replace('../')ingetPage()is te omzeilen. Gebruikrealpath()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
includewrapper 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-Forheader wordt blind vertrouwd in MQTTTracker (MQTTTracker.php:211) - Debug hardcoded -
'debug' => truehardcoded in admin config (admin-console/config/app.php:6) - Cookie security - Cookies zonder
Secure/HttpOnly/SameSiteflags (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()engetContentType()(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 ingetDirectoryListing()(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 -
$titledirect in HTML zonderhtmlspecialchars()(CodePressCMS.php:1197) - Zoekresultaat-URLs missen
&lang=- Taalparameter ontbreekt (CodePressCMS.php:264) - Operator precedence bug -
!$x ?? trueevalueert 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-labelenaria-expanded(CodePressCMS.php:1171) - Taalprefix hardcoded - Alleen
nl|eni.p.v. dynamisch uit config (CodePressCMS.php:691, 190) - Geen type hints - Ontbrekende type declarations op properties en methoden
- Public properties -
$config,$currentLanguage,$searchResultszouden 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/falsenaar pluginconfig.json. PluginManager moetenabledstatus 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.
.bakbestanden) - 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)