Files
CodePress/TODO.md
T
E.Noorlander 44a1e6dc96 v1.9.1: fix world map rendering and resolve eight small TODO items
World map:
- Fix zero-padded ISO numeric ids leaving 31 countries unrendered
  (Brazil, Australia, Belgium, Austria, Algeria and more)
- Fix Russia and Fiji smearing across the full map width at the antimeridian
  by unwrapping ring longitudes and drawing them at both edges
- Crop to 84N-60S, add evenodd fill rule, 174 countries rendered

Improvements:
- Logger::tail() reads backwards in chunks instead of loading the whole file
- External links get rel=noopener noreferrer in footer and Markdown content
- formatDisplayName() cleaned up and guarded against empty input
- Export statistics as CSV (Excel BOM) or JSON
- GeoIP database auto-updates when older than 35 days
- Editor shortcuts Ctrl/Cmd+S to save and Ctrl/Cmd+N for a new page
- Live search filter in the admin content browser
- Content versioning with timestamped .bak copies in content/-backups/

Also removes eight stale TODO entries that were already implemented
2026-07-29 15:53:35 +02:00

8.1 KiB
Raw Permalink Blame History

CodePress TODO

Voltooid (recent)

Opschoning & kleine verbeteringen (v1.9.1)

  • Wereldkaart: nul-opgevulde ISO-nummers werden niet herkend, waardoor 31 landen ontbraken (o.a. Brazilië, Australië, België, Oostenrijk, Algerije)
  • Wereldkaart: Rusland en Fiji smeerden over de datumgrens uit over de volle 360°; ringen worden nu ontvouwen en aan beide randen getekend
  • Wereldkaart: bijgesneden op 84°N60°Z, fill-rule="evenodd" voor enclaves, 174 landen
  • Logger::tail() leest het bestand nu achterwaarts in blokken i.p.v. volledig in het geheugen
  • Externe links krijgen rel="noopener noreferrer" — in de footer en automatisch in Markdown-content via ExternalLinkExtension
  • formatDisplayName() opgeschoond en beveiligd tegen lege invoer (PHP-waarschuwing verholpen)
  • Statistieken exporteren als CSV (met BOM voor Excel) of JSON
  • GeoIP-database werkt zichzelf automatisch bij als hij ouder is dan 35 dagen
  • Sneltoetsen in de editor: Ctrl/Cmd+S opslaan, Ctrl/Cmd+N nieuwe pagina
  • Zoekfilter in de admin content browser (live, met teller en Escape om te wissen)
  • Content versioning: bij elke save een tijdgestempelde .bak in content/-backups/, laatste 5 versies per bestand

Statistieken & GeoIP (v1.9.0)

  • GeoIP class met providerketen: lokaal (DB-IP Lite) → MaxMind .mmdb → externe API, met automatische fallback
  • Eigen pure-PHP MMDB-lezer (MMDBReader), geen Composer-afhankelijkheid nodig
  • cli/geoip-update.php — downloadt DB-IP Lite en bouwt compacte binaire index (354k IPv4 + 342k IPv6 records)
  • Binary search lookup via fseek voor IPv4 (10 bytes/record) en IPv6 (34 bytes/record)
  • Placeholder-landcodes (ZZ/XX) tellen als onbekend
  • cli/generate-world-map.php — genereert SVG-wereldkaart uit Natural Earth TopoJSON (publiek domein) met ISO alpha-2 id's
  • Analytics class met aggregatie in admin/storage/stats.json (LOCK_EX), overleeft het wissen van logs
  • Admin pagina /admin/statistics: KPI's, choropleth wereldkaart met tooltips, landenlijst met vlaggen, top pagina's, dagelijkse grafiek, referrers
  • Periodefilter 7 / 30 / 90 dagen / alles
  • GeoIP- en privacy-instellingen in admin (provider, .mmdb pad, API URL/sleutel, bewaartermijn)
  • Knop "GeoIP database bijwerken" en "Statistieken wissen" in admin
  • IP-anonimisering als schakelaar (RequestLogger::anonymizeIp()), standaard uit
  • Landkolom met vlag in requests log + KPI-kaarten op dashboard
  • requests.log uitgebreid met landcode (9e veld), parser accepteert 7/8/9 velden

Beveiliging (v1.8.0)

  • BotGuard engine: AI-crawlers, zoekmachines, scrapers en lege user-agents herkennen en blokkeren
  • Admin pagina /admin/security met schakelaars, rate limiting en IP block/allowlist
  • Rate limiting per IP (HTTP 429 met Retry-After)
  • Dynamische /robots.txt en noai/noimageai meta-tags
  • Statuskolom met badges in requests log
  • Echte bezoeker-IP achter HAProxy/PFSense (RequestLogger::getClientIp(), 2-pass publiek IP filter)
  • HAProxy/PFSense handleiding (docs/haproxy-bot-blocking.md)
  • Eén-klik systeemupdate via /admin/update met controle op Git-schrijfrechten
  • config.json en admin/config/admin.json uit Git, automatisch aangemaakt indien afwezig
  • ARIAComponents.php parse error — opgelost op regels 67, 137 en 262 ('UTF-8)'UTF-8'))

Media & Editor

  • Media browser modal met upload, thumbnail grid, en size-prompt
  • Media knop in editor toolbar voor alle modes (md/html/php)
  • Recursieve scan van content/ voor media bestanden (ipv alleen -assets/)
  • /-media/ URL prefix voor media bestanden (consistente routing, geen special cases)
  • /-assets/ blijft werken voor backward compatibility
  • Size prompt voor afbeeldingen: Markdown ![alt](url), HTML/PHP <img> met width/height
  • Editor change detectie: editor.on('change', ...) werkt nu correct
  • "Terug" knop verandert naar rode "Annuleren" bij ongewijzigde wijzigingen (content-edit + content-new)
  • Upload knop disabled tot bestand geselecteerd
  • "Aanmaken" knop disabled tot bestandsnaam ingevuld
  • Editor mode switching in content-new werkt via switchMode() (mode + toolbar + data-ext)

Content Management

  • Inline rename veld in content-edit pagina (geen aparte rename knop)
  • Bestanden en mappen verplaatsen (content-move)
  • Breadcrumb toont geen . meer (dirname check op PHP niveau)
  • Verwijderde aparte content-file-rename route/handler/template

Thema's

  • Thema's in subdirectory themes/naam/theme.json (ipv themes/naam.json)
  • Thema CRUD in admin (aanmaken, activeren, bewerken, verwijderen)
  • File upload voor thema achtergrond afbeeldingen

Security & Code Quality (docs/TODO.md)

  • Path traversal fix (realpath() + prefix-check)
  • JWT secret fallback verwijderd
  • executePhpFile() pad-restrictie
  • IP spoofing fix in MQTTTracker
  • Debug uitgezet in admin config
  • Cookie security (Secure/HttpOnly/SameSite)
  • Dead code verwijderd
  • htmlspecialchars() op bestandspad gecorrigeerd
  • Ongebruikte methode scanForPageNames() verwijderd
  • Breadcrumb titels geescaped
  • Taalparameter in zoekresultaat-URLs
  • Operator precedence bug in MQTTTracker
  • Hardcoded strings vervangen
  • HTML lang attribuut dynamisch gemaakt
  • console.log verwijderd
  • Sidebar toggle aria attributes

🔴 Nog openstaand

Kritiek

  • Plugin auto-loading — Elke map in plugins/ wordt blind geladen zonder allowlist of validatie (PluginManager.php:40 in docs/TODO.md)

Hoog

  • autoLinkPageTitles() — Regex kan geneste <a> tags produceren (CodePressCMS.php)
  • MQTT wachtwoord — Credentials in plain text JSON (MQTTTracker.php)
  • 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 API — Uitgebreide API voor plugins zodat ze kunnen inhaken op CMS events (hooks/filters): onPageLoad, onBeforeRender, onAfterRender, onSearch, onMenuBuild

Medium

  • ctime is geen creatietijd op Linuxstat() ctime is inode-wijzigingstijd. Deels ondervangen: frontmatter created heeft voorrang en de footer verbergt de datum als beide gelijk zijn (CodePressCMS.php)
  • Wachtwoord wijzigen eigen account — Apart formulier voor ingelogde gebruiker om eigen wachtwoord te wijzigen (met huidig wachtwoord verificatie)
  • Bestand uploaden — Uploaden naar andere mappen dan -assets/ via admin Content pagina
  • Content preview — Live preview van Markdown/HTML content naast de editor
  • Backups terugzetten — Versies uit content/-backups/ bekijken en herstellen vanuit de admin

Laag

  • 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
  • mobile.css override Bootstrap utilities met !important
  • Drag & drop — Bestanden herordenen/verplaatsen via drag & drop
  • Dark mode — Admin panel dark mode toggle
  • Responsive admin — Admin sidebar inklapbaar op mobiel (nu is het gestacked)
  • stats.json bij hoog verkeer — Nu één schrijfactie met LOCK_EX per request. Bij veel verkeer eventueel opsplitsen naar dagbestanden of APCu
  • Steden op de kaart — Nu alleen landniveau; met een City-database ook stippen per stad plotten
  • Kleine landen op de kaart — Natural Earth 110m bevat geen Monaco, Vaticaanstad, Liechtenstein en Singapore; eventueel 50m-dataset gebruiken