3. Définition du filtre de recherche sous forme de chaîne
La représentation sous forme de chaîne d'un filtre de recherche LDAP est une chaîne de caractères Unicode [Unicode] encodés en UTF-8 [RFC3629] qui est définie par la grammaire suivante, suivant la notation ABNF définie dans [RFC4234]. Les productions utilisées qui ne sont pas définies ici sont définies dans la section 1.4 (Productions ABNF communes) de [RFC4512], sauf indication contraire. Le format de filtre utilise une notation préfixée.
filter = LPAREN filtercomp RPAREN
filtercomp = and / or / not / item
and = AMPERSAND filterlist
or = VERTBAR filterlist
not = EXCLAMATION filter
filterlist = 1*filter
item = simple / present / substring / extensible
simple = attr filtertype assertionvalue
filtertype = equal / approx / greaterorequal / lessorequal
equal = EQUALS
approx = TILDE EQUALS
greaterorequal = RANGLE EQUALS
lessorequal = LANGLE EQUALS
extensible = ( attr [dnattrs]
[matchingrule] COLON EQUALS assertionvalue )
/ ( [dnattrs]
matchingrule COLON EQUALS assertionvalue )
present = attr EQUALS ASTERISK
substring = attr EQUALS [initial] any [final]
initial = assertionvalue
any = ASTERISK *(assertionvalue ASTERISK)
final = assertionvalue
attr = attributedescription
; The attributedescription rule is defined in
; Section 2.5 of [RFC4512].
dnattrs = COLON "dn"
matchingrule = COLON oid
assertionvalue = valueencoding
; The <valueencoding> rule is used to encode an <AssertionValue>
; from Section 4.1.6 of [RFC4511].
valueencoding = 0*(normal / escaped)
normal = UTF1SUBSET / UTFMB
escaped = ESC HEX HEX
UTF1SUBSET = %x01-27 / %x2B-5B / %x5D-7F
; UTF1SUBSET excludes 0x00 (NUL), LPAREN,
; RPAREN, ASTERISK, and ESC.
EXCLAMATION = %x21 ; exclamation mark ("!")
AMPERSAND = %x26 ; ampersand (or AND symbol) ("&")
ASTERISK = %x2A ; asterisk ("*")
COLON = %x3A ; colon (":")
VERTBAR = %x7C ; vertical bar (or pipe) ("|")
TILDE = %x7E ; tilde ("~")
Notez que bien que les productions <substring> et <present> dans la grammaire ci-dessus puissent produire la construction "attr=*", cette construction n'est utilisée que pour désigner un filtre de présence.
La règle <valueencoding> garantit que la chaîne de filtre entière est une chaîne UTF-8 valide et prévoit que les octets représentant les caractères ASCII "*" (ASCII 0x2a), "(" (ASCII 0x28), ")" (ASCII 0x29), "" (ASCII 0x5c) et NUL (ASCII 0x00) sont représentés par une barre oblique inverse "" (ASCII 0x5c) suivie des deux chiffres hexadécimaux représentant la valeur de l'octet codé.
Ce mécanisme d'échappement simple élimine les ambiguïtés d'analyse des filtres et permet à tout filtre pouvant être représenté dans LDAP d'être représenté sous forme de chaîne terminée par NUL. D'autres octets faisant partie de l'ensemble <normal> peuvent être échappés à l'aide de ce mécanisme, par exemple les caractères ASCII non imprimables.
Pour les AssertionValues qui contiennent des données de caractères UTF-8, chaque octet du caractère à échapper est remplacé par une barre oblique inverse et deux chiffres hexadécimaux, qui forment un seul octet dans le code du caractère. Par exemple, le filtre vérifiant si l'attribut "cn" contenait une valeur avec le caractère "" n'importe où serait représenté par "(cn=\2a*)".
Comme indiqué par la règle <valueencoding>, les implémentations DOIVENT échapper tous les octets supérieurs à 0x7F qui ne font pas partie d'une séquence de codage UTF-8 valide lorsqu'elles génèrent une représentation sous forme de chaîne d'un filtre de recherche. Les implémentations DEVRAIENT accepter en entrée des chaînes qui ne sont pas des chaînes UTF-8 valides. Ceci est nécessaire car la RFC 2254 n'a pas clairement défini le terme "représentation sous forme de chaîne" (et en particulier n'a pas mentionné que la représentation sous forme de chaîne d'un filtre de recherche LDAP est une chaîne de caractères Unicode encodés en UTF-8).