From 923d033c99342120e0736d07e27137a82af74c79 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Thu, 29 Aug 2002 02:27:15 +0000 Subject: [PATCH] Finish adding subclassing indexing support --- servers/slapd/schema_init.c | 44 ++++++------- servers/slapd/schema_prep.c | 119 ++++++++++++++++++++++++----------- tests/data/search.out.master | 5 ++ tests/data/slapd-master.conf | 4 +- tests/scripts/test003-search | 21 +++++-- 5 files changed, 126 insertions(+), 67 deletions(-) diff --git a/servers/slapd/schema_init.c b/servers/slapd/schema_init.c index b8308d7654..93427a0b2c 100644 --- a/servers/slapd/schema_init.c +++ b/servers/slapd/schema_init.c @@ -200,14 +200,14 @@ int octetStringFilter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { size_t slen, mlen; BerVarray keys; HASH_CONTEXT HASHcontext; unsigned char HASHdigest[HASH_BYTES]; - struct berval *value = (struct berval *) assertValue; + struct berval *value = (struct berval *) assertedValue; struct berval digest; digest.bv_val = HASHdigest; digest.bv_len = sizeof(HASHdigest); @@ -931,7 +931,7 @@ approxFilter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { char *c; @@ -940,7 +940,7 @@ approxFilter( BerVarray keys; /* Yes, this is necessary */ - val = UTF8bvnormalize( ((struct berval *)assertValue), + val = UTF8bvnormalize( ((struct berval *)assertedValue), NULL, LDAP_UTF8_APPROX ); if( val == NULL || val->bv_val == NULL ) { keys = (struct berval *)ch_malloc( sizeof(struct berval) ); @@ -1070,7 +1070,7 @@ approxFilter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { BerVarray keys; @@ -1079,7 +1079,7 @@ approxFilter( keys = (struct berval *)ch_malloc( sizeof( struct berval * ) * 2 ); /* Yes, this is necessary */ - s = UTF8normalize( ((struct berval *)assertValue), + s = UTF8normalize( ((struct berval *)assertedValue), UTF8_NOCASEFOLD ); if( s == NULL ) { keys[0] = NULL; @@ -1335,7 +1335,7 @@ static int caseExactIgnoreFilter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { unsigned casefold; @@ -1355,7 +1355,7 @@ static int caseExactIgnoreFilter( casefold = ( mr != caseExactMatchingRule ) ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD; - UTF8bvnormalize( (struct berval *) assertValue, &value, casefold ); + UTF8bvnormalize( (struct berval *) assertedValue, &value, casefold ); /* This usually happens if filter contains bad UTF8 */ if( value.bv_val == NULL ) { keys = ch_malloc( sizeof( struct berval ) ); @@ -1574,7 +1574,7 @@ static int caseExactIgnoreSubstringsFilter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { SubstringsAssertion *sa; @@ -1591,7 +1591,7 @@ static int caseExactIgnoreSubstringsFilter( casefold = ( mr != caseExactSubstringsMatchingRule ) ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD; - sa = UTF8SubstringsassertionNormalize( assertValue, casefold ); + sa = UTF8SubstringsassertionNormalize( assertedValue, casefold ); if( sa == NULL ) { *keysp = NULL; return LDAP_SUCCESS; @@ -2023,7 +2023,7 @@ static int integerFilter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { size_t slen, mlen; @@ -2038,7 +2038,7 @@ static int integerFilter( slen = syntax->ssyn_oidlen; mlen = mr->smr_oidlen; - integerNormalize( syntax, assertValue, &norm ); + integerNormalize( syntax, assertedValue, &norm ); keys = ch_malloc( sizeof( struct berval ) * 2 ); @@ -2417,7 +2417,7 @@ static int caseExactIA5Filter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { size_t slen, mlen; @@ -2432,7 +2432,7 @@ static int caseExactIA5Filter( slen = syntax->ssyn_oidlen; mlen = mr->smr_oidlen; - value = (struct berval *) assertValue; + value = (struct berval *) assertedValue; keys = ch_malloc( sizeof( struct berval ) * 2 ); @@ -2623,10 +2623,10 @@ static int caseExactIA5SubstringsFilter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { - SubstringsAssertion *sa = assertValue; + SubstringsAssertion *sa = assertedValue; char pre; ber_len_t nkeys = 0; size_t slen, mlen, klen; @@ -3004,7 +3004,7 @@ static int caseIgnoreIA5Filter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { size_t slen, mlen; @@ -3019,7 +3019,7 @@ static int caseIgnoreIA5Filter( slen = syntax->ssyn_oidlen; mlen = mr->smr_oidlen; - ber_dupbv( &value, (struct berval *) assertValue ); + ber_dupbv( &value, (struct berval *) assertedValue ); ldap_pvt_str2lower( value.bv_val ); keys = ch_malloc( sizeof( struct berval ) * 2 ); @@ -3218,10 +3218,10 @@ static int caseIgnoreIA5SubstringsFilter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { - SubstringsAssertion *sa = assertValue; + SubstringsAssertion *sa = assertedValue; char pre; ber_len_t nkeys = 0; size_t slen, mlen, klen; @@ -3917,13 +3917,13 @@ static int certificateExactFilter( Syntax *syntax, MatchingRule *mr, struct berval *prefix, - void * assertValue, + void * assertedValue, BerVarray *keysp ) { BerVarray keys; struct berval asserted_serial; - serial_and_issuer_parse(assertValue, + serial_and_issuer_parse(assertedValue, &asserted_serial, NULL); diff --git a/servers/slapd/schema_prep.c b/servers/slapd/schema_prep.c index 406add5386..8da0c25153 100644 --- a/servers/slapd/schema_prep.c +++ b/servers/slapd/schema_prep.c @@ -17,6 +17,8 @@ #include "ldap_pvt.h" #include "ldap_pvt_uc.h" +#define OCDEBUG 0 + int schema_init_done = 0; struct slap_internal_schema slap_schema; @@ -36,7 +38,7 @@ static int objectClassNormalize( ber_dupbv( out, in ); } -#if 0 +#if OCDEBUG #ifdef NEW_LOGGING LDAP_LOG( CONFIG, ENTRY, "< objectClassNormalize(%s, %s)\n", in->bv_val, out->bv_val, 0 ); @@ -62,7 +64,7 @@ objectSubClassMatch( ObjectClass *oc = oc_bvfind( value ); ObjectClass *asserted = oc_bvfind( a ); -#if 0 +#if OCDEBUG #ifdef NEW_LOGGING LDAP_LOG( CONFIG, ENTRY, "> objectSubClassMatch(%s, %s)\n", value->bv_val, a->bv_val, 0 ); @@ -94,7 +96,7 @@ objectSubClassMatch( *matchp = !is_object_subclass( asserted, oc ); } -#if 0 +#if OCDEBUG #ifdef NEW_LOGGING LDAP_LOG( CONFIG, ENTRY, "< objectSubClassMatch(%s, %s) = %d\n", @@ -121,17 +123,6 @@ static int objectSubClassIndexer( BerVarray ocvalues; for( noc=0; values[noc].bv_val != NULL; noc++ ) { -#if 0 -#ifdef NEW_LOGGING - LDAP_LOG( CONFIG, ENTRY, - "> objectSubClassIndexer(%d, %s)\n", - noc, values[noc].bv_val, 0 ); -#else - Debug( LDAP_DEBUG_TRACE, - "> objectSubClassIndexer(%d, %s)\n", - noc, values[noc].bv_val, 0 ); -#endif -#endif /* just count em */; } @@ -139,7 +130,25 @@ static int objectSubClassIndexer( ocvalues = ch_malloc( sizeof( struct berval ) * (noc+16) ); /* copy listed values (and termination) */ - AC_MEMCPY( ocvalues, values, sizeof( struct berval ) * noc+1 ); + for( i=0; isoc_cname; + } else { + ocvalues[i] = values[i]; + } +#if OCDEBUG +#ifdef NEW_LOGGING + LDAP_LOG( CONFIG, ENTRY, + "> objectSubClassIndexer(%d, %s)\n", + i, ocvalues[i].bv_val, 0 ); +#else + Debug( LDAP_DEBUG_TRACE, + "> objectSubClassIndexer(%d, %s)\n", + i, ocvalues[i].bv_val, 0 ); +#endif +#endif + } /* expand values */ for( i=0; isoc_cname; + } + +#ifdef NEW_LOGGING + LDAP_LOG( CONFIG, ENTRY, + "< objectSubClassFilter(%s)\n", bv->bv_val, 0, 0 ); +#else + Debug( LDAP_DEBUG_TRACE, "< objectSubClassFilter(%s)\n", + bv->bv_val, 0, 0 ); +#endif +#endif + + return octetStringFilter( use, flags, syntax, mr, + prefix, assertedValue, keysp ); +} static ObjectClassSchemaCheckFN rootDseObjectClass; static ObjectClassSchemaCheckFN aliasObjectClass; @@ -320,7 +357,7 @@ static struct slap_schema_ad_map { "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )", NULL, SLAP_AT_FINAL, NULL, objectClassNormalize, objectSubClassMatch, - objectSubClassIndexer, NULL, + objectSubClassIndexer, objectSubClassFilter, offsetof(struct slap_internal_schema, si_ad_objectClass) }, /* user entry operational attributes */ @@ -331,7 +368,7 @@ static struct slap_schema_ad_map { "SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )", NULL, 0, NULL, objectClassNormalize, objectSubClassMatch, - objectSubClassIndexer, NULL, + objectSubClassIndexer, objectSubClassFilter, offsetof(struct slap_internal_schema, si_ad_structuralObjectClass) }, { "createTimestamp", "( 2.5.18.1 NAME 'createTimestamp' " "DESC 'RFC2252: time which object was created' " @@ -851,25 +888,31 @@ slap_schema_load( void ) (*adp)->ad_type->sat_flags |= ad_map[i].ssam_flags; /* install custom rule routine */ - if( ad_map[i].ssam_convert ) { - (*adp)->ad_type->sat_equality->smr_convert - = ad_map[i].ssam_convert; - } - if( ad_map[i].ssam_normalize ) { - (*adp)->ad_type->sat_equality->smr_normalize - = ad_map[i].ssam_normalize; - } - if( ad_map[i].ssam_match ) { - (*adp)->ad_type->sat_equality->smr_match - = ad_map[i].ssam_match; - } - if( ad_map[i].ssam_indexer ) { - (*adp)->ad_type->sat_equality->smr_indexer - = ad_map[i].ssam_indexer; - } - if( ad_map[i].ssam_filter ) { - (*adp)->ad_type->sat_equality->smr_filter - = ad_map[i].ssam_filter; + if( ad_map[i].ssam_convert || + ad_map[i].ssam_normalize || + ad_map[i].ssam_match || + ad_map[i].ssam_indexer || + ad_map[i].ssam_filter ) + { + MatchingRule *mr = ch_malloc( sizeof( MatchingRule ) ); + *mr = *(*adp)->ad_type->sat_equality; + (*adp)->ad_type->sat_equality = mr; + + if( ad_map[i].ssam_convert ) { + mr->smr_convert = ad_map[i].ssam_convert; + } + if( ad_map[i].ssam_normalize ) { + mr->smr_normalize = ad_map[i].ssam_normalize; + } + if( ad_map[i].ssam_match ) { + mr->smr_match = ad_map[i].ssam_match; + } + if( ad_map[i].ssam_indexer ) { + mr->smr_indexer = ad_map[i].ssam_indexer; + } + if( ad_map[i].ssam_filter ) { + mr->smr_filter = ad_map[i].ssam_filter; + } } } } diff --git a/tests/data/search.out.master b/tests/data/search.out.master index 3205316b1f..3614047aea 100644 --- a/tests/data/search.out.master +++ b/tests/data/search.out.master @@ -264,3 +264,8 @@ postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481 telephonenumber: +1 313 764-1817 associateddomain: umich.edu +dn: cn=Ursula Hampster,ou=Alumni Association,ou=People,o=University of Michiga + n,c=US +objectClass: OpenLDAPperson +uid: uham + diff --git a/tests/data/slapd-master.conf b/tests/data/slapd-master.conf index 2d4e879bd4..161640c527 100644 --- a/tests/data/slapd-master.conf +++ b/tests/data/slapd-master.conf @@ -19,5 +19,5 @@ suffix "o=University of Michigan,c=US" directory ./test-db rootdn "cn=Manager,o=University of Michigan,c=US" rootpw secret -#ldbm#index objectClass eq -#bdb#index objectClass eq +# #ldbm#index objectClass eq +# #bdb#index objectClass eq diff --git a/tests/scripts/test003-search b/tests/scripts/test003-search index b763a6e853..08c6fecbcf 100755 --- a/tests/scripts/test003-search +++ b/tests/scripts/test003-search @@ -54,7 +54,7 @@ fi echo "Testing slapd searching..." for i in 0 1 2 3 4 5; do $LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT \ - 'objectclass=*' > /dev/null 2>&1 + '(objectclass=*)' > /dev/null 2>&1 RC=$? if test $RC = 1 ; then echo "Waiting 5 seconds for slapd to start..." @@ -72,7 +72,7 @@ cat /dev/null > $SEARCHOUT echo "Testing exact searching..." $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT \ - 'sn=jensen' >> $SEARCHOUT 2>&1 + '(sn=jensen)' >> $SEARCHOUT 2>&1 RC=$? if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" @@ -104,14 +104,25 @@ echo "Testing NOT searching..." $LDAPSEARCH -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT \ '(!(objectclass=pilotPerson))' >> $SEARCHOUT 2>&1 RC=$? - -kill -HUP $PID - if test $RC != 0 ; then echo "ldapsearch failed ($RC)!" + kill -HUP $PID exit $RC fi +echo "Testing objectClass/attributeType inheritance ..." +$LDAPSEARCH -M -a never -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT \ + '(&(objectClass=inetorgperson)(uid=uham))' \ + "2.5.4.0" "userid" >> $SEARCHOUT 2>&1 +RC=$? +if test $RC != 0 ; then + echo "ldapsearch failed ($RC)!" + kill -HUP $PID + exit $RC +fi + + +kill -HUP $PID LDIF=$SEARCHOUTMASTER echo "Filtering ldapsearch results..."