1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
function LDAPSearch(LDAP:integer; Name:string):string;
var
s1,s2,s3:string;
begin
Result:='';
// construction de la requête LDAP
s1:=Chunk(LDAP_SEQUENCE, // SEQUENCE
// en vrai, l'ID devrait incrémenté à chaque requête...
Chunk(LDAP_INTEGER,#2)+ // Message ID 2
// on va faire une recherche
Chunk(LDAP_SEARCH, // Search
// chaine vide = objet de base (efin il me semble :) )
Chunk(LDAP_STRING,'')+ // BaseObject
// sur tout l'arbre
Chunk(LDAP_ENUM,#2)+ // Scope 2 = Whole Tree
// en incluant les alias
Chunk(LDAP_ENUM,#0)+ // Aliases 0 = derefaliases
// sans limite de taille
Chunk(LDAP_INTEGER,#0)+ // Size limite
// ni de temps
Chunk(LDAP_INTEGER,#0)+ // Time limite
// ni de type d'objet
Chunk(LDAP_BOOLEAN,LDAP_FALSE)+ // Type only (boolean)
// et maintenant le filtre
// un OR entre les deux qui suivent
Chunk(LDAP_FILTER_OR, // Filter = OR
// le premier est un MATCH entre "cn" et le nom
Chunk(LDAP_FILTER_MATCH, // Filter = Equality Match
Chunk(LDAP_STRING,'cn')+ // common name
Chunk(LDAP_STRING,Name)
)+
// le second est un match entre "uid" et le nom
Chunk(LDAP_FILTER_MATCH, // Filter = Equality Match
Chunk(LDAP_STRING,'uid')+ // unique id
Chunk(LDAP_STRING,Name)
)
)+
// fin du chunk
Chunk(LDAP_SEQUENCE,
Chunk(LDAP_NULL,'') // NULL
)
)
);
// on envoie la requte
if SendData(LDAP,s1[1],Length(s1))<=0 then exit;
// on lit la séquence réponse dans s1, s2 est un buffer de réception
s1:='';
if not ReadSequence(LDAP,s1,s2,2) then exit;
// ouverture du chunk qui doit être un SEARCH_ENTRY
if not OpenChunk(LDAP_SEARCH_ENTRY,s1) then exit;
// la 2ième séquence dans s2 (s3 est le buffer de réception)
if not ReadSequence(LDAP,s2,s3,2) then exit;
// on ne devrait pas avoir de 3ième séquence (voir ci-dessous)
if s3<>'' then exit;
// la seconde séquence doit être un SEARCH_DONE (sinon, c'est qu'on a plusieurs réponses...ce qui sera le cas sur un explorateur)
if not OpenChunk(LDAP_SEARCH_DONE,s2) then exit; // Search Done
// tout va bien, donc la première séquence est la chaine que l'on cherche
Result:=StrChunk(s1);
end; |