From 3ec2eda49d87c1f3ee4dd51e44377f7ad4517116 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 15 Jun 2025 19:13:50 +0000 Subject: [PATCH] fix: Corriger les chemins d'inclusion dans la vue edit_password MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La vue `app/src/Views/users/edit_password.php` utilisait des chemins relatifs incorrects pour inclure `header.php` et `footer.php`, provoquant une erreur fatale. Cette correction remplace les chemins relatifs par des chemins absolus en utilisant la constante `APP_ROOT_DIR`. Modifications : - Mise à jour des `require_once` pour `header.php` et `footer.php` dans `app/src/Views/users/edit_password.php` pour utiliser `APP_ROOT_DIR`. - Ajout de commentaires en début de fichier pour lister les variables attendues du contrôleur. - Uniformisation de l'affichage des messages d'erreur via la variable `$errorMessage`. --- app/public/index.php | 2 + app/src/Controllers/UserController.php | 103 +++++++++++++++++++++++++ app/src/Lang/en.json | 15 +++- app/src/Lang/fr.json | 15 +++- app/src/Views/users/edit_password.php | 36 +++++++++ app/src/Views/users/index.php | 14 ++++ 6 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 app/src/Views/users/edit_password.php diff --git a/app/public/index.php b/app/public/index.php index e596c68..f09cfb2 100644 --- a/app/public/index.php +++ b/app/public/index.php @@ -216,6 +216,8 @@ $router->addRoute('GET', '/users/create', 'UserController@showCreateForm', true) $router->addRoute('POST', '/users/create', 'UserController@create', true); $router->addRoute('POST', '/users/delete', 'UserController@delete', true); $router->addRoute('POST', '/users/toggle-admin', 'UserController@toggleAdminRole', true); +$router->addRoute('GET', '/users/edit-password/{id}', 'UserController@showEditPasswordForm', true); // Nouvelle route GET +$router->addRoute('POST', '/users/update-password', 'UserController@updatePassword', true); // Nouvelle route POST $router->addRoute('GET', '/logout', 'AuthController@logout', true); // Exécuter le routage diff --git a/app/src/Controllers/UserController.php b/app/src/Controllers/UserController.php index e13aebb..ab8573a 100644 --- a/app/src/Controllers/UserController.php +++ b/app/src/Controllers/UserController.php @@ -142,6 +142,109 @@ class UserController exit(); } + /** + * Affiche le formulaire de modification du mot de passe pour un utilisateur. + * + * @param int $userId L'ID de l'utilisateur. + */ + public function showEditPasswordForm(int $userId) + { + $this->requireAdmin(); + + global $translations; // Utilisé par la vue + $currentLang = $this->langService->getLanguage(); // Utilisé par la vue + $darkModeClass = DarkMode::getBodyClass(); // Utilisé par la vue + + $stmt = $this->db->prepare("SELECT id, username FROM users WHERE id = ?"); + $stmt->execute([$userId]); + $user = $stmt->fetch(); + + if (!$user) { + $_SESSION['error'] = $this->langService->__('user_not_found'); + header('Location: /users'); + exit(); + } + + $errorMessage = $_SESSION['error'] ?? null; + unset($_SESSION['error']); // Effacer le message d'erreur après l'avoir récupéré + + require_once APP_ROOT_DIR . '/src/Views/users/edit_password.php'; + } + + /** + * Traite la soumission du formulaire de mise à jour du mot de passe. + */ + public function updatePassword() + { + $this->requireAdmin(); + $ipAddress = $_SERVER['REMOTE_ADDR']; + $adminUserId = $this->authService->getUserId(); // Pour les logs + + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + header('Location: /users'); + exit(); + } + + $userId = $_POST['user_id'] ?? null; + $newPassword = $_POST['new_password'] ?? ''; + $confirmPassword = $_POST['confirm_password'] ?? ''; + + if (empty($userId) || empty($newPassword) || empty($confirmPassword)) { + $_SESSION['error'] = $this->langService->__('password_update_error_empty_fields'); + // Rediriger vers le formulaire d'édition du mot de passe de l'utilisateur concerné + header('Location: /users/edit-password/' . $userId); + exit(); + } + + if ($newPassword !== $confirmPassword) { + $_SESSION['error'] = $this->langService->__('password_update_error_mismatch'); + header('Location: /users/edit-password/' . $userId); + exit(); + } + + // Récupérer les informations de l'utilisateur à modifier + $stmtUser = $this->db->prepare("SELECT username FROM users WHERE id = ?"); + $stmtUser->execute([$userId]); + $userToUpdate = $stmtUser->fetch(); + + if (!$userToUpdate) { + $_SESSION['error'] = $this->langService->__('user_not_found'); + header('Location: /users'); // Ou une page d'erreur générique + exit(); + } + + // Empêcher la modification du mot de passe de l'utilisateur "admin" (ou un nom spécifique) + // Vous pouvez rendre le nom "admin" configurable si nécessaire + if ($userToUpdate['username'] === 'admin') { + $_SESSION['error'] = $this->langService->__('cannot_change_admin_password'); + $this->logService->log('warning', "Tentative de modification du mot de passe de l'administrateur principal '{$userToUpdate['username']}' par l'admin ID: {$adminUserId}.", $adminUserId, $ipAddress); + header('Location: /users/edit-password/' . $userId); + exit(); + } + + $hashedPassword = password_hash($newPassword, PASSWORD_DEFAULT); + + try { + $stmt = $this->db->prepare("UPDATE users SET password = ? WHERE id = ?"); + $stmt->execute([$hashedPassword, $userId]); + + if ($stmt->rowCount() > 0) { + $this->logService->log('info', "Mot de passe de l'utilisateur '{$userToUpdate['username']}' (ID: {$userId}) modifié par l'administrateur ID: {$adminUserId}.", $adminUserId, $ipAddress); + $_SESSION['success'] = $this->langService->__('password_update_success', ['username' => htmlspecialchars($userToUpdate['username'])]); + } else { + // Ce cas peut arriver si le mot de passe est identique ou si l'utilisateur n'existe pas (déjà vérifié mais par sécurité) + $_SESSION['error'] = $this->langService->__('password_update_error_db'); // Ou un message plus spécifique + } + } catch (PDOException $e) { + error_log("Erreur lors de la mise à jour du mot de passe: " . $e->getMessage()); + $_SESSION['error'] = $this->langService->__('password_update_error_db'); + $this->logService->log('error', "Échec de la mise à jour du mot de passe pour '{$userToUpdate['username']}' (ID: {$userId}): " . $e->getMessage(), $adminUserId, $ipAddress); + } + + header('Location: /users'); + exit(); + } + /** * Supprime un utilisateur. */ diff --git a/app/src/Lang/en.json b/app/src/Lang/en.json index 2bcc27e..bc9c59a 100644 --- a/app/src/Lang/en.json +++ b/app/src/Lang/en.json @@ -90,8 +90,19 @@ "confirm_toggle_admin_role": "Are you sure you want to modify this user's role?", "remove_admin_status": "Remove Admin", "pass_to_admin": "Make Admin", - "cannot_change_main_admin_role": "Role not modifiable" + "cannot_change_main_admin_role": "Role not modifiable", "cert_revoke_success_intermediate": "Intermediate certificate '{name}' has been successfully revoked and the Root CA CRL has been updated.", "cert_revoke_warn_crl_update_failed_intermediate": "Intermediate certificate '{name}' has been revoked, but updating the Root CA CRL encountered an issue. Please contact an administrator.", - "cert_revoke_error_intermediate": "Error revoking intermediate certificate '{name}': {output}" + "cert_revoke_error_intermediate": "Error revoking intermediate certificate '{name}': {output}", + "edit_password_title": "Edit Password", + "new_password": "New Password", + "confirm_new_password": "Confirm New Password", + "update_password_button": "Update Password", + "editing_password_for_user": "Editing password for user: %username%", + "password_update_error_empty_fields": "Please fill in all password fields.", + "password_update_error_mismatch": "Passwords do not match.", + "cannot_change_admin_password": "The main administrator's password cannot be changed through this interface.", + "password_update_error_db": "Error updating password. Please try again.", + "password_update_success": "User %username%'s password has been successfully updated.", + "edit_password_button": "Edit Pwd" } diff --git a/app/src/Lang/fr.json b/app/src/Lang/fr.json index 60795e0..f38d28d 100644 --- a/app/src/Lang/fr.json +++ b/app/src/Lang/fr.json @@ -90,8 +90,19 @@ "confirm_toggle_admin_role": "Êtes-vous sûr de vouloir modifier le rôle de cet utilisateur ?", "remove_admin_status": "Retirer Admin", "pass_to_admin": "Passer Admin", - "cannot_change_main_admin_role": "Rôle non modifiable" + "cannot_change_main_admin_role": "Rôle non modifiable", "cert_revoke_success_intermediate": "Le certificat intermédiaire '{name}' a été révoqué avec succès et la CRL du CA Racine a été mise à jour.", "cert_revoke_warn_crl_update_failed_intermediate": "Le certificat intermédiaire '{name}' a été révoqué, mais la mise à jour de la CRL du CA Racine a rencontré un problème. Veuillez contacter un administrateur.", - "cert_revoke_error_intermediate": "Erreur lors de la révocation du certificat intermédiaire '{name}': {output}" + "cert_revoke_error_intermediate": "Erreur lors de la révocation du certificat intermédiaire '{name}': {output}", + "edit_password_title": "Modifier le mot de passe", + "new_password": "Nouveau mot de passe", + "confirm_new_password": "Confirmer le nouveau mot de passe", + "update_password_button": "Mettre à jour le mot de passe", + "editing_password_for_user": "Modification du mot de passe pour l'utilisateur : %username%", + "password_update_error_empty_fields": "Veuillez remplir tous les champs de mot de passe.", + "password_update_error_mismatch": "Les mots de passe ne correspondent pas.", + "cannot_change_admin_password": "Le mot de passe de l'administrateur principal ne peut pas être modifié via cette interface.", + "password_update_error_db": "Erreur lors de la mise à jour du mot de passe. Veuillez réessayer.", + "password_update_success": "Le mot de passe de l'utilisateur %username% a été mis à jour avec succès.", + "edit_password_button": "Modifier Mdp" } diff --git a/app/src/Views/users/edit_password.php b/app/src/Views/users/edit_password.php new file mode 100644 index 0000000..8f2f04a --- /dev/null +++ b/app/src/Views/users/edit_password.php @@ -0,0 +1,36 @@ + + +
+

+ + + + + +

:

+ +
+ + +
+ + +
+ +
+ + +
+ + +
+
+ + diff --git a/app/src/Views/users/index.php b/app/src/Views/users/index.php index 3012824..15d9db4 100644 --- a/app/src/Views/users/index.php +++ b/app/src/Views/users/index.php @@ -50,6 +50,20 @@ require_once APP_ROOT_DIR . '/src/Views/shared/header.php'; + getUserId()): ?> + + + N/A'; // Par exemple + ?> + getUserId()): ?> + N/A'; // Par exemple + ?> + + getUserId() && $user['username'] !== 'admin'): // Condition existante pour la suppression, légèrement ajustée pour être sûr que 'admin' n'est pas supprimable non plus via cette interface ?>