Commit 79d05bc8666ad148485c2d5880db63db0899de10

Authored by Etienne Pallier
1 parent e905b644

Bugfix de la section ldap_authentified et CLEANUP code gestion du LDAP

@@ -54,12 +54,10 @@ Logiciel testé et validé sur les configurations suivantes : @@ -54,12 +54,10 @@ Logiciel testé et validé sur les configurations suivantes :
54 VERSION ACTUELLE 54 VERSION ACTUELLE
55 55
56 Date: 10/01/2019 56 Date: 10/01/2019
57 -Version: 2.9.1.9 57 +Version: 2.9.1.10
58 Author: EP 58 Author: EP
59 - Ajout du mode ldap authentifié :  
60 - - Attention, modif de la BD, il faut executer le script db-update-2019-01-09.sh ("-CRAL.sh" pour le CRAL)  
61 - - renommé tous les champs et variables *_ldap en ldap_* pour meilleure lisibilité  
62 - - adapté la section LDAP de la config 59 + Bugfix et CLEANUP de la gestion du LDAP
  60 + - bugfix de la section ldap_authentified
63 61
64 Version majeure en cours : 2.9 (https://projects.irap.omp.eu/versions/207) 62 Version majeure en cours : 2.9 (https://projects.irap.omp.eu/versions/207)
65 63
@@ -75,11 +73,12 @@ CHANGEMENTS IMPORTANTS (MILESTONES) @@ -75,11 +73,12 @@ CHANGEMENTS IMPORTANTS (MILESTONES)
75 73
76 Liste complète des évolutions: https://gitlab.irap.omp.eu/epallier/labinvent/commits/master 74 Liste complète des évolutions: https://gitlab.irap.omp.eu/epallier/labinvent/commits/master
77 75
78 -10/01/2019 Version: 2.9.1.8 (EP) 76 +10/01/2019 Version: 2.9.1.10 (EP)
79 Ajout du mode ldap authentifié : 77 Ajout du mode ldap authentifié :
80 - **Attention, modif de la BD**, il faut executer le script db-update-2019-01-09.sh ("-CRAL.sh" pour le CRAL) 78 - **Attention, modif de la BD**, il faut executer le script db-update-2019-01-09.sh ("-CRAL.sh" pour le CRAL)
81 - renommé tous les champs et variables *_ldap en ldap_* pour meilleure lisibilité 79 - renommé tous les champs et variables *_ldap en ldap_* pour meilleure lisibilité
82 - adapté la section LDAP de la config 80 - adapté la section LDAP de la config
  81 + - cleanup
83 82
84 21/12/2018 Version: 2.9.1.4 (EP) 83 21/12/2018 Version: 2.9.1.4 (EP)
85 Version et date affichés automatiquement et merge vues listes... : 84 Version et date affichés automatiquement et merge vues listes... :
src/Model/Table/LdapConnectionsTable.php
@@ -100,13 +100,14 @@ class LdapConnectionsTable extends AppTable @@ -100,13 +100,14 @@ class LdapConnectionsTable extends AppTable
100 } 100 }
101 } 101 }
102 102
103 - // EP (aout 2017)  
104 - // ATTENTION : Utilisateur IMPORTANT.  
105 - // Avec cet utilisateur, on simule un utilisateur qui n'est PAS dans la table utilisateurs  
106 - // Il devrait donc se voir attribuer un role "Utilisateur" sans pour autant que ça soit écrit dans la table !!!  
107 - // login = '_NouvelUtilisateur_username'  
108 - // pass = '_NouvelUtilisateur_password'  
109 - // $prefix = "_NouvelUtilisateur_"; 103 + /* EP (aout 2017)
  104 + * ATTENTION : Utilisateur IMPORTANT.
  105 + * Avec cet utilisateur, on simule un utilisateur qui n'est PAS dans la table utilisateurs
  106 + * Il devrait donc se voir attribuer un role "Utilisateur" sans pour autant que ça soit écrit dans la table !!!
  107 + * login = '_NouvelUtilisateur_username'
  108 + * pass = '_NouvelUtilisateur_password'
  109 + * $prefix = "_NouvelUtilisateur_";
  110 + */
110 $ldapUsers[] = [ 111 $ldapUsers[] = [
111 'sn' => [ 112 'sn' => [
112 'UTILISATEUR' 113 'UTILISATEUR'
@@ -141,7 +142,10 @@ class LdapConnectionsTable extends AppTable @@ -141,7 +142,10 @@ class LdapConnectionsTable extends AppTable
141 142
142 $this->LDAP_USED = $config->ldap_used ? TRUE : FALSE; 143 $this->LDAP_USED = $config->ldap_used ? TRUE : FALSE;
143 144
144 - if (! $this->LDAP_USED) { 145 + // TODO: AVIRER !!!
  146 + $this->LDAP_USED = FALSE;
  147 +
  148 + if ( ! $this->LDAP_USED ) {
145 $this->authenticationType = $config->ldap_authenticationType; 149 $this->authenticationType = $config->ldap_authenticationType;
146 if (empty($this->fakeLDAPUsers)) $this->fakeLDAPUsers = $this->buildFakeLdapUsers(); 150 if (empty($this->fakeLDAPUsers)) $this->fakeLDAPUsers = $this->buildFakeLdapUsers();
147 return true; 151 return true;
@@ -156,16 +160,14 @@ class LdapConnectionsTable extends AppTable @@ -156,16 +160,14 @@ class LdapConnectionsTable extends AppTable
156 $this->baseDn = $config->ldap_baseDn; 160 $this->baseDn = $config->ldap_baseDn;
157 $this->filter = $config->ldap_filter; 161 $this->filter = $config->ldap_filter;
158 $this->authenticationType = $config->ldap_authenticationType; 162 $this->authenticationType = $config->ldap_authenticationType;
159 - /*MCM*/  
160 $this->ldap_authentified = $config->ldap_authentified; 163 $this->ldap_authentified = $config->ldap_authentified;
161 $this->bindDn = $config->ldap_bindDn; 164 $this->bindDn = $config->ldap_bindDn;
162 $this->bindPass = $config->ldap_bindPass; 165 $this->bindPass = $config->ldap_bindPass;
163 - /* fin MCM*/  
164 166
165 return true; 167 return true;
166 } 168 }
167 169
168 - throw new Exception('The ldap configuration is not valid : <br /> 170 + throw new Exception('The LDAP configuration is not valid : <br />
169 <ul> 171 <ul>
170 <li>host = ' . @$ldapConfig['host'] . '</li> 172 <li>host = ' . @$ldapConfig['host'] . '</li>
171 <li>port = ' . @$ldapConfig['port'] . '</li> 173 <li>port = ' . @$ldapConfig['port'] . '</li>
@@ -198,18 +200,18 @@ class LdapConnectionsTable extends AppTable @@ -198,18 +200,18 @@ class LdapConnectionsTable extends AppTable
198 return false; 200 return false;
199 } 201 }
200 202
201 - // $userName = login  
202 - //public function getUserAttributes($userName, $ldapConnection='', $LDAP_ANONYMOUS=true, $filter='', $just_these=[]) 203 + /*
  204 + * @param unknown $userName (= login)
  205 + * @param string $ldapConnection
  206 + * @param string $filter
  207 + * @param array $just_these
  208 + * @return $info = ldap search result (user attributes) or FALSE
  209 + */
203 public function getUserAttributes($userName, $ldapConnection='', $filter='', $just_these=[]) 210 public function getUserAttributes($userName, $ldapConnection='', $filter='', $just_these=[])
204 { 211 {
205 try { 212 try {
206 -  
207 if ($this->checkConfiguration()) { 213 if ($this->checkConfiguration()) {
208 if ($this->LDAP_USED) { 214 if ($this->LDAP_USED) {
209 - /* Code inutile car redondant:  
210 - $ldapConnection = ldap_connect($this->host, $this->port);  
211 - ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3);  
212 - */  
213 /* (EP) 215 /* (EP)
214 Fonction ldap_search ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) 216 Fonction ldap_search ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null)
215 Concernant le paramètre $attributes (ici, $just_these) : 217 Concernant le paramètre $attributes (ici, $just_these) :
@@ -232,12 +234,12 @@ class LdapConnectionsTable extends AppTable @@ -232,12 +234,12 @@ class LdapConnectionsTable extends AppTable
232 $info = ldap_get_entries($ldapConnection, $results); 234 $info = ldap_get_entries($ldapConnection, $results);
233 //echo $info["count"]." entries returned\n"; 235 //echo $info["count"]." entries returned\n";
234 return $info; 236 return $info;
235 - } else  
236 - return array(  
237 - $this->getFakeLdapUser($userName)  
238 - ); 237 + }
  238 + else return array( $this->getFakeLdapUser($userName) );
239 } 239 }
240 - } catch (Exception $e) {} 240 + } catch (Exception $e) {
  241 + echo 'Exception LDAP : ', $e->getMessage(), "\n";
  242 + }
241 243
242 return false; 244 return false;
243 } 245 }
@@ -349,14 +351,17 @@ class LdapConnectionsTable extends AppTable @@ -349,14 +351,17 @@ class LdapConnectionsTable extends AppTable
349 ]; 351 ];
350 } 352 }
351 353
352 - public function ldapAuthentication($user_login, $user_password)  
353 - { 354 + /*
  355 + * @param string $user_login
  356 + * @param string $user_password
  357 + * @return logged user LDAP attributes or FALSE if user not found in LDAP
  358 + */
  359 + public function ldapAuthentication($user_login, $user_password) {
  360 +
354 try { 361 try {
355 if ($this->checkConfiguration()) { 362 if ($this->checkConfiguration()) {
356 - // We are using LDAP  
357 - if ($this->LDAP_USED) {  
358 - // CRAL must set this to FALSE  
359 - //$LDAP_ANONYMOUS = TRUE; 363 +
  364 + if ($this->LDAP_USED) { // We are using LDAP
360 365
361 // No connexion allowed without password 366 // No connexion allowed without password
362 if (strlen(trim($user_password)) == 0) return FALSE; 367 if (strlen(trim($user_password)) == 0) return FALSE;
@@ -364,81 +369,45 @@ class LdapConnectionsTable extends AppTable @@ -364,81 +369,45 @@ class LdapConnectionsTable extends AppTable
364 // Set LDAP parameters 369 // Set LDAP parameters
365 // - Liste des attributs à récupérer dans le ldap (vide = TOUS les attributs) 370 // - Liste des attributs à récupérer dans le ldap (vide = TOUS les attributs)
366 $just_these = []; 371 $just_these = [];
367 -  
368 - /*  
369 - // - Anonymous connection (IRAP, IAS, LATMOS)  
370 - //if ($LDAP_ANONYMOUS) {  
371 - if ($this->anonymous_ldap) {  
372 - ///$auth_dn = ''; //= $this->authDn;  
373 - // $this->authenticationType = 'uid'  
374 - // $this->baseDn = "ou=users,dc=irap,dc=omp,dc=eu"  
375 -  
376 - //TODO: à virer, ca n'est pas nécessaire en anonymous  
377 - $binddn = $this->authenticationType . '=' . $user_login; // ex: uid=epallier  
378 - $ldappass = $user_password;  
379 -  
380 - //$filter = '('.$binddn.')'; // ex: "(uid=epallier)"  
381 - ////$filter = $this->filter . '('.$binddn.')'; // ex: "(uid=epallier)"  
382 - //TODO: refactoriser si comportement général  
383 - ///$binddn .= ','.$this->baseDn;  
384 - }  
385 - // - Authentified connection (CRAL)  
386 - else {  
387 - //$dn = $this->baseDn; // "dc=univ-lyon1,dc=fr"  
388 - //$binddn="CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1,DC=univ-lyon1,DC=fr";  
389 - //$binddn = "CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1,".$dn;  
390 - ///<*> EP version  
391 - $auth_dn = "CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1"; //= $this->authDn;  
392 - $binddn = $auth_dn;  
393 - $ldappass = "lemotdepasse";  
394 - $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))";  
395 - //<*>/  
396 - ///$auth_dn = $this->baseDn; // dc=univ-lyon1,dc=fr  
397 - // $this->authenticationType = 'sAMAccountName'  
398 - // $this->baseDn = "dc=univ-lyon1,dc=fr"  
399 - //$anonymous = $this->anonymous;  
400 - //if ($anonymous == '0') {  
401 - $binddn = $this->bindDn; // CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1,DC=univ-lyon1,DC=fr  
402 - $ldappass = $this->bindPass;  
403 - //}  
404 - //construction du filtre avec le filtre de la base de données avec un & sur le login de l'utilisateur  
405 - //si aucun filtre n'est défini dans la base de données on aura juste (& ($this->authenticationType=$user_login))  
406 - ////$filter = "(&".$this->filter."(".$this->authenticationType . '=' . $user_login."))";  
407 - //$just_these = array("cn");  
408 - ///<*>  
409 - NEW version  
410 - $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)(sAMAccountName=$user_login))";  
411 - $dn = "dc=univ-lyon1,dc=fr";  
412 - $binddn="CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1,DC=univ-lyon1,DC=fr";  
413 - //<*>/  
414 - } 372 + //$just_these = array("cn");
  373 +
  374 + /* Examples :
  375 + *
  376 + * - ANONYMOUS LDAP (IRAP) :
  377 + * $this->authenticationType = 'uid'
  378 + * $this->baseDn = "ou=users,dc=irap,dc=omp,dc=eu"
  379 + *
  380 + * - AUTHENTIFIED LDAP connection (CRAL) :
  381 + * $this->authenticationType = 'sAMAccountName'
  382 + * $this->baseDn = "dc=univ-lyon1,dc=fr"
  383 + * $binddn="CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1,DC=univ-lyon1,DC=fr";
  384 + * ($binddn = "CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1,".$this->baseDn;)
  385 + * $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))";
415 */ 386 */
  387 + // Construction du filtre avec le filtre de la base de données avec un & sur le login de l'utilisateur
  388 + // Si aucun filtre n'est défini dans la base de données on aura juste (& ($this->authenticationType=$user_login))
  389 + // 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))";
416 $filter = "(&".$this->filter."(".$this->authenticationType . '=' . $user_login."))"; 390 $filter = "(&".$this->filter."(".$this->authenticationType . '=' . $user_login."))";
417 - //TODO: optimisation  
418 - /////////$binddn .= ','.$this->baseDn;  
419 391
  392 + //TODO: optimisation, refactoriser si comportement général
  393 + //$binddn .= ','.$this->baseDn;
  394 +
420 // Connection 395 // Connection
421 $ldapConnection = ldap_connect($this->host, $this->port) or die("Could not connect to $this->host (port $this->port)"); 396 $ldapConnection = ldap_connect($this->host, $this->port) or die("Could not connect to $this->host (port $this->port)");
422 if ($ldapConnection) { 397 if ($ldapConnection) {
  398 +
423 ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); 399 ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3);
424 - // Binding  
425 - /*MCM*/  
426 - // bind optionnel 400 +
  401 + // Binding optionnel
427 if ($this->ldap_authentified) $ldapbind = ldap_bind($ldapConnection, $this->bindDn, $this->bindPass) or die("Could not bind to LDAP server.". ldap_error($ldapConnection) ); 402 if ($this->ldap_authentified) $ldapbind = ldap_bind($ldapConnection, $this->bindDn, $this->bindPass) or die("Could not bind to LDAP server.". ldap_error($ldapConnection) );
  403 +
428 $search = $this->getUserAttributes($user_login, $ldapConnection, $filter, $just_these); 404 $search = $this->getUserAttributes($user_login, $ldapConnection, $filter, $just_these);
429 - /* fin MCM*/  
430 if ($search === false) die("Could not get user attributes from LDAP server, response was: " . ldap_error($ldapConnection) ); 405 if ($search === false) die("Could not get user attributes from LDAP server, response was: " . ldap_error($ldapConnection) );
431 return $search[0]; 406 return $search[0];
432 - /*  
433 - * } else {  
434 - * return false;  
435 - */  
436 - //}  
437 } 407 }
438 408
439 -  
440 - // We are not using LDAP (so, use FAKE LDAP instead)  
441 - } else { 409 +
  410 + } else { // We are not using LDAP (so, use FAKE LDAP instead)
442 $user = $this->getFakeLdapUser($user_login); 411 $user = $this->getFakeLdapUser($user_login);
443 // debug($user); 412 // debug($user);
444 if ($user === false) 413 if ($user === false)
@@ -452,9 +421,18 @@ class LdapConnectionsTable extends AppTable @@ -452,9 +421,18 @@ class LdapConnectionsTable extends AppTable
452 return $user; 421 return $user;
453 // if ($user != false && $user['userpassword'][0] == $password) { 422 // if ($user != false && $user['userpassword'][0] == $password) {
454 } 423 }
  424 +
455 } 425 }
456 - } catch (Exception $e) {} 426 +
  427 + } catch (Exception $e) {
  428 + echo 'Exception LDAP : ', $e->getMessage(), "\n";
  429 + }
  430 +
457 return FALSE; 431 return FALSE;
458 - } 432 +
  433 + } // end ldapAuthentication()
  434 +
  435 +
  436 +
459 } 437 }
460 ?> 438 ?>
461 \ No newline at end of file 439 \ No newline at end of file
src/Template/Configurations/edit.ctp
@@ -219,6 +219,9 @@ echo $this-&gt;element(&#39;menu_form&#39;, [ @@ -219,6 +219,9 @@ echo $this-&gt;element(&#39;menu_form&#39;, [
219 219
220 <script type="text/javascript"> 220 <script type="text/javascript">
221 $(document).ready(function(){ 221 $(document).ready(function(){
  222 + // (EP) Bugfix: uniquement nécessaire dans un seul cas => pour que la section ldap-authentified soit fermée à l'ouverture de cette page si l'option n'est pas cochée !!!
  223 + toggle_ldap_auth();
  224 +
222 $( ".form" ).submit(function( event ) { 225 $( ".form" ).submit(function( event ) {
223 if($("#date-commande-facultative").is(':checked') && !$("#numero-labo-sans-annee").is(':checked')){ 226 if($("#date-commande-facultative").is(':checked') && !$("#numero-labo-sans-annee").is(':checked')){
224 alert("La case \"Numéro labo sans année\" dans la catégorie \"Divers\" doit être cochée"); 227 alert("La case \"Numéro labo sans année\" dans la catégorie \"Divers\" doit être cochée");
webroot/js/script.js
@@ -104,16 +104,16 @@ function emprunt_interne_externe() { @@ -104,16 +104,16 @@ function emprunt_interne_externe() {
104 104
105 function display_ldap() { 105 function display_ldap() {
106 $('#ldap').toggle(); 106 $('#ldap').toggle();
107 - toggle_ldap_auth(); 107 + //toggle_ldap_auth();
108 } 108 }
  109 +// EP
109 function toggle_ldap_auth() { 110 function toggle_ldap_auth() {
110 //$('#ldap_auth').toggle(); 111 //$('#ldap_auth').toggle();
111 - document.getElementById("ldap_auth").style.display = document.getElementById("ldap-authentified").checked ? "block":"none";  
112 - /* 112 + // Possible en une ligne, mais moins lisible...
  113 + //document.getElementById("ldap_auth").style.display = document.getElementById("ldap-authentified").checked ? "block":"none";
113 var ldap_auth_div = document.getElementById("ldap_auth"); 114 var ldap_auth_div = document.getElementById("ldap_auth");
114 var ldap_auth_checkbox = document.getElementById("ldap-authentified"); 115 var ldap_auth_checkbox = document.getElementById("ldap-authentified");
115 ldap_auth_div.style.display = ldap_auth_checkbox.checked ? "block":"none"; 116 ldap_auth_div.style.display = ldap_auth_checkbox.checked ? "block":"none";
116 - */  
117 } 117 }
118 118
119 function selectAll() { 119 function selectAll() {