From b0b629bbae8f064fa384781f69b5638fac2bd6a0 Mon Sep 17 00:00:00 2001 From: Etienne Pallier Date: Tue, 26 Mar 2019 16:06:59 +0100 Subject: [PATCH] Refactorisation add()&edit() de Materiels + BUGFIX + Cleanup LDAP --- README.md | 39 ++++++++++++++++++++------------------- src/Model/Table/LdapConnectionsTable.php | 391 ++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2 files changed, 44 insertions(+), 386 deletions(-) diff --git a/README.md b/README.md index cce6466..7ae4715 100644 --- a/README.md +++ b/README.md @@ -53,28 +53,29 @@ Logiciel testé et validé sur les configurations suivantes : VERSION ACTUELLE -Date: 25/03/2019 -Version: 2.11.2 +Date: 26/03/2019 +Version: 2.12.0 Author: EP - Refactorisation des actions add() et edit() de MaterielsController + BUGFIX gestionnaire +Refactorisation de add() et edit() de Materiels + BUGFIX gestionnaire + Cleanup LDAP - DESCRIPTION : - - Refactorisation des actions add() et edit() de MaterielsController en une seule fonction add_or_edit() car elles étaient très semblables - - Gestionnaire de reference : maintenant bien sauvegardé (avant il était perdu...) +DESCRIPTION : + - GROS CLEANUP du code LDAP dans LdapConnectionsTable.php + - REFACTORISATION des actions add() et edit() de MaterielsController en une seule fonction add_or_edit() car elles étaient très semblables + - BUGFIX Gestionnaire de reference : maintenant bien sauvegardé (avant il était perdu...) - IMPORTANT : - - Pour connaitre la version actuelle, taper "./VERSION" - - Pour mettre à jour le code, utiliser ./UPDATE depuis la racine du projet (ne plus se contenter de faire "git pull") - (UPDATE fait "git pull" mais il met aussi à jour la BD, seulement si nécessaire) - - Pour s'assurer que la version récupérée est stable, taper "./TESTS.sh" (tout doit passer ok) - - En cas de problème, taper ./SHOW_LOGS pour voir si les logs d'erreur peuvent aider - - Pour que "./TESTS.sh" s'exécute sans "deprecated error", - il faut ajouter cette ligne dans la clé 'Error' de votre fichier config/app.php - 'Error' => [ - ... - 'errorLevel' => E_ALL & ~E_USER_DEPRECATED, - ... - ], +IMPORTANT : + - Pour connaitre la version actuelle, taper "./VERSION" + - Pour mettre à jour le code, utiliser ./UPDATE depuis la racine du projet (ne plus se contenter de faire "git pull") + (UPDATE fait "git pull" mais il met aussi à jour la BD, seulement si nécessaire) + - Pour s'assurer que la version récupérée est stable, taper "./TESTS.sh" (tout doit passer ok) + - En cas de problème, taper ./SHOW_LOGS pour voir si les logs d'erreur peuvent aider + - Pour que "./TESTS.sh" s'exécute sans "deprecated error", + il faut ajouter cette ligne dans la clé 'Error' de votre fichier config/app.php : + 'Error' => [ + ... + 'errorLevel' => E_ALL & ~E_USER_DEPRECATED, + ... + ], Version majeure en cours : 2.10 (https://projects.irap.omp.eu/versions/207) diff --git a/src/Model/Table/LdapConnectionsTable.php b/src/Model/Table/LdapConnectionsTable.php index be2e651..a2707e0 100755 --- a/src/Model/Table/LdapConnectionsTable.php +++ b/src/Model/Table/LdapConnectionsTable.php @@ -1,32 +1,12 @@ get() - - * - */ - - - - use Cake\ORM\Table; use Cake\ORM\TableRegistry; use Cake\Auth\DefaultPasswordHasher; use Cake\Core\Exception\Exception; + class LdapConnectionsTable extends AppTable { @@ -230,35 +210,6 @@ class LdapConnectionsTable extends AppTable return TRUE; } - /** - * @return $users_fetched or FALSE - // REAL or FAKE LDAP - public function getAllLdapUsersOLD() - { - try { - if ($this->checkConfiguration()) { - - // REAL LDAP - if ($this->LDAP_USED) { - - $ldapConnection = ldap_connect($this->host, $this->port); - ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); - - $results = ldap_search($ldapConnection, $this->baseDn, $this->filter); - - $res = ldap_get_entries($ldapConnection, $results); - } // FAKE LDAP - else { - $res = $this->fakeLDAPUsers; - } - return $res; - } - } - catch (Exception $e) {} - - return false; - } - */ /** * @return $users_fetched or FALSE @@ -281,18 +232,7 @@ class LdapConnectionsTable extends AppTable // CACHE the new user in DB for next time if ($users_fetched !== FALSE) $this->saveAllUsersInDB($users_fetched); } - /* - $ldapConnection = ldap_connect($this->host, $this->port); - ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); - - // Binding optionnel - if ($this->ldap_authentified) $ldapbind = ldap_bind($ldapConnection, $this->bindDn, $this->bindPass) - or die("Could not bind to LDAP server.". ldap_error($ldapConnection) ); - - $results = ldap_search($ldapConnection, $this->baseDn, $this->filter); - - $res = ldap_get_entries($ldapConnection, $results); - */ + } // FAKE LDAP @@ -310,113 +250,7 @@ class LdapConnectionsTable extends AppTable return FALSE; } - - /* - // REAL LDAP only - // TODO: avirer, VIEUX CODE, à remplacer par getLdap1UserOrAllUsersAttributes() - // $userName = login - public function getUserAttributes($ldapConnection, $userName) - { - try { - - if ($this->checkConfiguration()) { - //if ($this->LDAP_USED) { - //$ldapConnection = ldap_connect($this->host, $this->port); - //ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); - $results = ldap_search($ldapConnection, $this->baseDn, '(' . $this->authenticationType . '=' . $userName . ')'); - return ldap_get_entries($ldapConnection, $results); - /STAR - } else - return array( - $this->getFakeLdapUser($userName) - ); - STAR/ - } - } catch (Exception $e) {} - - return false; - } - */ - - - - /* - //CALL : $filter = "(&".$this->filter."(".$this->authenticationType . '=' . $user_login."))"; - - // REAL LDAP only - /ST - * @param string $ldapConnection - * @param string $filter - * @param array $just_these - * @param string $userName (= login) => for FAKE LDAP only - * @return $res = ldap search result (1 user or all users attributes) or FALSE - ST/ - //public function getUserAttributes($userName, $ldapConnection='', $filter='', $just_these=[]) - //public function getUserAttributes($ldapConnection='', $filter='', $just_these=[], $userName=NULL) - //public function getLdapUsersAttributes($ldapConnection, $filter='', $just_these=[]) - public function getLdap1UserOrAllUsersAttributes($ldapConnection, $user_login, $filter='', $just_these=[]) - { - try { - if ($this->checkConfiguration()) { - - // LDAP mode - //if ($this->LDAP_USED) { - /ST (EP) - Fonction ldap_search ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) - Concernant le paramètre $attributes (ici, $just_these) : - - An array of the required attributes, e.g. array("mail", "sn", "cn"). - - Note that the "dn" is always returned irrespective of which attributes types are requested. - Telle que notre connexion au LDAP est conçue, on s'attend à recevoir AU MINIMUM - ces attributs dans la réponse de la fonction ldap_search(): - - 'sn' - - 'mail' - - 'givenname' - - 'uid' - - 'userpassword' - Pour récupérer tous ces attributs, il ne faut pas utiliser la variable $just_these, - ou alors il faut qu'elle soit égale à un tableau vide ([]). - (par exemple, si elle vaut "['cn']" ça signifie qu'on veut "seulement l'attribut 'cn'") - Quand on n'utilise pas $just_these, la fonction ldap_search() retourne TOUS les attributs disponibles, - donc c'est le comportement qu'on veut ici. - ST/ - - //$ldapConnection = ldap_connect($this->host, $this->port); - //ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); - // OLD: $results = ldap_search($ldapConnection, $this->baseDn, '(' . $this->authenticationType . '=' . $userName . ')'); - // NEW: $filter = "(&".$this->filter."(".$this->authenticationType . '=' . $user_login."))"; - - // OLD à virer - /ST - $filter = '(' . $this->authenticationType . '=' . $user_login . ')'; - $just_these = []; - $results = ldap_search($ldapConnection, $this->baseDn, $filter); - return ldap_get_entries($ldapConnection, $results); - ST/ - - // $filter = "(&".$this->filter. "(".$this->authenticationType . '=' . $user_login."))"; - $results = ldap_search($ldapConnection, $this->baseDn, $filter, $just_these) - or die("Could not search to LDAP server response was: " . ldap_error($ldapConnection) ); - $res = ldap_get_entries($ldapConnection, $results); - //echo $info["count"]." entries returned\n"; - return $res; - //} - - // FAKE LDAP mode - //else return array( $this->getFakeLdapUser($userName) ); - //else return $this->fakeLDAPUsers; - - } - } catch (Exception $e) { - //echo 'Exception LDAP : ', $e->getMessage(), "\n"; - } - - return false; - } - */ - - - public function getAuthenticationType() { return $this->authenticationType; @@ -563,96 +397,47 @@ class LdapConnectionsTable extends AppTable - /* - CALL - - $filter = "(&".$this->filter."(".$this->authenticationType . '=' . $user_login."))"; - //TODO: optimisation, refactoriser si comportement général - //$binddn .= ','.$this->baseDn; - $user_fetched = $this->searchLdap($filter, $just_these, $user_login, $user_password); - */ - - - // REAL LDAP only + // SEARCH en 4 étapes private function searchLdap($filter, $just_these, $user_login=NULL, $user_password=NULL) { - /* - * OLD CODE QUI MARCHE - - $ldapConnection = ldap_connect($this->host, $this->port); - ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); - - - From ldapAuthentication(): - if (@ldap_bind($ldapConnection, $this->authenticationType . '=' . $user_login . ',' . $this->baseDn, $user_password)) - return $this->getUserAttributes($user_login)[0]; - - - From getUserAttributes(): - $results = ldap_search($ldapConnection, $this->baseDn, $this->filter); - $search = ldap_get_entries($ldapConnection, $results); - - */ - - // CONNEXION + // (1) CONNEXION $ldapConnection = ldap_connect($this->host, $this->port) or die("Could not connect to $this->host (port $this->port)"); if ($ldapConnection) { - // OPTIONS + // (2) SET OPTIONS ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); - // BINDING + // (3) BINDING OPTIONNEL (true by default if not done) $ldapbind = TRUE; + // - Authentified LDAP + // (EP) ATTENTION: Ne pas faire die() ici car ça stopperait net la mauvaise connexion d'un utilisateur, avec ce message d'erreur ! + // Il vaut mieux retourner FALSE et afficher un joli message de refus sur la page d'accueil if ($this->ldap_authentified) - // - Authentified - $ldapbind = ldap_bind($ldapConnection, $this->bindDn, $this->bindPass) - or die("Could not bind to LDAP server.". ldap_error($ldapConnection) ); - - else { - // - Anonymous - // En cas de LDAP anonyme, binding quand même pour vérifier le mot de passe de l'utilisateur. - // Sans cette ligne, on passe avec n'importe quel password !!! - if ($user_login && $user_password) - $ldapbind = ldap_bind($ldapConnection, $this->authenticationType . '=' . $user_login . ',' . $this->baseDn, $user_password); + //$ldapbind = @ldap_bind($ldapConnection, $this->bindDn, $this->bindPass); + $ldapbind = ldap_bind($ldapConnection, $this->bindDn, $this->bindPass); + //or die("Could not bind to LDAP server.". ldap_error($ldapConnection) ); + + // - Anonymous LDAP + // (EP) En cas de LDAP anonyme, binding uniquement si login session (pour vérifier le mot de passe de l'utilisateur). + // Car sans cette ligne, on passe avec n'importe quel password !!! + // NB: pas de die() ici, voir remarque juste au-dessus + else if ($user_login && $user_password) + //$ldapbind = @ldap_bind($ldapConnection, $this->authenticationType . '=' . $user_login . ',' . $this->baseDn, $user_password); + $ldapbind = ldap_bind($ldapConnection, $this->authenticationType . '=' . $user_login . ',' . $this->baseDn, $user_password); // or die("Could not bind to LDAP server: ". ldap_error($ldapConnection) ); - // (EP) Ne pas faire die() ici car ça stopperait net la mauvaise connexion d'un utilisateur, avec ce message d'erreur - // Il vaut mieux retourner FALSE et afficher un joli message de refus sur la page d'accueil - /* - else { - $ldapbind = TRUE; - // function ldap_bind ($link_identifier, $bind_rdn = null, $bind_password = null) - //debug("log, pass= " . $user_login . ' ' . $user_password); - //if ($user_login && $user_password) $ldapbind = ldap_bind($ldapConnection, $this->authenticationType.'='.$user_login, $user_password); - if ($user_login && $user_password) $ldapbind = ldap_bind($ldapConnection, $this->authenticationType . '=' . $user_login . ',' . $this->baseDn, $user_password); - //debug("ldapbind " . $ldapbind); - } - */ - } - // SEARCH + // (4) SEARCH if ($ldapbind) { - - // OLD - //$search = $this->getUserAttributes($ldapConnection, $user_login); - // NEW - //$search = $this->getLdap1UserOrAllUsersAttributes($ldapConnection, $user_login, $filter, $just_these); - - // OLD à virer - /* - $filter = '(' . $this->authenticationType . '=' . $user_login . ')'; - $just_these = []; - $results = ldap_search($ldapConnection, $this->baseDn, $filter); - return ldap_get_entries($ldapConnection, $results); - */ // $filter = "(&".$this->filter."(".$this->authenticationType . '=' . $user_login."))"; // ex: (&(compteinfo=Oui)(uid=epallier)) $results = ldap_search($ldapConnection, $this->baseDn, $filter, $just_these) or die("Could not search to LDAP server response was: " . ldap_error($ldapConnection) ); $search = ldap_get_entries($ldapConnection, $results); - //echo $info["count"]." entries returned\n"; - + //echo $results["count"]." entries returned\n"; if ($search === FALSE) die("Could not get user attributes from LDAP server, response was: " . ldap_error($ldapConnection) ); //return $search[0]; return $search; @@ -662,76 +447,7 @@ class LdapConnectionsTable extends AppTable // Il y a eu un pb, utilisateur non reconnu return FALSE; - - } - - - - // REAL LDAP only - /* - private function checkAndFetchUserFromLdap($user_login, $user_password) { - // Set LDAP parameters - // - Liste des attributs à récupérer dans le ldap (vide = TOUS les attributs) - $just_these = []; - // TODO: vérifier si cette ligne est bien utile ou pas... (avant on faisait ça) - //if (! $this->ldap_authentified) $just_these = array("cn"); - - /* Examples : - * - * - ANONYMOUS LDAP (IRAP) : - * $this->authenticationType = 'uid' - * $this->baseDn = "ou=users,dc=irap,dc=omp,dc=eu" - * - * - AUTHENTIFIED LDAP connection (CRAL) : - * $this->authenticationType = 'sAMAccountName' - * $this->baseDn = "dc=univ-lyon1,dc=fr" - * $binddn="CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1,DC=univ-lyon1,DC=fr"; - * ($binddn = "CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1,".$this->baseDn;) - * $filter = "(&(objectClass=person)(memberOf:1.2.840.113556.1.4.1941:=cn=ucbl.osu.cral,ou=groups,ou=27,ou=sim,ou=univ-lyon1,dc=univ-lyon1,dc=fr))"; - STAR/ - // Construction du filtre avec le filtre de la base de données avec un & sur le login de l'utilisateur - // Si aucun filtre n'est défini dans la base de données on aura juste (& ($this->authenticationType=$user_login)) - // ex: "(&(objectClass=person)(memberOf:1.2.840.113556.1.4.1941:=cn=ucbl.osu.cral,ou=groups,ou=27,ou=sim,ou=univ-lyon1,dc=univ-lyon1,dc=fr)(sAMAccountName=$user_login))"; - $filter = "(&".$this->filter."(".$this->authenticationType . '=' . $user_login."))"; - - //TODO: optimisation, refactoriser si comportement général - //$binddn .= ','.$this->baseDn; - - $res = $this->searchLdap($filter, $just_these, $user_login, $user_password); - if ($res != FALSE) return $res[0]; - - /* - // CONNEXION - $ldapConnection = ldap_connect($this->host, $this->port) - or die("Could not connect to $this->host (port $this->port)"); - - if ($ldapConnection) { - - // OPTIONS - ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); - - // BINDING - if ($this->ldap_authentified) - $ldapbind = ldap_bind($ldapConnection, $this->bindDn, $this->bindPass); // or die("Could not bind to LDAP server.". ldap_error($ldapConnection) ); - // En cas de LDAP anonyme, binding quand même pour vérifier le mot de passe de l'utilisateur. - // Sans cette ligne, on passe avec n'importe quel password !!! - else - $ldapbind = ldap_bind($ldapConnection, $this->authenticationType.'='.$user_login, $user_password); - - // SEARCH - if ($ldapbind) { - $search = $this->getUserAttributes($user_login, $ldapConnection, $filter, $just_these); - if ($search === false) die("Could not get user attributes from LDAP server, response was: " . ldap_error($ldapConnection) ); - return $search[0]; - } - - } - STAR/ - - // Il y a eu un pb, utilisateur non reconnu - return FALSE; - } - */ + } // searchLdap() // TODO: implement @@ -741,51 +457,6 @@ class LdapConnectionsTable extends AppTable } - - - /* - * @param string $user_login - * @param string $user_password - * @return logged user LDAP attributes or FALSE if user not found in LDAP - */ - /* - public function ldapAuthenticationOLD($user_login, $user_password) { - try { - if ($this->checkConfiguration()) { - if ($this->LDAP_USED) { - if (strlen(trim($user_password)) == 0) - return FALSE; - $ldapConnection = ldap_connect($this->host, $this->port); - ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); - if (@ldap_bind($ldapConnection, $this->authenticationType . '=' . $user_login . ',' . $this->baseDn, $user_password)) { - return $this->getUserAttributes($user_login)[0]; - /STAR - * } else { - * return false; - STAR/ - } - } else { - $user = $this->getFakeLdapUser($user_login); - // debug($user); - if ($user === false) - return FALSE; - // $this->authenticationType peut valoir "uid" ou "cn"... (par défaut "uid" pour le fake ldap, à confirmer...) - // if ($user['uid'][0] == "_NouvelUtilisateur_username" && $user['userpassword'][0] == "_NouvelUtilisateur_password") return $user; - // if ($user[$this->authenticationType][0] == "_NouvelUtilisateur_username" && $user['userpassword'][0] == "_NouvelUtilisateur_password") return $user; - if ($user[$this->authenticationType][0] == $this->getTheFakeLdapUser()['login'] && $user['userpassword'][0] == $this->getTheFakeLdapUser()['pass']) - return $user; - if ((new DefaultPasswordHasher())->check($user_password, $user['userpassword'][0])) - return $user; - // if ($user != false && $user['userpassword'][0] == $password) { - } - } - } catch (Exception $e) { - //echo 'Exception LDAP : ', $e->getMessage(), "\n"; - } - // Il y a eu un problème, l'utilisateur n'est pas reconnu - return FALSE; - } // end ldapAuthentication() - */ /* * @param string $user_login @@ -802,20 +473,7 @@ class LdapConnectionsTable extends AppTable // No connexion allowed without password if (strlen(trim($user_password)) == 0) return FALSE; - - /* - // VIEUX CODE QUI MARCHE !!! - $ldapConnection = ldap_connect($this->host, $this->port); - ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); - if (@ldap_bind($ldapConnection, $this->authenticationType . '=' . $user_login . ',' . $this->baseDn, $user_password)) { - return $this->getUserAttributes($user_login)[0]; - /STAR - * } else { - * return false; - STAR/ - } - */ - + // TODO: optimisation possible // 1) Search user in CACHE (DB) $user_fetched = $this->checkAndFetchUserFromDB($user_login, $user_password); @@ -870,7 +528,6 @@ class LdapConnectionsTable extends AppTable return FALSE; } // end ldapAuthentication() - -- libgit2 0.21.2