Bonjour,

Je constate un bug assez embêtant sur la dernière version stable de GLPI (depuis au moins la version 0.83, mais le bug n'existait pas en 0.71 par exemple) : lorsqu'un utilisateur match plusieurs règles d'affectation de droits qui aboutissent exactement sur les mêmes droits (affectation du même triplet entité/profil/récursivité), ce droit supplémentaire est ajouté à l'utilisateur alors qu'il existe déjà.

Je me retrouve donc avec certains utilisateurs qui ont 900 affectations identiques (comme chaque jour j'ai le script ldap_mass_sync.php qui se lance et synchronise les droits).

J'ai trouvé le bug dans GLPI qui cause ceci : on a une double boucle qui parcourt les droits à affecter (basés sur les règles définies dans la config de GLPI) puis une seconde qui parcours les droits actuels de l'utilisateur (en base de données). Lorsque les triplets sont identiques à l'intérieur de cette double boucle, on supprime les index des 2 tableaux parcourus par chaque boucle.

Le problème est que si on a des règles qui valident le même triplet entité/profil/récursivité, on va avoir plusieurs fois ce triplet dans la boucle extérieure. Au premier triplet qui se présente, on supprime tous les triplets qui matchent dans le tableau qui provient de la BDD. Le tableau de la BDD n'a maintenant plus aucun triplet identique. Or ensuite on continue de parcourir le tableau des droits provenant des règles, qui contient lui potentiellement d'autres triplets identiques. Comme maintenant ces triplets n'existent plus dans la BDD, GLPI se dit qu'il faut les ajouter à l'utilisateur. Et voilà comment GLPI remplit la BDD de doublons (avec autant de doublons à chaque synchro qu'il y a de règles qui aboutissent sur le même triplet).

Le correctif que j'ai utilisé est simplement d'inverser les boucles : comme on ajoute uniquement que les triplets qui n'existent pas déjà en base, si on parcourt en premier les triplets en base en supprimant ceux provenant des règles, on est sûr de n'ajouter que les triplets manquants.

Je vous joints mon patch qui corrige donc ce problème.

Au passage, dans ces boucles, la variable $found semble ne servir à rien...

Cordialement
Régis Damongeot
Index: inc/user.class.php
===================================================================
--- inc/user.class.php  (revision 2045)
+++ inc/user.class.php  (working copy)
@@ -842,11 +842,11 @@
 
             // Compare retrived profiles to existing ones : clean arrays to do 
purge and add
             if (count($retrieved_dynamic_profiles)) {
-               foreach ($retrieved_dynamic_profiles as $keyretr => 
$retr_profile) {
+               foreach ($dynamic_profiles as $keydb => $db_profile) {
                   $found = false;
+                  foreach ($retrieved_dynamic_profiles as $keyretr => 
$retr_profile) {
+                     // Found existing profile : unset values in array
 
-                  foreach ($dynamic_profiles as $keydb => $db_profile) {
-                     // Found existing profile : unset values in array
                      if (!$found
                          && $db_profile['entities_id']  == 
$retr_profile['entities_id']
                          && $db_profile['profiles_id']  == 
$retr_profile['profiles_id']
_______________________________________________
Glpi-dev mailing list
Glpi-dev@gna.org
https://mail.gna.org/listinfo/glpi-dev

Reply via email to