From 326bc59be5ef54213c62e808cd426acb443db25d 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 18:13:37 +0000
Subject: [PATCH 1/2] =?UTF-8?q?feat:=20Ajout=20de=20la=20fonctionnalit?=
=?UTF-8?q?=C3=A9=20de=20modification=20de=20r=C3=B4le=20utilisateur?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
J'ai implémenté la possibilité pour les administrateurs de changer le rôle des utilisateurs entre 'user' et 'admin' directement depuis la page de liste des utilisateurs.
Changements apportés :
- Ajout d'une méthode `toggleAdminRole` dans `UserController.php` pour gérer la logique de changement de rôle.
- Intégration de vérifications de sécurité pour empêcher la modification du rôle de l'admin principal, de votre propre rôle, ou la suppression du dernier rôle admin.
- Ajout d'une route POST `/users/toggle-admin` pour cette nouvelle fonctionnalité.
- Modification de la vue `app/src/Views/users/index.php` pour afficher les boutons de changement de rôle ("Passer Admin" / "Retirer Admin") avec une confirmation JavaScript.
- Mise à jour du fichier de langue `fr.json` avec les nouvelles chaînes de caractères nécessaires.
- Journalisation des actions de modification de rôle.
Il est recommandé de tester manuellement cette fonctionnalité pour s'assurer qu'elle fonctionne comme prévu dans tous les scénarios.
---
app/public/index.php | 1 +
app/src/Controllers/UserController.php | 73 ++++++++++++++++++++++++++
app/src/Lang/fr.json | 12 ++++-
app/src/Views/users/index.php | 19 +++++--
4 files changed, 101 insertions(+), 4 deletions(-)
diff --git a/app/public/index.php b/app/public/index.php
index 30c2eee..e596c68 100644
--- a/app/public/index.php
+++ b/app/public/index.php
@@ -215,6 +215,7 @@ $router->addRoute('GET', '/users', 'UserController@index', true);
$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', '/logout', 'AuthController@logout', true);
// Exécuter le routage
diff --git a/app/src/Controllers/UserController.php b/app/src/Controllers/UserController.php
index 85b4a31..e13aebb 100644
--- a/app/src/Controllers/UserController.php
+++ b/app/src/Controllers/UserController.php
@@ -7,6 +7,7 @@ use App\Services\AuthService;
use App\Services\LogService;
use App\Services\LanguageService;
use App\Utils\DarkMode;
+use \PDOException;
/**
* Contrôleur pour la gestion des utilisateurs.
@@ -210,4 +211,76 @@ class UserController
header('Location: /users');
exit();
}
+
+ /**
+ * Modifie le rôle d'un utilisateur (admin/user).
+ */
+ public function toggleAdminRole()
+ {
+ $this->requireAdmin();
+
+ if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
+ header('Location: /users');
+ exit();
+ }
+
+ $userIdToModify = $_POST['user_id'] ?? null;
+ $ipAddress = $_SERVER['REMOTE_ADDR'];
+ $adminUserId = $this->authService->getUserId();
+
+ if (empty($userIdToModify)) {
+ $_SESSION['error'] = $this->langService->__('user_role_error_id_missing'); // Nouvelle chaîne de langue
+ header('Location: /users');
+ exit();
+ }
+
+ // Récupérer les informations de l'utilisateur à modifier
+ $stmt = $this->db->prepare("SELECT username, role FROM users WHERE id = ?");
+ $stmt->execute([$userIdToModify]);
+ $userToModify = $stmt->fetch();
+
+ if (!$userToModify) {
+ $_SESSION['error'] = $this->langService->__('user_not_found'); // Nouvelle chaîne de langue (ou existante)
+ header('Location: /users');
+ exit();
+ }
+
+ // Empêcher la modification du rôle de l'utilisateur "admin" (ou un nom spécifique)
+ // ou de son propre rôle si c'est l'admin connecté
+ if ($userToModify['username'] === 'admin' || $userIdToModify == $adminUserId) {
+ $_SESSION['error'] = $this->langService->__('cannot_change_admin_role'); // Nouvelle chaîne de langue
+ $this->logService->log('warning', "Tentative de modification du rôle de l'administrateur principal ou de soi-même par l'admin ID: {$adminUserId}.", $adminUserId, $ipAddress);
+ header('Location: /users');
+ exit();
+ }
+
+ $newRole = ($userToModify['role'] === 'admin') ? 'user' : 'admin';
+
+ // Si on retire le rôle admin, vérifier qu'il en reste au moins un autre
+ if ($newRole === 'user' && $userToModify['role'] === 'admin') {
+ $stmt = $this->db->query("SELECT COUNT(*) FROM users WHERE role = 'admin'");
+ $adminCount = $stmt->fetchColumn();
+ if ($adminCount <= 1) {
+ $_SESSION['error'] = $this->langService->__('cannot_remove_last_admin_role'); // Nouvelle chaîne de langue
+ $this->logService->log('warning', "Tentative de suppression du dernier rôle admin par l'admin ID: {$adminUserId}.", $adminUserId, $ipAddress);
+ header('Location: /users');
+ exit();
+ }
+ }
+
+ try {
+ $stmt = $this->db->prepare("UPDATE users SET role = ? WHERE id = ?");
+ $stmt->execute([$newRole, $userIdToModify]);
+
+ $this->logService->log('info', "Rôle de l'utilisateur '{$userToModify['username']}' (ID: {$userIdToModify}) changé en '{$newRole}' par l'administrateur ID: {$adminUserId}.", $adminUserId, $ipAddress);
+ $_SESSION['success'] = $this->langService->__('user_role_updated_success', ['username' => htmlspecialchars($userToModify['username']), 'role' => htmlspecialchars($newRole)]); // Nouvelle chaîne de langue
+ } catch (\PDOException $e) {
+ error_log("Erreur lors du changement de rôle de l'utilisateur: " . $e->getMessage());
+ $_SESSION['error'] = $this->langService->__('user_role_update_error_db'); // Nouvelle chaîne de langue
+ $this->logService->log('error', "Échec changement de rôle pour utilisateur ID: {$userIdToModify}: " . $e->getMessage(), $adminUserId, $ipAddress);
+ }
+
+ header('Location: /users');
+ exit();
+ }
}
diff --git a/app/src/Lang/fr.json b/app/src/Lang/fr.json
index 203b1bb..af24851 100644
--- a/app/src/Lang/fr.json
+++ b/app/src/Lang/fr.json
@@ -80,5 +80,15 @@
"user_delete_success": "Utilisateur '{username}' supprimé avec succès.",
"user_delete_error_not_found": "Utilisateur introuvable pour la suppression.",
"user_delete_error_db": "Erreur lors de la suppression de l'utilisateur dans la base de données.",
- "self_delete_not_allowed": "Vous ne pouvez pas vous supprimer vous-même."
+ "self_delete_not_allowed": "Vous ne pouvez pas vous supprimer vous-même.",
+ "user_role_error_id_missing": "ID utilisateur manquant pour la modification du rôle.",
+ "user_not_found": "Utilisateur non trouvé.",
+ "cannot_change_admin_role": "Le rôle de l'administrateur principal ou son propre rôle ne peut être modifié.",
+ "cannot_remove_last_admin_role": "Impossible de retirer le statut d'administrateur au dernier administrateur.",
+ "user_role_updated_success": "Le rôle de l'utilisateur '{username}' a été changé en '{role}' avec succès.",
+ "user_role_update_error_db": "Erreur de base de données lors de la mise à jour du rôle de l'utilisateur.",
+ "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"
}
diff --git a/app/src/Views/users/index.php b/app/src/Views/users/index.php
index 9396bce..3012824 100644
--- a/app/src/Views/users/index.php
+++ b/app/src/Views/users/index.php
@@ -36,13 +36,26 @@ require_once APP_ROOT_DIR . '/src/Views/shared/header.php';
= htmlspecialchars($user['username']) ?> |
= htmlspecialchars($translations[$user['role']] ?? $user['role']) ?> |
= htmlspecialchars((new DateTime($user['created_at']))->format('Y-m-d H:i:s')) ?> |
-
- getUserId()): // Impossible de supprimer son propre compte ?>
+ |
+ getUserId()): ?>
+
+
+ = htmlspecialchars($translations['cannot_change_main_admin_role'] ?? 'Rôle non modifiable') ?>
+
+
+ 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 ?>
-
+ getUserId() && $user['username'] !== 'admin'): // Permet à l'admin de voir "non modifiable" pour lui meme, mais pas "auto suppression interdite" si c'est admin ?>
= htmlspecialchars($translations['self_delete_not_allowed']) ?>
|
From 3ea4fc51c9ad17e03dd5e71268b0f6e5fca4a9bc 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 18:25:50 +0000
Subject: [PATCH 2/2] =?UTF-8?q?fix:=20Ajout=20des=20traductions=20manquant?=
=?UTF-8?q?es=20pour=20la=20modification=20de=20r=C3=B4le?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
J'ai ajouté les clés de traduction nécessaires pour la fonctionnalité de modification de rôle utilisateur à tous les fichiers de langue.
- Les traductions françaises et anglaises sont fournies.
- Pour les autres langues (ar, de, es, hi, it, ja, pt, ru, zh), les textes anglais sont utilisés comme placeholders.
Ceci corrige l'omission de la mise à jour de tous les fichiers de langue lors de l'implémentation initiale de la fonctionnalité.
---
app/src/Lang/ar.json | 12 +++++++++++-
app/src/Lang/de.json | 12 +++++++++++-
app/src/Lang/en.json | 12 +++++++++++-
app/src/Lang/es.json | 12 +++++++++++-
app/src/Lang/hi.json | 12 +++++++++++-
app/src/Lang/it.json | 12 +++++++++++-
app/src/Lang/ja.json | 12 +++++++++++-
app/src/Lang/pt.json | 12 +++++++++++-
app/src/Lang/ru.json | 12 +++++++++++-
app/src/Lang/zh.json | 12 +++++++++++-
10 files changed, 110 insertions(+), 10 deletions(-)
diff --git a/app/src/Lang/ar.json b/app/src/Lang/ar.json
index 091d274..4af9b22 100644
--- a/app/src/Lang/ar.json
+++ b/app/src/Lang/ar.json
@@ -80,5 +80,15 @@
"user_delete_success": "Auto-translated 'User ''{username}'' deleted successfully.' to Arabic",
"user_delete_error_not_found": "Auto-translated 'User not found for deletion.' to Arabic",
"user_delete_error_db": "Auto-translated 'Error deleting user from the database.' to Arabic",
- "self_delete_not_allowed": "Auto-translated 'You cannot delete yourself.' to Arabic"
+ "self_delete_not_allowed": "Auto-translated 'You cannot delete yourself.' to Arabic",
+ "user_role_error_id_missing": "User ID missing for role modification.",
+ "user_not_found": "User not found.",
+ "cannot_change_admin_role": "The main administrator's role or your own role cannot be modified.",
+ "cannot_remove_last_admin_role": "Cannot remove administrator status from the last administrator.",
+ "user_role_updated_success": "User '{username}' role has been successfully changed to '{role}'.",
+ "user_role_update_error_db": "Database error while updating user role.",
+ "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"
}
diff --git a/app/src/Lang/de.json b/app/src/Lang/de.json
index 90c16d4..6a5b1ac 100644
--- a/app/src/Lang/de.json
+++ b/app/src/Lang/de.json
@@ -80,5 +80,15 @@
"user_delete_success": "Benutzer '{username}' erfolgreich gelöscht.",
"user_delete_error_not_found": "Benutzer zum Löschen nicht gefunden.",
"user_delete_error_db": "Fehler beim Löschen des Benutzers aus der Datenbank.",
- "self_delete_not_allowed": "Sie können sich nicht selbst löschen."
+ "self_delete_not_allowed": "Sie können sich nicht selbst löschen.",
+ "user_role_error_id_missing": "User ID missing for role modification.",
+ "user_not_found": "User not found.",
+ "cannot_change_admin_role": "The main administrator's role or your own role cannot be modified.",
+ "cannot_remove_last_admin_role": "Cannot remove administrator status from the last administrator.",
+ "user_role_updated_success": "User '{username}' role has been successfully changed to '{role}'.",
+ "user_role_update_error_db": "Database error while updating user role.",
+ "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"
}
diff --git a/app/src/Lang/en.json b/app/src/Lang/en.json
index 6951f8a..53e4348 100644
--- a/app/src/Lang/en.json
+++ b/app/src/Lang/en.json
@@ -80,5 +80,15 @@
"user_delete_success": "User '{username}' deleted successfully.",
"user_delete_error_not_found": "User not found for deletion.",
"user_delete_error_db": "Error deleting user from the database.",
- "self_delete_not_allowed": "You cannot delete yourself."
+ "self_delete_not_allowed": "You cannot delete yourself.",
+ "user_role_error_id_missing": "User ID missing for role modification.",
+ "user_not_found": "User not found.",
+ "cannot_change_admin_role": "The main administrator's role or your own role cannot be modified.",
+ "cannot_remove_last_admin_role": "Cannot remove administrator status from the last administrator.",
+ "user_role_updated_success": "User '{username}' role has been successfully changed to '{role}'.",
+ "user_role_update_error_db": "Database error while updating user role.",
+ "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"
}
diff --git a/app/src/Lang/es.json b/app/src/Lang/es.json
index 66cb7ab..fc628a2 100644
--- a/app/src/Lang/es.json
+++ b/app/src/Lang/es.json
@@ -80,5 +80,15 @@
"user_delete_success": "Usuario '{username}' eliminado correctamente.",
"user_delete_error_not_found": "Usuario no encontrado para la eliminación.",
"user_delete_error_db": "Error al eliminar el usuario de la base de datos.",
- "self_delete_not_allowed": "No puedes eliminarte a ti mismo."
+ "self_delete_not_allowed": "No puedes eliminarte a ti mismo.",
+ "user_role_error_id_missing": "User ID missing for role modification.",
+ "user_not_found": "User not found.",
+ "cannot_change_admin_role": "The main administrator's role or your own role cannot be modified.",
+ "cannot_remove_last_admin_role": "Cannot remove administrator status from the last administrator.",
+ "user_role_updated_success": "User '{username}' role has been successfully changed to '{role}'.",
+ "user_role_update_error_db": "Database error while updating user role.",
+ "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"
}
diff --git a/app/src/Lang/hi.json b/app/src/Lang/hi.json
index a2f7b86..bdee1a4 100644
--- a/app/src/Lang/hi.json
+++ b/app/src/Lang/hi.json
@@ -80,5 +80,15 @@
"user_delete_success": "Auto-translated 'User ''{username}'' deleted successfully.' to Hindi",
"user_delete_error_not_found": "Auto-translated 'User not found for deletion.' to Hindi",
"user_delete_error_db": "Auto-translated 'Error deleting user from the database.' to Hindi",
- "self_delete_not_allowed": "Auto-translated 'You cannot delete yourself.' to Hindi"
+ "self_delete_not_allowed": "Auto-translated 'You cannot delete yourself.' to Hindi",
+ "user_role_error_id_missing": "User ID missing for role modification.",
+ "user_not_found": "User not found.",
+ "cannot_change_admin_role": "The main administrator's role or your own role cannot be modified.",
+ "cannot_remove_last_admin_role": "Cannot remove administrator status from the last administrator.",
+ "user_role_updated_success": "User '{username}' role has been successfully changed to '{role}'.",
+ "user_role_update_error_db": "Database error while updating user role.",
+ "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"
}
diff --git a/app/src/Lang/it.json b/app/src/Lang/it.json
index 2145aa9..b30a72f 100644
--- a/app/src/Lang/it.json
+++ b/app/src/Lang/it.json
@@ -80,5 +80,15 @@
"user_delete_success": "Utente '{username}' eliminato con successo.",
"user_delete_error_not_found": "Utente non trovato per l'eliminazione.",
"user_delete_error_db": "Errore durante l'eliminazione dell'utente dal database.",
- "self_delete_not_allowed": "Non puoi eliminare te stesso."
+ "self_delete_not_allowed": "Non puoi eliminare te stesso.",
+ "user_role_error_id_missing": "User ID missing for role modification.",
+ "user_not_found": "User not found.",
+ "cannot_change_admin_role": "The main administrator's role or your own role cannot be modified.",
+ "cannot_remove_last_admin_role": "Cannot remove administrator status from the last administrator.",
+ "user_role_updated_success": "User '{username}' role has been successfully changed to '{role}'.",
+ "user_role_update_error_db": "Database error while updating user role.",
+ "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"
}
diff --git a/app/src/Lang/ja.json b/app/src/Lang/ja.json
index bccf65c..4b1fc53 100644
--- a/app/src/Lang/ja.json
+++ b/app/src/Lang/ja.json
@@ -80,5 +80,15 @@
"user_delete_success": "Auto-translated 'User ''{username}'' deleted successfully.' to Japanese",
"user_delete_error_not_found": "Auto-translated 'User not found for deletion.' to Japanese",
"user_delete_error_db": "Auto-translated 'Error deleting user from the database.' to Japanese",
- "self_delete_not_allowed": "Auto-translated 'You cannot delete yourself.' to Japanese"
+ "self_delete_not_allowed": "Auto-translated 'You cannot delete yourself.' to Japanese",
+ "user_role_error_id_missing": "User ID missing for role modification.",
+ "user_not_found": "User not found.",
+ "cannot_change_admin_role": "The main administrator's role or your own role cannot be modified.",
+ "cannot_remove_last_admin_role": "Cannot remove administrator status from the last administrator.",
+ "user_role_updated_success": "User '{username}' role has been successfully changed to '{role}'.",
+ "user_role_update_error_db": "Database error while updating user role.",
+ "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"
}
diff --git a/app/src/Lang/pt.json b/app/src/Lang/pt.json
index 1ff5920..9e7e453 100644
--- a/app/src/Lang/pt.json
+++ b/app/src/Lang/pt.json
@@ -80,5 +80,15 @@
"user_delete_success": "Utilizador '{username}' eliminado com sucesso.",
"user_delete_error_not_found": "Utilizador não encontrado para eliminação.",
"user_delete_error_db": "Erro ao eliminar utilizador da base de dados.",
- "self_delete_not_allowed": "Não pode eliminar-se a si mesmo."
+ "self_delete_not_allowed": "Não pode eliminar-se a si mesmo.",
+ "user_role_error_id_missing": "User ID missing for role modification.",
+ "user_not_found": "User not found.",
+ "cannot_change_admin_role": "The main administrator's role or your own role cannot be modified.",
+ "cannot_remove_last_admin_role": "Cannot remove administrator status from the last administrator.",
+ "user_role_updated_success": "User '{username}' role has been successfully changed to '{role}'.",
+ "user_role_update_error_db": "Database error while updating user role.",
+ "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"
}
diff --git a/app/src/Lang/ru.json b/app/src/Lang/ru.json
index 4deb99e..940f10d 100644
--- a/app/src/Lang/ru.json
+++ b/app/src/Lang/ru.json
@@ -80,5 +80,15 @@
"user_delete_success": "Auto-translated 'User ''{username}'' deleted successfully.' to Russian",
"user_delete_error_not_found": "Auto-translated 'User not found for deletion.' to Russian",
"user_delete_error_db": "Auto-translated 'Error deleting user from the database.' to Russian",
- "self_delete_not_allowed": "Auto-translated 'You cannot delete yourself.' to Russian"
+ "self_delete_not_allowed": "Auto-translated 'You cannot delete yourself.' to Russian",
+ "user_role_error_id_missing": "User ID missing for role modification.",
+ "user_not_found": "User not found.",
+ "cannot_change_admin_role": "The main administrator's role or your own role cannot be modified.",
+ "cannot_remove_last_admin_role": "Cannot remove administrator status from the last administrator.",
+ "user_role_updated_success": "User '{username}' role has been successfully changed to '{role}'.",
+ "user_role_update_error_db": "Database error while updating user role.",
+ "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"
}
diff --git a/app/src/Lang/zh.json b/app/src/Lang/zh.json
index e8b19b2..af88502 100644
--- a/app/src/Lang/zh.json
+++ b/app/src/Lang/zh.json
@@ -80,5 +80,15 @@
"user_delete_success": "Auto-translated 'User ''{username}'' deleted successfully.' to Chinese",
"user_delete_error_not_found": "Auto-translated 'User not found for deletion.' to Chinese",
"user_delete_error_db": "Auto-translated 'Error deleting user from the database.' to Chinese",
- "self_delete_not_allowed": "Auto-translated 'You cannot delete yourself.' to Chinese"
+ "self_delete_not_allowed": "Auto-translated 'You cannot delete yourself.' to Chinese",
+ "user_role_error_id_missing": "User ID missing for role modification.",
+ "user_not_found": "User not found.",
+ "cannot_change_admin_role": "The main administrator's role or your own role cannot be modified.",
+ "cannot_remove_last_admin_role": "Cannot remove administrator status from the last administrator.",
+ "user_role_updated_success": "User '{username}' role has been successfully changed to '{role}'.",
+ "user_role_update_error_db": "Database error while updating user role.",
+ "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"
}