v2.5.1: Admin theme refactor, Navigation plugin, user roles, guide restructure
- Reorganize admin into admin/theme/default/ (views + assets) - Rename GuideNav to Navigation plugin (essential, protected) - Plugin assets support (SCSS/CSS) loaded after theme CSS - User roles: Admin, Content Manager, BI Manager, Site Admin - Role-based access control (RBAC) for admin routes and sidebar - Guide restructure: sub-topics in separate folders with sidebar nav - Dynamic breadcrumb for homepage and subdirectories - Fix theme path traversal (../../ -> ../) in admin.php - Fix CodeMirror mode load order (xml -> css -> js -> htmlmixed -> php) - Fix editor-toolbar.js null checks for plugin edit pages - Layout select from theme.json with live frontmatter update - Footer sticky at bottom of viewport (min-height: 100vh) - Breadcrumb color fix (var(--nav-font) -> var(--header-bg)) - Remove language switcher from guide pages - Update README.md and README.en.md - Bump version to 2.5.1
This commit is contained in:
@@ -1,119 +1,13 @@
|
||||
# CodePress TODO
|
||||
# TODO
|
||||
|
||||
## ✅ Voltooid (recent)
|
||||
## Voltooid ✅
|
||||
|
||||
### Opschoning & kleine verbeteringen (v1.9.1)
|
||||
- [x] Wereldkaart: nul-opgevulde ISO-nummers werden niet herkend, waardoor 31 landen ontbraken (o.a. Brazilië, Australië, België, Oostenrijk, Algerije)
|
||||
- [x] Wereldkaart: Rusland en Fiji smeerden over de datumgrens uit over de volle 360°; ringen worden nu ontvouwen en aan beide randen getekend
|
||||
- [x] Wereldkaart: bijgesneden op 84°N–60°Z, `fill-rule="evenodd"` voor enclaves, 174 landen
|
||||
- [x] `Logger::tail()` leest het bestand nu achterwaarts in blokken i.p.v. volledig in het geheugen
|
||||
- [x] Externe links krijgen `rel="noopener noreferrer"` — in de footer en automatisch in Markdown-content via `ExternalLinkExtension`
|
||||
- [x] `formatDisplayName()` opgeschoond en beveiligd tegen lege invoer (PHP-waarschuwing verholpen)
|
||||
- [x] Statistieken exporteren als CSV (met BOM voor Excel) of JSON
|
||||
- [x] GeoIP-database werkt zichzelf automatisch bij als hij ouder is dan 35 dagen
|
||||
- [x] Sneltoetsen in de editor: Ctrl/Cmd+S opslaan, Ctrl/Cmd+N nieuwe pagina
|
||||
- [x] Zoekfilter in de admin content browser (live, met teller en Escape om te wissen)
|
||||
- [x] Content versioning: bij elke save een tijdgestempelde `.bak` in `content/-backups/`, laatste 5 versies per bestand
|
||||
- [x] Admin code en niet gebruikte mappen/bestanden opschonen
|
||||
- [x] version.php changelog verwijderen (staat in git)
|
||||
- [x] Guide mappenstructuur reorganiseren (NL/EN → rollen)
|
||||
- [x] README.md compacter maken met verwijzingen naar guide
|
||||
|
||||
### Statistieken & GeoIP (v1.9.0)
|
||||
- [x] `GeoIP` class met providerketen: lokaal (DB-IP Lite) → MaxMind `.mmdb` → externe API, met automatische fallback
|
||||
- [x] Eigen pure-PHP MMDB-lezer (`MMDBReader`), geen Composer-afhankelijkheid nodig
|
||||
- [x] `cli/geoip-update.php` — downloadt DB-IP Lite en bouwt compacte binaire index (354k IPv4 + 342k IPv6 records)
|
||||
- [x] Binary search lookup via `fseek` voor IPv4 (10 bytes/record) en IPv6 (34 bytes/record)
|
||||
- [x] Placeholder-landcodes (`ZZ`/`XX`) tellen als onbekend
|
||||
- [x] `cli/generate-world-map.php` — genereert SVG-wereldkaart uit Natural Earth TopoJSON (publiek domein) met ISO alpha-2 id's
|
||||
- [x] `Analytics` class met aggregatie in `admin/storage/stats.json` (LOCK_EX), overleeft het wissen van logs
|
||||
- [x] Admin pagina `/admin/statistics`: KPI's, choropleth wereldkaart met tooltips, landenlijst met vlaggen, top pagina's, dagelijkse grafiek, referrers
|
||||
- [x] Periodefilter 7 / 30 / 90 dagen / alles
|
||||
- [x] GeoIP- en privacy-instellingen in admin (provider, `.mmdb` pad, API URL/sleutel, bewaartermijn)
|
||||
- [x] Knop "GeoIP database bijwerken" en "Statistieken wissen" in admin
|
||||
- [x] IP-anonimisering als schakelaar (`RequestLogger::anonymizeIp()`), standaard uit
|
||||
- [x] Landkolom met vlag in requests log + KPI-kaarten op dashboard
|
||||
- [x] `requests.log` uitgebreid met landcode (9e veld), parser accepteert 7/8/9 velden
|
||||
## Te doen ⏳
|
||||
|
||||
### Beveiliging (v1.8.0)
|
||||
- [x] `BotGuard` engine: AI-crawlers, zoekmachines, scrapers en lege user-agents herkennen en blokkeren
|
||||
- [x] Admin pagina `/admin/security` met schakelaars, rate limiting en IP block/allowlist
|
||||
- [x] Rate limiting per IP (HTTP 429 met `Retry-After`)
|
||||
- [x] Dynamische `/robots.txt` en `noai`/`noimageai` meta-tags
|
||||
- [x] Statuskolom met badges in requests log
|
||||
- [x] Echte bezoeker-IP achter HAProxy/PFSense (`RequestLogger::getClientIp()`, 2-pass publiek IP filter)
|
||||
- [x] HAProxy/PFSense handleiding (`docs/haproxy-bot-blocking.md`)
|
||||
- [x] Eén-klik systeemupdate via `/admin/update` met controle op Git-schrijfrechten
|
||||
- [x] `config.json` en `admin/config/admin.json` uit Git, automatisch aangemaakt indien afwezig
|
||||
- [x] **ARIAComponents.php parse error** — opgelost op regels 67, 137 en 262 (`'UTF-8)` → `'UTF-8')`)
|
||||
|
||||
### Media & Editor
|
||||
- [x] Media browser modal met upload, thumbnail grid, en size-prompt
|
||||
- [x] Media knop in editor toolbar voor alle modes (md/html/php)
|
||||
- [x] Recursieve scan van `content/` voor media bestanden (ipv alleen `-assets/`)
|
||||
- [x] `/-media/` URL prefix voor media bestanden (consistente routing, geen special cases)
|
||||
- [x] `/-assets/` blijft werken voor backward compatibility
|
||||
- [x] Size prompt voor afbeeldingen: Markdown ``, HTML/PHP `<img>` met width/height
|
||||
- [x] Editor change detectie: `editor.on('change', ...)` werkt nu correct
|
||||
- [x] "Terug" knop verandert naar rode "Annuleren" bij ongewijzigde wijzigingen (content-edit + content-new)
|
||||
- [x] Upload knop disabled tot bestand geselecteerd
|
||||
- [x] "Aanmaken" knop disabled tot bestandsnaam ingevuld
|
||||
- [x] Editor mode switching in content-new werkt via `switchMode()` (mode + toolbar + data-ext)
|
||||
|
||||
### Content Management
|
||||
- [x] Inline rename veld in content-edit pagina (geen aparte rename knop)
|
||||
- [x] Bestanden en mappen verplaatsen (content-move)
|
||||
- [x] Breadcrumb toont geen `.` meer (dirname check op PHP niveau)
|
||||
- [x] Verwijderde aparte `content-file-rename` route/handler/template
|
||||
|
||||
### Thema's
|
||||
- [x] Thema's in subdirectory `themes/naam/theme.json` (ipv `themes/naam.json`)
|
||||
- [x] Thema CRUD in admin (aanmaken, activeren, bewerken, verwijderen)
|
||||
- [x] File upload voor thema achtergrond afbeeldingen
|
||||
|
||||
### Security & Code Quality (docs/TODO.md)
|
||||
- [x] Path traversal fix (`realpath()` + prefix-check)
|
||||
- [x] JWT secret fallback verwijderd
|
||||
- [x] `executePhpFile()` pad-restrictie
|
||||
- [x] IP spoofing fix in MQTTTracker
|
||||
- [x] Debug uitgezet in admin config
|
||||
- [x] Cookie security (Secure/HttpOnly/SameSite)
|
||||
- [x] Dead code verwijderd
|
||||
- [x] `htmlspecialchars()` op bestandspad gecorrigeerd
|
||||
- [x] Ongebruikte methode `scanForPageNames()` verwijderd
|
||||
- [x] Breadcrumb titels geescaped
|
||||
- [x] Taalparameter in zoekresultaat-URLs
|
||||
- [x] Operator precedence bug in MQTTTracker
|
||||
- [x] Hardcoded strings vervangen
|
||||
- [x] HTML lang attribuut dynamisch gemaakt
|
||||
- [x] console.log verwijderd
|
||||
- [x] 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 Linux** — `stat()` 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
|
||||
- [ ] Pentest controles uitvoeren
|
||||
- [ ] WCAG 2.1 AA accessibility tests
|
||||
|
||||
Reference in New Issue
Block a user