3. Definizione del filtro di ricerca in stringa
La rappresentazione in stringa di un filtro di ricerca LDAP è una stringa di caratteri Unicode [Unicode] codificati in UTF-8 [RFC3629] che è definita dalla seguente grammatica, seguendo la notazione ABNF definita in [RFC4234]. Le produzioni utilizzate che non sono definite qui sono definite nella Sezione 1.4 (Produzioni ABNF comuni) di [RFC4512] se non diversamente specificato. Il formato del filtro utilizza una notazione prefissa.
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 ("~")
Si noti che sebbene entrambe le produzioni <substring> e <present> nella grammatica sopra possano produrre il costrutto "attr=*", questo costrutto viene utilizzato solo per denotare un filtro di presenza.
La regola <valueencoding> garantisce che l'intera stringa del filtro sia una stringa UTF-8 valida e prevede che gli ottetti che rappresentano i caratteri ASCII "*" (ASCII 0x2a), "(" (ASCII 0x28), ")" (ASCII 0x29), "" (ASCII 0x5c) e NUL (ASCII 0x00) siano rappresentati come una barra rovesciata "" (ASCII 0x5c) seguita dalle due cifre esadecimali che rappresentano il valore dell'ottetto codificato.
Questo semplice meccanismo di escape elimina le ambiguità di analisi del filtro e consente a qualsiasi filtro che può essere rappresentato in LDAP di essere rappresentato come una stringa con terminazione NUL. Altri ottetti che fanno parte del set <normal> possono essere sottoposti a escape utilizzando questo meccanismo, ad esempio i caratteri ASCII non stampabili.
Per AssertionValues che contengono dati di caratteri UTF-8, ogni ottetto del carattere da sottoporre a escape viene sostituito da una barra rovesciata e due cifre esadecimali, che formano un singolo ottetto nel codice del carattere. Ad esempio, il filtro che controlla se l'attributo "cn" conteneva un valore con il carattere "" ovunque in esso sarebbe rappresentato come "(cn=\2a*)".
Come indicato dalla regola <valueencoding>, le implementazioni DEVONO eseguire l'escape di tutti gli ottetti maggiori di 0x7F che non fanno parte di una sequenza di codifica UTF-8 valida quando generano una rappresentazione in stringa di un filtro di ricerca. Le implementazioni DOVREBBERO accettare come input stringhe che non sono stringhe UTF-8 valide. Ciò è necessario perché RFC 2254 non ha definito chiaramente il termine "rappresentazione in stringa" (e in particolare non ha menzionato che la rappresentazione in stringa di un filtro di ricerca LDAP è una stringa di caratteri Unicode codificati UTF-8).