diff --git a/controllers/auth.php b/controllers/auth.php index 213f7ff..5bed0e6 100644 --- a/controllers/auth.php +++ b/controllers/auth.php @@ -24,7 +24,7 @@ class AuthController $_SESSION['is_admin'] = $result['is_admin']; $_SESSION['admin_ous'] = $result['admin_ous']; // Stocker les OUs administrables $_SESSION['password'] = $_POST['user_password']; - header('Location: /index.php'); + header('Location: ../views/menu.php'); exit; } else { $error_message = 'Identifiants incorrects'; diff --git a/controllers/controllerAdmin.php b/controllers/controllerAdmin.php index 7843127..c933add 100644 --- a/controllers/controllerAdmin.php +++ b/controllers/controllerAdmin.php @@ -18,3 +18,26 @@ function getUserOU($username) $ldapAuth = new LDAPAuth(); return $ldapAuth->getUserOU($username); } + +function listUsers() +{ + if (!isset($_SESSION["is_admin"])) { + die("Accès non autorisé"); + } + + $ldapAuth = new LDAPAuth(); + + if (isset($_GET['ou'])) { + // Lister les utilisateurs d'une OU spécifique + $ou_dn = urldecode($_GET['ou']); + if (!in_array($ou_dn, $_SESSION['admin_ous'])) { + die("Vous n'avez pas les droits sur cette OU"); + } + $users = $ldapAuth->listUsersByOU($ou_dn); + } else { + // Lister tous les utilisateurs des OUs administrées + $users = $ldapAuth->listUsersByOUs($_SESSION['admin_ous']); + } + + return $users; +} diff --git a/models/LDAPAuth.php b/models/LDAPAuth.php index 509ac6f..333e535 100644 --- a/models/LDAPAuth.php +++ b/models/LDAPAuth.php @@ -70,39 +70,36 @@ class LDAPAuth private function isUserAdmin($user_dn) { - $this->connect(); - $this->bindServiceAccount(); - - // Vérifier l'attribut adminCount - $filter = "(objectClass=user)"; - $attributes = ["adminCount"]; - - $result = ldap_read($this->ad, $user_dn, $filter, $attributes); - $entries = ldap_get_entries($this->ad, $result); - - if ($entries['count'] > 0 && isset($entries[0]['admincount'][0]) && $entries[0]['admincount'][0] == 1) { - return true; // L'utilisateur est un administrateur - } - - // Vérifier les groupes d'administration $admin_groups = [ "CN=Domain Admins,CN=Users,DC=epul3a,DC=local", "CN=Enterprise Admins,CN=Users,DC=epul3a,DC=local", "CN=Schema Admins,CN=Users,DC=epul3a,DC=local", - "CN=Group Policy Creator Owners,CN=Users,DC=epul3a,DC=local", + "CN=Group Policy Creator Owners,CN=Users,DC=epul3a,DC=local" ]; - foreach ($admin_groups as $admin_group_dn) { - $filter = "(memberOf:1.2.840.113556.1.4.1941:=$admin_group_dn)"; // Vérification récursive - $attributes = ["memberOf"]; - - $result = ldap_read($this->ad, $user_dn, $filter, $attributes); + foreach ($admin_groups as $group_dn) { + $filter = "(memberOf:1.2.840.113556.1.4.1941:=$group_dn)"; + $result = ldap_read($this->ad, $user_dn, $filter, ["memberOf"]); if ($result && ldap_count_entries($this->ad, $result) > 0) { - return true; // L'utilisateur appartient à un groupe d'administration + return true; } } - return false; // L'utilisateur n'est pas un administrateur + return false; + } + + public function getUserGroups($user_dn) + { + $this->connect(); + $this->bindServiceAccount(); + + $filter = "(objectClass=*)"; + $attributes = ["memberOf"]; + + $result = ldap_read($this->ad, $user_dn, $filter, $attributes); + $entries = ldap_get_entries($this->ad, $result); + + return $entries[0]['memberof'] ?? []; } private function getAdminOUs($user_dn) @@ -110,20 +107,18 @@ class LDAPAuth $this->connect(); $this->bindServiceAccount(); - // Liste des groupes administratifs et leurs OUs associées + // Mappage explicite des groupes d'administration vers les OUs $admin_groups_with_ous = [ - "CN=Domain Admins,CN=Users,DC=epul3a,DC=local" => "OU=Domain Admins,DC=epul3a,DC=local", - "CN=Enterprise Admins,CN=Users,DC=epul3a,DC=local" => "OU=Enterprise Admins,DC=epul3a,DC=local", - "CN=Schema Admins,CN=Users,DC=epul3a,DC=local" => "OU=Schema Admins,DC=epul3a,DC=local", - "CN=Group Policy Creator Owners,CN=Users,DC=epul3a,DC=local" => "OU=Group Policy Creator Owners,DC=epul3a,DC=local", + "CN=Domain Admins,CN=Users,DC=epul3a,DC=local" => "OU=3AFISA,DC=epul3a,DC=local", // Domain Admins → OU=3AFISA + "CN=Enterprise Admins,CN=Users,DC=epul3a,DC=local" => "CN=Users,DC=epul3a,DC=local", + // Ajoutez d'autres groupes si nécessaire ]; $admin_ous = []; foreach ($admin_groups_with_ous as $group_dn => $ou) { - $filter = "(memberOf:1.2.840.113556.1.4.1941:=$group_dn)"; - $attributes = ["memberOf"]; + $filter = "(memberOf:1.2.840.113556.1.4.1941:=$group_dn)"; // Vérification récursive + $result = ldap_read($this->ad, $user_dn, $filter, ["memberOf"]); - $result = ldap_read($this->ad, $user_dn, $filter, $attributes); if ($result && ldap_count_entries($this->ad, $result) > 0) { $admin_ous[] = $ou; } @@ -132,6 +127,45 @@ class LDAPAuth return array_unique($admin_ous); } + private function getOUACL($ou_dn) + { + $filter = "(objectClass=organizationalUnit)"; + $attributes = ["nTSecurityDescriptor"]; + + $result = @ldap_read($this->ad, $ou_dn, $filter, $attributes); // Ajoutez @ pour supprimer les warnings + + if (!$result) { + return null; // Retourne null si la lecture échoue + } + + $entries = ldap_get_entries($this->ad, $result); + + if ($entries['count'] > 0 && isset($entries[0]['ntsecuritydescriptor'][0])) { + return $entries[0]['ntsecuritydescriptor'][0]; // Retourne les ACL + } + + return null; // Retourne null si aucune ACL n'est trouvée + } + + private function hasAdminRights($acl, $user_dn) + { + // Si les ACL sont null, retourne false + if ($acl === null) { + return false; + } + + // Convertir l'ACL en un format exploitable + // Note : Cette partie dépend de la manière dont les ACL sont stockées dans votre AD + // Vous devrez peut-être utiliser une bibliothèque pour parser l'ACL + + // Exemple simplifié : Vérifier si l'utilisateur a le droit "WriteProperty" ou "GenericAll" + if (strpos($acl, $user_dn) !== false && (strpos($acl, "WriteProperty") !== false || strpos($acl, "GenericAll") !== false)) { + return true; + } + + return false; + } + public function getAllOUs() { $this->connect(); @@ -241,4 +275,59 @@ class LDAPAuth return null; } + + public function listUsersByOUs(array $admin_ous) + { + $this->connect(); + $this->bindServiceAccount(); + + $users = []; + foreach ($admin_ous as $ou) { + $searchBase = $ou; + $filter = "(objectClass=user)"; + $attributes = ["cn", "sn", "givenName", "mail", "distinguishedName"]; + + $result = ldap_search($this->ad, $searchBase, $filter, $attributes); + $entries = ldap_get_entries($this->ad, $result); + + if ($entries['count'] > 0) { + foreach ($entries as $key => $entry) { + if (is_numeric($key)) { + $users[] = $entry; + } + } + } + } + + return $users; + } + + public function listUsersByOU($ou_dn) + { + $this->connect(); + $this->bindServiceAccount(); + + $searchBase = $ou_dn; + $filter = "(objectClass=user)"; + $attributes = ["cn", "sn", "givenName", "mail", "distinguishedName"]; + + $result = @ldap_search($this->ad, $searchBase, $filter, $attributes); + + if (!$result) { + return []; + } + + $entries = ldap_get_entries($this->ad, $result); + $users = []; + + if ($entries['count'] > 0) { + for ($i = 0; $i < $entries['count']; $i++) { + if (!empty($entries[$i]['distinguishedname'][0])) { + $users[] = $entries[$i]; + } + } + } + + return $users; + } } diff --git a/views/add_user.php b/views/add_user.php new file mode 100644 index 0000000..f993020 --- /dev/null +++ b/views/add_user.php @@ -0,0 +1,97 @@ + $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/list_users.php b/views/list_users.php index 3841519..4d513d5 100644 --- a/views/list_users.php +++ b/views/list_users.php @@ -1,46 +1,49 @@ Gestion des utilisateurs"; +// Afficher le tableau des utilisateurs +echo "

Gestion des utilisateurs

"; -// Display users table -echo " - - - - - - "; - -$users = listAllUsers(); -foreach ($users as $user) { - $name = htmlspecialchars($user['cn'][0]); - $email = htmlspecialchars($user['mail'][0] ?? 'N/A'); - $ou = htmlspecialchars($user['ou']); - $dn = htmlspecialchars($user['distinguishedname'][0]); - - echo " - - - - - "; +if (isset($_GET['ou'])) { + echo "

OU : " . htmlspecialchars(urldecode($_GET['ou'])) . "

"; } -echo "
NomEmailOUActions
$name$email$ou -
- - -
-
- - -
-
"; + +if (!empty($users)) { + echo ""; + echo " + + + + + + "; + + foreach ($users as $entry) { + if (!is_array($entry)) continue; + + echo " + + + + + + "; + } + echo "
NomPrénomEmailDNActions
" . ($entry['sn'][0] ?? '') . "" . ($entry['givenname'][0] ?? '') . "" . ($entry['mail'][0] ?? '') . "" . ($entry['distinguishedname'][0] ?? '') . " + Modifier + Supprimer +
"; +} else { + echo "

Aucun utilisateur trouvé dans cette OU.

"; +} + +echo "

Retour au menu

"; diff --git a/views/menu.php b/views/menu.php index b9615d5..09f3e6a 100644 --- a/views/menu.php +++ b/views/menu.php @@ -1,6 +1,10 @@ "; - // Afficher les actions par OU + // Modifier la section d'affichage des OUs foreach ($_SESSION['admin_ous'] as $ou) { echo "

Gestion de $ou

"; - echo "Gérer les utilisateurs"; + echo "Voir les utilisateurs
"; + echo "Ajouter un utilisateur"; } - echo "
  • Liste des utilisateurs
  • "; - echo "
  • Ajouter un utilisateur
  • "; + echo "
  • Liste complète des utilisateurs
  • "; + echo "
  • Ajouter un utilisateur
  • "; + + + echo "
    Debug - OUs administrées : ";
    +    print_r($_SESSION['admin_ous']);
    +    echo "
    "; } echo ""; @@ -51,6 +61,14 @@ if (!isset($_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 "
    "; + // Bouton de déconnexion echo "
    "; echo "";