Bug OpenLDAP LDAP Plugin Piwigo

De EjnTricks
Révision de 20 septembre 2018 à 15:13 par Etienne (discussion | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Study icon.png Anomalie

Malgré la validation des paramètres, les premières tentatives de connexion avec un compte LDAP n'ont pas permis de rentrer dans l'application. Le problème n'est pas observé lorsqu' aucun groupe n'est spécifié dans les filtres de recherche.

L'étude du code, et plus spécifique du fichier class.ldap.php va permettre d'identifier le problème. La fonction user_membership est utilisé afin de valider qu'un utilisateur se trouve dans un groupe. Or cette recherche est effectuée sur l'attribut interne memberUid contenant uniquement l'identifiant de l'utilisateur. Or, dans le cadre de cette installation sous OpenLDAP, cela n'est pas fonctionnel car l'attribut sur les groupes est member et contient l'identifiant complet du compte.


Update icon.png Modifications

Afin de corriger le problème, le fichier class.ldap.php est modifié ainsi.

        // This function takes the user and check if it is a member of some ldap groups.
        // This allows to set that it is allowed to log in, or that it is an admin or a webmaster (see function ldap_status)
        public function user_membership($user, $groups){
                // $groups is an array of groupdn ! (there is a possibility of several groups, we search the user in each of them).
                $userId = $this->config['ld_attr'].'='.$user.','
                        .(empty($this->config['usersbranch']) ? '' : $this->config['usersbranch'].',')
                        .(empty($this->config['basedn']) ? '' : $this->config['basedn']);
                foreach ($groups as $groupdn) {
                        $filter = '(objectClass=*)';
                        // $result = @ldap_read($this->cnx,$groupdn,$filter,array('memberUid'));
                        $result = @ldap_read($this->cnx,$groupdn,$filter,array('member'));
                        $result2 = @ldap_get_entries($this->cnx, $result);
                        // if(isset($result2[0]['memberuid'])){
                        if(isset($result2[0]['member'])){
                                // foreach($result2[0]['memberuid'] as $item){
                                foreach($result2[0]['member'] as $item){
                                        // if ($item == $user){
                                        if ($item == $userId){
                                                return True;
                                        }
                                }
                        }
                }
                return False;
        }

L'objectif de cette modification est de construire l'identifiant complet de l'utilisateur qui se connecte avec la racine de recherche, la branche de stockage des utilisateurs et l'identifiant de validation de l'utilisateur. Puis cette chaîne est validée sur l'attribute member du groupe.

Attention, cette modification est asez sommaire et ne prend pas forcément en compte les sous branches des groupes. Elle est fonctionnelle dans le cadre de cette installation et l'implémentation de l'annuaire, mais n'est absolument pas générique. Cependant, elle permet d'avoir une idée de la modification à apporter afin de rendre fonctionnel le plugin.


Untar-icon.png Package installé

Plugin installé: Ldap login plugin Piwigo.tar.gz