X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschema_init.c;h=d1e4068a23fcfdec981b9872af0ec0ace50c88ac;hb=fbc6a7e8ac780fd421e057c34caa9d4ecb166807;hp=53cdb6a6f2bc9a20c8221cefdfcc662aa12d3b9c;hpb=627de4de152f4346c92f379e1625950f1ac77fd3;p=openldap diff --git a/servers/slapd/schema_init.c b/servers/slapd/schema_init.c index 53cdb6a6f2..d1e4068a23 100644 --- a/servers/slapd/schema_init.c +++ b/servers/slapd/schema_init.c @@ -28,24 +28,121 @@ #define HASH_Update(c,buf,len) lutil_HASHUpdate(c,buf,len) #define HASH_Final(d,c) lutil_HASHFinal(d,c) -/* recycled validatation routines */ -#define berValidate blobValidate +#define SLAP_NVALUES 1 + +#ifdef SLAP_NVALUES +/* 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 +#define xgeneralizedTimeNormalize NULL +#define xintegerNormalize NULL +#define xnumericStringNormalize NULL +#define xnameUIDNormalize NULL +#define xdnNormalize NULL + +/* (new) normalization routines */ +#define caseExactIA5Normalize IA5StringNormalize +#define caseIgnoreIA5Normalize IA5StringNormalize +#define caseExactNormalize UTF8StringNormalize +#define caseIgnoreNormalize UTF8StringNormalize + +#define integerFirstComponentNormalize NULL +#define objectIdentifierNormalize NULL +#define objectIdentifierFirstComponentNormalize NULL + +#define distinguishedNameNormalize dnNormalize +#define distinguishedNameMatch dnMatch +#define distinguishedNameIndexer octetStringIndexer +#define distinguishedNameFilter octetStringFilter -/* unimplemented pretters */ -#define integerPretty NULL +#define integerOrderingMatch integerMatch +#define integerFirstComponentMatch NULL +#define integerIndexer octetStringIndexer +#define integerFilter octetStringFilter -/* recycled matching routines */ -#define bitStringMatch octetStringMatch -#define numericStringMatch caseIgnoreIA5Match -#define objectIdentifierMatch octetStringMatch -#define telephoneNumberMatch caseIgnoreIA5Match -#define telephoneNumberSubstringsMatch caseIgnoreIA5SubstringsMatch #define generalizedTimeMatch caseIgnoreIA5Match #define generalizedTimeOrderingMatch caseIgnoreIA5Match -#define uniqueMemberMatch dnMatch -#define integerFirstComponentMatch integerMatch + +#define uniqueMemberMatch dnMatch /* FIXME! */ + +#define objectIdentifierMatch octetStringMatch +#define objectIdentifierIndexer octetStringIndexer +#define objectIdentifierFilter octetStringFilter + +#define OpenLDAPaciMatch NULL + +#define bitStringMatch octetStringMatch +#define bitStringIndexer octetStringIndexer +#define bitStringFilter octetStringFilter + +#define caseIgnoreMatch octetStringMatch +#define caseIgnoreOrderingMatch octetStringOrderingMatch +#define caseIgnoreIndexer octetStringIndexer +#define caseIgnoreFilter octetStringFilter + +#define caseIgnoreSubstringsMatch octetStringSubstringsMatch +#define caseIgnoreSubstringsIndexer octetStringSubstringsIndexer +#define caseIgnoreSubstringsFilter octetStringSubstringsFilter + +#define caseExactMatch octetStringMatch +#define caseExactOrderingMatch octetStringOrderingMatch +#define caseExactIndexer octetStringIndexer +#define caseExactFilter octetStringFilter + +#define caseExactSubstringsMatch octetStringSubstringsMatch +#define caseExactSubstringsIndexer octetStringSubstringsIndexer +#define caseExactSubstringsFilter octetStringSubstringsFilter + +#define caseExactIA5Match octetStringMatch +#define caseExactIA5Indexer octetStringIndexer +#define caseExactIA5Filter octetStringFilter + +#define caseExactIA5SubstringsMatch octetStringSubstringsMatch +#define caseExactIA5SubstringsIndexer octetStringSubstringsIndexer +#define caseExactIA5SubstringsFilter octetStringSubstringsFilter + +#define caseIgnoreIA5Match octetStringMatch +#define caseIgnoreIA5Indexer octetStringIndexer +#define caseIgnoreIA5Filter octetStringFilter + +#define caseIgnoreIA5SubstringsMatch caseExactIA5SubstringsMatch +#define caseIgnoreIA5SubstringsIndexer caseExactIA5SubstringsIndexer +#define caseIgnoreIA5SubstringsFilter caseExactIA5SubstringsFilter + +#define numericStringMatch octetStringMatch +#define numericStringIndexer octetStringIndexer +#define numericStringFilter octetStringFilter + +#define numericStringSubstringsMatch caseExactIA5SubstringsMatch +#define numericStringSubstringsIndexer caseExactIA5SubstringsIndexer +#define numericStringSubstringsFilter caseExactIA5SubstringsFilter + +#define telephoneNumberMatch octetStringMatch +#define telephoneNumberIndexer octetStringIndexer +#define telephoneNumberFilter octetStringFilter + +#define telephoneNumberSubstringsMatch caseExactIA5SubstringsMatch +#define telephoneNumberSubstringsIndexer caseExactIA5SubstringsIndexer +#define telephoneNumberSubstringsFilter caseExactIA5SubstringsFilter + +#define booleanIndexer octetStringIndexer +#define booleanFilter octetStringFilter +#endif + +/* validatation routines */ +#define berValidate blobValidate /* approx matching rules */ +#ifdef SLAP_NVALUES +#define directoryStringApproxMatchOID NULL +#define IA5StringApproxMatchOID NULL +#else #define directoryStringApproxMatchOID "1.3.6.1.4.1.4203.666.4.4" #define directoryStringApproxMatch approxMatch #define directoryStringApproxIndexer approxIndexer @@ -54,48 +151,82 @@ #define IA5StringApproxMatch approxMatch #define IA5StringApproxIndexer approxIndexer #define IA5StringApproxFilter approxFilter +#endif -/* ordering matching rules */ -#define caseIgnoreOrderingMatch caseIgnoreMatch -#define caseExactOrderingMatch caseExactMatch -#define integerOrderingMatch integerMatch +#ifndef SLAP_NVALUES -/* unimplemented matching routines */ -#define caseIgnoreListMatch NULL -#define caseIgnoreListSubstringsMatch NULL -#define protocolInformationMatch NULL +#define xdnNormalize dnNormalize -#ifdef SLAPD_ACI_ENABLED +/* (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 telephoneNumberNormalize NULL + + +/* matching routines */ +#define bitStringMatch octetStringMatch +#define bitStringIndexer octetStringIndexer +#define bitStringFilter octetStringFilter + +#define numericStringMatch caseIgnoreIA5Match +#define numericStringIndexer NULL +#define numericStringFilter NULL +#define numericStringSubstringsIndexer NULL +#define numericStringSubstringsFilter NULL + +#define objectIdentifierMatch octetStringMatch +#define objectIdentifierIndexer caseIgnoreIA5Indexer +#define objectIdentifierFilter caseIgnoreIA5Filter + +#define octetStringSubstringsMatch NULL #define OpenLDAPaciMatch NULL -#endif -#ifdef SLAPD_AUTHPASSWD -#define authPasswordMatch NULL -#endif -/* recycled indexing/filtering routines */ -#define dnIndexer caseExactIgnoreIndexer -#define dnFilter caseExactIgnoreFilter -#define bitStringFilter octetStringFilter -#define bitStringIndexer octetStringIndexer +#define generalizedTimeMatch caseIgnoreIA5Match +#define generalizedTimeOrderingMatch caseIgnoreIA5Match + +#define uniqueMemberMatch dnMatch +#define numericStringSubstringsMatch NULL + +#define caseExactIndexer caseExactIgnoreIndexer +#define caseExactFilter caseExactIgnoreFilter +#define caseExactOrderingMatch caseExactMatch +#define caseExactSubstringsMatch caseExactIgnoreSubstringsMatch +#define caseExactSubstringsIndexer caseExactIgnoreSubstringsIndexer +#define caseExactSubstringsFilter caseExactIgnoreSubstringsFilter +#define caseIgnoreIndexer caseExactIgnoreIndexer +#define caseIgnoreFilter caseExactIgnoreFilter +#define caseIgnoreOrderingMatch caseIgnoreMatch +#define caseIgnoreSubstringsMatch caseExactIgnoreSubstringsMatch +#define caseIgnoreSubstringsIndexer caseExactIgnoreSubstringsIndexer +#define caseIgnoreSubstringsFilter caseExactIgnoreSubstringsFilter + +#define integerOrderingMatch integerMatch +#define integerFirstComponentMatch integerMatch -#define telephoneNumberIndexer caseIgnoreIA5Indexer -#define telephoneNumberFilter caseIgnoreIA5Filter +#define distinguishedNameMatch dnMatch +#define distinguishedNameIndexer caseExactIgnoreIndexer +#define distinguishedNameFilter caseExactIgnoreFilter + +#define telephoneNumberMatch caseIgnoreIA5Match +#define telephoneNumberSubstringsMatch caseIgnoreIA5SubstringsMatch +#define telephoneNumberIndexer caseIgnoreIA5Indexer +#define telephoneNumberFilter caseIgnoreIA5Filter #define telephoneNumberSubstringsIndexer caseIgnoreIA5SubstringsIndexer #define telephoneNumberSubstringsFilter caseIgnoreIA5SubstringsFilter -static MatchingRule *caseExactMatchingRule; -static MatchingRule *caseExactSubstringsMatchingRule; -static MatchingRule *integerFirstComponentMatchingRule; - -static const struct MatchingRulePtr { - const char *oid; - MatchingRule **mr; -} mr_ptr [] = { - /* must match OIDs below */ - { "2.5.13.5", &caseExactMatchingRule }, - { "2.5.13.7", &caseExactSubstringsMatchingRule }, - { "2.5.13.29", &integerFirstComponentMatchingRule } -}; +#define booleanIndexer octetStringIndexer +#define booleanFilter octetStringFilter +#endif static char *bvcasechr( struct berval *bv, unsigned char c, ber_len_t *len ) @@ -148,11 +279,13 @@ octetStringOrderingMatch( { ber_len_t v_len = value->bv_len; ber_len_t av_len = ((struct berval *) assertedValue)->bv_len; + int match = memcmp( value->bv_val, ((struct berval *) assertedValue)->bv_val, (v_len < av_len ? v_len : av_len) ); - if( match == 0 ) - match = v_len - av_len; + + if( match == 0 ) match = v_len - av_len; + *matchp = match; return LDAP_SUCCESS; } @@ -354,11 +487,21 @@ nameUIDValidate( return rc; } +#ifdef SLAP_NVALUES static int -nameUIDNormalize( +uniqueMemberNormalize( + slap_mask_t usage, Syntax *syntax, + MatchingRule *mr, struct berval *val, struct berval *normalized ) +#else +static int +xnameUIDNormalize( + Syntax *syntax, + struct berval *val, + struct berval *normalized ) +#endif { struct berval out; int rc; @@ -462,9 +605,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 @@ -481,6 +625,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. @@ -536,7 +681,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 */ @@ -576,13 +724,83 @@ 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; } +#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_NOCASEFOLD : LDAP_UTF8_CASEFOLD; + 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; issyn_oidlen; mlen = mr->smr_oidlen; - casefold = ( mr != caseExactMatchingRule ) + casefold = ( mr != slap_schema.si_mr_caseExactMatch ) ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD; for( i=0; values[i].bv_val != NULL; i++ ) { @@ -1345,7 +1563,7 @@ static int caseExactIgnoreFilter( slen = syntax->ssyn_oidlen; mlen = mr->smr_oidlen; - casefold = ( mr != caseExactMatchingRule ) + casefold = ( mr != slap_schema.si_mr_caseExactMatch ) ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD; UTF8bvnormalize( (struct berval *) assertedValue, &value, casefold ); @@ -1379,10 +1597,16 @@ static int caseExactIgnoreFilter( *keysp = keys; return LDAP_SUCCESS; } +#endif /* Substrings Index generation function */ -static int caseExactIgnoreSubstringsIndexer( - slap_mask_t use, +static int +#ifdef SLAP_NVALUES +octetStringSubstringsIndexer +#else +caseExactIgnoreSubstringsIndexer +#endif + ( slap_mask_t use, slap_mask_t flags, Syntax *syntax, MatchingRule *mr, @@ -1390,11 +1614,13 @@ static int caseExactIgnoreSubstringsIndexer( BerVarray values, BerVarray *keysp ) { - unsigned casefold, wasspace; ber_len_t i, j, nkeys; size_t slen, mlen; BerVarray keys; +#ifndef SLAP_NVALUES BerVarray tvalues, nvalues; + unsigned casefold, wasspace; +#endif HASH_CONTEXT HASHcontext; unsigned char HASHdigest[HASH_BYTES]; @@ -1402,8 +1628,7 @@ static int caseExactIgnoreSubstringsIndexer( digest.bv_val = HASHdigest; digest.bv_len = sizeof(HASHdigest); - nkeys=0; - +#ifndef SLAP_NVALUES for( i=0; values[i].bv_val != NULL; i++ ) { /* empty - just count them */ } @@ -1411,7 +1636,7 @@ static int caseExactIgnoreSubstringsIndexer( /* we should have at least one value at this point */ assert( i > 0 ); - casefold = ( mr != caseExactSubstringsMatchingRule ) + casefold = ( mr != slap_schema.si_mr_caseExactSubstringsMatch ) ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD; tvalues = ch_malloc( sizeof( struct berval ) * (i+1) ); @@ -1449,6 +1674,9 @@ static int caseExactIgnoreSubstringsIndexer( tvalues[i].bv_val = NULL; nvalues[i].bv_val = NULL; values = nvalues; +#endif + + nkeys=0; for( i=0; values[i].bv_val != NULL; i++ ) { /* count number of indices to generate */ @@ -1484,8 +1712,10 @@ static int caseExactIgnoreSubstringsIndexer( if( nkeys == 0 ) { /* no keys to generate */ *keysp = NULL; +#ifndef SLAP_NVALUES ber_bvarray_free( tvalues ); ch_free( nvalues ); +#endif return LDAP_SUCCESS; } @@ -1586,14 +1816,21 @@ static int caseExactIgnoreSubstringsIndexer( *keysp = NULL; } +#ifndef SLAP_NVALUES ber_bvarray_free( tvalues ); ch_free( nvalues ); +#endif return LDAP_SUCCESS; } -static int caseExactIgnoreSubstringsFilter( - slap_mask_t use, +static int +#ifdef SLAP_NVALUES +octetStringSubstringsFilter +#else +caseExactIgnoreSubstringsFilter +#endif + ( slap_mask_t use, slap_mask_t flags, Syntax *syntax, MatchingRule *mr, @@ -1612,14 +1849,18 @@ static int caseExactIgnoreSubstringsFilter( struct berval *value; struct berval digest; - casefold = ( mr != caseExactSubstringsMatchingRule ) +#ifndef SLAP_NVALUES + casefold = ( mr != slap_schema.si_mr_caseExactSubstringsMatch ) ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD; - sa = UTF8SubstringsassertionNormalize( assertedValue, casefold ); + sa = UTF8SubstringsAssertionNormalize( assertedValue, casefold ); if( sa == NULL ) { *keysp = NULL; return LDAP_SUCCESS; } +#else + sa = (SubstringsAssertion *) assertedValue; +#endif if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial.bv_val != NULL && sa->sa_initial.bv_len >= SLAP_INDEX_SUBSTR_MINLEN ) @@ -1645,10 +1886,12 @@ static int caseExactIgnoreSubstringsFilter( } if( nkeys == 0 ) { +#ifndef SLAP_NVALUES if ( sa->sa_final.bv_val ) free( sa->sa_final.bv_val ); if ( sa->sa_any ) ber_bvarray_free( sa->sa_any ); if ( sa->sa_initial.bv_val ) free( sa->sa_initial.bv_val ); ch_free( sa ); +#endif *keysp = NULL; return LDAP_SUCCESS; } @@ -1760,13 +2003,17 @@ static int caseExactIgnoreSubstringsFilter( ch_free( keys ); *keysp = NULL; } + +#ifndef SLAP_NVALUES if ( sa->sa_final.bv_val ) free( sa->sa_final.bv_val ); if ( sa->sa_any ) ber_bvarray_free( sa->sa_any ); if ( sa->sa_initial.bv_val ) free( sa->sa_initial.bv_val ); ch_free( sa ); +#endif return LDAP_SUCCESS; } +#ifndef SLAP_NVALUES static int caseIgnoreMatch( @@ -1782,13 +2029,23 @@ caseIgnoreMatch( LDAP_UTF8_CASEFOLD ); return LDAP_SUCCESS; } +#endif /* Remove all spaces and '-' characters */ static int +#ifdef SLAP_NVALUES telephoneNumberNormalize( + slap_mask_t usage, + Syntax *syntax, + MatchingRule *mr, + struct berval *val, + struct berval *normalized ) +#else +xtelephoneNumberNormalize( Syntax *syntax, struct berval *val, struct berval *normalized ) +#endif { char *p, *q; @@ -1871,18 +2128,20 @@ integerMatch( /* Skip leading space/sign/zeroes, and get the sign of the *value number */ v = value->bv_val; vlen = value->bv_len; - if( mr == integerFirstComponentMatchingRule ) { + +#ifndef SLAP_NVALUES + if( mr == slap_schema.si_mr_integerFirstComponentMatch ) { char *tmp = memchr( v, '$', vlen ); - if( tmp ) - vlen = tmp - v; - while( vlen && ASCII_SPACE( v[vlen-1] )) - vlen--; + if( tmp ) vlen = tmp - v; + while( vlen && ASCII_SPACE( v[vlen-1] )) vlen--; } - for( ; vlen && ( *v < '1' || '9' < *v ); v++, vlen-- ) /* ANSI 2.2.1 */ - if( *v == '-' ) - vsign = -1; - if( vlen == 0 ) - vsign = 0; +#endif + + for( ; vlen && ( *v < '1' || '9' < *v ); v++, vlen-- ) { /* ANSI 2.2.1 */ + if( *v == '-' ) vsign = -1; + } + + if( vlen == 0 ) vsign = 0; /* Do the same with the *assertedValue number */ asserted = (struct berval *) assertedValue; @@ -1918,6 +2177,7 @@ integerValidate( if(( val->bv_val[0] == '+' ) || ( val->bv_val[0] == '-' )) { if( val->bv_len < 2 ) return LDAP_INVALID_SYNTAX; + } else if( !ASCII_DIGIT(val->bv_val[0]) ) { return LDAP_INVALID_SYNTAX; } @@ -1930,10 +2190,19 @@ integerValidate( } static int +#ifdef SLAP_NVALUES integerNormalize( + slap_mask_t use, + Syntax *syntax, + MatchingRule *mr, + struct berval *val, + struct berval *normalized ) +#else +xintegerNormalize( Syntax *syntax, struct berval *val, struct berval *normalized ) +#endif { char *p; int negative=0; @@ -1969,13 +2238,11 @@ integerNormalize( if( len == 0 ) { normalized->bv_val = ch_strdup("0"); normalized->bv_len = 1; - } - else { + + } else { normalized->bv_len = len+negative; normalized->bv_val = ch_malloc( normalized->bv_len + 1 ); - if( negative ) { - normalized->bv_val[0] = '-'; - } + if( negative ) normalized->bv_val[0] = '-'; AC_MEMCPY( normalized->bv_val + negative, p, len ); normalized->bv_val[len+negative] = '\0'; } @@ -1983,6 +2250,8 @@ integerNormalize( return LDAP_SUCCESS; } +#ifndef SLAP_NVALUES + /* Index generation function */ static int integerIndexer( slap_mask_t use, @@ -2016,7 +2285,7 @@ static int integerIndexer( for( i=0; values[i].bv_val != NULL; i++ ) { struct berval norm; - integerNormalize( syntax, &values[i], &norm ); + xintegerNormalize( syntax, &values[i], &norm ); HASH_Init( &HASHcontext ); if( prefix != NULL && prefix->bv_len > 0 ) { @@ -2062,7 +2331,7 @@ static int integerFilter( slen = syntax->ssyn_oidlen; mlen = mr->smr_oidlen; - integerNormalize( syntax, assertedValue, &norm ); + xintegerNormalize( syntax, assertedValue, &norm ); keys = ch_malloc( sizeof( struct berval ) * 2 ); @@ -2087,6 +2356,7 @@ static int integerFilter( return LDAP_SUCCESS; } +#endif static int countryStringValidate( @@ -2174,12 +2444,24 @@ IA5StringValidate( } static int +#ifdef SLAP_NVALUES IA5StringNormalize( + slap_mask_t use, + Syntax *syntax, + MatchingRule *mr, + struct berval *val, + struct berval *normalized ) +#else +xIA5StringNormalize( Syntax *syntax, struct berval *val, struct berval *normalized ) +#endif { char *p, *q; +#ifdef SLAP_NVALUES + int casefold = !SLAP_MR_ASSOCIATED(mr, slap_schema.si_mr_caseExactIA5Match); +#endif assert( val->bv_len ); @@ -2201,6 +2483,13 @@ IA5StringNormalize( while ( ASCII_SPACE( *p ) ) { p++; } + +#ifdef SLAP_NVALUES + } else if ( casefold ) { + /* Most IA5 rules require casefolding */ + *q++ = TOLOWER(*p++); +#endif + } else { *q++ = *p++; } @@ -2234,6 +2523,8 @@ IA5StringNormalize( return LDAP_SUCCESS; } +#ifndef SLAP_NVALUES + static int caseExactIA5Match( int *matchp, @@ -2256,7 +2547,12 @@ caseExactIA5Match( } static int -caseExactIA5SubstringsMatch( +caseExactIA5SubstringsMatch +#else +static int +octetStringSubstringsMatch +#endif +( int *matchp, slap_mask_t flags, Syntax *syntax, @@ -2289,7 +2585,7 @@ caseExactIA5SubstringsMatch( goto done; } - match = strncmp( sub->sa_initial.bv_val, left.bv_val, + match = memcmp( sub->sa_initial.bv_val, left.bv_val, sub->sa_initial.bv_len ); if( match != 0 ) { @@ -2307,7 +2603,7 @@ caseExactIA5SubstringsMatch( goto done; } - match = strncmp( sub->sa_final.bv_val, + match = memcmp( sub->sa_final.bv_val, &left.bv_val[left.bv_len - sub->sa_final.bv_len], sub->sa_final.bv_len ); @@ -2335,7 +2631,7 @@ retry: continue; } - p = strchr( left.bv_val, *sub->sa_any[i].bv_val ); + p = memchr( left.bv_val, *sub->sa_any[i].bv_val, left.bv_len ); if( p == NULL ) { match = 1; @@ -2358,7 +2654,7 @@ retry: goto done; } - match = strncmp( left.bv_val, + match = memcmp( left.bv_val, sub->sa_any[i].bv_val, sub->sa_any[i].bv_len ); @@ -2379,6 +2675,8 @@ done: return LDAP_SUCCESS; } +#ifndef SLAP_NVALUES + /* Index generation function */ static int caseExactIA5Indexer( slap_mask_t use, @@ -2983,11 +3281,13 @@ static int caseIgnoreIA5Indexer( if( rc != LDAP_SUCCESS ) { break; } +#ifndef SLAP_NVALUES } else if ( mr->smr_syntax->ssyn_normalize ) { rc = (mr->smr_syntax->ssyn_normalize)( syntax, &values[i], &value ); if( rc != LDAP_SUCCESS ) { break; } +#endif } else { ber_dupbv( &value, &values[i] ); } @@ -3400,6 +3700,8 @@ static int caseIgnoreIA5SubstringsFilter( return LDAP_SUCCESS; } +#endif + static int numericStringValidate( Syntax *syntax, @@ -3419,10 +3721,19 @@ numericStringValidate( } static int +#ifdef SLAP_NVALUES numericStringNormalize( + slap_mask_t usage, + Syntax *syntax, + MatchingRule *mr, + struct berval *val, + struct berval *normalized ) +#else +xnumericStringNormalize( Syntax *syntax, struct berval *val, struct berval *normalized ) +#endif { /* removal all spaces */ char *p, *q; @@ -3461,6 +3772,7 @@ numericStringNormalize( return LDAP_SUCCESS; } +#ifndef SLAP_NVALUES static int objectIdentifierFirstComponentMatch( int *matchp, @@ -3548,6 +3860,8 @@ objectIdentifierFirstComponentMatch( return rc; } +#endif + static int integerBitAndMatch( int *matchp, @@ -3604,6 +3918,8 @@ integerBitOrMatch( return LDAP_SUCCESS; } +#ifndef SLAP_NVALUES + #ifdef HAVE_TLS #include #include @@ -3922,7 +4238,7 @@ static int certificateExactIndexer( asn1_integer2str(xcert->cert_info->serialNumber, &serial); X509_free(xcert); - integerNormalize( slap_schema.si_syn_integer, + xintegerNormalize( slap_schema.si_syn_integer, &serial, &keys[i] ); ber_memfree(serial.bv_val); #ifdef NEW_LOGGING @@ -3960,7 +4276,7 @@ static int certificateExactFilter( if( ret != LDAP_SUCCESS ) return ret; keys = ch_malloc( sizeof( struct berval ) * 2 ); - integerNormalize( syntax, &asserted_serial, &keys[0] ); + xintegerNormalize( syntax, &asserted_serial, &keys[0] ); keys[1].bv_val = NULL; *keysp = keys; @@ -3968,6 +4284,7 @@ static int certificateExactFilter( return LDAP_SUCCESS; } #endif +#endif static int check_time_syntax (struct berval *val, @@ -4136,7 +4453,7 @@ check_time_syntax (struct berval *val, #ifdef SUPPORT_OBSOLETE_UTC_SYNTAX static int -utcTimeNormalize( +xutcTimeNormalize( Syntax *syntax, struct berval *val, struct berval *normalized ) @@ -4185,10 +4502,19 @@ generalizedTimeValidate( } static int +#ifdef SLAP_NVALUES generalizedTimeNormalize( + slap_mask_t usage, + Syntax *syntax, + MatchingRule *mr, + struct berval *val, + struct berval *normalized ) +#else +xgeneralizedTimeNormalize( Syntax *syntax, struct berval *val, struct berval *normalized ) +#endif { int parts[9], rc; @@ -4331,15 +4657,15 @@ static slap_syntax_defs_rec syntax_defs[] = { X_BINARY X_NOT_H_R ")", SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )", - 0, countryStringValidate, IA5StringNormalize, NULL}, + 0, countryStringValidate, xIA5StringNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )", - 0, dnValidate, dnNormalize2, dnPretty2}, + 0, dnValidate, xdnNormalize, dnPretty2}, {"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )", - 0, UTF8StringValidate, UTF8StringNormalize, NULL}, + 0, UTF8StringValidate, xUTF8StringNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DIT Content Rule Description' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DIT Structure Rule Description' )", @@ -4351,17 +4677,17 @@ static slap_syntax_defs_rec syntax_defs[] = { {"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'Enhanced Guide' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )", - 0, printablesStringValidate, telephoneNumberNormalize, NULL}, + 0, printablesStringValidate, xtelephoneNumberNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'Fax' " X_NOT_H_R ")", SLAP_SYNTAX_BLOB, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )", - 0, generalizedTimeValidate, generalizedTimeNormalize, NULL}, + 0, generalizedTimeValidate, xgeneralizedTimeNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )", - 0, IA5StringValidate, IA5StringNormalize, NULL}, + 0, IA5StringValidate, xIA5StringNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )", - 0, integerValidate, integerNormalize, NULL}, + 0, integerValidate, xintegerNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' " X_NOT_H_R ")", SLAP_SYNTAX_BLOB, blobValidate, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.29 DESC 'Master And Shadow Access Points' )", @@ -4375,27 +4701,27 @@ static slap_syntax_defs_rec syntax_defs[] = { {"( 1.3.6.1.4.1.1466.115.121.1.33 DESC 'MHS OR Address' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )", - 0, nameUIDValidate, nameUIDNormalize, NULL}, + 0, nameUIDValidate, xnameUIDNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'Name Form Description' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )", - 0, numericStringValidate, numericStringNormalize, NULL}, + 0, numericStringValidate, xnumericStringNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'Object Class Description' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )", 0, oidValidate, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )", - 0, IA5StringValidate, IA5StringNormalize, NULL}, + 0, IA5StringValidate, xIA5StringNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )", 0, blobValidate, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )", - 0, UTF8StringValidate, UTF8StringNormalize, NULL}, + 0, UTF8StringValidate, xUTF8StringNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'Protocol Information' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'Presentation Address' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )", - 0, printableStringValidate, IA5StringNormalize, NULL}, + 0, printableStringValidate, xIA5StringNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.45 DESC 'SubtreeSpecification' " X_BINARY X_NOT_H_R ")", SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, NULL, NULL, NULL}, @@ -4403,14 +4729,14 @@ static slap_syntax_defs_rec syntax_defs[] = { X_BINARY X_NOT_H_R ")", SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )", - 0, printableStringValidate, telephoneNumberNormalize, NULL}, + 0, printableStringValidate, xtelephoneNumberNormalize, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'Teletex Terminal Identifier' )", 0, NULL, NULL, NULL}, {"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )", - 0, printablesStringValidate, IA5StringNormalize, NULL}, + 0, printablesStringValidate, xIA5StringNormalize, NULL}, #ifdef SUPPORT_OBSOLETE_UTC_SYNTAX {"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTC Time' )", - 0, utcTimeValidate, utcTimeNormalize, NULL}, + 0, utcTimeValidate, xutcTimeNormalize, NULL}, #endif {"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAP Syntax Description' )", 0, NULL, NULL, NULL}, @@ -4490,7 +4816,6 @@ char *objectIdentifierFirstComponentMatchSyntaxes[] = { * Other matching rules in X.520 that we do not use (yet): * * 2.5.13.9 numericStringOrderingMatch - * 2.5.13.19 octetStringSubstringsMatch * 2.5.13.25 uTCTimeMatch * 2.5.13.26 uTCTimeOrderingMatch * 2.5.13.31 directoryStringFirstComponentMatch @@ -4512,23 +4837,21 @@ static slap_mrule_defs_rec mrule_defs[] = { * EQUALITY matching rules must be listed after associated APPROX * matching rules. So, we list all APPROX matching rules first. */ +#ifndef SLAP_NVALUES {"( " directoryStringApproxMatchOID " NAME 'directoryStringApproxMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", SLAP_MR_HIDE | SLAP_MR_EQUALITY_APPROX | SLAP_MR_EXT, NULL, - NULL, NULL, - directoryStringApproxMatch, - directoryStringApproxIndexer, - directoryStringApproxFilter, + NULL, NULL, directoryStringApproxMatch, + directoryStringApproxIndexer, directoryStringApproxFilter, NULL}, {"( " IA5StringApproxMatchOID " NAME 'IA5StringApproxMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", SLAP_MR_HIDE | SLAP_MR_EQUALITY_APPROX | SLAP_MR_EXT, NULL, - NULL, NULL, - IA5StringApproxMatch, - IA5StringApproxIndexer, - IA5StringApproxFilter, + NULL, NULL, IA5StringApproxMatch, + IA5StringApproxIndexer, IA5StringApproxFilter, NULL}, +#endif /* * Other matching rules @@ -4537,122 +4860,119 @@ static slap_mrule_defs_rec mrule_defs[] = { {"( 2.5.13.0 NAME 'objectIdentifierMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL, - NULL, NULL, - objectIdentifierMatch, caseIgnoreIA5Indexer, caseIgnoreIA5Filter, + NULL, + objectIdentifierNormalize, objectIdentifierMatch, + objectIdentifierIndexer, objectIdentifierFilter, NULL}, {"( 2.5.13.1 NAME 'distinguishedNameMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL, - NULL, NULL, - dnMatch, dnIndexer, dnFilter, + NULL, + distinguishedNameNormalize, distinguishedNameMatch, + distinguishedNameIndexer, distinguishedNameFilter, NULL}, {"( 2.5.13.2 NAME 'caseIgnoreMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, directoryStringSyntaxes, - NULL, NULL, - caseIgnoreMatch, caseExactIgnoreIndexer, caseExactIgnoreFilter, + NULL, + caseIgnoreNormalize, caseIgnoreMatch, + caseIgnoreIndexer, caseIgnoreFilter, directoryStringApproxMatchOID }, {"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", SLAP_MR_ORDERING, directoryStringSyntaxes, - NULL, NULL, - caseIgnoreOrderingMatch, NULL, NULL, - NULL}, + NULL, caseIgnoreNormalize, caseIgnoreOrderingMatch, + NULL, NULL, NULL}, {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", SLAP_MR_SUBSTR, NULL, NULL, NULL, - caseExactIgnoreSubstringsMatch, - caseExactIgnoreSubstringsIndexer, - caseExactIgnoreSubstringsFilter, + caseIgnoreSubstringsMatch, + caseIgnoreSubstringsIndexer, caseIgnoreSubstringsFilter, NULL}, {"( 2.5.13.5 NAME 'caseExactMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, directoryStringSyntaxes, - NULL, NULL, - caseExactMatch, caseExactIgnoreIndexer, caseExactIgnoreFilter, + NULL, + caseExactNormalize, caseExactMatch, + caseExactIndexer, caseExactFilter, directoryStringApproxMatchOID }, {"( 2.5.13.6 NAME 'caseExactOrderingMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", SLAP_MR_ORDERING, directoryStringSyntaxes, - NULL, NULL, - caseExactOrderingMatch, NULL, NULL, - NULL}, + NULL, caseExactNormalize, caseExactOrderingMatch, + NULL, NULL, NULL}, {"( 2.5.13.7 NAME 'caseExactSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", SLAP_MR_SUBSTR, directoryStringSyntaxes, - NULL, NULL, - caseExactIgnoreSubstringsMatch, - caseExactIgnoreSubstringsIndexer, - caseExactIgnoreSubstringsFilter, + NULL, + NULL, caseExactSubstringsMatch, + caseExactSubstringsIndexer, caseExactSubstringsFilter, NULL}, {"( 2.5.13.8 NAME 'numericStringMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )", SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL, - NULL, NULL, - caseIgnoreIA5Match, - caseIgnoreIA5Indexer, - caseIgnoreIA5Filter, + NULL, + numericStringNormalize, numericStringMatch, + numericStringIndexer, numericStringFilter, NULL}, {"( 2.5.13.10 NAME 'numericStringSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", SLAP_MR_SUBSTR, NULL, - NULL, NULL, - caseIgnoreIA5SubstringsMatch, - caseIgnoreIA5SubstringsIndexer, - caseIgnoreIA5SubstringsFilter, + NULL, + NULL, numericStringSubstringsMatch, + numericStringSubstringsIndexer, numericStringSubstringsFilter, NULL}, {"( 2.5.13.11 NAME 'caseIgnoreListMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )", SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL, - NULL, NULL, - caseIgnoreListMatch, NULL, NULL, - NULL}, + NULL, NULL, NULL, NULL, NULL, NULL}, {"( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", SLAP_MR_SUBSTR, NULL, - NULL, NULL, - caseIgnoreListSubstringsMatch, NULL, NULL, - NULL}, + NULL, NULL, NULL, NULL, NULL, NULL}, {"( 2.5.13.13 NAME 'booleanMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL, - NULL, NULL, - booleanMatch, NULL, NULL, + NULL, + NULL, booleanMatch, + booleanIndexer, booleanFilter, NULL}, {"( 2.5.13.14 NAME 'integerMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL, - NULL, NULL, - integerMatch, integerIndexer, integerFilter, + NULL, + integerNormalize, integerMatch, + integerIndexer, integerFilter, NULL}, {"( 2.5.13.15 NAME 'integerOrderingMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", - SLAP_MR_ORDERING, NULL, - NULL, NULL, - integerOrderingMatch, NULL, NULL, + SLAP_MR_ORDERING, NULL, NULL, + integerNormalize, integerOrderingMatch, + integerIndexer, integerFilter, NULL}, {"( 2.5.13.16 NAME 'bitStringMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL, - NULL, NULL, - bitStringMatch, bitStringIndexer, bitStringFilter, + NULL, + NULL, bitStringMatch, + bitStringIndexer, bitStringFilter, NULL}, {"( 2.5.13.17 NAME 'octetStringMatch' " @@ -4669,22 +4989,26 @@ static slap_mrule_defs_rec mrule_defs[] = { octetStringOrderingMatch, NULL, NULL, NULL}, + {"( 2.5.13.19 NAME 'octetStringSubstringsMatch' " + "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )", + SLAP_MR_SUBSTR, NULL, + NULL, NULL, + octetStringSubstringsMatch, NULL, NULL, + NULL}, + {"( 2.5.13.20 NAME 'telephoneNumberMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )", SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL, - NULL, NULL, - telephoneNumberMatch, - telephoneNumberIndexer, - telephoneNumberFilter, + NULL, + telephoneNumberNormalize, telephoneNumberMatch, + telephoneNumberIndexer, telephoneNumberFilter, NULL}, {"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", SLAP_MR_SUBSTR, NULL, - NULL, NULL, - telephoneNumberSubstringsMatch, - telephoneNumberSubstringsIndexer, - telephoneNumberSubstringsFilter, + NULL, NULL, telephoneNumberSubstringsMatch, + telephoneNumberSubstringsIndexer, telephoneNumberSubstringsFilter, NULL}, {"( 2.5.13.22 NAME 'presentationAddressMatch' " @@ -4697,46 +5021,50 @@ static slap_mrule_defs_rec mrule_defs[] = { {"( 2.5.13.23 NAME 'uniqueMemberMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL, + NULL, + uniqueMemberNormalize, uniqueMemberMatch, NULL, NULL, - uniqueMemberMatch, NULL, NULL, NULL}, {"( 2.5.13.24 NAME 'protocolInformationMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL, - NULL, NULL, - protocolInformationMatch, NULL, NULL, - NULL}, + NULL, NULL, NULL, NULL, NULL, NULL}, {"( 2.5.13.27 NAME 'generalizedTimeMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL, + NULL, + generalizedTimeNormalize, generalizedTimeMatch, NULL, NULL, - generalizedTimeMatch, NULL, NULL, NULL}, {"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )", SLAP_MR_ORDERING, NULL, + NULL, + generalizedTimeNormalize, generalizedTimeOrderingMatch, NULL, NULL, - generalizedTimeOrderingMatch, NULL, NULL, NULL}, {"( 2.5.13.29 NAME 'integerFirstComponentMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, integerFirstComponentMatchSyntaxes, + NULL, + integerFirstComponentNormalize, integerMatch, NULL, NULL, - integerFirstComponentMatch, NULL, NULL, NULL}, {"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, objectIdentifierFirstComponentMatchSyntaxes, + NULL, + objectIdentifierFirstComponentNormalize, objectIdentifierMatch, NULL, NULL, - objectIdentifierFirstComponentMatch, NULL, NULL, NULL}, +#ifndef SLAP_NVALUES #ifdef HAVE_TLS {"( 2.5.13.34 NAME 'certificateExactMatch' " "SYNTAX 1.2.826.0.1.3344810.7.1 )", @@ -4745,38 +5073,39 @@ static slap_mrule_defs_rec mrule_defs[] = { certificateExactMatch, certificateExactIndexer, certificateExactFilter, NULL}, +#endif #endif {"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL, - NULL, NULL, - caseExactIA5Match, caseExactIA5Indexer, caseExactIA5Filter, + NULL, + caseExactIA5Normalize, caseExactIA5Match, + caseExactIA5Indexer, caseExactIA5Filter, IA5StringApproxMatchOID }, {"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL, - NULL, NULL, - caseIgnoreIA5Match, caseIgnoreIA5Indexer, caseIgnoreIA5Filter, + NULL, + NULL, caseIgnoreIA5Match, + caseIgnoreIA5Indexer, caseIgnoreIA5Filter, IA5StringApproxMatchOID }, {"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", SLAP_MR_SUBSTR, NULL, - NULL, NULL, - caseIgnoreIA5SubstringsMatch, - caseIgnoreIA5SubstringsIndexer, - caseIgnoreIA5SubstringsFilter, + NULL, + NULL, caseIgnoreIA5SubstringsMatch, + caseIgnoreIA5SubstringsIndexer, caseIgnoreIA5SubstringsFilter, NULL}, {"( 1.3.6.1.4.1.4203.1.2.1 NAME 'caseExactIA5SubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )", SLAP_MR_SUBSTR, NULL, - NULL, NULL, - caseExactIA5SubstringsMatch, - caseExactIA5SubstringsIndexer, - caseExactIA5SubstringsFilter, + NULL, + NULL, caseExactIA5SubstringsMatch, + caseExactIA5SubstringsIndexer, caseExactIA5SubstringsFilter, NULL}, #ifdef SLAPD_AUTHPASSWD @@ -4801,15 +5130,15 @@ static slap_mrule_defs_rec mrule_defs[] = { {"( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", SLAP_MR_EXT, NULL, - NULL, NULL, - integerBitAndMatch, NULL, NULL, + NULL, + NULL, integerBitAndMatch, NULL, NULL, NULL}, {"( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )", SLAP_MR_EXT, NULL, - NULL, NULL, - integerBitOrMatch, NULL, NULL, + NULL, + NULL, integerBitOrMatch, NULL, NULL, NULL}, {NULL, SLAP_MR_NONE, NULL, @@ -4841,7 +5170,7 @@ slap_schema_init( void ) mrule_defs[i].mrd_compat_syntaxes == NULL ) { fprintf( stderr, - "slap_schema_init: Ingoring unusable matching rule %s\n", + "slap_schema_init: Ignoring unusable matching rule %s\n", mrule_defs[i].mrd_desc ); continue; } @@ -4856,9 +5185,6 @@ slap_schema_init( void ) } } - for ( i=0; i < (int)(sizeof(mr_ptr)/sizeof(mr_ptr[0])); i++ ) - *mr_ptr[i].mr = mr_find( mr_ptr[i].oid ); - res = slap_schema_load(); schema_init_done = 1; return res; @@ -4871,8 +5197,6 @@ schema_destroy( void ) oidm_destroy(); oc_destroy(); at_destroy(); - for ( i=0; i < (int)(sizeof(mr_ptr)/sizeof(mr_ptr[0])); i++ ) - *mr_ptr[i].mr = NULL; mr_destroy(); mru_destroy(); syn_destroy();