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
This commit is contained in:
@@ -0,0 +1,190 @@
|
||||
# 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).
|
||||
Reference in New Issue
Block a user