Commit 2ed50053cea49f3ef8d819077e7b804697317b98
1 parent
a5909c57
Exists in
master
and in
2 other branches
bugfix ldap...
Showing
2 changed files
with
57 additions
and
373 deletions
Show diff stats
README.md
... | ... | @@ -54,12 +54,12 @@ Logiciel testé et validé sur les configurations suivantes : |
54 | 54 | VERSION ACTUELLE |
55 | 55 | |
56 | 56 | Date: 14/02/2019 |
57 | -Version: 2.10.10.bugfix2 | |
57 | +Version: 2.10.12.bugfix3 | |
58 | 58 | Author: EP |
59 | 59 | (version IRAP only) Bugfix LDAP anonyme, refactorisation, et optimisation |
60 | 60 | |
61 | 61 | - LDAP anonyme se faisait sans vérifier le mot de passe utilisateur !!! |
62 | - - Optimisation update email sur changement de responsable => LDAP et AJAX inutile, on fait avec un tableau local | |
62 | + - Optimisation update email sur changement de responsable (dans vues ADD et EDIT) => LDAP et AJAX inutile, on fait avec un tableau local | |
63 | 63 | |
64 | 64 | IMPORTANT: |
65 | 65 | - Pour connaitre la version actuelle, taper "./VERSION" | ... | ... |
src/Model/Table/LdapConnectionsTable.php
... | ... | @@ -29,7 +29,7 @@ class LdapConnectionsTable extends AppTable |
29 | 29 | private $bindPass; |
30 | 30 | /* fin MCM*/ |
31 | 31 | |
32 | - private $LDAP_USED = TRUE; | |
32 | + private $USE_LDAP = TRUE; | |
33 | 33 | |
34 | 34 | private $fakeLDAPUsers = []; |
35 | 35 | |
... | ... | @@ -47,7 +47,7 @@ class LdapConnectionsTable extends AppTable |
47 | 47 | public function useLdap() |
48 | 48 | { |
49 | 49 | $this->checkConfiguration(); |
50 | - return $this->LDAP_USED; | |
50 | + return $this->USE_LDAP; | |
51 | 51 | } |
52 | 52 | |
53 | 53 | private function buildFakeLdapUsers() |
... | ... | @@ -100,14 +100,13 @@ 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_"; | |
110 | - */ | |
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_"; | |
111 | 110 | $ldapUsers[] = [ |
112 | 111 | 'sn' => [ |
113 | 112 | 'UTILISATEUR' |
... | ... | @@ -135,15 +134,19 @@ class LdapConnectionsTable extends AppTable |
135 | 134 | |
136 | 135 | private function checkConfiguration() |
137 | 136 | { |
138 | - $config = TableRegistry::get('Configurations') | |
139 | - ->find() | |
140 | - ->where(['id =' => 1]) | |
137 | + $config = TableRegistry::get('Configurations')->find() | |
138 | + ->where([ | |
139 | + 'id =' => 1 | |
140 | + ]) | |
141 | 141 | ->first(); |
142 | 142 | |
143 | - $this->LDAP_USED = $config->ldap_used ? TRUE : FALSE; | |
144 | - if ( ! $this->LDAP_USED ) { | |
143 | + $this->USE_LDAP = $config->use_ldap ? TRUE : FALSE; | |
144 | + | |
145 | + if (! $this->USE_LDAP) { | |
146 | + //$this->authenticationType = $config->authentificationType_ldap; | |
145 | 147 | $this->authenticationType = $config->ldap_authenticationType; |
146 | - if (empty($this->fakeLDAPUsers)) $this->fakeLDAPUsers = $this->buildFakeLdapUsers(); | |
148 | + if (empty($this->fakeLDAPUsers)) | |
149 | + $this->fakeLDAPUsers = $this->buildFakeLdapUsers(); | |
147 | 150 | return true; |
148 | 151 | } |
149 | 152 | // debug($this->fakeLDAPUsers); |
... | ... | @@ -151,6 +154,14 @@ class LdapConnectionsTable extends AppTable |
151 | 154 | $ldapConfig = $config->toArray(); |
152 | 155 | |
153 | 156 | if (! empty($config->ldap_host) && ! empty($config->ldap_port) && ! empty($config->ldap_baseDn) && ! empty($config->ldap_authenticationType) && ! empty($config->ldap_filter)) { |
157 | + //if (! empty($config->host_ldap) && ! empty($config->port_ldap) && ! empty($config->baseDn_ldap) && ! empty($config->authentificationType_ldap) && ! empty($config->filter_ldap)) { | |
158 | + /* | |
159 | + $this->host = $config->host_ldap; | |
160 | + $this->port = $config->port_ldap; | |
161 | + $this->baseDn = $config->baseDn_ldap; | |
162 | + $this->filter = $config->filter_ldap; | |
163 | + $this->authenticationType = $config->authentificationType_ldap; | |
164 | + */ | |
154 | 165 | $this->host = $config->ldap_host; |
155 | 166 | $this->port = $config->ldap_port; |
156 | 167 | $this->baseDn = $config->ldap_baseDn; |
... | ... | @@ -163,7 +174,7 @@ class LdapConnectionsTable extends AppTable |
163 | 174 | return true; |
164 | 175 | } |
165 | 176 | |
166 | - throw new Exception('The LDAP configuration is not valid : <br /> | |
177 | + throw new Exception('The ldap configuration is not valid : <br /> | |
167 | 178 | <ul> |
168 | 179 | <li>host = ' . @$ldapConfig['host'] . '</li> |
169 | 180 | <li>port = ' . @$ldapConfig['port'] . '</li> |
... | ... | @@ -173,90 +184,28 @@ class LdapConnectionsTable extends AppTable |
173 | 184 | </ul>'); |
174 | 185 | } |
175 | 186 | |
176 | - | |
177 | - | |
178 | - // REAL LDAP only | |
179 | - /** | |
180 | - * @return array or boolean : all users from DB (CACHE of the LDAP) or FALSE (if table emtpy or expired data) | |
181 | - */ | |
182 | - private function fetchAllUsersFromDB() { | |
183 | - // On remet à jour tous les 7 jours | |
184 | - $PEREMPTION_NB_DAYS = 7; | |
185 | - | |
186 | - // Doit aussi retourner FALSE si la ligne FAKE de la table users | |
187 | - // (celle qui contient le user_name "FAKE_USER") | |
188 | - // a une date "updated" périmée (now - updated > $PEREMPTION_NB_DAYS) | |
189 | - // (update automatique de tous les users, chaque semaine, pour rester synced avec le LDAP) | |
190 | - // By default, no user in CACHE | |
191 | - return FALSE; | |
192 | - } | |
193 | - | |
194 | - // REAL LDAP only | |
195 | - // Sauvegarde de tous les users du LDAP en BD (avec un rythme de mise à jour hebdo) | |
196 | - // Seulement les champs: nom, pnom, login, pass, email, create, updated, profile | |
197 | - private function saveAllUsersInDB($users_fetched) { | |
198 | - | |
199 | - // START TRANSACTION | |
200 | - // 1) Update (ou création) de la ligne FAKE (contient le user_name "FAKE_USER") => avec une date "updated" | |
201 | - // 2) Update (ou création) de chaque user contenu dans $users_fetched | |
202 | - // Attention à ne pas perdre l'attribut "profile", surtout pour les users privilégiés!!! (les autres ont un profile = "Utilisateur") | |
203 | - // END TRANSACTION (COMMIT) | |
204 | - | |
205 | - // SAVE s'est bien passé | |
206 | - return TRUE; | |
207 | - } | |
208 | - | |
209 | - /** | |
210 | - * @return $users_fetched or FALSE | |
211 | - */ | |
212 | - // REAL or FAKE LDAP | |
213 | 187 | public function getAllLdapUsers() |
214 | 188 | { |
215 | 189 | try { |
216 | 190 | if ($this->checkConfiguration()) { |
217 | - | |
218 | 191 | // REAL LDAP |
219 | - if ($this->LDAP_USED) { | |
220 | - | |
221 | - // 1) Search users in CACHE (DB) | |
222 | - $users_fetched = $this->fetchAllUsersFromDB(); | |
223 | - | |
224 | - // 2) Not found in CACHE, so search users in LDAP | |
225 | - if ($users_fetched === FALSE) { | |
226 | - $users_fetched = $this->searchLdap($this->filter, []); | |
227 | - // CACHE the new user in DB for next time | |
228 | - if ($users_fetched != FALSE) $this->saveAllUsersInDB($users_fetched); | |
229 | - } | |
230 | - /* | |
192 | + if ($this->USE_LDAP) { | |
231 | 193 | $ldapConnection = ldap_connect($this->host, $this->port); |
232 | 194 | ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); |
233 | 195 | |
234 | - // Binding optionnel | |
235 | - if ($this->ldap_authentified) $ldapbind = ldap_bind($ldapConnection, $this->bindDn, $this->bindPass) | |
236 | - or die("Could not bind to LDAP server.". ldap_error($ldapConnection) ); | |
237 | - | |
238 | 196 | $results = ldap_search($ldapConnection, $this->baseDn, $this->filter); |
239 | 197 | |
240 | 198 | $res = ldap_get_entries($ldapConnection, $results); |
241 | - */ | |
242 | - } | |
243 | - | |
244 | - // FAKE LDAP | |
199 | + } // FAKE LDAP | |
245 | 200 | else { |
246 | - $users_fetched = $this->fakeLDAPUsers; | |
201 | + $res = $this->fakeLDAPUsers; | |
247 | 202 | } |
248 | - | |
249 | - // Noter que $user_fetched peut etre egal a FALSE (si rien trouvé) | |
250 | - return $users_fetched; | |
203 | + return $res; | |
251 | 204 | } |
252 | 205 | } catch (Exception $e) {} |
253 | - | |
254 | - // Pb, rien trouvé | |
255 | - return FALSE; | |
206 | + return false; | |
256 | 207 | } |
257 | - | |
258 | 208 | |
259 | - // TODO: avirer, VIEUX CODE, à remplacer par getLdap1UserOrAllUsersAttributes() | |
260 | 209 | // $userName = login |
261 | 210 | public function getUserAttributes($userName) |
262 | 211 | { |
... | ... | @@ -268,80 +217,16 @@ class LdapConnectionsTable extends AppTable |
268 | 217 | ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); |
269 | 218 | $results = ldap_search($ldapConnection, $this->baseDn, '(' . $this->authenticationType . '=' . $userName . ')'); |
270 | 219 | return ldap_get_entries($ldapConnection, $results); |
271 | - } | |
272 | - else { | |
220 | + } else | |
273 | 221 | return array( |
274 | 222 | $this->getFakeLdapUser($userName) |
275 | 223 | ); |
276 | - } | |
277 | 224 | } |
278 | 225 | } catch (Exception $e) {} |
279 | 226 | |
280 | 227 | return false; |
281 | 228 | } |
282 | - | |
283 | - | |
284 | - | |
285 | - // REAL LDAP only | |
286 | - /* | |
287 | - * @param string $ldapConnection | |
288 | - * @param string $filter | |
289 | - * @param array $just_these | |
290 | - * @param string $userName (= login) => for FAKE LDAP only | |
291 | - * @return $res = ldap search result (1 user or all users attributes) or FALSE | |
292 | - */ | |
293 | - //public function getUserAttributes($userName, $ldapConnection='', $filter='', $just_these=[]) | |
294 | - //public function getUserAttributes($ldapConnection='', $filter='', $just_these=[], $userName=NULL) | |
295 | - //public function getLdapUsersAttributes($ldapConnection, $filter='', $just_these=[]) | |
296 | - public function getLdap1UserOrAllUsersAttributes($ldapConnection, $filter='', $just_these=[]) | |
297 | - { | |
298 | - try { | |
299 | - if ($this->checkConfiguration()) { | |
300 | - | |
301 | - // LDAP mode | |
302 | - //if ($this->LDAP_USED) { | |
303 | - /* (EP) | |
304 | - Fonction ldap_search ($link_identifier, $base_dn, $filter, array $attributes = null, $attrsonly = null, $sizelimit = null, $timelimit = null, $deref = null) | |
305 | - Concernant le paramètre $attributes (ici, $just_these) : | |
306 | - - An array of the required attributes, e.g. array("mail", "sn", "cn"). | |
307 | - - Note that the "dn" is always returned irrespective of which attributes types are requested. | |
308 | - Telle que notre connexion au LDAP est conçue, on s'attend à recevoir AU MINIMUM | |
309 | - ces attributs dans la réponse de la fonction ldap_search(): | |
310 | - - 'sn' | |
311 | - - 'mail' | |
312 | - - 'givenname' | |
313 | - - 'uid' | |
314 | - - 'userpassword' | |
315 | - Pour récupérer tous ces attributs, il ne faut pas utiliser la variable $just_these, | |
316 | - ou alors il faut qu'elle soit égale à un tableau vide ([]). | |
317 | - (par exemple, si elle vaut "['cn']" ça signifie qu'on veut "seulement l'attribut 'cn'") | |
318 | - Quand on n'utilise pas $just_these, la fonction ldap_search() retourne TOUS les attributs disponibles, | |
319 | - donc c'est le comportement qu'on veut ici. | |
320 | - */ | |
321 | - | |
322 | - //$search = $this->getUserAttributes($ldapConnection, $filter, $just_these, $user_login); | |
323 | - //$results = ldap_search($ldapConnection, $this->baseDn, $this->filter); | |
324 | - | |
325 | - $results = ldap_search($ldapConnection, $this->baseDn, $filter, $just_these) | |
326 | - or die("Could not search to LDAP server response was: " . ldap_error($ldapConnection) ); | |
327 | - $res = ldap_get_entries($ldapConnection, $results); | |
328 | - //echo $info["count"]." entries returned\n"; | |
329 | - return $res; | |
330 | - //} | |
331 | - | |
332 | - // FAKE LDAP mode | |
333 | - //else return array( $this->getFakeLdapUser($userName) ); | |
334 | - //else return $this->fakeLDAPUsers; | |
335 | - | |
336 | - } | |
337 | - } catch (Exception $e) { | |
338 | - echo 'Exception LDAP : ', $e->getMessage(), "\n"; | |
339 | - } | |
340 | - | |
341 | - return false; | |
342 | - } | |
343 | - | |
344 | - | |
229 | + | |
345 | 230 | public function getAuthenticationType() |
346 | 231 | { |
347 | 232 | return $this->authenticationType; |
... | ... | @@ -357,62 +242,26 @@ class LdapConnectionsTable extends AppTable |
357 | 242 | return FALSE; |
358 | 243 | } |
359 | 244 | |
360 | - // TODO: à implémenter | |
361 | - public function getUsersWithNameAndEmail() { | |
362 | - $usersWithNameAndEmail = []; | |
363 | - // Get all users (with ALL their attributes) | |
364 | - $u = $this->getAllLdapUsers(); | |
365 | - // Sort users | |
366 | - //sort($u); | |
367 | - //debug($u); | |
368 | - // (EP) Refactorisation pour éviter code redondant ci-dessous, c'était pourtant pas compliqué, poil dans la main... | |
369 | - $nb_users = $this->LDAP_USED ? $u['count'] : sizeof($u)-1; | |
370 | - for ($i = 0; $i < $nb_users; $i ++) | |
371 | - // $utilisateurs["Pallier Etienne"] = ["email"] | |
372 | - $usersWithNameAndEmail[ $u[$i]['sn'][0].' '.$u[$i]['givenname'][0] ] = $u[$i]['mail'][0]; | |
373 | - //debug($usersWithNameAndEmail); | |
374 | - // Sort users (without modifying the keys, don't use sort() but asort() !!!!!!!!!!!!!) | |
375 | - ksort($usersWithNameAndEmail); | |
376 | - return $usersWithNameAndEmail; | |
377 | - } | |
378 | - | |
379 | - | |
380 | 245 | /** |
381 | 246 | * Return a list of Users with key = username & value = username |
382 | 247 | */ |
383 | 248 | public function getListUsers() |
384 | 249 | { |
385 | - $utilisateurs = []; | |
386 | - | |
387 | - // Get all users (with ALL their attributes) | |
388 | 250 | $u = $this->getAllLdapUsers(); |
389 | - // Sort users | |
390 | - //sort($u); | |
391 | - //debug($u); | |
251 | + $utilisateurs = []; | |
392 | 252 | |
393 | - // (EP) Refactorisation pour éviter code redondant ci-dessous, c'était pourtant pas compliqué, poil dans la main... | |
394 | - $nb_users = $this->LDAP_USED ? $u['count'] : sizeof($u)-1; | |
395 | - for ($i = 0; $i < $nb_users; $i ++) | |
396 | - // $utilisateurs["Pallier Etienne"] = "Pallier Etienne" | |
397 | - $utilisateurs[ $u[$i]['sn'][0].' '.$u[$i]['givenname'][0] ] = $u[$i]['sn'][0].' '.$u[$i]['givenname'][0]; | |
398 | - /* | |
399 | - if ($this->LDAP_USED) { | |
253 | + if ($this->USE_LDAP) { | |
400 | 254 | for ($i = 0; $i < $u['count']; $i ++) { |
401 | - $utilisateurs[ $u[$i]['sn'][0].' '.$u[$i]['givenname'][0] ] = $u[$i]['sn'][0].' '.$u[$i]['givenname'][0]; | |
255 | + $utilisateurs[$u[$i]['sn'][0] . ' ' . $u[$i]['givenname'][0]] = $u[$i]['sn'][0] . ' ' . $u[$i]['givenname'][0]; | |
402 | 256 | } |
403 | 257 | } else { |
404 | 258 | for ($i = 0; $i < sizeof($u) - 1; $i ++) { |
405 | - $utilisateurs[ $u[$i]['sn'][0].' '.$u[$i]['givenname'][0] ] = $u[$i]['sn'][0].' '.$u[$i]['givenname'][0]; | |
259 | + $utilisateurs[$u[$i]['sn'][0] . ' ' . $u[$i]['givenname'][0]] = $u[$i]['sn'][0] . ' ' . $u[$i]['givenname'][0]; | |
406 | 260 | } |
407 | 261 | } |
408 | - */ | |
409 | - //debug($utilisateurs); | |
410 | - // Sort users (without modifying the keys, don't use sort() but asort() !!!!!!!!!!!!!) | |
411 | - asort($utilisateurs); | |
412 | - //debug($utilisateurs); | |
262 | + | |
413 | 263 | return $utilisateurs; |
414 | 264 | } |
415 | - | |
416 | 265 | |
417 | 266 | /** |
418 | 267 | * Return a list of login ofUsers with key = username & value = login |
... | ... | @@ -422,7 +271,7 @@ class LdapConnectionsTable extends AppTable |
422 | 271 | $u = $this->getAllLdapUsers(); |
423 | 272 | $utilisateurs = []; |
424 | 273 | |
425 | - if ($this->LDAP_USED) { | |
274 | + if ($this->USE_LDAP) { | |
426 | 275 | for ($i = 0; $i < $u['count']; $i ++) { |
427 | 276 | $utilisateurs[$u[$i]['sn'][0] . ' ' . $u[$i]['givenname'][0]] = $u[$i][$this->authenticationType][0]; |
428 | 277 | } |
... | ... | @@ -443,7 +292,7 @@ class LdapConnectionsTable extends AppTable |
443 | 292 | $u = $this->getAllLdapUsers(); |
444 | 293 | $utilisateurs = []; |
445 | 294 | |
446 | - if ($this->LDAP_USED) { | |
295 | + if ($this->USE_LDAP) { | |
447 | 296 | for ($i = 0; $i < $u['count']; $i ++) { |
448 | 297 | if (isset($u[$i]['mail'][0])) { |
449 | 298 | $utilisateurs[$u[$i]['sn'][0] . ' ' . $u[$i]['givenname'][0]] = $u[$i]['mail'][0]; |
... | ... | @@ -467,7 +316,7 @@ class LdapConnectionsTable extends AppTable |
467 | 316 | { |
468 | 317 | $u = $this->getAllLdapUsers(); |
469 | 318 | |
470 | - if ($this->LDAP_USED) { | |
319 | + if ($this->USE_LDAP) { | |
471 | 320 | $nbUsers = $u['count']; |
472 | 321 | } else { |
473 | 322 | $nbUsers = sizeof($u) - 1; |
... | ... | @@ -485,181 +334,25 @@ class LdapConnectionsTable extends AppTable |
485 | 334 | ]; |
486 | 335 | } |
487 | 336 | |
488 | - | |
489 | - // TODO: implement | |
490 | - // REAL LDAP only | |
491 | - private function checkAndFetchUserFromDB($user_login, $user_password) { | |
492 | - // Doit aussi return false si ce user_login est "périmé" (sa date "created" est > 2 mois par exemple), | |
493 | - // ce qui obligera à relire ses données dans le LDAP et donc se mettre à jour | |
494 | - // By default, user is not in DB | |
495 | - return FALSE; | |
496 | - } | |
497 | - | |
498 | - | |
499 | - // REAL LDAP only | |
500 | - private function searchLdap($filter, $just_these, $user_login=NULL, $user_password=NULL) { | |
501 | - | |
502 | - // CONNEXION | |
503 | - $ldapConnection = ldap_connect($this->host, $this->port) | |
504 | - or die("Could not connect to $this->host (port $this->port)"); | |
505 | - | |
506 | - if ($ldapConnection) { | |
507 | - | |
508 | - // OPTIONS | |
509 | - ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); | |
510 | - | |
511 | - // BINDING | |
512 | - | |
513 | - // - Authentified | |
514 | - if ($this->ldap_authentified) | |
515 | - $ldapbind = ldap_bind($ldapConnection, $this->bindDn, $this->bindPass); // or die("Could not bind to LDAP server.". ldap_error($ldapConnection) ); | |
516 | - | |
517 | - // - Anonymous | |
518 | - // En cas de LDAP anonyme, binding quand même pour vérifier le mot de passe de l'utilisateur. | |
519 | - // Sans cette ligne, on passe avec n'importe quel password !!! | |
520 | - else { | |
521 | - $ldapbind = TRUE; | |
522 | - debug("log, pass= " . $user_login . ' ' . $user_password); | |
523 | - if ($user_login && $user_password) $ldapbind = ldap_bind($ldapConnection, $this->authenticationType.'='.$user_login, $user_password); | |
524 | - debug("ldapbind " . $ldapbind); | |
525 | - } | |
526 | - | |
527 | - // SEARCH | |
528 | - if ($ldapbind) { | |
529 | - //$search = $this->getLdapUserAttributes($ldapConnection, $filter, $just_these, $user_login); | |
530 | - $search = $this->getLdap1UserOrAllUsersAttributes($ldapConnection, $filter, $just_these); | |
531 | - if ($search === false) die("Could not get user attributes from LDAP server, response was: " . ldap_error($ldapConnection) ); | |
532 | - //return $search[0]; | |
533 | - return $search; | |
534 | - } | |
535 | - | |
536 | - } | |
537 | - | |
538 | - // Il y a eu un pb, utilisateur non reconnu | |
539 | - return FALSE; | |
540 | - | |
541 | - } | |
542 | - | |
543 | - | |
544 | - // REAL LDAP only | |
545 | - private function checkAndFetchUserFromLdap($user_login, $user_password) { | |
546 | - // Set LDAP parameters | |
547 | - // - Liste des attributs à récupérer dans le ldap (vide = TOUS les attributs) | |
548 | - $just_these = []; | |
549 | - // TODO: vérifier si cette ligne est bien utile ou pas... (avant on faisait ça) | |
550 | - if (! $this->ldap_authentified) $just_these = array("cn"); | |
551 | - | |
552 | - /* Examples : | |
553 | - * | |
554 | - * - ANONYMOUS LDAP (IRAP) : | |
555 | - * $this->authenticationType = 'uid' | |
556 | - * $this->baseDn = "ou=users,dc=irap,dc=omp,dc=eu" | |
557 | - * | |
558 | - * - AUTHENTIFIED LDAP connection (CRAL) : | |
559 | - * $this->authenticationType = 'sAMAccountName' | |
560 | - * $this->baseDn = "dc=univ-lyon1,dc=fr" | |
561 | - * $binddn="CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1,DC=univ-lyon1,DC=fr"; | |
562 | - * ($binddn = "CN=svc_ldap_cral,OU=users,OU=27,OU=sim,OU=univ-lyon1,".$this->baseDn;) | |
563 | - * $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))"; | |
564 | - */ | |
565 | - // Construction du filtre avec le filtre de la base de données avec un & sur le login de l'utilisateur | |
566 | - // Si aucun filtre n'est défini dans la base de données on aura juste (& ($this->authenticationType=$user_login)) | |
567 | - // 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))"; | |
568 | - $filter = "(&".$this->filter."(".$this->authenticationType . '=' . $user_login."))"; | |
569 | - | |
570 | - //TODO: optimisation, refactoriser si comportement général | |
571 | - //$binddn .= ','.$this->baseDn; | |
572 | - | |
573 | - $res = $this->searchLdap($filter, $just_these, $user_login, $user_password); | |
574 | - if ($res != FALSE) return $res[0]; | |
575 | - | |
576 | - /* | |
577 | - // CONNEXION | |
578 | - $ldapConnection = ldap_connect($this->host, $this->port) | |
579 | - or die("Could not connect to $this->host (port $this->port)"); | |
580 | - | |
581 | - if ($ldapConnection) { | |
582 | - | |
583 | - // OPTIONS | |
584 | - ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); | |
585 | - | |
586 | - // BINDING | |
587 | - if ($this->ldap_authentified) | |
588 | - $ldapbind = ldap_bind($ldapConnection, $this->bindDn, $this->bindPass); // or die("Could not bind to LDAP server.". ldap_error($ldapConnection) ); | |
589 | - // En cas de LDAP anonyme, binding quand même pour vérifier le mot de passe de l'utilisateur. | |
590 | - // Sans cette ligne, on passe avec n'importe quel password !!! | |
591 | - else | |
592 | - $ldapbind = ldap_bind($ldapConnection, $this->authenticationType.'='.$user_login, $user_password); | |
593 | - | |
594 | - // SEARCH | |
595 | - if ($ldapbind) { | |
596 | - $search = $this->getUserAttributes($user_login, $ldapConnection, $filter, $just_these); | |
597 | - if ($search === false) die("Could not get user attributes from LDAP server, response was: " . ldap_error($ldapConnection) ); | |
598 | - return $search[0]; | |
599 | - } | |
600 | - | |
601 | - } | |
602 | - */ | |
603 | - | |
604 | - // Il y a eu un pb, utilisateur non reconnu | |
605 | - return FALSE; | |
606 | - } | |
607 | - | |
608 | - | |
609 | - // TODO: implement | |
610 | - private function saveNewUserInDB($user_fetched) { | |
611 | - // SAVE new user in DB | |
612 | - return TRUE; | |
613 | - } | |
614 | - | |
615 | - | |
616 | - | |
617 | - /* | |
618 | - * @param string $user_login | |
619 | - * @param string $user_password | |
620 | - * @return logged user LDAP attributes or FALSE if user not found in LDAP | |
621 | - */ | |
622 | - public function ldapAuthentication($user_login, $user_password) { | |
623 | - | |
337 | + public function ldapAuthentication($login, $password) | |
338 | + { | |
624 | 339 | try { |
625 | 340 | if ($this->checkConfiguration()) { |
626 | 341 | |
627 | - // REAL LDAP | |
628 | - if ($this->LDAP_USED) { | |
629 | - | |
630 | - // No connexion allowed without password | |
631 | - if (strlen(trim($user_password)) == 0) return FALSE; | |
632 | - | |
633 | - // VIEUX CODE QUI MARCHE !!! | |
342 | + if ($this->USE_LDAP) { | |
343 | + if (strlen(trim($password)) == 0) | |
344 | + return FALSE; | |
634 | 345 | $ldapConnection = ldap_connect($this->host, $this->port); |
635 | 346 | ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); |
636 | - if (@ldap_bind($ldapConnection, $this->authenticationType . '=' . $user_login . ',' . $this->baseDn, $user_password)) { | |
637 | - return $this->getUserAttributes($user_login)[0]; | |
347 | + if (@ldap_bind($ldapConnection, $this->authenticationType . '=' . $login . ',' . $this->baseDn, $password)) { | |
348 | + return $this->getUserAttributes($login)[0]; | |
638 | 349 | /* |
639 | 350 | * } else { |
640 | 351 | * return false; |
641 | 352 | */ |
642 | 353 | } |
643 | - | |
644 | - /* NEW CODE QUI MARCHE PAS | |
645 | - // TODO: optimisation possible | |
646 | - // 1) Search user in CACHE (DB) | |
647 | - $user_fetched = $this->checkAndFetchUserFromDB($user_login, $user_password); | |
648 | - // 2) If not CACHED, search user in LDAP | |
649 | - if ($user_fetched === FALSE) { | |
650 | - $user_fetched = $this->checkAndFetchUserFromLdap($user_login, $user_password); | |
651 | - // CACHE the new user in DB for next time | |
652 | - if ($user_fetched != FALSE) $this->saveNewUserInDB($user_fetched); | |
653 | - } | |
654 | - return $user_fetched; // Noter que $user_fetched peut etre egal a FALSE (si pas trouvé) | |
655 | - */ | |
656 | - } | |
657 | - | |
658 | - // FAKE LDAP | |
659 | - else { | |
660 | - //debug($this->USE_LDAP); | |
661 | - //debug($this->baseDn); | |
662 | - $user = $this->getFakeLdapUser($user_login); | |
354 | + } else { | |
355 | + $user = $this->getFakeLdapUser($login); | |
663 | 356 | // debug($user); |
664 | 357 | if ($user === false) |
665 | 358 | return FALSE; |
... | ... | @@ -668,22 +361,13 @@ class LdapConnectionsTable extends AppTable |
668 | 361 | // if ($user[$this->authenticationType][0] == "_NouvelUtilisateur_username" && $user['userpassword'][0] == "_NouvelUtilisateur_password") return $user; |
669 | 362 | if ($user[$this->authenticationType][0] == $this->getTheFakeLdapUser()['login'] && $user['userpassword'][0] == $this->getTheFakeLdapUser()['pass']) |
670 | 363 | return $user; |
671 | - if ( (new DefaultPasswordHasher())->check($user_password,$user['userpassword'][0]) ) | |
364 | + if ((new DefaultPasswordHasher())->check($password, $user['userpassword'][0])) | |
672 | 365 | return $user; |
673 | 366 | // if ($user != false && $user['userpassword'][0] == $password) { |
674 | 367 | } |
675 | - | |
676 | 368 | } |
677 | - | |
678 | - } catch (Exception $e) { | |
679 | - //echo 'Exception LDAP : ', $e->getMessage(), "\n"; | |
680 | - } | |
681 | - // Il y a eu un problème, l'utilisateur n'est pas reconnu | |
369 | + } catch (Exception $e) {} | |
682 | 370 | return FALSE; |
683 | - | |
684 | - } // end ldapAuthentication() | |
685 | - | |
686 | - | |
687 | - | |
371 | + } | |
688 | 372 | } |
689 | 373 | ?> |
690 | 374 | \ No newline at end of file | ... | ... |