From e3243dd018cb9549c2e7e7c6fafe69a0dfbf23f6 Mon Sep 17 00:00:00 2001 From: Morph01 Date: Tue, 4 Feb 2025 16:35:30 -0800 Subject: [PATCH] feat: implement user creation, editing, and deletion functionality ALL features are working --- controllers/add_user.php | 68 -------------------------- controllers/create_user.php | 67 +++++++++++++------------ controllers/delete_user.php | 35 +++++++++++++ controllers/edit_user.php | 50 +++++++++++++++++++ models/LDAPAuth.php | 87 +++++++++++++++++++++++++++++++++ views/add_user.php | 97 ------------------------------------- views/create_user.php | 46 ++++++++++++++++++ views/delete_user.php | 56 +++++++-------------- views/edit_user.php | 58 +++++++++++----------- views/list_users.php | 4 +- views/menu.php | 58 +++++++++++----------- 11 files changed, 330 insertions(+), 296 deletions(-) delete mode 100644 controllers/add_user.php create mode 100644 controllers/delete_user.php create mode 100644 controllers/edit_user.php delete mode 100644 views/add_user.php create mode 100644 views/create_user.php diff --git a/controllers/add_user.php b/controllers/add_user.php deleted file mode 100644 index c4d2ae5..0000000 --- a/controllers/add_user.php +++ /dev/null @@ -1,68 +0,0 @@ -getAllOUs(); -$admin_ous = $_SESSION['admin_ous'] ?? []; - -// Filtrer les OUs disponibles selon les droits de l'admin -$allowed_ous = array_intersect($available_ous, $admin_ous); - -if ($_SERVER['REQUEST_METHOD'] === 'POST') { - // Récupérer les données du formulaire - $nom = $_POST['nom']; - $prenom = $_POST['prenom']; - $pseudo = $_POST['pseudo']; - $email = $_POST['email']; - $password = $_POST['password']; - $role = $_POST['role']; - $ou_dn = $_POST['ou']; // DN de l'OU sélectionnée - - // Valider les données (exemple simplifié) - if (empty($nom) || empty($prenom) || empty($pseudo) || empty($email) || empty($password) || empty($ou_dn)) { - die("Tous les champs sont obligatoires."); - } - - // Connexion LDAP - $ldapconn = ldap_connect("ldap://intranet.epul3a.local") - or die("Could not connect to LDAP server."); - - ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); - ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); - - $ldap_user = "CN=" . $_SESSION['sAMAccountName'] . ",CN=Users,DC=epul3a,DC=local"; - - if (!@ldap_bind($ldapconn, $ldap_user, $_SESSION['password'])) { - die("Could not bind to LDAP server: " . ldap_error($ldapconn)); - } - - $samAccountName = strtolower(substr($prenom, 0, 1) . $nom); // Générer le samAccountName - - // Créer l'utilisateur dans l'OU sélectionnée - $user_dn = "CN=$pseudo,$ou_dn"; // DN du nouvel utilisateur - - $user_info = [ - 'cn' => $pseudo, - 'sn' => $nom, - 'givenName' => $prenom, - 'mail' => $email, - 'userPassword' => $password, - 'samAccountName' => $samAccountName, - // 'userAccountControl' => "544", // Activer le compte - 'objectClass' => ['top', 'person', 'organizationalPerson', 'user'] - ]; - - // Ajout de l'utilisateur - if (@ldap_add($ldapconn, $user_dn, $user_info)) { - echo "Utilisateur créé avec succès dans l'OU : $ou_dn"; - } else { - echo "Erreur lors de la création de l'utilisateur : " . ldap_error($ldapconn); - } - - ldap_close($ldapconn); -} diff --git a/controllers/create_user.php b/controllers/create_user.php index ee56fa5..d03daca 100644 --- a/controllers/create_user.php +++ b/controllers/create_user.php @@ -1,42 +1,45 @@ Création d'un utilisateur"; -echo "
"; -echo "Nom
"; -echo "Prénom
"; -echo "Nom d'utilisateur
"; -echo "E-Mail
"; -echo "Mot de passe
"; +// Récupérer les attributs du nouvel utilisateur depuis le formulaire +$entry = [ + 'objectClass' => ['top', 'person', 'organizationalPerson', 'user'], + 'cn' => $_POST['username'], + 'givenName' => $_POST['firstname'], + 'sn' => $_POST['lastname'], + 'mail' => $_POST['email'], + 'userPassword' => $_POST['password'], + 'sAMAccountName' => $_POST['username'], +]; -echo "Choisir une OU
"; -echo "Rôle dans l'OU
"; - -echo ""; -echo "
"; +// Tenter la création +try { + $user_dn = "CN=" . $_POST['username'] . "," . $ou_dn; + if ($ldapAuth->addUserWithAdminAuth($user_dn, $entry, $admin_username, $_SESSION['password'])) { + header("Location: ../views/list_users.php?ou=" . urlencode($ou_dn)); + } else { + die("Erreur lors de la création."); + } +} catch (Exception $e) { + die("Erreur : " . $e->getMessage()); +} diff --git a/controllers/delete_user.php b/controllers/delete_user.php new file mode 100644 index 0000000..51fea3b --- /dev/null +++ b/controllers/delete_user.php @@ -0,0 +1,35 @@ +getUserOUFromDN($user_dn); + +if ($user_ou === null || !in_array($user_ou, $_SESSION['admin_ous'])) { + die("Accès non autorisé"); +} + +// Tenter la suppression +try { + if ($ldapAuth->deleteUserWithAdminAuth($user_dn, $admin_username, $_SESSION['password'])) { + header("Location: ../views/list_users.php?ou=" . urlencode($user_ou)); + } else { + die("Erreur lors de la suppression."); + } +} catch (Exception $e) { + die("Erreur : " . $e->getMessage()); +} diff --git a/controllers/edit_user.php b/controllers/edit_user.php new file mode 100644 index 0000000..f7e94f7 --- /dev/null +++ b/controllers/edit_user.php @@ -0,0 +1,50 @@ +getUserOUFromDN($user_dn); +if ($user_ou === null || !in_array($user_ou, $_SESSION['admin_ous'])) { + die("Accès non autorisé"); +} + +try { + if ($ldapAuth->updateUserWithAdminAuth($user_dn, $attributes, $_SESSION['sAMAccountName'], $_SESSION['password'])) { + header("Location: ../views/list_users.php?ou=" . urlencode($user_ou)); + } else { + die("Erreur lors de la modification."); + } +} catch (Exception $e) { + die("Erreur : " . $e->getMessage()); +} diff --git a/models/LDAPAuth.php b/models/LDAPAuth.php index 10ef257..5d07158 100644 --- a/models/LDAPAuth.php +++ b/models/LDAPAuth.php @@ -359,4 +359,91 @@ class LDAPAuth } return $clean; } + + public function getUserDetailsByDn($dn) + { + $this->connect(); + $this->bindServiceAccount(); + + $filter = "(objectClass=user)"; + $attributes = ["givenName", "sn", "mail", "sAMAccountName"]; + $result = ldap_read($this->ad, $dn, $filter, $attributes); + $entries = ldap_get_entries($this->ad, $result); + + return $this->cleanLdapEntries($entries[0]); + } + + public function updateUser($dn, $attributes) + { + $this->connect(); + $this->bindServiceAccount(); + + return ldap_modify($this->ad, $dn, $attributes); + } + + public function getUserOUFromDN($dn) + { + // Extraire l'OU ou le conteneur parent + $parts = explode(',', $dn); + foreach ($parts as $part) { + if (strpos($part, 'OU=') === 0) { + return $part . ",DC=epul3a,DC=local"; + } + } + // Si l'utilisateur est dans CN=Users, retourner CN=Users + if (strpos($dn, 'CN=Users,DC=epul3a,DC=local') !== false) { + return "CN=Users,DC=epul3a,DC=local"; + } + return null; + } + + public function getAdConnection() + { + return $this->ad; + } + + /** + * Supprime un utilisateur en utilisant les identifiants de l'admin connecté + */ + public function deleteUserWithAdminAuth($user_dn, $admin_username, $admin_password) + { + $this->connect(); + $this->bindWithCredentials($admin_username, $admin_password); + + if (!@ldap_delete($this->ad, $user_dn)) { + return false; + } + return true; + } + + /** + * Met à jour un utilisateur avec les identifiants de l'admin + */ + public function updateUserWithAdminAuth($user_dn, $attributes, $admin_username, $admin_password) + { + $this->connect(); + $this->bindWithCredentials($admin_username, $admin_password); + return ldap_modify($this->ad, $user_dn, $attributes); + } + + /** + * Ajoute un nouvel utilisateur avec les droits de l'admin + */ + public function addUserWithAdminAuth($dn, $entry, $admin_username, $admin_password) + { + $this->connect(); + $this->bindWithCredentials($admin_username, $admin_password); + return ldap_add($this->ad, $dn, $entry); + } + + /** + * Méthode générique pour lier la connexion avec des identifiants + */ + private function bindWithCredentials($username, $password) + { + $admin_dn = $this->getUserDN($username); // Récupérer le DN de l'admin + if (!@ldap_bind($this->ad, $admin_dn, $password)) { + throw new Exception("Erreur d'authentification : " . ldap_error($this->ad)); + } + } } diff --git a/views/add_user.php b/views/add_user.php deleted file mode 100644 index f993020..0000000 --- a/views/add_user.php +++ /dev/null @@ -1,97 +0,0 @@ - $pseudo, - 'sn' => $nom, - 'givenName' => $prenom, - 'mail' => $email, - 'userPassword' => $password, - 'objectClass' => ['top', 'person', 'organizationalPerson', 'user'] - ]; - - if (@ldap_add($ldapconn, $user_dn, $user_info)) { - echo "

Utilisateur créé avec succès dans l'OU : $ou_dn

"; - } else { - echo "

Erreur lors de la création de l'utilisateur : " . ldap_error($ldapconn) . "

"; - } - - ldap_close($ldapconn); -} else { - // Affichage du formulaire - echo "

Ajouter un utilisateur

"; - echo "
"; - echo "
"; - echo "
"; - echo "
"; - echo "
"; - echo "
"; - echo "
"; - echo "
"; - echo " "; - echo "
"; -} - -// Lien de retour -echo "

Retour au menu

"; diff --git a/views/create_user.php b/views/create_user.php new file mode 100644 index 0000000..7967083 --- /dev/null +++ b/views/create_user.php @@ -0,0 +1,46 @@ + + + + + + + + Créer un utilisateur + + + +

Créer un nouvel utilisateur

+
+ +

+ + +

+ + +

+ + +

+ + +

+ + +

+ + +
+ + + \ No newline at end of file diff --git a/views/delete_user.php b/views/delete_user.php index 7a4348a..f283f34 100644 --- a/views/delete_user.php +++ b/views/delete_user.php @@ -1,48 +1,28 @@ -if (!isset($_POST['user_dn'])) { - echo "Utilisateur non spécifié."; - exit; -} + + -$user_dn = $_POST['user_dn']; + + + Supprimer un utilisateur + -deleteUser($user_dn); // Fonction à implémenter pour supprimer l'utilisateur + +

Supprimer l'utilisateur

+

Êtes-vous sûr de vouloir supprimer cet utilisateur ?

+
+ + +
+ -echo "Utilisateur supprimé avec succès."; -header("Location: list_users.php"); -exit; - -function deleteUser($user_dn) -{ - if (session_status() == PHP_SESSION_NONE) { - session_start(); - } - - $ldapconn = ldap_connect("ldap://intranet.epul3a.local") - or die("Could not connect to LDAP server."); - - ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); - ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); - - $ldap_user = "CN=" . $_SESSION['sAMAccountName'] . ",CN=Users,DC=epul3a,DC=local"; - - if (!@ldap_bind($ldapconn, $ldap_user, $_SESSION['password'])) { - die("Could not bind to LDAP server: " . ldap_error($ldapconn)); - } - - if (!@ldap_delete($ldapconn, $user_dn)) { - die("Erreur lors de la suppression de l'utilisateur: " . ldap_error($ldapconn)); - } - - ldap_close($ldapconn); -} + \ No newline at end of file diff --git a/views/edit_user.php b/views/edit_user.php index 5559801..c57f8e5 100644 --- a/views/edit_user.php +++ b/views/edit_user.php @@ -1,40 +1,42 @@ getUserDetailsByDn($user_dn); ?> -

Modifier un utilisateur

-
- - -
+ + - -
+ + + Modifier un utilisateur + - - + +

Modifier l'utilisateur

+ + - -
\ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/list_users.php b/views/list_users.php index 4d513d5..9bd7cb2 100644 --- a/views/list_users.php +++ b/views/list_users.php @@ -36,8 +36,8 @@ if (!empty($users)) { " . ($entry['mail'][0] ?? '') . " " . ($entry['distinguishedname'][0] ?? '') . " - Modifier - Supprimer + Modifier + Supprimer "; } diff --git a/views/menu.php b/views/menu.php index 9016c78..6f11628 100644 --- a/views/menu.php +++ b/views/menu.php @@ -10,9 +10,6 @@ if (!isset($_SESSION["login"]) || $_SESSION["login"] !== true) { require_once __DIR__ . '/../controllers/controllerAdmin.php'; -// Récupérer les infos de l'utilisateur -// $user_info = getUserByPseudo($_SESSION["sAMAccountName"]); - echo "Bienvenue " . $_SESSION["sAMAccountName"] . "!"; // Affichage du menu @@ -29,43 +26,42 @@ if ($_SESSION["is_admin"]) { // Modifier la section d'affichage des OUs foreach ($_SESSION['admin_ous'] as $ou) { + preg_match('/[^=]*=([^,]*)/', $ou, $matches); + $shortName = $matches[1] ?? $ou; + echo "

Gestion de $ou

"; - echo "Voir les utilisateurs
"; - echo "Ajouter un utilisateur

"; + echo "Voir les utilisateurs dans l'OU " . $shortName . "
"; + echo "Ajouter un utilisateur dans l'OU " . $shortName . "

"; } - echo "Liste complète des utilisateurs des OU administrées
"; - - echo "
Debug - OUs administrées : ";
-    print_r($_SESSION['admin_ous']);
-    echo "
"; + echo "Liste complète des utilisateurs des OUs administrées
"; } echo ""; -if (!isset($_SESSION['sAMAccountName'])) { - die("Nom utilisateur manquant. Veuillez vous reconnecter."); -} +echo "

Profil

"; -// // Exemple : Lister toutes les OUs -// $ous = listAllOU(); -// print_r($ous); - -// // Exemple : Lister tous les utilisateurs -// $users = listAllUsers(); -// print_r($users); - -// Exemple : Récupérer l'OU d'un utilisateur -// $username = $_SESSION['sAMAccountName']; -// $ou = getUserOU($username); -// echo "OU de l'utilisateur : $ou"; - - -// Debug : Vérifier les groupes de l'utilisateur $ldapAuth = new LDAPAuth(); $user_dn = $ldapAuth->getUserDN($_SESSION['sAMAccountName']); -echo "
Groupes de l'utilisateur : ";
-print_r($ldapAuth->getUserGroups($user_dn));
-echo "
"; + +echo "

Groupes de l'utilisateur

"; +$userGroups = $ldapAuth->getUserGroups($user_dn); + +if (!empty($userGroups) && isset($userGroups['count']) && $userGroups['count'] > 0) { + echo " + + + "; + + // Skip the 'count' element and iterate through numeric indices + for ($i = 0; $i < $userGroups['count']; $i++) { + echo " + + "; + } + echo "
Groupe
" . htmlspecialchars($userGroups[$i]) . "
"; +} else { + echo "

Aucun groupe trouvé pour cet utilisateur.

"; +} // Ajouter cette section après l'affichage des groupes $user_details = $ldapAuth->getUserDetails($_SESSION['sAMAccountName']);