Commit 79d05bc8666ad148485c2d5880db63db0899de10

Authored by Etienne Pallier
1 parent e905b644

Bugfix de la section ldap_authentified et CLEANUP code gestion du LDAP

README.md
... ... @@ -54,12 +54,10 @@ Logiciel testé et validé sur les configurations suivantes :
54 54 VERSION ACTUELLE
55 55  
56 56 Date: 10/01/2019
57   -Version: 2.9.1.9
  57 +Version: 2.9.1.10
58 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 62 Version majeure en cours : 2.9 (https://projects.irap.omp.eu/versions/207)
65 63  
... ... @@ -75,11 +73,12 @@ CHANGEMENTS IMPORTANTS (MILESTONES)
75 73  
76 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 77 Ajout du mode ldap authentifié :
80 78 - **Attention, modif de la BD**, il faut executer le script db-update-2019-01-09.sh ("-CRAL.sh" pour le CRAL)
81 79 - renommé tous les champs et variables *_ldap en ldap_* pour meilleure lisibilité
82 80 - adapté la section LDAP de la config
  81 + - cleanup
83 82  
84 83 21/12/2018 Version: 2.9.1.4 (EP)
85 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 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 111 $ldapUsers[] = [
111 112 'sn' => [
112 113 'UTILISATEUR'
... ... @@ -141,7 +142,10 @@ class LdapConnectionsTable extends AppTable
141 142  
142 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 149 $this->authenticationType = $config->ldap_authenticationType;
146 150 if (empty($this->fakeLDAPUsers)) $this->fakeLDAPUsers = $this->buildFakeLdapUsers();
147 151 return true;
... ... @@ -156,16 +160,14 @@ class LdapConnectionsTable extends AppTable
156 160 $this->baseDn = $config->ldap_baseDn;
157 161 $this->filter = $config->ldap_filter;
158 162 $this->authenticationType = $config->ldap_authenticationType;
159   - /*MCM*/
160 163 $this->ldap_authentified = $config->ldap_authentified;
161 164 $this->bindDn = $config->ldap_bindDn;
162 165 $this->bindPass = $config->ldap_bindPass;
163   - /* fin MCM*/
164 166  
165 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 171 <ul>
170 172 <li>host = ' . @$ldapConfig['host'] . '</li>
171 173 <li>port = ' . @$ldapConfig['port'] . '</li>
... ... @@ -198,18 +200,18 @@ class LdapConnectionsTable extends AppTable
198 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 210 public function getUserAttributes($userName, $ldapConnection='', $filter='', $just_these=[])
204 211 {
205 212 try {
206   -
207 213 if ($this->checkConfiguration()) {
208 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 215 /* (EP)
214 216 Fonction ldap_search ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null)
215 217 Concernant le paramètre $attributes (ici, $just_these) :
... ... @@ -232,12 +234,12 @@ class LdapConnectionsTable extends AppTable
232 234 $info = ldap_get_entries($ldapConnection, $results);
233 235 //echo $info["count"]." entries returned\n";
234 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 244 return false;
243 245 }
... ... @@ -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 361 try {
355 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 366 // No connexion allowed without password
362 367 if (strlen(trim($user_password)) == 0) return FALSE;
... ... @@ -364,81 +369,45 @@ class LdapConnectionsTable extends AppTable
364 369 // Set LDAP parameters
365 370 // - Liste des attributs à récupérer dans le ldap (vide = TOUS les attributs)
366 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 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 395 // Connection
421 396 $ldapConnection = ldap_connect($this->host, $this->port) or die("Could not connect to $this->host (port $this->port)");
422 397 if ($ldapConnection) {
  398 +
423 399 ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3);
424   - // Binding
425   - /*MCM*/
426   - // bind optionnel
  400 +
  401 + // Binding optionnel
427 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 404 $search = $this->getUserAttributes($user_login, $ldapConnection, $filter, $just_these);
429   - /* fin MCM*/
430 405 if ($search === false) die("Could not get user attributes from LDAP server, response was: " . ldap_error($ldapConnection) );
431 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 411 $user = $this->getFakeLdapUser($user_login);
443 412 // debug($user);
444 413 if ($user === false)
... ... @@ -452,9 +421,18 @@ class LdapConnectionsTable extends AppTable
452 421 return $user;
453 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 431 return FALSE;
458   - }
  432 +
  433 + } // end ldapAuthentication()
  434 +
  435 +
  436 +
459 437 }
460 438 ?>
461 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 219  
220 220 <script type="text/javascript">
221 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 225 $( ".form" ).submit(function( event ) {
223 226 if($("#date-commande-facultative").is(':checked') && !$("#numero-labo-sans-annee").is(':checked')){
224 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 104  
105 105 function display_ldap() {
106 106 $('#ldap').toggle();
107   - toggle_ldap_auth();
  107 + //toggle_ldap_auth();
108 108 }
  109 +// EP
109 110 function toggle_ldap_auth() {
110 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 114 var ldap_auth_div = document.getElementById("ldap_auth");
114 115 var ldap_auth_checkbox = document.getElementById("ldap-authentified");
115 116 ldap_auth_div.style.display = ldap_auth_checkbox.checked ? "block":"none";
116   - */
117 117 }
118 118  
119 119 function selectAll() {
... ...