Greboca  

LinuxFr.org : les journaux  -  PHP 7.3 apporte le support des contrôles dans PHP-LDAP

 -  19 janvier - 

Sommaire

PHP 7.3 est sorti le 6 décembre 2018 et apporte le support des contrôles dans l’extension LDAP.

La précédente version 7.2 contenait elle le support des opérations étendues.

Étant à l’origine de ces deux ajouts je voulais revenir sur ces fonctionnalités et leur support dans PHP.

PHP-LDAP

Le support LDAP dans PHP est un peu daté.
Il n’y a pas d’interface orientée objet, et le support de certaines fonctionnalités avancées du protocole LDAP étaient manquantes.

En cherchant un peu, je suis tombé sur des patchs et des tickets qui dataient de 2005 pour les plus vieux.
Ça manquait clairement de mainteneur coté PHP, et la seule fonctionnalité à avoir été fusionnée était le support des contrôles dans le cas très spécifique de la pagination: http://php.net/manual/fr/function.ldap-control-paged-result.php

J’ai donc contacté le projet PHP et ait demandé à devenir mainteneur du module LDAP. C’était étonnamment facile d’obtenir le poste (A priori personne chez PHP ne s’intéressent à LDAP et c’était juste un truc qu’ils gardent dans un coin parce que ça marche).
Mon employeur a accepté que je fasse ça sur mon temps de travail vu l’usage avancé qu’on fait de LDAP et on compte bien utiliser les nouvelles fonctionnalités à terme.

J’ai d’abord naïvement pensé qu’il suffirait de relancer les gens qui s’étaient heurtés à des refus pour être enseveli par les propositions de patch et n’avoir plus qu’à faire mon marché. Mais étonamment depuis 2005 il semble que les gens concernés aient changés de postes, entreprise, intérêts et je n’ai quasiment pas eu de réponses.
J’ai assez vite compris que j’allais devoir développer moi même si je voulais faire avancer les choses, en m’inspirant des différents patchs glanés sur le web.
Ça a été un peu difficile puisque comme j’ai toujours contacté les serveurs LDAP au travers de PHP, les choses qui ne sont pas supportées par php-ldap, je ne les ait jamais utilisées.

Mais j’y suis parvenu et on arrive enfin au terme de cette trop longue introduction.

PHP 7.2: les opérations étendues

Les opérations étendues (Extended Operations, souvent abrégées exop), sont des opérations autre que celles de base (add/bind/delete/search/compare/modify), dont le support varie d’un serveur LDAP à un autre.

Il faut donc d’abord consulter le RootDSE, c’est à dire faire une recherche LDAP avec un DN vide et le scope base.
Dans le résultat on regarde l’attribut supportedExtension qui liste les OIDs des opérations étendues supportées par ce serveur.

PHP 7.2 ajoute donc la fonction suivante pour appeler de telles opérations:

ldap_exop ( resource $link , string $reqoid [, string $reqdata = NULL [, array $serverctrls = NULL [, string &$retdata [, string &$retoid ]]]] ) : mixed

Comme $reqdata doit pour la plupart des opérations contenir des données encodées en BER et que c’est pas forcément trivial à faire, il existe aussi des helpers pour les opérations étendues les plus courantes:

  • ldap_​exop_​passwd: Opération étendue pour changer un mot de passe (qui laisse le serveur s’occuper du hashage et permet à des overlay comme password policy d’appliquer des politiques de mot de passe)
  • ldap_​exop_​refresh: Opération pour rafraichir une entrée dynamique (uniquement disponible dans PHP 7.3, j’ai raté la deadline)
  • ldap_​exop_​whoami: Opération pour obtenir le DN utilisé lors du bind

À noter que des constantes sont aussi définies pour toutes les OID des opérations étendues connues, à savoir LDAP_EXOP_START_TLS, LDAP_EXOP_MODIFY_PASSWD, LDAP_EXOP_REFRESH, LDAP_EXOP_WHO_AM_I, LDAP_EXOP_TURN.

PHP 7.3: les contrôles

Les contrôles sont un autre moyen d’étendre le protocole LDAP, cette fois ci lors d’une opération standard, mais à laquelle on veut rajouter des contraintes ou des fonctionnalités.

De la même manière que pour les opérations étendues, on peut connaître les contrôles supportés par le serveur en interrogeant le RootDSE et en regardant l’attribut supportedControl.

Comme il y a beaucoup plus de contrôles et qu’il doivent être passés avec les opérations classiques, je n’ai pas fait une méthode par contrôle supporté mais ai convenu d’une façon de représenter chaque contrôle sous forme d’un tableau.

Avec la plupart des opérations LDAP il est maintenant possible de passer un tableau contenant pour chaque contrôle à envoyer un tableau contenant les clés suivantes:

  • oid: Chaine contenant l’OID du contrôle. Il est recommandé d’utiliser les constantes prédéfinies.
  • iscritical: Booléen indiquant quoi faire si le serveur ne connait pas ce contrôle: Soit il l’ignore, soit l’opération échoue. Attention certains contrôles indiquent dans leur RFC que iscritical doit toujours être à vrai
  • value: Soit une chaine contenant directement la valeur, soit pour les contrôles supportés un tableau contenant les données appropriées.

Pour les clés attendues dans value en fonction des contrôles je vous laisse lire la documentation: http://php.net/manual/fr/ldap.controls.php

Les contrôles supportés sont les suivants:

  • LDAP_CONTROL_PAGEDRESULTS Qui permet de paginer les résultats d’une recherche
  • LDAP_CONTROL_ASSERT Qui permet d’ajouter une assertion nécessaire à l’execution d’une opération (exemple: s’assurer qu’un entier vaut n dans une modification qui le met à n+1)
  • LDAP_CONTROL_VALUESRETURNFILTER Qui permet de filtrer les valeurs retournées pour un attribut
  • LDAP_CONTROL_PRE_READ Qui permet de lire certains attributs avant execution de l’opération (exemple: sauver la valeur de certains attributs lors d’une suppression)
  • LDAP_CONTROL_POST_READ Qui permet de lire certains attributs après opération (exemple: lire la valeur d’un attribut autogénéré à la création d’une entrée)
  • LDAP_CONTROL_SORTREQUEST Qui permet de demander au serveur de trier les résultats d’une requête
  • LDAP_CONTROL_VLVREQUEST Qui permet de faire des vues, assez proche de la pagination
  • LDAP_CONTROL_PASSWORDPOLICYREQUEST Qui indique qu’on souhaite avoir les informations ppolicy dans la réponse
  • LDAP_CONTROL_MANAGEDSAIT Qui indique qu’on veut modifier une référence et pas l’objet qu’elle référence.
  • LDAP_CONTROL_DONTUSECOPY Qui interdit au serveur de travailler sur une copie des données.
  • LDAP_CONTROL_PROXY_AUTHZ Qui est l’équivalent LDAP d’un sudo.

Il peut aussi y avoir des contrôles dans les réponses, qui sont récupérables avec ldap_parse_result.
Pour les opérations qui ne donnaient pas accès à l’objet réponse, par exemple ldap_bind qui renvoit un booléen directement, une version avec le suffixe _ext a été ajoutée pour obtenir l’objet réponse.

Futur

ldap_sort est déprécié et sera retiré dans PHP 8.
ldap_control_paged_result et ldap_control_paged_result_response devraient être bientôt dépréciées et retirées aussi de PHP 8, au profit de la nouvelle API.

Idéalement il faudrait ajouter à ldap_exop un support des exop sous forme de tableau comme pour les contrôles, pour ne pas avoir à passer par les fonctions spécifiques à chaque exop et pouvoir facilement envoyer des contrôles avec une exop et récupérer les contrôles retournés par le serveur.

À noter que toutes ces fonctionnalités ont encore été peu testées, donc n’hésitez pas à ouvrir des rapports de bug si vous rencontrez des problèmes lors de leur utilisation.

Commentaires : voir le flux atom ouvrir dans le navigateur

par MCMic

LinuxFr.org : les journaux

LinuxFr.org : Journaux

Sécurité, vie privée... et Google Analytics!

 -  14 février - 

Ave, 'nal (ça fait vénal, je sait, c'est fait exprès). Il y a un détail qui m'intrigue: c'est très bien de vouloir la vie privée renforcée sur (...)


Suivre les amendements débattue à l'assemblée nationale avec Eliasse

 -  13 février - 

Il m'arrive parfois de suivre les séances de débats à l'assemblée nationale via la diffusion en direct ou en regardant les rediffusions vidéo. Le (...)


Utilisation de GtkTreeModel, GtkTreeView et consorts

 -  11 février - 

Sommaire Introduction Création du modèle et ajout des données Ajout d'un tri sur le modèle Ajout d'un filtre sur le modèle Affichage des données du (...)


Mettre en place des build automatiques avec jenkins et docker

 -  10 février - 

Sommaire Mettre en place des build automatiques avec jenkins et dockerOutils installation de docker installation de jenkins Création d'un agent (...)


Delta Chat est prêt pour le bureau

 -  7 février - 

Delta Chat est un logiciel de messagerie instantanée comme il en existe des milliers: on ajoute des contacts, on crée des groupes et s'envoie des (...)