X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmr.c;h=639f594fe4872fcc62df2fb98a0e0d772bd7991d;hb=6d1aa51604a7ae9c44287af5201afc9f43b5e91e;hp=1c5d95d4e2810ed807597d99803de33c43028e74;hpb=fc7e29e0c5730115fffc5511afa9f2efc2c51982;p=openldap diff --git a/servers/slapd/mr.c b/servers/slapd/mr.c index 1c5d95d4e2..639f594fe4 100644 --- a/servers/slapd/mr.c +++ b/servers/slapd/mr.c @@ -1,8 +1,17 @@ /* mr.c - routines to manage matching rule definitions */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2009 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -14,7 +23,6 @@ #include #include "slap.h" -#include "ldap_pvt.h" struct mindexrec { struct berval mir_name; @@ -22,9 +30,9 @@ struct mindexrec { }; static Avlnode *mr_index = NULL; -static LDAP_SLIST_HEAD(MRList, slap_matching_rule) mr_list +static LDAP_SLIST_HEAD(MRList, MatchingRule) mr_list = LDAP_SLIST_HEAD_INITIALIZER(&mr_list); -static LDAP_SLIST_HEAD(MRUList, slap_matching_rule_use) mru_list +static LDAP_SLIST_HEAD(MRUList, MatchingRuleUse) mru_list = LDAP_SLIST_HEAD_INITIALIZER(&mru_list); static int @@ -37,7 +45,7 @@ mr_index_cmp( const struct mindexrec *mir2 = v_mir2; int i = mir1->mir_name.bv_len - mir2->mir_name.bv_len; if (i) return i; - return (strcmp( mir1->mir_name.bv_val, mir2->mir_name.bv_val )); + return (strcasecmp( mir1->mir_name.bv_val, mir2->mir_name.bv_val )); } static int @@ -50,7 +58,7 @@ mr_index_name_cmp( const struct mindexrec *mir = v_mir; int i = name->bv_len - mir->mir_name.bv_len; if (i) return i; - return (strncmp( name->bv_val, mir->mir_name.bv_val, name->bv_len )); + return (strncasecmp( name->bv_val, mir->mir_name.bv_val, name->bv_len )); } MatchingRule * @@ -137,6 +145,67 @@ mr_insert( return 0; } +int +mr_make_syntax_compat_with_mr( + Syntax *syn, + MatchingRule *mr ) +{ + int n = 0; + + assert( syn != NULL ); + assert( mr != NULL ); + + if ( mr->smr_compat_syntaxes ) { + /* count esisting */ + for ( n = 0; + mr->smr_compat_syntaxes[ n ]; + n++ ) + { + if ( mr->smr_compat_syntaxes[ n ] == syn ) { + /* already compatible; mmmmh... */ + return 1; + } + } + } + + mr->smr_compat_syntaxes = ch_realloc( + mr->smr_compat_syntaxes, + sizeof( Syntax * )*(n + 2) ); + mr->smr_compat_syntaxes[ n ] = syn; + mr->smr_compat_syntaxes[ n + 1 ] = NULL; + + return 0; +} + +int +mr_make_syntax_compat_with_mrs( + const char *syntax, + char *const *mrs ) +{ + int r, rc = 0; + Syntax *syn; + + assert( syntax != NULL ); + assert( mrs != NULL ); + + syn = syn_find( syntax ); + if ( syn == NULL ) { + return -1; + } + + for ( r = 0; mrs[ r ] != NULL; r++ ) { + MatchingRule *mr = mr_find( mrs[ r ] ); + if ( mr == NULL ) { + /* matchingRule not found -- ignore by now */ + continue; + } + + rc += mr_make_syntax_compat_with_mr( syn, mr ); + } + + return rc; +} + int mr_add( LDAPMatchingRule *mr, @@ -161,6 +230,7 @@ mr_add( for( i=0; def->mrd_compat_syntaxes[i]; i++ ) { compat_syn[i] = syn_find( def->mrd_compat_syntaxes[i] ); if( compat_syn[i] == NULL ) { + ch_free( compat_syn ); return SLAP_SCHERR_SYN_NOT_FOUND; } } @@ -190,10 +260,12 @@ mr_add( smr->smr_syntax = syn; } else { *err = smr->smr_syntax_oid; + ch_free( smr ); return SLAP_SCHERR_SYN_NOT_FOUND; } } else { *err = ""; + ch_free( smr ); return SLAP_SCHERR_MR_INCOMPLETE; } code = mr_insert(smr,err); @@ -209,74 +281,67 @@ register_matching_rule( int code; const char *err; - if( def->mrd_usage == SLAP_MR_NONE && - def->mrd_compat_syntaxes == NULL ) - { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "register_matching_rule: %s not usable\n", def->mrd_desc, 0, 0 ); -#else + if( def->mrd_usage == SLAP_MR_NONE && def->mrd_compat_syntaxes == NULL ) { Debug( LDAP_DEBUG_ANY, "register_matching_rule: not usable %s\n", def->mrd_desc, 0, 0 ); -#endif return -1; } if( def->mrd_associated != NULL ) { amr = mr_find( def->mrd_associated ); - if( amr == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "register_matching_rule: could not locate associated " - "matching rule %s for %s\n", - def->mrd_associated, def->mrd_desc, 0 ); -#else - Debug( LDAP_DEBUG_ANY, "register_matching_rule: could not locate " - "associated matching rule %s for %s\n", + Debug( LDAP_DEBUG_ANY, "register_matching_rule: " + "could not locate associated matching rule %s for %s\n", def->mrd_associated, def->mrd_desc, 0 ); -#endif return -1; } + + if (( def->mrd_usage & SLAP_MR_EQUALITY ) && + (( def->mrd_usage & SLAP_MR_SUBTYPE_MASK ) == SLAP_MR_NONE )) + { + if (( def->mrd_usage & SLAP_MR_EQUALITY ) && + (( def->mrd_usage & SLAP_MR_SUBTYPE_MASK ) != SLAP_MR_NONE )) + { + Debug( LDAP_DEBUG_ANY, "register_matching_rule: " + "inappropriate (approx) association %s for %s\n", + def->mrd_associated, def->mrd_desc, 0 ); + return -1; + } + + } else if (!( amr->smr_usage & SLAP_MR_EQUALITY )) { + Debug( LDAP_DEBUG_ANY, "register_matching_rule: " + "inappropriate (equalilty) association %s for %s\n", + def->mrd_associated, def->mrd_desc, 0 ); + return -1; + } } mr = ldap_str2matchingrule( def->mrd_desc, &code, &err, LDAP_SCHEMA_ALLOW_ALL ); if ( !mr ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "register_matching_rule: %s before %s in %s.\n", - ldap_scherr2str(code), err, def->mrd_desc ); -#else Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s before %s in %s\n", ldap_scherr2str(code), err, def->mrd_desc ); -#endif - return( -1 ); + return -1; } + code = mr_add( mr, def, amr, &err ); ldap_memfree( mr ); if ( code ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "register_matching_rule: %s for %s in %s.\n", - scherr2str(code), err, def->mrd_desc ); -#else Debug( LDAP_DEBUG_ANY, "Error in register_matching_rule: %s for %s in %s\n", scherr2str(code), err, def->mrd_desc ); -#endif - return( -1 ); + return -1; } - return( 0 ); + return 0; } void @@ -290,14 +355,14 @@ mru_destroy( void ) if ( m->smru_str.bv_val ) { ch_free( m->smru_str.bv_val ); + m->smru_str.bv_val = NULL; } /* memory borrowed from m->smru_mr */ m->smru_oid = NULL; m->smru_names = NULL; m->smru_desc = NULL; - /* free what's left (basically - * smru_mruleuse.mru_applies_oids) */ + /* free what's left (basically smru_mruleuse.mru_applies_oids) */ ldap_matchingruleuse_free((LDAPMatchingRuleUse *)m); } } @@ -308,15 +373,12 @@ matching_rule_use_init( void ) MatchingRule *mr; MatchingRuleUse **mru_ptr = &LDAP_SLIST_FIRST(&mru_list); -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, "matching_rule_use_init\n", 0, 0, 0 ); -#else Debug( LDAP_DEBUG_TRACE, "matching_rule_use_init\n", 0, 0, 0 ); -#endif LDAP_SLIST_FOREACH( mr, &mr_list, smr_next ) { AttributeType *at; - MatchingRuleUse mru_storage, *mru = &mru_storage; + MatchingRuleUse mru_storage = {{ 0 }}, + *mru = &mru_storage; char **applies_oids = NULL; @@ -341,8 +403,6 @@ matching_rule_use_init( void ) continue; } - memset( mru, 0, sizeof( MatchingRuleUse ) ); - /* * Note: we're using the same values of the corresponding * MatchingRule structure; maybe we'd copy them ... @@ -355,15 +415,9 @@ matching_rule_use_init( void ) mru->smru_names = mr->smr_names; mru->smru_desc = mr->smr_desc; -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, " %s (%s): ", - mru->smru_oid, - mru->smru_names ? mru->smru_names[ 0 ] : "", 0 ); -#else Debug( LDAP_DEBUG_TRACE, " %s (%s): ", mru->smru_oid, mru->smru_names ? mru->smru_names[ 0 ] : "", 0 ); -#endif at = NULL; for ( at_start( &at ); at; at_next( &at ) ) { @@ -381,19 +435,11 @@ matching_rule_use_init( void ) */ if ( applies_oids != NULL ) { mru->smru_applies_oids = applies_oids; -#ifdef NEW_LOGGING - { - char *str = ldap_matchingruleuse2str( &mru->smru_mruleuse ); - LDAP_LOG( OPERATION, INFO, "matchingRuleUse: %s\n", str, 0, 0 ); - ldap_memfree( str ); - } -#else { char *str = ldap_matchingruleuse2str( &mru->smru_mruleuse ); Debug( LDAP_DEBUG_TRACE, "matchingRuleUse: %s\n", str, 0, 0 ); ldap_memfree( str ); } -#endif mru = (MatchingRuleUse *)ber_memalloc( sizeof( MatchingRuleUse ) ); /* call-forward from MatchingRule to MatchingRuleUse */ @@ -410,13 +456,16 @@ matching_rule_use_init( void ) return( 0 ); } -int mr_usable_with_at( - MatchingRule *mr, - AttributeType *at ) +int +mr_usable_with_at( + MatchingRule *mr, + AttributeType *at ) { - if( mr->smr_usage & SLAP_MR_EXT && ( + if ( ( mr->smr_usage & SLAP_MR_EXT ) && ( mr->smr_syntax == at->sat_syntax || - mr == at->sat_equality || mr == at->sat_approx ) ) + mr == at->sat_equality || + mr == at->sat_approx || + syn_is_sup( at->sat_syntax, mr->smr_syntax ) ) ) { return 1; } @@ -458,10 +507,10 @@ int mr_schema_info( Entry *e ) Debug( LDAP_DEBUG_TRACE, "Merging mr [%lu] %s\n", mr->smr_str.bv_len, mr->smr_str.bv_val, 0 ); #endif + nval.bv_val = mr->smr_oid; nval.bv_len = strlen(mr->smr_oid); - if( attr_merge_one( e, ad_matchingRules, &mr->smr_str, &nval ) ) - { + if( attr_merge_one( e, ad_matchingRules, &mr->smr_str, &nval ) ) { return -1; } } @@ -476,7 +525,6 @@ int mru_schema_info( Entry *e ) struct berval nval; LDAP_SLIST_FOREACH( mru, &mru_list, smru_next ) { - assert( !( mru->smru_usage & SLAP_MR_HIDE ) ); if ( mru->smru_str.bv_val == NULL ) { @@ -490,10 +538,10 @@ int mru_schema_info( Entry *e ) Debug( LDAP_DEBUG_TRACE, "Merging mru [%lu] %s\n", mru->smru_str.bv_len, mru->smru_str.bv_val, 0 ); #endif + nval.bv_val = mru->smru_oid; nval.bv_len = strlen(mru->smru_oid); - if( attr_merge_one( e, ad_matchingRuleUse, &mru->smru_str, &nval ) ) - { + if( attr_merge_one( e, ad_matchingRuleUse, &mru->smru_str, &nval ) ) { return -1; } }