diff --git a/TODO.md b/TODO.md index 17f49a5..21d6af7 100644 --- a/TODO.md +++ b/TODO.md @@ -49,6 +49,15 @@ - [x] Pentest controles uitgevoerd (30/30 tests geslaagd — 0 vulnerabilities) - [x] WCAG 2.1 AA accessibility tests (25/25 tests geslaagd — 100% compliance, test-script verbeterd met min/max checks en grep -E) +## v2.6.1c (2026-08-17) ✅ +- [x] Pentest controles uitgevoerd (30/30) +- [x] WCAG 2.1 AA accessibility tests (25/25) +- [x] README.md en handleidingen in guide/ doorgeloken en bijgewerkt +- [x] Admin gebruikersbeheer opnieuw ontworpen (lijst + zoeken/filter + profiel + wachtwoord) +- [x] CLI commando voor admin wachtwoord reset (cli/reset-admin-password.php) +- [x] Verslag gemaakt (docs/release-notes/v2.6.1c.md) +- [x] Versie verhoogd naar 2.6.1c + ## v2.6.1 (2026-08-17) ✅ - [x] Pentest controles uitgevoerd (30/30) - [x] WCAG 2.1 AA accessibility tests (25/25) diff --git a/admin/src/AdminAuth.php b/admin/src/AdminAuth.php index a1e862d..20b0c74 100644 --- a/admin/src/AdminAuth.php +++ b/admin/src/AdminAuth.php @@ -432,6 +432,14 @@ class AdminAuth file_put_contents($this->lockFile, json_encode($attempts)); } + /** + * Clear all failed login attempts for a user (public, used by CLI reset). + */ + public function clearLockout(string $username): void + { + $this->clearFailedAttempts($username); + } + private function getFailedAttempts(): array { if (!file_exists($this->lockFile)) { diff --git a/admin/theme/default/views/pages/users-edit.twig b/admin/theme/default/views/pages/users-edit.twig new file mode 100644 index 0000000..25ee757 --- /dev/null +++ b/admin/theme/default/views/pages/users-edit.twig @@ -0,0 +1,136 @@ +{% extends "layouts/admin.twig" %} + +{% block title %}{{ ta.edit_profile|default('Profiel bewerken') }}: {{ target_user.username }} - {{ ta.admin_title|default('CodePress Admin') }}{% endblock %} + +{% block content %} +
{{ ta.current_role|default('Huidige rol') }}
++ + {{ target_user.role_label|default(target_user.role) }} + +
+| {{ ta.username|default('Gebruikersnaam') }} | -{{ ta.col_role|default('Rol') }} | -{{ ta.col_created|default('Aangemaakt') }} | -{{ ta.col_actions|default('Acties') }} | -
|---|---|---|---|
| - - {{ username }} - {% if username == user.username %} - {{ ta.you|default('Jij') }} - {% endif %} - | -- - {{ data.role_label|default(data.role) }} - - | -{{ data.created|default(ta.unknown|default('Onbekend')) }} | -
- {% if username != user.username %}
-
-
-
-
-
-
- {% else %}
-
- {% endif %}
-
-
-
- |
-
| {{ ta.no_users|default('Geen gebruikers gevonden.') }} | -|||
| {{ ta.username|default('Gebruikersnaam') }} | +{{ ta.col_role|default('Rol') }} | +{{ ta.login_email|default('Login e-mail') }} | +{{ ta.col_created|default('Aangemaakt') }} | +{{ ta.col_actions|default('Acties') }} | +
|---|---|---|---|---|
| + + {{ username }} + {% if username == user.username %} + {{ ta.you|default('Jij') }} + {% endif %} + | ++ + {{ data.role_label|default(data.role) }} + + | +{{ data.email|default('-') }} | +{{ data.created|default(ta.unknown|default('Onbekend')) }} | +
+
+
+
+ {% if username != user.username %}
+ |
+
| {{ ta.no_users|default('Geen gebruikers gevonden.') }} | +||||