From: Kurt Zeilenga Date: Fri, 28 Feb 2003 05:13:29 +0000 (+0000) Subject: SLAP_NVALUES: a couple of basic normalizers... but not working yet. X-Git-Tag: NO_SLAP_OP_BLOCKS~256 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=840f3644f4d54a6f6bea59750d95c893824a6611;p=openldap SLAP_NVALUES: a couple of basic normalizers... but not working yet. --- diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index a24e250abb..885066970e 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -607,6 +607,20 @@ int slap_mods_check( } } + /* + * a rough single value check... an additional check is needed + * to catch add of single value to existing single valued attribute + */ + if ((ml->sml_op == LDAP_MOD_ADD || ml->sml_op == LDAP_MOD_REPLACE) + && nvals > 1 && is_at_single_value( ad->ad_type )) + { + snprintf( textbuf, textlen, + "%s: multiple values provided", + ml->sml_type.bv_val ); + *text = textbuf; + return LDAP_CONSTRAINT_VIOLATION; + } + #ifdef SLAP_NVALUES if( nvals && ad->ad_type->sat_equality && ad->ad_type->sat_equality->smr_normalize ) @@ -639,20 +653,6 @@ int slap_mods_check( ml->sml_nvalues[nvals].bv_len = 0; } #endif - - /* - * a rough single value check... an additional check is needed - * to catch add of single value to existing single valued attribute - */ - if ((ml->sml_op == LDAP_MOD_ADD || ml->sml_op == LDAP_MOD_REPLACE) - && nvals > 1 && is_at_single_value( ad->ad_type )) - { - snprintf( textbuf, textlen, - "%s: multiple value provided", - ml->sml_type.bv_val ); - *text = textbuf; - return LDAP_CONSTRAINT_VIOLATION; - } } } diff --git a/servers/slapd/schema_init.c b/servers/slapd/schema_init.c index 16271a6a29..070c14cde4 100644 --- a/servers/slapd/schema_init.c +++ b/servers/slapd/schema_init.c @@ -32,6 +32,9 @@ /* TO BE DELETED */ #define SLAP_MR_DN_FOLD (0) +#define SLAP_MR_ASSOCIATED(mr, with) \ + ((mr) == (with) || (mr)->smr_associated == (with)) + #define xUTF8StringNormalize NULL #define xIA5StringNormalize NULL #define xtelephoneNumberNormalize NULL @@ -40,6 +43,23 @@ #define xnumericStringNormalize NULL #define xnameUIDNormalize NULL +/* (new) normalization routines */ +#define caseExactIA5Normalize IA5StringNormalize +#define caseIgnoreIA5Normalize IA5StringNormalize +#define caseExactNormalize UTF8StringNormalize +#define caseIgnoreNormalize UTF8StringNormalize + +#define distinguishedNameNormalize NULL +#define integerNormalize NULL +#define integerFirstComponentNormalize NULL +#define numericStringNormalize NULL +#define objectIdentifierNormalize NULL +#define objectIdentifierFirstComponentNormalize NULL +#define generalizedTimeNormalize NULL +#define uniqueMemberNormalize NULL +#define bitStringNormalize NULL +#define telephoneNumberNormalize NULL + #define distinguishedNameMatch dnMatch #define distinguishedNameIndexer octetStringIndexer #define distinguishedNameFilter octetStringFilter @@ -117,22 +137,6 @@ /* validatation routines */ #define berValidate blobValidate -/* (new) normalization routines */ -#define caseExactNormalize NULL -#define caseExactIA5Normalize NULL -#define caseIgnoreNormalize NULL -#define caseIgnoreIA5Normalize NULL -#define distinguishedNameNormalize NULL -#define integerNormalize NULL -#define integerFirstComponentNormalize NULL -#define numericStringNormalize NULL -#define objectIdentifierNormalize NULL -#define objectIdentifierFirstComponentNormalize NULL -#define generalizedTimeNormalize NULL -#define uniqueMemberNormalize NULL -#define bitStringNormalize NULL -#define telephoneNumberNormalize NULL - /* approx matching rules */ #ifdef SLAP_NVALUES #define directoryStringApproxMatchOID NULL @@ -150,6 +154,23 @@ #ifndef SLAP_NVALUES +/* (new) normalization routines */ +#define caseExactNormalize NULL +#define caseExactIA5Normalize NULL +#define caseIgnoreNormalize NULL +#define caseIgnoreIA5Normalize NULL +#define distinguishedNameNormalize NULL +#define integerNormalize NULL +#define integerFirstComponentNormalize NULL +#define numericStringNormalize NULL +#define objectIdentifierNormalize NULL +#define objectIdentifierFirstComponentNormalize NULL +#define generalizedTimeNormalize NULL +#define uniqueMemberNormalize NULL +#define bitStringNormalize NULL +#define telephoneNumberNormalize NULL + + /* matching routines */ #define bitStringMatch octetStringMatch #define bitStringIndexer octetStringIndexer @@ -569,9 +590,10 @@ 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 + StringSyntax X.500 LDAP Matching/Comments DirectoryString CHOICE UTF8 i/e + ignore insignificant spaces PrintableString subset subset 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 @@ -588,6 +610,7 @@ Directory String - must be non-empty. In LDAPv3, a directory string is a UTF-8 encoded UCS string. + A directory string cannot be zero length. For matching, there are both case ignore and exact rules. Both also require that "insignificant" spaces be ignored. @@ -643,7 +666,10 @@ UTF8StringValidate( int len; unsigned char *u = in->bv_val; - if( !in->bv_len ) return LDAP_INVALID_SYNTAX; + if( in->bv_len == 0 && syntax == slap_schema.si_syn_directoryString ) { + /* directory strings cannot be empty */ + return LDAP_INVALID_SYNTAX; + } for( count = in->bv_len; count > 0; count-=len, u+=len ) { /* get the length indicated by the first byte */ @@ -683,12 +709,79 @@ UTF8StringValidate( if( LDAP_UTF8_OFFSET( u ) != len ) return LDAP_INVALID_SYNTAX; } - if( count != 0 ) return LDAP_INVALID_SYNTAX; + if( count != 0 ) { + return LDAP_INVALID_SYNTAX; + } return LDAP_SUCCESS; } -#ifndef SLAP_NVALUES +#ifdef SLAP_NVALUES +static int +UTF8StringNormalize( + slap_mask_t use, + Syntax *syntax, + MatchingRule *mr, + struct berval *val, + struct berval *normalized ) +{ + struct berval tmp, nvalue; + int flags; + int i, wasspace; + + if( val->bv_val == NULL ) { + /* assume we're dealing with a syntax (e.g., UTF8String) + * which allows empty strings + */ + normalized->bv_len = 0; + normalized->bv_val = NULL; + return LDAP_SUCCESS; + } + + flags = SLAP_MR_ASSOCIATED(mr, slap_schema.si_mr_caseExactMatch ) + ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD; + flags |= ( use & SLAP_MR_EQUALITY_APPROX == SLAP_MR_EQUALITY_APPROX ) + ? LDAP_UTF8_APPROX : 0; + + val = UTF8bvnormalize( val, &tmp, flags ); + if( val == NULL ) { + return LDAP_OTHER; + } + + /* collapse spaces (in place) */ + nvalue.bv_len = 0; + nvalue.bv_val = tmp.bv_val; + + wasspace=1; /* trim leading spaces */ + for( i=0; ibv_len ); @@ -2318,6 +2422,13 @@ xIA5StringNormalize( while ( ASCII_SPACE( *p ) ) { p++; } + +#ifdef SLAP_NVALUES + } else if ( casefold ) { + /* Most IA5 rules require casefolding */ + *q++ = TOLOWER(*p++); +#endif + } else { *q++ = *p++; } @@ -2351,6 +2462,8 @@ xIA5StringNormalize( return LDAP_SUCCESS; } +#ifndef SLAP_NVALUES + static int caseExactIA5Match( int *matchp, @@ -4839,7 +4952,7 @@ static slap_mrule_defs_rec mrule_defs[] = { "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", SLAP_MR_ORDERING, NULL, NULL, - generalizedTimeOrderingMatch, generalizedTimeOrderingMatch, + generalizedTimeNormalize, generalizedTimeOrderingMatch, NULL, NULL, NULL}, diff --git a/servers/slapd/schema_prep.c b/servers/slapd/schema_prep.c index abb2b2217a..5905bb61c8 100644 --- a/servers/slapd/schema_prep.c +++ b/servers/slapd/schema_prep.c @@ -796,6 +796,8 @@ static struct slap_schema_mr_map { char *ssmm_name; size_t ssmm_offset; } mr_map[] = { + { "caseExactIA5Match", + offsetof(struct slap_internal_schema, si_mr_caseExactIA5Match) }, { "caseExactMatch", offsetof(struct slap_internal_schema, si_mr_caseExactMatch) }, { "caseExactSubstringsMatch", @@ -814,12 +816,14 @@ static struct slap_schema_syn_map { char *sssm_name; size_t sssm_offset; } syn_map[] = { - { "1.3.6.1.4.1.1466.115.121.1.40", - offsetof(struct slap_internal_schema, si_syn_octetString) }, + { "1.3.6.1.4.1.1466.115.121.1.15", + offsetof(struct slap_internal_schema, si_syn_directoryString) }, { "1.3.6.1.4.1.1466.115.121.1.12", offsetof(struct slap_internal_schema, si_syn_distinguishedName) }, { "1.3.6.1.4.1.1466.115.121.1.27", offsetof(struct slap_internal_schema, si_syn_integer) }, + { "1.3.6.1.4.1.1466.115.121.1.40", + offsetof(struct slap_internal_schema, si_syn_octetString) }, { NULL, 0 } }; diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 8d033a96a2..340e46538f 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -792,13 +792,15 @@ struct slap_internal_schema { MatchingRule *si_mr_distinguishedNameMatch; MatchingRule *si_mr_caseExactMatch; MatchingRule *si_mr_caseExactSubstringsMatch; + MatchingRule *si_mr_caseExactIA5Match; MatchingRule *si_mr_integerMatch; MatchingRule *si_mr_integerFirstComponentMatch; /* Syntaxes */ - Syntax *si_syn_octetString; + Syntax *si_syn_directoryString; Syntax *si_syn_distinguishedName; Syntax *si_syn_integer; + Syntax *si_syn_octetString; }; typedef struct slap_attr_assertion {