From a5909c57f482b343e5fa4b3fbc5d5b33f2bb9bfd Mon Sep 17 00:00:00 2001 From: Etienne Pallier Date: Thu, 14 Feb 2019 13:05:12 +0100 Subject: [PATCH] bugfix ldap goes on... (+ optim & refactor) --- README.md | 10 ++++++---- src/Controller/MaterielsController.php | 71 +++++++++++++++++++++++++++++++++++++++++------------------------------ src/Controller/UsersController.php | 2 +- src/Model/Table/LdapConnectionsTable.php | 21 +++++++++++++-------- src/Template/Materiels/add.ctp | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++------------------ src/Template/Materiels/edit.ctp | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------- webroot/js/Verifications_dates_materiels.js | 2 ++ 7 files changed, 181 insertions(+), 83 deletions(-) diff --git a/README.md b/README.md index 0874c5a..9212311 100644 --- a/README.md +++ b/README.md @@ -53,12 +53,14 @@ Logiciel testé et validé sur les configurations suivantes : VERSION ACTUELLE -Date: 13/02/2019 -Version: 2.10.9.bugfix1 +Date: 14/02/2019 +Version: 2.10.10.bugfix2 Author: EP - Bugfix LDAP anonyme et refactorisation + (version IRAP only) Bugfix LDAP anonyme, refactorisation, et optimisation + + - LDAP anonyme se faisait sans vérifier le mot de passe utilisateur !!! + - Optimisation update email sur changement de responsable => LDAP et AJAX inutile, on fait avec un tableau local - LDAP anonyme se faisait sans vérifier le mot de passe utilisateur !!! 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") diff --git a/src/Controller/MaterielsController.php b/src/Controller/MaterielsController.php index 1d3d888..01328e1 100755 --- a/src/Controller/MaterielsController.php +++ b/src/Controller/MaterielsController.php @@ -805,24 +805,20 @@ class MaterielsController extends AppController $domaineresp = false; $utilisateurconnect = TableRegistry::get('Users')->find('all')->toArray(); - $users = TableRegistry::get('LdapConnections')->getListUsers(); - //sort($users); - + // TODO: code redondant avec edit(), à factoriser + // HOWTO: https://book.cakephp.org/3.0/en/orm.html + //$users = TableRegistry::get('LdapConnections')->getListUsers(); //$users = TableRegistry::get('LdapConnections')->getUsersWithNameAndEmail(); - //$user_names = array_keys($users); - //sort($user_names); - // tri des utilisateurs par nom - //sort($users); - //debug($users); - $utilisateurs = $users; - /* - $utilisateurs = []; - for ($i = 0; $i < sizeof($users); $i ++) { - // $utilisateurs["Etienne Pallier"] = "Etienne Pallier" - $utilisateurs[$users[$i]] = $users[$i]; + $users_name_and_email = TableRegistry::getTableLocator()->get('LdapConnections')->getUsersWithNameAndEmail(); + $users_name = array_keys($users_name_and_email); + $users_option_list = []; + for ($i = 0; $i < sizeof($users_name); $i ++) { + // $users_option_list["Etienne Pallier"] = "Etienne Pallier" + $users_option_list[$users_name[$i]] = $users_name[$i]; } - */ - + // no more needed + $users_name = NULL; //unset($users_name); + // Ne pas commenter la ligne suivante, on en a besoin dans add.cpt $mail_responsable = TableRegistry::get('Users')->find() ->select('email') @@ -846,9 +842,7 @@ class MaterielsController extends AppController 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'mail_responsable', 'domaineresp', 'lieu_detail', 'fournisseurs', - //'users', - //'user_names', - 'utilisateurs' + 'users_name_and_email', 'users_option_list' )); $this->set('_serialize', [ 'materiel' @@ -1000,26 +994,35 @@ class MaterielsController extends AppController ]) ->first()['role']; + /* NUL, franchement faudrait reflechir un peu quand meme, ya des limites !!! if ($dom == $domaines) $domaineresp = true; else $domaineresp = false; - $users = TableRegistry::get('LdapConnections')->getListUsers(); - - // tri des utilisateurs par nom - sort($users); - $utilisateurs = []; - for ($i = 0; $i < sizeof($users); $i ++) { - $utilisateurs[$users[$i]] = $users[$i]; + */ + $domaineresp = ($dom == $domaines); + + // TODO: code redondant avec add(), à factoriser + // HOWTO: https://book.cakephp.org/3.0/en/orm.html + //$users = TableRegistry::get('LdapConnections')->getListUsers(); + //$users = TableRegistry::get('LdapConnections')->getUsersWithNameAndEmail(); + $users_name_and_email = TableRegistry::getTableLocator()->get('LdapConnections')->getUsersWithNameAndEmail(); + $users_name = array_keys($users_name_and_email); + $users_option_list = []; + for ($i = 0; $i < sizeof($users_name); $i ++) { + // $users_option_list["Etienne Pallier"] = "Etienne Pallier" + $users_option_list[$users_name[$i]] = $users_name[$i]; } - + if (! empty($materiel->get('nom_responsable'))) { - if (! in_array($materiel->get('nom_responsable'), $utilisateurs)) { + //if (! in_array($materiel->get('nom_responsable'), $utilisateurs)) { + if (! in_array($materiel->get('nom_responsable'), $users_name)) { $nom_ancien_responsable = $materiel->get('nom_responsable'); $this->set(compact('nom_ancien_responsable')); } } - $mail_responsable = TableRegistry::get('Users')->find() + //$mail_responsable = TableRegistry::get('Users')->find() + $mail_responsable = TableRegistry::getTableLocator()->get('Users')->find() ->select('email') ->where([ 'username =' => $this->LdapAuth->user($this->request->getSession() @@ -1044,7 +1047,15 @@ class MaterielsController extends AppController 'TOBEARCHIVED', 'ARCHIVED' ])); - $this->set(compact('materiel', 'surCategories', 'categories', 'sousCategories', 'groupesThematiques', 'groupesMetiers', 'organismes', 'sites', 'utilisateurs', 'mail_responsable', 'role', 'domaineresp', 'designation_edit', 'designation', 'lieu_detail', 'lieu_detail_edit', 'fournisseurs')); + $this->set(compact( + 'materiel', + 'surCategories', 'categories', 'sousCategories', + 'groupesThematiques', 'groupesMetiers', + 'organismes', 'sites', + 'mail_responsable', 'role', 'domaineresp', 'designation_edit', 'designation', 'lieu_detail', 'lieu_detail_edit', 'fournisseurs', + //'utilisateurs', + 'users_name_and_email', 'users_option_list' + )); $this->set('_serialize', [ 'materiel' ]); diff --git a/src/Controller/UsersController.php b/src/Controller/UsersController.php index 99fcde9..4df7b42 100755 --- a/src/Controller/UsersController.php +++ b/src/Controller/UsersController.php @@ -66,7 +66,7 @@ class UsersController extends AppController if ($this->request->is('post')) { $user = $this->LdapAuth->connection(); - // debug($user); + //debug($user); // Utilisateur identifié if ($user != FALSE) { diff --git a/src/Model/Table/LdapConnectionsTable.php b/src/Model/Table/LdapConnectionsTable.php index a551d79..6e7e8ca 100755 --- a/src/Model/Table/LdapConnectionsTable.php +++ b/src/Model/Table/LdapConnectionsTable.php @@ -256,7 +256,7 @@ class LdapConnectionsTable extends AppTable } - + // TODO: avirer, VIEUX CODE, à remplacer par getLdap1UserOrAllUsersAttributes() // $userName = login public function getUserAttributes($userName) { @@ -268,10 +268,12 @@ class LdapConnectionsTable extends AppTable ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); $results = ldap_search($ldapConnection, $this->baseDn, '(' . $this->authenticationType . '=' . $userName . ')'); return ldap_get_entries($ldapConnection, $results); - } else + } + else { return array( $this->getFakeLdapUser($userName) ); + } } } catch (Exception $e) {} @@ -290,7 +292,8 @@ class LdapConnectionsTable extends AppTable */ //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 getLdapUsersAttributes($ldapConnection, $filter='', $just_these=[]) + public function getLdap1UserOrAllUsersAttributes($ldapConnection, $filter='', $just_these=[]) { try { if ($this->checkConfiguration()) { @@ -369,7 +372,7 @@ class LdapConnectionsTable extends AppTable $usersWithNameAndEmail[ $u[$i]['sn'][0].' '.$u[$i]['givenname'][0] ] = $u[$i]['mail'][0]; //debug($usersWithNameAndEmail); // Sort users (without modifying the keys, don't use sort() but asort() !!!!!!!!!!!!!) - asort($usersWithNameAndEmail); + ksort($usersWithNameAndEmail); return $usersWithNameAndEmail; } @@ -524,7 +527,7 @@ class LdapConnectionsTable extends AppTable // SEARCH if ($ldapbind) { //$search = $this->getLdapUserAttributes($ldapConnection, $filter, $just_these, $user_login); - $search = $this->getLdapUsersAttributes($ldapConnection, $filter, $just_these); + $search = $this->getLdap1UserOrAllUsersAttributes($ldapConnection, $filter, $just_these); if ($search === false) die("Could not get user attributes from LDAP server, response was: " . ldap_error($ldapConnection) ); //return $search[0]; return $search; @@ -609,6 +612,7 @@ class LdapConnectionsTable extends AppTable return TRUE; } + /* * @param string $user_login @@ -630,7 +634,7 @@ class LdapConnectionsTable extends AppTable $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($login)[0]; + return $this->getUserAttributes($user_login)[0]; /* * } else { * return false; @@ -653,6 +657,8 @@ class LdapConnectionsTable extends AppTable // FAKE LDAP else { + //debug($this->USE_LDAP); + //debug($this->baseDn); $user = $this->getFakeLdapUser($user_login); // debug($user); if ($user === false) @@ -670,9 +676,8 @@ class LdapConnectionsTable extends AppTable } } catch (Exception $e) { - echo 'Exception LDAP : ', $e->getMessage(), "\n"; + //echo 'Exception LDAP : ', $e->getMessage(), "\n"; } - // Il y a eu un problème, l'utilisateur n'est pas reconnu return FALSE; diff --git a/src/Template/Materiels/add.ctp b/src/Template/Materiels/add.ctp index 5fcea3e..8217700 100755 --- a/src/Template/Materiels/add.ctp +++ b/src/Template/Materiels/add.ctp @@ -1,11 +1,15 @@ 'Nom de l\'utilisateur', 'empty' => 'Choisir un utilisateur', 'default' => $username, - 'options' => $utilisateurs - //'options' => $user_names + //'options' => $utilisateurs + 'options' => $users_option_list ]); echo $this->Form->control('email_responsable', [ 'label' => 'Email de l\'utilisateur', @@ -350,6 +354,17 @@ echo $this->element('menu_form', [ */ $(document).ready(function() { + + // Convert (once for all) PHP $users_name_and_email array to JAVASCRIPT array + //Implode Method + //var array = [INF?php echo implode($array, ","); ?SUP]; + //JSON Method + var users_name_and_email = ; + + /** + * + * Event SURCATEGORIE change => update Categories + */ $("#sur-categorie-id").bind("change", function(event) { var domaineId = $("#sur-categorie-id :selected").val(); var domaineresp = ""; @@ -382,23 +397,43 @@ $(document).ready(function() { else { updateSelectOptionsFromAnother("#sous-categorie-id", "#categorie-id", "SousCategories/getByCategorie", "Choisir une sous-catégorie " + categLabel); updateSelectOptionsFromAnother("#sur-categorie-id", "#categorie-id", "SurCategories/getFromCategorie", ""); - } + }; return false; }); + /** - * Event Mail change + * + * Event "Nom utilisateur" change => "Email" change + * + * TODO: Code commun avec edit.ctp => factoriser quelque part, mais comment, vu qu'on a besoin du tableau users_name_and_email ??? + * (EP) New method, quicker, get email directly from PHP $users_name_and_email array + * (OLD code is below, "fetch email via AJAX request to UsersController.getLdapEmail") */ $("#nom-responsable").bind("change", function(event) { - var url = document.URL; - var reg = new RegExp("(materiels).*$", "g"); - var emailUrl = url.replace(reg, "Users/getLdapEmail/"); - $.ajax({ - url: emailUrl + $("#nom-responsable").val() - }).done(function(data) { + var nom_resp = $("#nom-responsable").val(); + var new_email = users_name_and_email[nom_resp]; + $("#email-responsable").val(new_email); + }); + + +}); // end document.ready + + +/* +// OLD method, fetch email via AJAX request to UsersController.getLdapEmail() +$("#nom-responsable").bind("change", function(event) { + var url = document.URL; + var reg = new RegExp("(materiels).*$", "g"); + var emailUrl = url.replace(reg, "Users/getLdapEmail/"); + $.ajax( + { url: emailUrl + $("#nom-responsable").val() } + ).done( + function(data) { $("#email-responsable").val(data) - }); + } + ); }); -}); - +*/ + \ No newline at end of file diff --git a/src/Template/Materiels/edit.ctp b/src/Template/Materiels/edit.ctp index df72600..40b2e53 100755 --- a/src/Template/Materiels/edit.ctp +++ b/src/Template/Materiels/edit.ctp @@ -1,4 +1,18 @@ numero_serie) 'label' => 'Nom de l\'utilisateur', 'empty' => 'Choisir un utilisateur', 'default' => $username, - 'options' => $utilisateurs + //'options' => $utilisateurs + 'options' => $users_option_list ]); if (isset($nom_ancien_responsable)) { @@ -378,8 +393,9 @@ if ($USER_IS_SUPERADMIN) { echo $this->Form->control('nom_createur', [ 'label' => 'Nom du créateur', 'disabled' => true, - 'options' => $utilisateurs - ]); + //'options' => $utilisateurs + 'options' => $users_option_list + ]); echo $this->Form->control('created', [ 'label' => 'Date de création', @@ -443,6 +459,12 @@ echo $this->element('menu_form', [ $(document).ready(function () { + // Convert (once for all) PHP $users_name_and_email array to JAVASCRIPT array + //Implode Method + //var array = [INF?php echo implode($array, ","); ?SUP]; + //JSON Method + var users_name_and_email = ; + /** * Event DOMAINE change * @@ -497,29 +519,26 @@ $(document).ready(function () { } return false; }); -}); -/** - * Event Mail change - */ - $(document).ready(function () { - $("#nom-responsable").bind("change", function (event) { - var url = document.URL; - var reg=new RegExp("(materiels).*$","g"); - var emailUrl = url.replace(reg, "Users/getLdapEmail/"); - $.ajax({ - url: emailUrl + $("#nom-responsable").val() - }).done(function(data) { - $("#email-responsable").val(data) - }); - }); - }); + + /** + * + * Event "Nom utilisateur" change => "Email" change + * + * TODO: Code commun avec edit.ctp => factoriser quelque part, mais comment, vu qu'on a besoin du tableau users_name_and_email ??? + * (EP) New method, quicker, get email directly from PHP $users_name_and_email array + * (OLD code is below (at the end), "fetch email via AJAX request to UsersController.getLdapEmail") + */ + $("#nom-responsable").bind("change", function(event) { + var nom_resp = $("#nom-responsable").val(); + var new_email = users_name_and_email[nom_resp]; + $("#email-responsable").val(new_email); + }); /** * Event calcul date fin de garantie */ - $(document).ready(function () { $("#duree-garantie").bind("change", function (event) { if($("#date-reception").val() != "" && $("#duree-garantie").val() != "") { var url = document.URL; @@ -532,6 +551,7 @@ $(document).ready(function () { }); } }); + $("#unite-duree-garantie").bind("change", function (event) { if($("#date-reception").val() != "" && $("#duree-garantie").val() != "") { var url = document.URL; @@ -543,9 +563,14 @@ $(document).ready(function () { $("#date-fin-garantie").val(data) }); } - }); -}); + }); + + }); // end document.ready + + + + // (EP) Pourquoi c'est pas dans document.ready ca ??? function changeAdminEdit() { if (document.getElementById('eotp').disabled) { document.getElementById('eotp').disabled=false; @@ -564,5 +589,23 @@ $(document).ready(function () { document.getElementById('num_labo').disabled=true; } } + + +/* + // OLD method, fetch email via AJAX request to UsersController.getLdapEmail() + $("#nom-responsable").bind("change", function(event) { + var url = document.URL; + var reg = new RegExp("(materiels).*$", "g"); + var emailUrl = url.replace(reg, "Users/getLdapEmail/"); + $.ajax( + { url: emailUrl + $("#nom-responsable").val() } + ).done( + function(data) { + $("#email-responsable").val(data) + } + ); + }); +*/ + diff --git a/webroot/js/Verifications_dates_materiels.js b/webroot/js/Verifications_dates_materiels.js index dd5d8ce..8b2d52d 100644 --- a/webroot/js/Verifications_dates_materiels.js +++ b/webroot/js/Verifications_dates_materiels.js @@ -2,6 +2,7 @@ $(document).ready(function () { /** * Event Mail change */ + /* $("#nom-responsable").bind("change", function(event) { if ($("#nom-responsable").val() == "") { $("#email-responsable").val(""); @@ -16,6 +17,7 @@ $(document).ready(function () { }); } }); + */ /** -- libgit2 0.21.2