OpenLDAP et les classes d'objets inexistantes

Je suis tombé sur un comportement curieux lors d'une réconciliation d'un annuaire OpenLDAP avec IBM Tivoli Identity Manager : impossible de récupérer les données de Groupes du service.

Dans les logs ITDI, le filtre LDAP était correct, et le même filtre passait correctement sur le réseau, en analysant le flux via tcpdump :

Group connector : Setting search criteria as (&(objectclass=groupOfNames)(!(objectclass=erldapuseraccount)))

La même réconciliation fonctionnait parfaitement sur un annuaire LDAP IBM Tivoli Directory Server.

En cause, la tendance de l'annuaire OpenLDAP a être très (trop ?) restrictif sur la syntaxe. Visiblement, lorsqu'on lui donne un filtre avec une classe d'objet inexistante, il ne renvoie rien, même si on veut tous les objets qui n'ont pas cette classe. Par exemple, la requête :

(!(objectclass=uneclasseinconnue))

ne renvoie aucun résultat sur OpenLDAP, alors que la même requête avec ITDS renvoie la liste des objets qui n'ont pas cette classe (et donc logiquement tous les objets, puisque cette classe n'existe pas).

Du coup l'adaptateur standard ITIM (LDAPProfile.jar) ne permet pas de réconcilier les données de support. Pour réussir à faire cela, il faut modifier la ligne d'assemblage LDAPSearch.xml du côté de la ligne 261 :

// grpSearchFilter = "(&(" + Packages.com.ibm.di.utils.LDAPAdapterUtils.OBJECTCLASS + "=" + gGrpObjectClass + ")" + gSearchFilter + ")";
//Changed for Supported Data
grpSearchFilter = "(&(" + Packages.com.ibm.di.utils.LDAPAdapterUtils.OBJECTCLASS + "=" + gGrpObjectClass + ")" + ")" ;

 

Catégorie