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:
2026-08-27 09:05:51 +00:00
parent 74612aefbb
commit d9ea2eee47
38 changed files with 771 additions and 572 deletions
+42 -42
View File
@@ -7,14 +7,14 @@
* lockout en gebruikersbeheer. Alle data wordt opgeslagen in JSON-bestanden
* (geen database).
*
* @since 2.6.4
* @since 2.6.5
*/
class AdminAuth
{
/**
* Applicatie-configuratie uit config.json.
*
* @since 2.6.4
* @since 2.6.5
* @var array Applicatie-configuratie.
*/
private array $config;
@@ -22,7 +22,7 @@ class AdminAuth
/**
* Admin-configuratie geladen uit admin.json (gebruikers en security-instellingen).
*
* @since 2.6.4
* @since 2.6.5
* @var array Admin-configuratie met keys 'users' en 'security'.
*/
private array $adminConfig;
@@ -30,7 +30,7 @@ class AdminAuth
/**
* Pad naar het JSON-bestand met mislukte inlogpogingen voor brute-force lockout.
*
* @since 2.6.4
* @since 2.6.5
* @var string Absoluut pad naar login_attempts.json.
*/
private string $lockFile;
@@ -42,7 +42,7 @@ class AdminAuth
* met een cryptografisch veilig willekeurig wachtwoord. De login-pagina
* toont dit wachtwoord eenmalig via getGeneratedPassword().
*
* @since 2.6.4
* @since 2.6.5
* @var string Leeg tenzij net aangemaakt bij eerste installatie.
*/
private string $generatedPassword = '';
@@ -53,7 +53,7 @@ class AdminAuth
* Elke rol mapt naar een lijst van toegestane route-prefixen. De rol
* 'admin' heeft wildcard '*' toegang tot alle routes.
*
* @since 2.6.4
* @since 2.6.5
* @var array<string, string[]> Map van rol-sleutel naar lijst met toegestane routes.
*/
public const ROLE_PERMISSIONS = [
@@ -66,7 +66,7 @@ class AdminAuth
/**
* Leesbare rol-labels voor weergave in de admin-interface.
*
* @since 2.6.4
* @since 2.6.5
* @var array<string, string> Map van rol-sleutel naar label.
*/
public const ROLE_LABELS = [
@@ -82,7 +82,7 @@ class AdminAuth
* Laadt de admin-configuratie, bepaalt het pad naar het lockout-bestand en
* start de sessie met de juiste security-instellingen.
*
* @since 2.6.4
* @since 2.6.5
*
* @param array $appConfig Applicatie-configuratie; vereist keys 'log_file' en 'admin_config'.
*/
@@ -101,7 +101,7 @@ class AdminAuth
* admin.json.example, of indien die ook ontbreekt met een standaard admin-
* gebruiker. Geeft een lege structuur terug als de JSON ongeldig is.
*
* @since 2.6.4
* @since 2.6.5
*
* @return array Admin-configuratie met keys 'users' en 'security'.
*/
@@ -155,7 +155,7 @@ class AdminAuth
* en een vaste lengte, zodat het wachtwoord voldoende entropie heeft
* en veilig te typen is.
*
* @since 2.6.4
* @since 2.6.5
*
* @return string Willekeurig wachtwoord van 16 alfanumerieke tekens.
*/
@@ -178,7 +178,7 @@ class AdminAuth
* wordt het veld geleegd. Geeft een lege string terug wanneer er
* geen nieuw wachtwoord is gegenereerd in deze request.
*
* @since 2.6.4
* @since 2.6.5
*
* @return string Plaintext wachtwoord of lege string.
*/
@@ -193,7 +193,7 @@ class AdminAuth
* Schrijft de interne admin-configuratie weg als pretty-printed JSON met
* behoud van unicode-tekens.
*
* @since 2.6.4
* @since 2.6.5
*
* @return void
*/
@@ -212,7 +212,7 @@ class AdminAuth
* de sessie en beëindigt deze bij inactiviteit langer dan de geconfigureerde
* timeout. Vernieuwt de activiteit-timestamp bij geauthenticeerde gebruikers.
*
* @since 2.6.4
* @since 2.6.5
*
* @return void
*/
@@ -255,7 +255,7 @@ class AdminAuth
* en gelogd. Bij succes worden mislukte pogingen gewist en de sessie
* gevuld met gebruiker, rol en CSRF-token.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @param string $password Wachtwoord (plaintext).
@@ -299,7 +299,7 @@ class AdminAuth
* Maakt de sessie-array leeg, verwijdert het sessie-cookie en vernietigt de
* sessie. De uitlogactie wordt gelogd.
*
* @since 2.6.4
* @since 2.6.5
*
* @return void
*/
@@ -321,7 +321,7 @@ class AdminAuth
/**
* Controleert of de huidige bezoeker is ingelogd.
*
* @since 2.6.4
* @since 2.6.5
*
* @return bool True indien een admin-gebruiker in de sessie staat.
*/
@@ -336,7 +336,7 @@ class AdminAuth
* Levert username en rol uit de sessie en vult deze aan met email,
* author_name en author_email uit admin.json indien aanwezig.
*
* @since 2.6.4
* @since 2.6.5
*
* @return array|null Gebruikersdata als array, of null indien niet ingelogd.
*/
@@ -366,7 +366,7 @@ class AdminAuth
* Retourneert de override-rol indien ingesteld (voor test-doeleinden), anders
* de werkelijke rol.
*
* @since 2.6.4
* @since 2.6.5
*
* @return string Rol-sleutel.
*/
@@ -381,7 +381,7 @@ class AdminAuth
/**
* Geeft de werkelijke rol van de ingelogde gebruiker, eventuele override negerend.
*
* @since 2.6.4
* @since 2.6.5
*
* @return string Rol-sleutel.
*/
@@ -393,7 +393,7 @@ class AdminAuth
/**
* Controleert of de ingelogde gebruiker een actieve rol-override heeft.
*
* @since 2.6.4
* @since 2.6.5
*
* @return bool True indien een override-rol is ingesteld.
*/
@@ -409,7 +409,7 @@ class AdminAuth
* 'admin' (zinloos) en enkel naar lagere rollen. Slaat de override op in de
* sessie. De actie wordt gelogd.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $role Doel-rol-sleutel.
* @return array Resultaat met keys 'success' (bool) en 'message' (string).
@@ -441,7 +441,7 @@ class AdminAuth
*
* Verwijdert de override uit de sessie indien aanwezig en logt de actie.
*
* @since 2.6.4
* @since 2.6.5
*
* @return array Resultaat met keys 'success' (bool) en 'message' (string).
*/
@@ -461,7 +461,7 @@ class AdminAuth
* Gebruikt de permissies van de huidige rol; de wildcard '*' geeft toegang
* tot alles. Onbekende rollen krijgen enkel 'dashboard' en 'logout'.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $route Route-sleutel die gecontroleerd moet worden.
* @return bool True indien de gebruiker de route mag benaderen.
@@ -481,7 +481,7 @@ class AdminAuth
/**
* Geeft alle beschikbare rollen met hun leesbare labels.
*
* @since 2.6.4
* @since 2.6.5
*
* @return array<string, string> Map van rol-sleutel naar label.
*/
@@ -493,7 +493,7 @@ class AdminAuth
/**
* Geeft het leesbare label voor een rol.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $role Rol-sleutel.
* @return string Leesbaar label, of de rol-sleutel zelf indien onbekend.
@@ -509,7 +509,7 @@ class AdminAuth
* Slaat een cryptografisch willekeurig token op in de sessie en retourneert
* dit voor gebruik in admin-formulieren.
*
* @since 2.6.4
* @since 2.6.5
*
* @return string 64-tekens hexadecimaal CSRF-token.
*/
@@ -526,7 +526,7 @@ class AdminAuth
*
* Gebruikt hash_equals om timing-attacks te voorkomen.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $token Token uit het formulier of verzoek.
* @return bool True indien het token overeenkomt met het sessie-token.
@@ -542,7 +542,7 @@ class AdminAuth
* Maakt een nieuw cryptografisch willekeurig token aan, nuttig na
* privilege-wijzigingen of na het verwerken van een formulier.
*
* @since 2.6.4
* @since 2.6.5
*
* @return void
*/
@@ -559,7 +559,7 @@ class AdminAuth
* Levert een array geïndexeerd op gebruikersnaam, aangevuld met het
* leesbare rol-label en eventuele profielvelden.
*
* @since 2.6.4
* @since 2.6.5
*
* @return array<string, array> Map van gebruikersnaam naar gebruikersdata.
*/
@@ -588,7 +588,7 @@ class AdminAuth
* geldigheid van de rol. Het wachtwoord wordt opgeslagen als bcrypt-hash.
* Wijzigingen worden direct weggeschreven en gelogd.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @param string $password Wachtwoord (plaintext, minimaal 8 tekens).
@@ -630,7 +630,7 @@ class AdminAuth
* Zoekt de gebruiker op naam en overschrijft de profielvelden, slaat de
* configuratie op en logt de wijziging.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @param string $email E-mailadres. Default ''.
@@ -660,7 +660,7 @@ class AdminAuth
* moet een bekende sleutel uit ROLE_PERMISSIONS zijn. Wijzigingen worden
* opgeslagen en gelogd.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @param string $role Nieuwe rol-sleutel.
@@ -691,7 +691,7 @@ class AdminAuth
* Een gebruiker kan zichzelf niet verwijderen. De gebruikerslijst wordt
* gefilterd, opgeslagen en de actie gelogd.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @return array Resultaat met keys 'success' (bool) en 'message' (string).
@@ -717,7 +717,7 @@ class AdminAuth
* Controleert de minimum wachtwoordlengte (8), hasht het wachtwoord met de
* standaard PHP-hash en slaat de wijziging op.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @param string $newPassword Nieuw wachtwoord (plaintext, minimaal 8 tekens).
@@ -745,7 +745,7 @@ class AdminAuth
* Verifieert eerst het huidige wachtwoord tegen de opgeslagen hash, controleert
* de lengte van het nieuwe wachtwoord (minimaal 8) en slaat de nieuwe hash op.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @param string $currentPassword Huidig wachtwoord (plaintext).
@@ -780,7 +780,7 @@ class AdminAuth
/**
* Zoekt een gebruiker op gebruikersnaam in de admin-configuratie.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @return array|null Gebruikersdata als array, of null indien niet gevonden.
@@ -802,7 +802,7 @@ class AdminAuth
* laatste poging met de geconfigureerde limieten. Verloopt de lockout dan
* worden de pogingen gewist.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @return array Resultaat met keys 'locked' (bool) en optioneel 'remaining' (int, seconden).
@@ -836,7 +836,7 @@ class AdminAuth
* Verhoogt de teller en actualiseert de timestamp van de laatste poging,
* waarna de gegevens worden weggeschreven naar het lockout-bestand.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @return void
@@ -857,7 +857,7 @@ class AdminAuth
*
* Verwijdert de gebruiker uit het lockout-bestand en slaat dit op.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @return void
@@ -875,7 +875,7 @@ class AdminAuth
* Wrapper rond clearFailedAttempts die ook van buiten de class kan worden
* aangeroepen, bijvoorbeeld door een CLI-tool voor het resetten van vergrendelingen.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $username Gebruikersnaam.
* @return void
@@ -888,7 +888,7 @@ class AdminAuth
/**
* Leest alle mislukte inlogpogingen uit het lockout-bestand.
*
* @since 2.6.4
* @since 2.6.5
*
* @return array<string, array{count: int, last_attempt: int}> Map van gebruikersnaam naar poging-data.
*/
@@ -907,7 +907,7 @@ class AdminAuth
* Maakt de logdirectory aan indien nodig. Het IP-adres wordt via RequestLogger
* bepaald indien beschikbaar, anders via REMOTE_ADDR met een fallback.
*
* @since 2.6.4
* @since 2.6.5
*
* @param string $level Log-niveau (bijv. 'info', 'warning').
* @param string $message Bericht dat gelogd moet worden.