Commit 4a4323e3 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

Move large string comment to just above UTF8StringValidate().

parent 50d490be
......@@ -5,74 +5,6 @@
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
/****
LDAP/X.500 string syntax / matching rules have a few oddities. This
comment attempts to detail how slapd(8) treats them.
Summary:
StringSyntax X.500 LDAP Matching
DirectoryString CHOICE UTF8 i/e + ignore insignificant spaces
PrintableString subset subset i/e + ignore insignificant spaces
NumericString subset subset ignore all spaces
IA5String ASCII ASCII i/e + ignore insignificant spaces
TeletexString T.61 T.61 i/e + ignore insignificant spaces
TelephoneNumber subset subset i + ignore all spaces and "-"
See draft-ietf-ldapbis-strpro for details (once published).
Directory String -
In X.500(93), a directory string can be either a PrintableString,
a bmpString, or a UniversalString (e.g., UCS (a subset of Unicode)).
In later versions, more CHOICEs were added. In all cases the string
must be non-empty.
In LDPAv3, a directory string is a UTF-8 encoded UCS string.
For matching, there are both case ignore and exact rules. Both
also require that "insignificant" spaces be ignored.
spaces before the first non-space are ignored;
spaces after the last non-space are ignored;
spaces after a space are ignored.
Note: by these rules (and as clarified in X.520), a string of only
spaces is to be treated as if held one space, not empty (which would
be a syntax error).
NumericString
In ASN.1, numeric string is just a string of digits and spaces and
could be empty. However, in X.500, all attribute values of numeric
string carry a non-empty constraint. For example:
internationalISDNNumber ATTRIBUTE ::= {
WITH SYNTAX InternationalISDNNumber
EQUALITY MATCHING RULE numericStringMatch
SUBSTRINGS MATCHING RULE numericStringSubstringsMatch
ID id-at-internationalISDNNumber }
InternationalISDNNumber ::= NumericString (SIZE(1..ub-international-isdn-number))
Unfornately, some assertion values are don't carry the same constraint
(but its unclear how such an assertion could ever be true). In LDAP,
there is one syntax (numericString) not two (numericString with constraint,
numericString without constraint). This should be treated as numericString
with non-empty constraint. Note that while someone may have no
ISDN number, there are no ISDN numbers which are zero length.
In matching, spaces are ignored.
PrintableString
In ASN.1, Printable string is just a string of printable characters and
can be empty. In X.500, semantics much like NumericString (see serialNumber
for a like example) excepting uses insignificant space handling instead of
ignore all spaces.
IA5String
Basically same as PrintableString. There are no examples in X.500, but
same logic applies. So we require them to be non-empty as well.
****/
#include "portable.h"
#include <stdio.h>
......@@ -556,6 +488,76 @@ booleanMatch(
return LDAP_SUCCESS;
}
/*-------------------------------------------------------------------
LDAP/X.500 string syntax / matching rules have a few oddities. This
comment attempts to detail how slapd(8) treats them.
Summary:
StringSyntax X.500 LDAP Matching
DirectoryString CHOICE UTF8 i/e + ignore insignificant spaces
PrintableString subset subset i/e + ignore insignificant spaces
NumericString subset subset ignore all spaces
IA5String ASCII ASCII i/e + ignore insignificant spaces
TeletexString T.61 T.61 i/e + ignore insignificant spaces
TelephoneNumber subset subset i + ignore all spaces and "-"
See draft-ietf-ldapbis-strpro for details (once published).
Directory String -
In X.500(93), a directory string can be either a PrintableString,
a bmpString, or a UniversalString (e.g., UCS (a subset of Unicode)).
In later versions, more CHOICEs were added. In all cases the string
must be non-empty.
In LDPAv3, a directory string is a UTF-8 encoded UCS string.
For matching, there are both case ignore and exact rules. Both
also require that "insignificant" spaces be ignored.
spaces before the first non-space are ignored;
spaces after the last non-space are ignored;
spaces after a space are ignored.
Note: by these rules (and as clarified in X.520), a string of only
spaces is to be treated as if held one space, not empty (which
would be a syntax error).
NumericString
In ASN.1, numeric string is just a string of digits and spaces
and could be empty. However, in X.500, all attribute values of
numeric string carry a non-empty constraint. For example:
internationalISDNNumber ATTRIBUTE ::= {
WITH SYNTAX InternationalISDNNumber
EQUALITY MATCHING RULE numericStringMatch
SUBSTRINGS MATCHING RULE numericStringSubstringsMatch
ID id-at-internationalISDNNumber }
InternationalISDNNumber ::=
NumericString (SIZE(1..ub-international-isdn-number))
Unforunately, some assertion values are don't carry the same
constraint (but its unclear how such an assertion could ever
be true). In LDAP, there is one syntax (numericString) not two
(numericString with constraint, numericString without constraint).
This should be treated as numericString with non-empty constraint.
Note that while someone may have no ISDN number, there are no ISDN
numbers which are zero length.
In matching, spaces are ignored.
PrintableString
In ASN.1, Printable string is just a string of printable characters
and can be empty. In X.500, semantics much like NumericString (see
serialNumber for a like example) excepting uses insignificant space
handling instead of ignore all spaces.
IA5String
Basically same as PrintableString. There are no examples in X.500,
but same logic applies. So we require them to be non-empty as
well.
-------------------------------------------------------------------*/
static int
UTF8StringValidate(
Syntax *syntax,
......@@ -665,7 +667,7 @@ UTF8StringNormalize(
assert( q+len <= p );
/* cannot start with a space */
assert( !ASCII_SPACE(normalized->bv_val[0]) );
assert( !ASCII_SPACE( normalized->bv_val[0] ) );
/*
* If the string ended in space, backup the pointer one
......@@ -717,7 +719,9 @@ UTF8SubstringsassertionNormalize(
for( i=0; sa->sa_any[i].bv_val != NULL; i++ ) {
/* empty */
}
nsa->sa_any = (struct berval *)ch_malloc( (i + 1) * sizeof(struct berval) );
nsa->sa_any = (struct berval *)
ch_malloc( (i + 1) * sizeof(struct berval) );
for( i=0; sa->sa_any[i].bv_val != NULL; i++ ) {
UTF8bvnormalize( &sa->sa_any[i], &nsa->sa_any[i],
casefold );
......@@ -739,7 +743,7 @@ UTF8SubstringsassertionNormalize(
err:
if ( nsa->sa_final.bv_val ) free( nsa->sa_final.bv_val );
if ( nsa->sa_any )ber_bvarray_free( nsa->sa_any );
if ( nsa->sa_any ) ber_bvarray_free( nsa->sa_any );
if ( nsa->sa_initial.bv_val ) free( nsa->sa_initial.bv_val );
ch_free( nsa );
return NULL;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment