Files
CodePress/docs/release-notes/v2.6.5.md
T
E.Noorlander d9ea2eee47 v2.6.5 (Lyra): Dynamische pad-resolutie, WordPress-stijl docblocks, security-fix wachtwoord, git-historie schoon
- Bug: dashboard toonde 0 content (AdminPluginAPI::getContentDir() gaf relatief pad terug zonder normalisatie)
- Dynamische pad-resolutie: PluginAPIInterface uitgebreid met getProjectRoot/getContentDir/getPluginsDir/getVersionInfo; CMSAPI en AdminPluginAPI implementeren deze universeel
- public/index.php media-serving gebruikt $config['content_dir'] i.p.v. hardcoded /content
- Navigation en Logs plugins halen paden via de API i.p.v. hardcoded dirname(__DIR__)
- WordPress-stijl docblocks toegevoegd voor alle classes, methods, properties en functies (~450 docblocks, @since 2.6.5)
- Security: hardcoded plaintext-wachtwoord 'admin' verwijderd uit AdminAuth.php; bij eerste installatie wordt een cryptografisch veilig wachtwoord gegenereerd (random_bytes, 16 tekens) en eenmalig op het inlogscherm getoond
- Security: git-geschiedenis schoongemaakt (admin.json, admin.json.example, admin-console/config/admin.json verwijderd uit alle commits; filter-branch over alle branches + tags, gc --prune --aggressive)
- README.md, README.en.md, AGENTS.md bijgewerkt
- Test-scripts bijgewerkt naar clean-URL structuur + actuele ARIA-waarden
- Versie verhoogd naar 2.6.5
- Tests: pentest 29/29, WCAG 25/25, functioneel 16/16, enhanced 25/25
2026-08-27 09:05:51 +00:00

190 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CodePress CMS v2.6.5 — Release Notes
**Release datum:** 2026-08-27
**Codename:** Lyra
**Status:** stable
---
## Samenvatting
Deze release richt zich op **dynamische pad-resolutie**, **volledige
code-documentatie** en een **belangrijke security-fix** rond het standaard
admin-wachtwoord. Daarnaast is de git-geschiedenis schoongemaakt van
kraakbare wachtwoord-hashes die per ongeluk gecommit waren.
---
## Nieuwe features & wijzigingen
### 1. Dynamische pad-resolutie via de Plugin-API
Eerder gaf `AdminPluginAPI::getContentDir()` een relatief pad ("content")
terug zonder dat te normaliseren tegen de project-root. Omdat Apache
`admin.php` uit de `public/` map draait, resolvedde dat relatieve pad naar
`public/content` (niet-bestaand) → het dashboard toonde 0 pagina's, 0
mappen en 0 B aan content.
Nu:
- `PluginAPIInterface` definieert universele pad-methodes
(`getProjectRoot()`, `getContentDir()`, `getPluginsDir()`,
`getVersionInfo()`) die door zowel `CMSAPI` (frontend) als
`AdminPluginAPI` (admin) worden geïmplementeerd.
- `AdminPluginAPI::getContentDir()` normaliseert relatieve paden tegen de
project-root (met Windows-drive-letter detectie), conform
`cms/core/config.php`.
- `CMSAPI` heeft deze methodes erbij gekregen (deze ontbraken op de
frontend-API).
- `public/index.php` media-/assets-serving gebruikt
`$config['content_dir']` i.p.v. een hardcoded `/content` pad, zodat een
aangepaste `content_dir` in `config.json` wordt gevolgd.
- De `Navigation` plugin haalt de content-root via
`$this->api->getContentDir()` i.p.v. hardcoded `dirname(__DIR__, 2)`;
de guide-root via `getProjectRoot()`.
- De `Logs` plugin haalt de log-dir via `$this->api->getProjectRoot()`
i.p.v. hardcoded `dirname(__DIR__, 2)`.
### 2. WordPress-stijl code-documentatie
Alle classes, methods, properties en functies in de codebase zijn
voorzien van volledige docblocks in WordPress-stijl (~450 docblocks):
```
/**
* Summary.
*
* Description.
*
* @since 2.6.5
*
* @param type $var Description.
* @param array $args {
* Optional. An array of arguments.
*
* @type type $key Description. Default 'value'. Accepts 'value', 'value'.
* @type type $key Description.
* }
* @param type $var Description.
* @return type Description.
*/
```
Behandelde bestanden: `AdminAuth`, `Cache`, `RateLimiter`, `RequestLogger`,
`Analytics`, `BotGuard`, `ContentBackup`, `GeoIP`, `Logger`, `LogManager`,
`ThemeManager`, `CodePressCMS`, `PluginAPIInterface`, `CMSAPI`,
`AdminPluginAPI`, `PluginManager`, alle 6 plugins, `public/admin.php`
(82 functies), en de entrypoints/CLI-bestanden.
---
## Security fixes
### 3. Hardcoded plaintext-wachtwoord verwijderd
In `admin/src/AdminAuth.php` stond het standaard-wachtwoord letterlijk in
de broncode:
```php
'password_hash' => password_hash('admin', PASSWORD_BCRYPT),
```
Deze fallback draaide bij een nieuwe installatie wanneer zowel
`admin.json` als `admin.json.example` ontbraken. Het wachtwoord `'admin'`
was hierdoor in de gecommitte broncode zichtbaar.
Nu:
- Bij eerste installatie wordt een **cryptografisch veilig willekeurig
wachtwoord** gegenereerd (`random_bytes`, 16 alfanumerieke tekens).
- De bcrypt-hash wordt weggeschreven naar `admin/config/admin.json`.
- Het plaintext wachtwoord wordt **eenmalig** op het inlogscherm getoond
via een waarschuwing, zodat de beheerder het kan noteren.
- Na de eerste succesvolle login is het wachtwoord nergens meer in
plaintext opgeslagen.
Nieuwe methodes in `AdminAuth`:
- `generateRandomPassword(int $length = 16): string` — CSPRNG-gebaseerd.
- `getGeneratedPassword(): string` — geeft het gegenereerde wachtwoord
terug voor weergave op de login-pagina.
### 4. Git-geschiedenis schoongemaakt
Bij eerdere commits (`d97c67c`, `b8d4a4e`, `5884877`) was
`admin/config/admin.json` per ongeluk gecommit voordat het bestand
gitignored werd. Dit bestand bevatte een bcrypt-hash die kraakt naar het
wachtwoord `'admin'`. Ook `admin/config/admin.json.example` (gecommit)
en het oude `admin-console/config/admin.json` pad bevatten dergelijke
hashes.
Uitgevoerd:
- `git filter-branch` om `admin/config/admin.json`,
`admin/config/admin.json.example` en `admin-console/config/admin.json`
te verwijderen uit **alle commits** op alle branches en tags.
- `reflog expire --expire=now --all` + `gc --prune=now --aggressive` om
oude objecten te verwijderen.
- Verificatie: beide bekende hashes (`nUpoaCNZZ...`, `CV2uORTI...`) en
`password_hash('admin'` komen 0× voor in de hele object-database.
### 5. admin.json.example verwijderd
Het gecommitte `admin/config/admin.json.example` bevatte een geldige
bcrypt-hash (kraakt naar `'admin'`). Omdat de `AdminAuth`-fallback nu
zelf een veilig wachtwoord genereert, is het example-bestand overbodig
geworden en verwijderd uit de repo.
---
## Bijgewerkte documentatie
- `README.md` en `README.en.md`: installatie-stappen herschreven (geen
`admin.json.example` kopie-stap meer; verwijzing naar
`admin`/`admin` inlog verwijderd; uitleg over automatisch gegenereerd
wachtwoord bij eerste installatie).
- `AGENTS.md`: admin-inlog beschrijving bijgewerkt.
- `TODO.md`: v2.6.5 entry toegevoegd.
---
## Onder de motorkap
| Bestand | Wijziging |
|---|---|
| `cms/core/plugin/PluginAPIInterface.php` | Universele pad-methodes toegevoegd |
| `cms/core/plugin/CMSAPI.php` | `getProjectRoot`/`getContentDir`/`getPluginsDir`/`getVersionInfo` toegevoegd |
| `cms/core/plugin/AdminPluginAPI.php` | `getContentDir` normaliseert relatieve paden |
| `public/index.php` | Media-serving via `$config['content_dir']` |
| `plugins/Navigation/Navigation.php` | Content/guide-root via de API |
| `plugins/Logs/Logs.php` | Log-dir via de API |
| `admin/src/AdminAuth.php` | Random-wachtwoord-generator + `getGeneratedPassword` |
| `admin/theme/default/views/login.twig` | Waarschuwing bij eerste installatie |
| `version.php` | 2.6.4 → 2.6.5 |
| `README.md`, `README.en.md`, `AGENTS.md`, `TODO.md` | Docs bijgewerkt |
| ~20 PHP-bestanden | WordPress-stijl docblocks toegevoegd |
---
## Tests uitgevoerd
- `php -l` over alle 67 PHP-bestanden (zonder vendor): 0 syntax-errors.
- Apache smoke-test: login (nieuw wachtwoord), dashboard (4 pagina's /
2 mappen / 282 KB), content, users, plugins, logs, guide, homepage,
pagina en media-serving allen HTTP 200.
- Inloggen met oud wachtwoord `admin` werkt niet meer.
- Eerste-installatie flow getest: bij afwezigheid van `admin.json` wordt
een nieuw wachtwoord gegenereerd en op het inlogscherm getoond.
- Git-historie: beide oude hashes en `password_hash('admin'` 0×
aanwezig in `git log --all -p`.
---
## Upgrade-instructies
1. Pull de nieuwe versie.
2. Als je nog met het standaard-wachtwoord `admin` inlogt: wijzig het
direct na upgrade via de admin-interface of
`php cli/reset-admin-password.php admin <nieuw-wachtwoord>`.
3. optioneel: verwijder `admin/config/admin.json.example` uit je working
tree (is niet meer nodig).