X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fschema_init.c;h=e0a0600542be8973823c6bc0019f161ea7dde35e;hb=08fe5e7026a6ea7ab301f6ab9bd383b85f1e2149;hp=6421cacf7791470e2857fd5cfb87c7434ecdd79c;hpb=810abc14194df98eebda1aa96557ccaea7cf439e;p=openldap diff --git a/servers/slapd/schema_init.c b/servers/slapd/schema_init.c index 6421cacf77..e0a0600542 100644 --- a/servers/slapd/schema_init.c +++ b/servers/slapd/schema_init.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2004 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -17,7 +17,9 @@ #include "portable.h" #include +#ifdef HAVE_LIMITS_H #include +#endif #include #include @@ -48,8 +50,6 @@ #define HASH_Update(c,buf,len) lutil_HASHUpdate(c,buf,len) #define HASH_Final(d,c) lutil_HASHFinal(d,c) -#define OpenLDAPaciMatch NULL - /* approx matching rules */ #define directoryStringApproxMatchOID "1.3.6.1.4.1.4203.666.4.4" #define directoryStringApproxMatch approxMatch @@ -67,11 +67,19 @@ #define csnIndexer generalizedTimeIndexer #define csnFilter generalizedTimeFilter +#ifdef SLAP_AUTHZ_SYNTAX +/* FIXME: temporary */ +#define authzMatch octetStringMatch +#endif /* SLAP_AUTHZ_SYNTAX */ + unsigned int index_substr_if_minlen = SLAP_INDEX_SUBSTR_IF_MINLEN_DEFAULT; unsigned int index_substr_if_maxlen = SLAP_INDEX_SUBSTR_IF_MAXLEN_DEFAULT; unsigned int index_substr_any_len = SLAP_INDEX_SUBSTR_ANY_LEN_DEFAULT; unsigned int index_substr_any_step = SLAP_INDEX_SUBSTR_ANY_STEP_DEFAULT; +ldap_pvt_thread_mutex_t ad_undef_mutex; +ldap_pvt_thread_mutex_t oc_undef_mutex; + static int inValidate( Syntax *syntax, @@ -119,7 +127,7 @@ static int certificateValidate( Syntax *syntax, struct berval *in ) #define certificateValidate sequenceValidate #endif -static int +int octetStringMatch( int *matchp, slap_mask_t flags, @@ -161,15 +169,13 @@ octetStringOrderingMatch( return LDAP_SUCCESS; } -hashDigestify( +static void +hashPreset( HASH_CONTEXT *HASHcontext, - unsigned char *HASHdigest, struct berval *prefix, char pre, Syntax *syntax, - MatchingRule *mr, - unsigned char *value, - int value_len) + MatchingRule *mr) { HASH_Init(HASHcontext); if(prefix && prefix->bv_len > 0) { @@ -179,11 +185,21 @@ hashDigestify( if(pre) HASH_Update(HASHcontext, (unsigned char*)&pre, sizeof(pre)); HASH_Update(HASHcontext, (unsigned char*)syntax->ssyn_oid, syntax->ssyn_oidlen); HASH_Update(HASHcontext, (unsigned char*)mr->smr_oid, mr->smr_oidlen); - HASH_Update(HASHcontext, value, value_len); - HASH_Final(HASHdigest, HASHcontext); return; } +static void +hashIter( + HASH_CONTEXT *HASHcontext, + unsigned char *HASHdigest, + unsigned char *value, + int len) +{ + HASH_CONTEXT ctx = *HASHcontext; + HASH_Update( &ctx, value, len ); + HASH_Final( HASHdigest, &ctx ); +} + /* Index generation function */ int octetStringIndexer( slap_mask_t use, @@ -204,7 +220,7 @@ int octetStringIndexer( digest.bv_val = (char *)HASHdigest; digest.bv_len = sizeof(HASHdigest); - for( i=0; values[i].bv_val != NULL; i++ ) { + for( i=0; !BER_BVISNULL( &values[i] ); i++ ) { /* just count them */ } @@ -216,14 +232,14 @@ int octetStringIndexer( slen = syntax->ssyn_oidlen; mlen = mr->smr_oidlen; - for( i=0; values[i].bv_val != NULL; i++ ) { - hashDigestify( &HASHcontext, HASHdigest, prefix, 0, - syntax, mr, (unsigned char *)values[i].bv_val, values[i].bv_len ); + hashPreset( &HASHcontext, prefix, 0, syntax, mr); + for( i=0; !BER_BVISNULL( &values[i] ); i++ ) { + hashIter( &HASHcontext, HASHdigest, + (unsigned char *)values[i].bv_val, values[i].bv_len ); ber_dupbv_x( &keys[i], &digest, ctx ); } - keys[i].bv_val = NULL; - keys[i].bv_len = 0; + BER_BVZERO( &keys[i] ); *keysp = keys; @@ -255,12 +271,12 @@ int octetStringFilter( keys = slap_sl_malloc( sizeof( struct berval ) * 2, ctx ); - hashDigestify( &HASHcontext, HASHdigest, prefix, 0, - syntax, mr, (unsigned char *)value->bv_val, value->bv_len ); + hashPreset( &HASHcontext, prefix, 0, syntax, mr ); + hashIter( &HASHcontext, HASHdigest, + (unsigned char *)value->bv_val, value->bv_len ); ber_dupbv_x( keys, &digest, ctx ); - keys[1].bv_val = NULL; - keys[1].bv_len = 0; + BER_BVZERO( &keys[1] ); *keysp = keys; @@ -283,20 +299,20 @@ octetStringSubstringsMatch( ber_len_t inlen = 0; /* Add up asserted input length */ - if( sub->sa_initial.bv_val ) { + if ( !BER_BVISNULL( &sub->sa_initial ) ) { inlen += sub->sa_initial.bv_len; } - if( sub->sa_any ) { - for(i=0; sub->sa_any[i].bv_val != NULL; i++) { + if ( sub->sa_any ) { + for ( i = 0; !BER_BVISNULL( &sub->sa_any[i] ); i++ ) { inlen += sub->sa_any[i].bv_len; } } - if( sub->sa_final.bv_val ) { + if ( !BER_BVISNULL( &sub->sa_final ) ) { inlen += sub->sa_final.bv_len; } - if( sub->sa_initial.bv_val ) { - if( inlen > left.bv_len ) { + if ( !BER_BVISNULL( &sub->sa_initial ) ) { + if ( inlen > left.bv_len ) { match = 1; goto done; } @@ -304,7 +320,7 @@ octetStringSubstringsMatch( match = memcmp( sub->sa_initial.bv_val, left.bv_val, sub->sa_initial.bv_len ); - if( match != 0 ) { + if ( match != 0 ) { goto done; } @@ -313,8 +329,8 @@ octetStringSubstringsMatch( inlen -= sub->sa_initial.bv_len; } - if( sub->sa_final.bv_val ) { - if( inlen > left.bv_len ) { + if ( !BER_BVISNULL( &sub->sa_final ) ) { + if ( inlen > left.bv_len ) { match = 1; goto done; } @@ -323,7 +339,7 @@ octetStringSubstringsMatch( &left.bv_val[left.bv_len - sub->sa_final.bv_len], sub->sa_final.bv_len ); - if( match != 0 ) { + if ( match != 0 ) { goto done; } @@ -331,19 +347,19 @@ octetStringSubstringsMatch( inlen -= sub->sa_final.bv_len; } - if( sub->sa_any ) { - for(i=0; sub->sa_any[i].bv_val; i++) { + if ( sub->sa_any ) { + for ( i = 0; !BER_BVISNULL( &sub->sa_any[i] ); i++ ) { ber_len_t idx; char *p; retry: - if( inlen > left.bv_len ) { + if ( inlen > left.bv_len ) { /* not enough length */ match = 1; goto done; } - if( sub->sa_any[i].bv_len == 0 ) { + if ( BER_BVISEMPTY( &sub->sa_any[i] ) ) { continue; } @@ -356,7 +372,7 @@ retry: idx = p - left.bv_val; - if( idx >= left.bv_len ) { + if ( idx >= left.bv_len ) { /* this shouldn't happen */ return LDAP_OTHER; } @@ -364,7 +380,7 @@ retry: left.bv_val = p; left.bv_len -= idx; - if( sub->sa_any[i].bv_len > left.bv_len ) { + if ( sub->sa_any[i].bv_len > left.bv_len ) { /* not enough left */ match = 1; goto done; @@ -374,7 +390,7 @@ retry: sub->sa_any[i].bv_val, sub->sa_any[i].bv_len ); - if( match != 0 ) { + if ( match != 0 ) { left.bv_val++; left.bv_len--; goto retry; @@ -403,19 +419,19 @@ octetStringSubstringsIndexer( BerVarray *keysp, void *ctx ) { - ber_len_t i, j, len, nkeys; + ber_len_t i, nkeys; size_t slen, mlen; BerVarray keys; - HASH_CONTEXT HASHcontext; + HASH_CONTEXT HCany, HCini, HCfin; unsigned char HASHdigest[HASH_BYTES]; struct berval digest; digest.bv_val = (char *)HASHdigest; digest.bv_len = sizeof(HASHdigest); - nkeys=0; + nkeys = 0; - for( i=0; values[i].bv_val != NULL; i++ ) { + for ( i = 0; !BER_BVISNULL( &values[i] ); i++ ) { /* count number of indices to generate */ if( flags & SLAP_INDEX_SUBSTR_INITIAL ) { if( values[i].bv_len >= index_substr_if_maxlen ) { @@ -453,19 +469,26 @@ octetStringSubstringsIndexer( slen = syntax->ssyn_oidlen; mlen = mr->smr_oidlen; - nkeys=0; - for( i=0; values[i].bv_val != NULL; i++ ) { + if ( flags & SLAP_INDEX_SUBSTR_ANY ) + hashPreset( &HCany, prefix, SLAP_INDEX_SUBSTR_PREFIX, syntax, mr ); + if( flags & SLAP_INDEX_SUBSTR_INITIAL ) + hashPreset( &HCini, prefix, SLAP_INDEX_SUBSTR_INITIAL_PREFIX, syntax, mr ); + if( flags & SLAP_INDEX_SUBSTR_FINAL ) + hashPreset( &HCfin, prefix, SLAP_INDEX_SUBSTR_FINAL_PREFIX, syntax, mr ); + + nkeys = 0; + for ( i = 0; !BER_BVISNULL( &values[i] ); i++ ) { ber_len_t j,max; if( ( flags & SLAP_INDEX_SUBSTR_ANY ) && ( values[i].bv_len >= index_substr_any_len ) ) { - char pre = SLAP_INDEX_SUBSTR_PREFIX; max = values[i].bv_len - (index_substr_any_len - 1); for( j=0; j 0 ) { - keys[nkeys].bv_val = NULL; + BER_BVZERO( &keys[nkeys] ); *keysp = keys; } else { ch_free( keys ); @@ -520,7 +540,7 @@ octetStringSubstringsFilter ( { SubstringsAssertion *sa; char pre; - ber_len_t len, max, nkeys = 0; + ber_len_t nkeys = 0; size_t slen, mlen, klen; BerVarray keys; HASH_CONTEXT HASHcontext; @@ -531,20 +551,20 @@ octetStringSubstringsFilter ( sa = (SubstringsAssertion *) assertedValue; if( flags & SLAP_INDEX_SUBSTR_INITIAL && - sa->sa_initial.bv_val != NULL && + !BER_BVISNULL( &sa->sa_initial ) && sa->sa_initial.bv_len >= index_substr_if_minlen ) { nkeys++; if ( sa->sa_initial.bv_len > index_substr_if_maxlen && ( flags & SLAP_INDEX_SUBSTR_ANY )) { - nkeys += (sa->sa_initial.bv_len - index_substr_if_maxlen) / index_substr_any_step; + nkeys += 1 + (sa->sa_initial.bv_len - index_substr_if_maxlen) / index_substr_any_step; } } - if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) { + if ( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) { ber_len_t i; - for( i=0; sa->sa_any[i].bv_val != NULL; i++ ) { + for( i=0; !BER_BVISNULL( &sa->sa_any[i] ); i++ ) { if( sa->sa_any[i].bv_len >= index_substr_any_len ) { /* don't bother accounting with stepping */ nkeys += sa->sa_any[i].bv_len - @@ -554,14 +574,14 @@ octetStringSubstringsFilter ( } if( flags & SLAP_INDEX_SUBSTR_FINAL && - sa->sa_final.bv_val != NULL && + !BER_BVISNULL( &sa->sa_final ) && sa->sa_final.bv_len >= index_substr_if_minlen ) { nkeys++; if ( sa->sa_final.bv_len > index_substr_if_maxlen && ( flags & SLAP_INDEX_SUBSTR_ANY )) { - nkeys += (sa->sa_final.bv_len - index_substr_if_maxlen) / index_substr_any_step; + nkeys += 1 + (sa->sa_final.bv_len - index_substr_if_maxlen) / index_substr_any_step; } } @@ -580,7 +600,7 @@ octetStringSubstringsFilter ( nkeys = 0; if( flags & SLAP_INDEX_SUBSTR_INITIAL && - sa->sa_initial.bv_val != NULL && + !BER_BVISNULL( &sa->sa_initial ) && sa->sa_initial.bv_len >= index_substr_if_minlen ) { pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX; @@ -589,8 +609,9 @@ octetStringSubstringsFilter ( klen = index_substr_if_maxlen < value->bv_len ? index_substr_if_maxlen : value->bv_len; - hashDigestify( &HASHcontext, HASHdigest, prefix, pre, - syntax, mr, (unsigned char *)value->bv_val, klen ); + hashPreset( &HASHcontext, prefix, pre, syntax, mr ); + hashIter( &HASHcontext, HASHdigest, + (unsigned char *)value->bv_val, klen ); ber_dupbv_x( &keys[nkeys++], &digest, ctx ); /* If initial is too long and we have subany indexed, use it @@ -600,10 +621,11 @@ octetStringSubstringsFilter ( { ber_len_t j; pre = SLAP_INDEX_SUBSTR_PREFIX; + hashPreset( &HASHcontext, prefix, pre, syntax, mr); for ( j=index_substr_if_maxlen-1; j <= value->bv_len - index_substr_any_len; j+=index_substr_any_step ) { - hashDigestify( &HASHcontext, HASHdigest, prefix, pre, - syntax, mr, (unsigned char *)&value->bv_val[j], index_substr_any_len ); + hashIter( &HASHcontext, HASHdigest, + (unsigned char *)&value->bv_val[j], index_substr_any_len ); ber_dupbv_x( &keys[nkeys++], &digest, ctx ); } } @@ -614,26 +636,27 @@ octetStringSubstringsFilter ( pre = SLAP_INDEX_SUBSTR_PREFIX; klen = index_substr_any_len; - for( i=0; sa->sa_any[i].bv_val != NULL; i++ ) { + for( i=0; !BER_BVISNULL( &sa->sa_any[i] ); i++ ) { if( sa->sa_any[i].bv_len < index_substr_any_len ) { continue; } value = &sa->sa_any[i]; + hashPreset( &HASHcontext, prefix, pre, syntax, mr); for(j=0; j <= value->bv_len - index_substr_any_len; j += index_substr_any_step ) { - hashDigestify( &HASHcontext, HASHdigest, prefix, pre, - syntax, mr, (unsigned char *)&value->bv_val[j], klen ); + hashIter( &HASHcontext, HASHdigest, + (unsigned char *)&value->bv_val[j], klen ); ber_dupbv_x( &keys[nkeys++], &digest, ctx ); } } } if( flags & SLAP_INDEX_SUBSTR_FINAL && - sa->sa_final.bv_val != NULL && + !BER_BVISNULL( &sa->sa_final ) && sa->sa_final.bv_len >= index_substr_if_minlen ) { pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX; @@ -642,8 +665,9 @@ octetStringSubstringsFilter ( klen = index_substr_if_maxlen < value->bv_len ? index_substr_if_maxlen : value->bv_len; - hashDigestify( &HASHcontext, HASHdigest, prefix, pre, - syntax, mr, (unsigned char *)&value->bv_val[value->bv_len-klen], klen ); + hashPreset( &HASHcontext, prefix, pre, syntax, mr ); + hashIter( &HASHcontext, HASHdigest, + (unsigned char *)&value->bv_val[value->bv_len-klen], klen ); ber_dupbv_x( &keys[nkeys++], &digest, ctx ); /* If final is too long and we have subany indexed, use it @@ -653,17 +677,18 @@ octetStringSubstringsFilter ( { ber_len_t j; pre = SLAP_INDEX_SUBSTR_PREFIX; + hashPreset( &HASHcontext, prefix, pre, syntax, mr); for ( j=0; j <= value->bv_len - index_substr_if_maxlen; j+=index_substr_any_step ) { - hashDigestify( &HASHcontext, HASHdigest, prefix, pre, - syntax, mr, (unsigned char *)&value->bv_val[j], index_substr_any_len ); + hashIter( &HASHcontext, HASHdigest, + (unsigned char *)&value->bv_val[j], index_substr_any_len ); ber_dupbv_x( &keys[nkeys++], &digest, ctx ); } } } if( nkeys > 0 ) { - keys[nkeys].bv_val = NULL; + BER_BVZERO( &keys[nkeys] ); *keysp = keys; } else { ch_free( keys ); @@ -695,13 +720,13 @@ bitStringValidate( */ if( in->bv_val[0] != '\'' || - in->bv_val[in->bv_len-2] != '\'' || - in->bv_val[in->bv_len-1] != 'B' ) + in->bv_val[in->bv_len - 2] != '\'' || + in->bv_val[in->bv_len - 1] != 'B' ) { return LDAP_INVALID_SYNTAX; } - for( i=in->bv_len-3; i>0; i-- ) { + for( i = in->bv_len - 3; i > 0; i-- ) { if( in->bv_val[i] != '0' && in->bv_val[i] != '1' ) { return LDAP_INVALID_SYNTAX; } @@ -858,14 +883,14 @@ nameUIDValidate( int rc; struct berval dn, uid; - if( in->bv_len == 0 ) return LDAP_SUCCESS; + if( BER_BVISEMPTY( in ) ) return LDAP_SUCCESS; ber_dupbv( &dn, in ); if( !dn.bv_val ) return LDAP_OTHER; /* if there's a "#", try bitStringValidate()... */ uid.bv_val = strrchr( dn.bv_val, '#' ); - if ( uid.bv_val ) { + if ( !BER_BVISNULL( &uid ) ) { uid.bv_val++; uid.bv_len = dn.bv_len - ( uid.bv_val - dn.bv_val ); @@ -891,13 +916,13 @@ nameUIDPretty( struct berval *out, void *ctx ) { - assert( val ); - assert( out ); + assert( val != NULL ); + assert( out != NULL ); Debug( LDAP_DEBUG_TRACE, ">>> nameUIDPretty: <%s>\n", val->bv_val, 0, 0 ); - if( val->bv_len == 0 ) { + if( BER_BVISEMPTY( val ) ) { ber_dupbv_x( out, val, ctx ); } else if ( val->bv_len > SLAP_LDAPDN_MAXLEN ) { @@ -909,7 +934,7 @@ nameUIDPretty( struct berval uidval = BER_BVNULL; uidval.bv_val = strrchr( val->bv_val, '#' ); - if ( uidval.bv_val ) { + if ( !BER_BVISNULL( &uidval ) ) { uidval.bv_val++; uidval.bv_len = val->bv_len - ( uidval.bv_val - val->bv_val ); @@ -921,7 +946,7 @@ nameUIDPretty( dnval.bv_val[dnval.bv_len] = '\0'; } else { - uidval.bv_val = NULL; + BER_BVZERO( &uidval ); } } @@ -933,7 +958,7 @@ nameUIDPretty( return rc; } - if( uidval.bv_val ) { + if( !BER_BVISNULL( &uidval ) ) { int i, c, got1; char *tmp; @@ -995,7 +1020,7 @@ uniqueMemberNormalize( struct berval uid = BER_BVNULL; uid.bv_val = strrchr( out.bv_val, '#' ); - if ( uid.bv_val ) { + if ( !BER_BVISNULL( &uid ) ) { uid.bv_val++; uid.bv_len = out.bv_len - ( uid.bv_val - out.bv_val ); @@ -1004,7 +1029,7 @@ uniqueMemberNormalize( uid.bv_val[-1] = '\0'; out.bv_len -= uid.bv_len + 1; } else { - uid.bv_val = NULL; + BER_BVZERO( &uid ); } } @@ -1015,7 +1040,7 @@ uniqueMemberNormalize( return LDAP_INVALID_SYNTAX; } - if( uid.bv_val ) { + if( !BER_BVISNULL( &uid ) ) { char *tmp; tmp = ch_realloc( normalized->bv_val, @@ -1059,8 +1084,9 @@ uniqueMemberMatch( struct berval *asserted = (struct berval *) assertedValue; struct berval assertedDN = *asserted; struct berval assertedUID = BER_BVNULL; - struct berval valueDN = BER_BVNULL; + struct berval valueDN = *value; struct berval valueUID = BER_BVNULL; + int approx = ((flags & SLAP_MR_EQUALITY_APPROX) == SLAP_MR_EQUALITY_APPROX); if ( !BER_BVISEMPTY( asserted ) ) { assertedUID.bv_val = strrchr( assertedDN.bv_val, '#' ); @@ -1079,7 +1105,6 @@ uniqueMemberMatch( } if ( !BER_BVISEMPTY( value ) ) { - valueDN = *value; valueUID.bv_val = strrchr( valueDN.bv_val, '#' ); if ( !BER_BVISNULL( &valueUID ) ) { @@ -1108,11 +1133,109 @@ uniqueMemberMatch( *matchp = match; return LDAP_SUCCESS; } + + } else if ( !approx && valueUID.bv_len ) { + match = -1; + *matchp = match; + return LDAP_SUCCESS; + + } else if ( !approx && assertedUID.bv_len ) { + match = 1; + *matchp = match; + return LDAP_SUCCESS; } return dnMatch( matchp, flags, syntax, mr, &valueDN, &assertedDN ); } +static int +uniqueMemberIndexer( + slap_mask_t use, + slap_mask_t flags, + Syntax *syntax, + MatchingRule *mr, + struct berval *prefix, + BerVarray values, + BerVarray *keysp, + void *ctx ) +{ + BerVarray dnvalues; + int rc; + int i; + for( i=0; !BER_BVISNULL( &values[i] ); i++ ) { + /* just count them */ + } + assert( i > 0 ); + + dnvalues = slap_sl_malloc( sizeof( struct berval ) * (i+1), ctx ); + + for( i=0; !BER_BVISNULL( &values[i] ); i++ ) { + struct berval assertedDN = values[i]; + struct berval assertedUID = BER_BVNULL; + + if ( !BER_BVISEMPTY( &assertedDN ) ) { + assertedUID.bv_val = strrchr( assertedDN.bv_val, '#' ); + if ( !BER_BVISNULL( &assertedUID ) ) { + assertedUID.bv_val++; + assertedUID.bv_len = assertedDN.bv_len + - ( assertedUID.bv_val - assertedDN.bv_val ); + + if ( bitStringValidate( NULL, &assertedUID ) == LDAP_SUCCESS ) { + assertedDN.bv_len -= assertedUID.bv_len + 1; + + } else { + BER_BVZERO( &assertedUID ); + } + } + } + + dnvalues[i] = assertedDN; + } + BER_BVZERO( &dnvalues[i] ); + + rc = octetStringIndexer( use, flags, syntax, mr, prefix, + dnvalues, keysp, ctx ); + + slap_sl_free( dnvalues, ctx ); + return rc; +} + +static int +uniqueMemberFilter( + slap_mask_t use, + slap_mask_t flags, + Syntax *syntax, + MatchingRule *mr, + struct berval *prefix, + void * assertedValue, + BerVarray *keysp, + void *ctx ) +{ + struct berval *asserted = (struct berval *) assertedValue; + struct berval assertedDN = *asserted; + struct berval assertedUID = BER_BVNULL; + + if ( !BER_BVISEMPTY( asserted ) ) { + assertedUID.bv_val = strrchr( assertedDN.bv_val, '#' ); + if ( !BER_BVISNULL( &assertedUID ) ) { + assertedUID.bv_val++; + assertedUID.bv_len = assertedDN.bv_len + - ( assertedUID.bv_val - assertedDN.bv_val ); + + if ( bitStringValidate( NULL, &assertedUID ) == LDAP_SUCCESS ) { + assertedDN.bv_len -= assertedUID.bv_len + 1; + + } else { + BER_BVZERO( &assertedUID ); + } + } + } + + return octetStringFilter( use, flags, syntax, mr, prefix, + &assertedDN, keysp, ctx ); +} + + /* * Handling boolean syntax and matching is quite rigid. * A more flexible approach would be to allow a variety @@ -1237,12 +1360,12 @@ UTF8StringValidate( int len; unsigned char *u = (unsigned char *)in->bv_val; - if( in->bv_len == 0 && syntax == slap_schema.si_syn_directoryString ) { + if( BER_BVISEMPTY( in ) && 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 ) { + for( count = in->bv_len; count > 0; count -= len, u += len ) { /* get the length indicated by the first byte */ len = LDAP_UTF8_CHARLEN2( u, len ); @@ -1302,12 +1425,11 @@ UTF8StringNormalize( assert( SLAP_MR_IS_VALUE_OF_SYNTAX( use )); - if( val->bv_val == NULL ) { + if( BER_BVISNULL( val ) ) { /* assume we're dealing with a syntax (e.g., UTF8String) * which allows empty strings */ - normalized->bv_len = 0; - normalized->bv_val = NULL; + BER_BVZERO( normalized ); return LDAP_SUCCESS; } @@ -1325,8 +1447,11 @@ UTF8StringNormalize( nvalue.bv_len = 0; nvalue.bv_val = tmp.bv_val; - wasspace=1; /* trim leading spaces */ - for( i=0; isa_initial ) ) { + if ( sub->sa_initial.bv_len > left.bv_len ) { + /* not enough left */ + match = 1; + goto done; + } + + match = memcmp( sub->sa_initial.bv_val, left.bv_val, + sub->sa_initial.bv_len ); + + if ( match != 0 ) { + goto done; + } + + left.bv_val += sub->sa_initial.bv_len; + left.bv_len -= sub->sa_initial.bv_len; + + priorspace = ASCII_SPACE( + sub->sa_initial.bv_val[sub->sa_initial.bv_len] ); + } + + if ( sub->sa_any ) { + for ( i = 0; !BER_BVISNULL( &sub->sa_any[i] ); i++ ) { + ber_len_t idx; + char *p; + + if( priorspace && !BER_BVISEMPTY( &sub->sa_any[i] ) + && ASCII_SPACE( sub->sa_any[i].bv_val[0] )) + { + /* allow next space to match */ + left.bv_val--; + left.bv_len++; + } + priorspace=0; + +retry: + if ( BER_BVISEMPTY( &sub->sa_any[i] ) ) { + continue; + } + + if ( sub->sa_any[i].bv_len > left.bv_len ) { + /* not enough left */ + match = 1; + goto done; + } + + p = memchr( left.bv_val, *sub->sa_any[i].bv_val, left.bv_len ); + + if( p == NULL ) { + match = 1; + goto done; + } + + idx = p - left.bv_val; + + if ( idx >= left.bv_len ) { + /* this shouldn't happen */ + return LDAP_OTHER; + } + + left.bv_val = p; + left.bv_len -= idx; + + if ( sub->sa_any[i].bv_len > left.bv_len ) { + /* not enough left */ + match = 1; + goto done; + } + + match = memcmp( left.bv_val, + sub->sa_any[i].bv_val, + sub->sa_any[i].bv_len ); + + if ( match != 0 ) { + left.bv_val++; + left.bv_len--; + goto retry; + } + + left.bv_val += sub->sa_any[i].bv_len; + left.bv_len -= sub->sa_any[i].bv_len; + + priorspace = ASCII_SPACE( + sub->sa_any[i].bv_val[sub->sa_any[i].bv_len] ); + } + } + + if ( !BER_BVISNULL( &sub->sa_final ) ) { + if( priorspace && !BER_BVISEMPTY( &sub->sa_final ) + && ASCII_SPACE( sub->sa_final.bv_val[0] )) + { + /* allow next space to match */ + left.bv_val--; + left.bv_len++; + } + + if ( sub->sa_final.bv_len > left.bv_len ) { + /* not enough left */ + match = 1; + goto done; + } + + match = memcmp( sub->sa_final.bv_val, + &left.bv_val[left.bv_len - sub->sa_final.bv_len], + sub->sa_final.bv_len ); + + if ( match != 0 ) { + goto done; + } + } + +done: + *matchp = match; + return LDAP_SUCCESS; +} + #if defined(SLAPD_APPROX_INITIALS) # define SLAPD_APPROX_DELIMITER "._ " # define SLAPD_APPROX_WORDLEN 2 @@ -1489,11 +1748,11 @@ approxIndexer( struct berval *newkeys; BerVarray keys=NULL; - for( j=0; values[j].bv_val != NULL; j++ ) { + for( j = 0; !BER_BVISNULL( &values[j] ); j++ ) { struct berval val = BER_BVNULL; /* Yes, this is necessary */ UTF8bvnormalize( &values[j], &val, LDAP_UTF8_APPROX, NULL ); - assert( val.bv_val != NULL ); + assert( !BER_BVISNULL( &val ) ); /* Isolate how many words there are. There will be a key for each */ for( wordcount = 0, c = val.bv_val; *c; c++) { @@ -1522,7 +1781,7 @@ approxIndexer( ber_memfree( val.bv_val ); } - keys[keycount].bv_val = NULL; + BER_BVZERO( &keys[keycount] ); *keysp = keys; return LDAP_SUCCESS; @@ -1547,9 +1806,9 @@ approxFilter( /* Yes, this is necessary */ val = UTF8bvnormalize( ((struct berval *)assertedValue), NULL, LDAP_UTF8_APPROX, NULL ); - if( val == NULL || val->bv_val == NULL ) { + if( val == NULL || BER_BVISNULL( val ) ) { keys = (struct berval *)ch_malloc( sizeof(struct berval) ); - keys[0].bv_val = NULL; + BER_BVZERO( &keys[0] ); *keysp = keys; ber_bvfree( val ); return LDAP_SUCCESS; @@ -1577,7 +1836,7 @@ approxFilter( ber_bvfree( val ); - keys[count].bv_val = NULL; + BER_BVZERO( &keys[count] ); *keysp = keys; return LDAP_SUCCESS; @@ -1598,7 +1857,7 @@ telephoneNumberNormalize( assert( SLAP_MR_IS_VALUE_OF_SYNTAX( usage )); /* validator should have refused an empty string */ - assert( val->bv_len ); + assert( !BER_BVISEMPTY( val ) ); q = normalized->bv_val = slap_sl_malloc( val->bv_len + 1, ctx ); @@ -1611,23 +1870,23 @@ telephoneNumberNormalize( normalized->bv_len = q - normalized->bv_val; - if( normalized->bv_len == 0 ) { + if( BER_BVISEMPTY( normalized ) ) { slap_sl_free( normalized->bv_val, ctx ); - normalized->bv_val = NULL; + BER_BVZERO( normalized ); return LDAP_INVALID_SYNTAX; } return LDAP_SUCCESS; } -static int +int numericoidValidate( Syntax *syntax, struct berval *in ) { struct berval val = *in; - if( val.bv_len == 0 ) { + if( BER_BVISEMPTY( &val ) ) { /* disallow empty strings */ return LDAP_INVALID_SYNTAX; } @@ -1637,7 +1896,7 @@ numericoidValidate( return LDAP_SUCCESS; } - if ( val.bv_val[0] == '0' ) { + if ( val.bv_val[0] == '0' && !OID_SEPARATOR( val.bv_val[1] )) { break; } @@ -1672,13 +1931,13 @@ integerValidate( ber_len_t i; struct berval val = *in; - if( val.bv_len == 0 ) return LDAP_INVALID_SYNTAX; + if ( BER_BVISEMPTY( &val ) ) return LDAP_INVALID_SYNTAX; if ( val.bv_val[0] == '-' ) { val.bv_len--; val.bv_val++; - if( val.bv_len == 0 ) { /* bare "-" */ + if( BER_BVISEMPTY( &val ) ) { /* bare "-" */ return LDAP_INVALID_SYNTAX; } @@ -1724,7 +1983,7 @@ integerMatch( v.bv_len--; } - if( v.bv_len == 0 ) vsign = 0; + if( BER_BVISEMPTY( &v ) ) vsign = 0; a = *asserted; if( a.bv_val[0] == '-' ) { @@ -1733,7 +1992,7 @@ integerMatch( a.bv_len--; } - if( a.bv_len == 0 ) vsign = 0; + if( BER_BVISEMPTY( &a ) ) vsign = 0; match = vsign - asign; if( match == 0 ) { @@ -1771,7 +2030,7 @@ printableStringValidate( { ber_len_t i; - if( val->bv_len == 0 ) return LDAP_INVALID_SYNTAX; + if( BER_BVISEMPTY( val ) ) return LDAP_INVALID_SYNTAX; for(i=0; i < val->bv_len; i++) { if( !SLAP_PRINTABLE(val->bv_val[i]) ) { @@ -1789,7 +2048,7 @@ printablesStringValidate( { ber_len_t i, len; - if( val->bv_len == 0 ) return LDAP_INVALID_SYNTAX; + if( BER_BVISEMPTY( val ) ) return LDAP_INVALID_SYNTAX; for(i=0,len=0; i < val->bv_len; i++) { int c = val->bv_val[i]; @@ -1821,7 +2080,7 @@ IA5StringValidate( { ber_len_t i; - if( val->bv_len == 0 ) return LDAP_INVALID_SYNTAX; + if( BER_BVISEMPTY( val ) ) return LDAP_INVALID_SYNTAX; for(i=0; i < val->bv_len; i++) { if( !LDAP_ASCII(val->bv_val[i]) ) { @@ -1844,7 +2103,7 @@ IA5StringNormalize( char *p, *q; int casefold = !SLAP_MR_ASSOCIATED(mr, slap_schema.si_mr_caseExactIA5Match); - assert( val->bv_len ); + assert( !BER_BVISEMPTY( val ) ); assert( SLAP_MR_IS_VALUE_OF_SYNTAX( use )); @@ -1888,7 +2147,7 @@ IA5StringNormalize( *q = '\0'; normalized->bv_len = q - normalized->bv_val; - if( normalized->bv_len == 0 ) { + if( BER_BVISEMPTY( normalized ) ) { normalized->bv_val = slap_sl_realloc( normalized->bv_val, 2, ctx ); normalized->bv_val[0] = ' '; normalized->bv_val[1] = '\0'; @@ -1929,6 +2188,56 @@ UUIDValidate( } static int +UUIDPretty( + Syntax *syntax, + struct berval *in, + struct berval *out, + void *ctx ) +{ + int i; + int rc=LDAP_INVALID_SYNTAX; + + assert( in != NULL ); + assert( out != NULL ); + + if( in->bv_len != 36 ) return LDAP_INVALID_SYNTAX; + + out->bv_len = 36; + out->bv_val = slap_sl_malloc( out->bv_len + 1, ctx ); + + for( i=0; i<36; i++ ) { + switch(i) { + case 8: + case 13: + case 18: + case 23: + if( in->bv_val[i] != '-' ) { + goto handle_error; + } + out->bv_val[i] = '-'; + break; + + default: + if( !ASCII_HEX( in->bv_val[i]) ) { + goto handle_error; + } + out->bv_val[i] = TOLOWER( in->bv_val[i] ); + } + } + + rc = LDAP_SUCCESS; + out->bv_val[ out->bv_len ] = '\0'; + + if( 0 ) { +handle_error: + slap_sl_free( out->bv_val, ctx ); + out->bv_val = NULL; + } + + return rc; +} + +int UUIDNormalize( slap_mask_t usage, Syntax *syntax, @@ -1984,7 +2293,7 @@ numericStringValidate( { ber_len_t i; - if( in->bv_len == 0 ) return LDAP_INVALID_SYNTAX; + if( BER_BVISEMPTY( in ) ) return LDAP_INVALID_SYNTAX; for(i=0; i < in->bv_len; i++) { if( !SLAP_NUMERIC(in->bv_val[i]) ) { @@ -2007,7 +2316,7 @@ numericStringNormalize( /* removal all spaces */ char *p, *q; - assert( val->bv_len ); + assert( !BER_BVISEMPTY( val ) ); normalized->bv_val = slap_sl_malloc( val->bv_len + 1, ctx ); @@ -2031,7 +2340,7 @@ numericStringNormalize( normalized->bv_len = q - normalized->bv_val; - if( normalized->bv_len == 0 ) { + if( BER_BVISEMPTY( normalized ) ) { normalized->bv_val = slap_sl_realloc( normalized->bv_val, 2, ctx ); normalized->bv_val[0] = ' '; normalized->bv_val[1] = '\0'; @@ -2085,7 +2394,7 @@ integerBitAndMatch( return LDAP_CONSTRAINT_VIOLATION; } - *matchp = (lValue & lAssertedValue) ? 0 : 1; + *matchp = ((lValue & lAssertedValue) == lAssertedValue) ? 0 : 1; return LDAP_SUCCESS; } @@ -2116,7 +2425,7 @@ integerBitOrMatch( return LDAP_CONSTRAINT_VIOLATION; } - *matchp = (lValue | lAssertedValue) ? 0 : -1; + *matchp = ((lValue & lAssertedValue) != 0) ? 0 : -1; return LDAP_SUCCESS; } @@ -2126,13 +2435,12 @@ serialNumberAndIssuerValidate( struct berval *in ) { int rc; - int state; ber_len_t n; struct berval sn, i; if( in->bv_len < 3 ) return LDAP_INVALID_SYNTAX; - i.bv_val = strchr( in->bv_val, '$' ); - if( i.bv_val == NULL ) return LDAP_INVALID_SYNTAX; + i.bv_val = ber_bvchr( in, '$' ); + if( BER_BVISNULL( &i ) ) return LDAP_INVALID_SYNTAX; sn.bv_val = in->bv_val; sn.bv_len = i.bv_val - in->bv_val; @@ -2160,20 +2468,19 @@ serialNumberAndIssuerPretty( void *ctx ) { int rc; - int state; ber_len_t n; struct berval sn, i, newi; - assert( val ); - assert( out ); + assert( val != NULL ); + assert( out != NULL ); Debug( LDAP_DEBUG_TRACE, ">>> serialNumberAndIssuerPretty: <%s>\n", val->bv_val, 0, 0 ); if( val->bv_len < 3 ) return LDAP_INVALID_SYNTAX; - i.bv_val = strchr( val->bv_val, '$' ); - if( i.bv_val == NULL ) return LDAP_INVALID_SYNTAX; + i.bv_val = ber_bvchr( val, '$' ); + if( BER_BVISNULL( &i ) ) return LDAP_INVALID_SYNTAX; sn.bv_val = val->bv_val; sn.bv_len = i.bv_val - val->bv_val; @@ -2201,12 +2508,13 @@ serialNumberAndIssuerPretty( out->bv_val = slap_sl_realloc( newi.bv_val, out->bv_len + 1, ctx ); if( out->bv_val == NULL ) { + out->bv_len = 0; slap_sl_free( newi.bv_val, ctx ); return LDAP_OTHER; } /* push issuer over */ - AC_MEMCPY( &out->bv_val[sn.bv_len+1], newi.bv_val, newi.bv_len ); + AC_MEMCPY( &out->bv_val[sn.bv_len+1], out->bv_val, newi.bv_len ); /* insert sn and "$" */ AC_MEMCPY( out->bv_val, sn.bv_val, sn.bv_len ); out->bv_val[sn.bv_len] = '$'; @@ -2235,20 +2543,19 @@ serialNumberAndIssuerNormalize( void *ctx ) { int rc; - int state; ber_len_t n; struct berval sn, i, newi; - assert( val ); - assert( out ); + assert( val != NULL ); + assert( out != NULL ); Debug( LDAP_DEBUG_TRACE, ">>> serialNumberAndIssuerNormalize: <%s>\n", val->bv_val, 0, 0 ); if( val->bv_len < 3 ) return LDAP_INVALID_SYNTAX; - i.bv_val = strchr( val->bv_val, '$' ); - if( i.bv_val == NULL ) return LDAP_INVALID_SYNTAX; + i.bv_val = ber_bvchr( val, '$' ); + if( BER_BVISNULL( &i ) ) return LDAP_INVALID_SYNTAX; sn.bv_val = val->bv_val; sn.bv_len = i.bv_val - val->bv_val; @@ -2278,12 +2585,13 @@ serialNumberAndIssuerNormalize( out->bv_val = slap_sl_realloc( newi.bv_val, out->bv_len + 1, ctx ); if( out->bv_val == NULL ) { + out->bv_len = 0; slap_sl_free( newi.bv_val, ctx ); return LDAP_OTHER; } /* push issuer over */ - AC_MEMCPY( &out->bv_val[sn.bv_len+1], newi.bv_val, newi.bv_len ); + AC_MEMCPY( &out->bv_val[sn.bv_len+1], out->bv_val, newi.bv_len ); /* insert sn and "$" */ AC_MEMCPY( out->bv_val, sn.bv_val, sn.bv_len ); out->bv_val[sn.bv_len] = '$'; @@ -2315,7 +2623,7 @@ certificateExactNormalize( ASN1_INTEGER *sn = NULL; X509 *xcert = NULL; - if( val->bv_len == 0 ) goto done; + if( BER_BVISEMPTY( val ) ) goto done; if( SLAP_MR_IS_VALUE_OF_ASSERTION_SYNTAX(usage) ) { return serialNumberAndIssuerNormalize(0,NULL,NULL,val,normalized,ctx); @@ -2612,14 +2920,14 @@ generalizedTimeNormalize( len = sizeof("YYYYmmddHHMMSSZ")-1 + fraction.bv_len; normalized->bv_val = slap_sl_malloc( len + 1, ctx ); - if ( normalized->bv_val == NULL ) { + if ( BER_BVISNULL( normalized ) ) { return LBER_ERROR_MEMORY; } sprintf( normalized->bv_val, "%02d%02d%02d%02d%02d%02d%02d", parts[0], parts[1], parts[2] + 1, parts[3] + 1, parts[4], parts[5], parts[6] ); - if ( fraction.bv_len ) { + if ( !BER_BVISEMPTY( &fraction ) ) { memcpy( normalized->bv_val + sizeof("YYYYmmddHHMMSSZ")-2, fraction.bv_val, fraction.bv_len ); normalized->bv_val[sizeof("YYYYmmddHHMMSSZ")-2] = '.'; @@ -2664,7 +2972,6 @@ int generalizedTimeIndexer( void *ctx ) { int i, j; - size_t slen, mlen; BerVarray keys; char tmp[5]; BerValue bvtmp; /* 40 bit index */ @@ -2870,19 +3177,19 @@ again: return LDAP_INVALID_SYNTAX; } - if( tmp.bv_len == 0 ) return LDAP_SUCCESS; + if( BER_BVISEMPTY( &tmp ) ) return LDAP_SUCCESS; - while( tmp.bv_len && ( tmp.bv_val[0] == ' ' )) { + while( !BER_BVISEMPTY( &tmp ) && ( tmp.bv_val[0] == ' ' ) ) { tmp.bv_len++; tmp.bv_val--; } - if( tmp.bv_len && ( tmp.bv_val[0] == '$' )) { + if( !BER_BVISEMPTY( &tmp ) && ( tmp.bv_val[0] == '$' ) ) { tmp.bv_len++; tmp.bv_val--; } else { return LDAP_INVALID_SYNTAX; } - while( tmp.bv_len && ( tmp.bv_val[0] == ' ' )) { + while( !BER_BVISEMPTY( &tmp ) && ( tmp.bv_val[0] == ' ' ) ) { tmp.bv_len++; tmp.bv_val--; } @@ -2898,7 +3205,7 @@ nisNetgroupTripleValidate( char *p, *e; int commas = 0; - if ( val->bv_len == 0 ) { + if ( BER_BVISEMPTY( val ) ) { return LDAP_INVALID_SYNTAX; } @@ -2941,7 +3248,7 @@ bootParameterValidate( { char *p, *e; - if ( val->bv_len == 0 ) { + if ( BER_BVISEMPTY( val ) ) { return LDAP_INVALID_SYNTAX; } @@ -3017,7 +3324,7 @@ firstComponentNormalize( /* grab next word */ comp.bv_val = &val->bv_val[len]; len = val->bv_len - len; - for( comp.bv_len=0; + for( comp.bv_len = 0; !ASCII_SPACE(comp.bv_val[comp.bv_len]) && comp.bv_len < len; comp.bv_len++ ) { @@ -3078,8 +3385,8 @@ static slap_syntax_defs_rec syntax_defs[] = { {"( 1.2.36.79672281.1.5.0 DESC 'RDN' )", 0, rdnValidate, rdnPretty}, #ifdef LDAP_COMP_MATCH - {"( 1.2.36.79672281.1.5.3 DESC 'allComponents' )", - 0, allComponentsValidate, NULL}, + {"( 1.2.36.79672281.1.5.3 DESC 'allComponents' )", + 0, allComponentsValidate, NULL}, {"( 1.2.36.79672281.1.5.2 DESC 'componentFilterMatch assertion') ", 0, componentFilterValidate, NULL}, #endif @@ -3184,22 +3491,14 @@ static slap_syntax_defs_rec syntax_defs[] = { serialNumberAndIssuerValidate, serialNumberAndIssuerPretty}, -#ifdef SLAPD_ACI_ENABLED - /* OpenLDAP Experimental Syntaxes */ - {"( 1.3.6.1.4.1.4203.666.2.1 DESC 'OpenLDAP Experimental ACI' )", - SLAP_SYNTAX_HIDE, - UTF8StringValidate /* THIS WILL CHANGE FOR NEW ACI SYNTAX */, - NULL}, -#endif - #ifdef SLAPD_AUTHPASSWD /* needs updating */ {"( 1.3.6.1.4.1.4203.666.2.2 DESC 'OpenLDAP authPassword' )", SLAP_SYNTAX_HIDE, NULL, NULL}, #endif - {"( 1.3.6.1.4.1.4203.666.2.6 DESC 'UUID' )", - SLAP_SYNTAX_HIDE, UUIDValidate, NULL}, + {"( 1.3.6.1.1.16.1 DESC 'UUID' )", + 0, UUIDValidate, UUIDPretty}, {"( 1.3.6.1.4.1.4203.666.11.2.1 DESC 'CSN' )", SLAP_SYNTAX_HIDE, csnValidate, NULL}, @@ -3207,6 +3506,13 @@ static slap_syntax_defs_rec syntax_defs[] = { /* OpenLDAP Void Syntax */ {"( 1.3.6.1.4.1.4203.1.1.1 DESC 'OpenLDAP void' )" , SLAP_SYNTAX_HIDE, inValidate, NULL}, + +#ifdef SLAP_AUTHZ_SYNTAX + /* FIXME: OID is unused, but not registered yet */ + {"( 1.3.6.1.4.1.4203.666.2.7 DESC 'OpenLDAP authz' )", + SLAP_SYNTAX_HIDE, authzValidate, authzPretty}, +#endif /* SLAP_AUTHZ_SYNTAX */ + {NULL, 0, NULL, NULL} }; @@ -3373,7 +3679,7 @@ static slap_mrule_defs_rec mrule_defs[] = { {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", SLAP_MR_SUBSTR, directoryStringSyntaxes, - NULL, UTF8StringNormalize, octetStringSubstringsMatch, + NULL, UTF8StringNormalize, directoryStringSubstringsMatch, octetStringSubstringsIndexer, octetStringSubstringsFilter, "caseIgnoreMatch" }, @@ -3394,7 +3700,7 @@ static slap_mrule_defs_rec mrule_defs[] = { {"( 2.5.13.7 NAME 'caseExactSubstringsMatch' " "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )", SLAP_MR_SUBSTR, directoryStringSyntaxes, - NULL, UTF8StringNormalize, octetStringSubstringsMatch, + NULL, UTF8StringNormalize, directoryStringSubstringsMatch, octetStringSubstringsIndexer, octetStringSubstringsFilter, "caseExactMatch" }, @@ -3503,7 +3809,7 @@ static slap_mrule_defs_rec mrule_defs[] = { "SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )", SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL, NULL, uniqueMemberNormalize, uniqueMemberMatch, - NULL, NULL, + uniqueMemberIndexer, uniqueMemberFilter, NULL }, {"( 2.5.13.24 NAME 'protocolInformationMatch' " @@ -3580,14 +3886,14 @@ static slap_mrule_defs_rec mrule_defs[] = { {"( 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, IA5StringNormalize, octetStringSubstringsMatch, + NULL, IA5StringNormalize, directoryStringSubstringsMatch, octetStringSubstringsIndexer, octetStringSubstringsFilter, "caseIgnoreIA5Match" }, {"( 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, IA5StringNormalize, octetStringSubstringsMatch, + NULL, IA5StringNormalize, directoryStringSubstringsMatch, octetStringSubstringsIndexer, octetStringSubstringsFilter, "caseExactIA5Match" }, @@ -3601,15 +3907,6 @@ static slap_mrule_defs_rec mrule_defs[] = { NULL}, #endif -#ifdef SLAPD_ACI_ENABLED - {"( 1.3.6.1.4.1.4203.666.4.2 NAME 'OpenLDAPaciMatch' " - "SYNTAX 1.3.6.1.4.1.4203.666.2.1 )", - SLAP_MR_HIDE | SLAP_MR_EQUALITY, NULL, - NULL, NULL, OpenLDAPaciMatch, - NULL, NULL, - NULL}, -#endif - {"( 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, @@ -3624,16 +3921,16 @@ static slap_mrule_defs_rec mrule_defs[] = { NULL, NULL, "integerMatch" }, - {"( 1.3.6.1.4.1.4203.666.4.6 NAME 'UUIDMatch' " - "SYNTAX 1.3.6.1.4.1.4203.666.2.6 )", - SLAP_MR_HIDE | SLAP_MR_EQUALITY, NULL, + {"( 1.3.6.1.1.16.2 NAME 'UUIDMatch' " + "SYNTAX 1.3.6.1.1.16.1 )", + SLAP_MR_EQUALITY | SLAP_MR_MUTATION_NORMALIZER, NULL, NULL, UUIDNormalize, octetStringMatch, octetStringIndexer, octetStringFilter, NULL}, - {"( 1.3.6.1.4.1.4203.666.4.7 NAME 'UUIDOrderingMatch' " - "SYNTAX 1.3.6.1.4.1.4203.666.2.6 )", - SLAP_MR_HIDE | SLAP_MR_ORDERING, NULL, + {"( 1.3.6.1.1.16.3 NAME 'UUIDOrderingMatch' " + "SYNTAX 1.3.6.1.1.16.1 )", + SLAP_MR_ORDERING | SLAP_MR_MUTATION_NORMALIZER, NULL, NULL, UUIDNormalize, octetStringOrderingMatch, octetStringIndexer, octetStringFilter, "UUIDMatch"}, @@ -3652,6 +3949,16 @@ static slap_mrule_defs_rec mrule_defs[] = { NULL, NULL, "CSNMatch" }, +#ifdef SLAP_AUTHZ_SYNTAX + /* FIXME: OID is unused, but not registered yet */ + {"( 1.3.6.1.4.1.4203.666.4.12 NAME 'authzMatch' " + "SYNTAX 1.3.6.1.4.1.4203.666.2.7 )", + SLAP_MR_HIDE | SLAP_MR_EQUALITY, NULL, + NULL, authzNormalize, authzMatch, + NULL, NULL, + NULL}, +#endif /* SLAP_AUTHZ_SYNTAX */ + {NULL, SLAP_MR_NONE, NULL, NULL, NULL, NULL, NULL, NULL, NULL } @@ -3710,4 +4017,7 @@ schema_destroy( void ) mr_destroy(); mru_destroy(); syn_destroy(); + + ldap_pvt_thread_mutex_destroy( &ad_undef_mutex ); + ldap_pvt_thread_mutex_destroy( &oc_undef_mutex ); }