X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmra.c;h=54dde3964ee2b4e8bc5527705727094148ac450c;hb=21be582df7e13ae2c8d44e1f7f02478eb9ec0762;hp=d9e1ec622647156e900da3cfd4134896095d60d7;hpb=d611a4b49a00238ed32ae84c68f27c6a0ef2273a;p=openldap diff --git a/servers/slapd/mra.c b/servers/slapd/mra.c index d9e1ec6226..54dde3964e 100644 --- a/servers/slapd/mra.c +++ b/servers/slapd/mra.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 @@ -23,12 +23,22 @@ #include "slap.h" +#ifdef LDAP_COMP_MATCH +#include "component.h" +#endif + void mra_free( Operation *op, MatchingRuleAssertion *mra, int freeit ) { +#ifdef LDAP_COMP_MATCH + /* free component assertion */ + if ( mra->ma_rule->smr_usage & SLAP_MR_COMPONENT && mra->ma_cf ) { + component_free( mra->ma_cf ); + } +#endif /* op->o_tmpfree( mra->ma_value.bv_val, op->o_tmpmemctx ); */ ch_free( mra->ma_value.bv_val ); if ( freeit ) op->o_tmpfree( (char *) mra, op->o_tmpmemctx ); @@ -47,9 +57,10 @@ get_mra( struct berval type = BER_BVNULL; struct berval value = BER_BVNULL; struct berval rule_text = BER_BVNULL; - MatchingRuleAssertion ma; - - memset( &ma, 0, sizeof ma); + MatchingRuleAssertion ma = { 0 }; +#ifdef LDAP_COMP_MATCH + AttributeAliasing* aa = NULL; +#endif rtag = ber_scanf( ber, "{t" /*"}"*/, &tag ); @@ -130,7 +141,12 @@ get_mra( if( type.bv_val != NULL ) { rc = slap_bv2ad( &type, &ma.ma_desc, text ); if( rc != LDAP_SUCCESS ) { - return rc; + rc = slap_bv2undef_ad( &type, &ma.ma_desc, text, + SLAP_AD_PROXIED|SLAP_AD_NOINSERT ); + + if( rc != LDAP_SUCCESS ) { + return rc; + } } } @@ -180,17 +196,21 @@ get_mra( SLAP_MR_EXT|SLAP_MR_VALUE_OF_ASSERTION_SYNTAX, &value, &ma.ma_value, text, op->o_tmpmemctx ); - if( rc != LDAP_SUCCESS ) { - return rc; - } + if( rc != LDAP_SUCCESS ) return rc; #ifdef LDAP_COMP_MATCH - /* Matching Rule for Component Matching */ - Debug( LDAP_DEBUG_FILTER, "matchingrule %s\n",ma.ma_rule->smr_mrule.mr_oid,0,0); - if( ma.ma_rule && ma.ma_rule->smr_usage & SLAP_MR_COMPONENT ) - rc = get_comp_filter( op, &ma.ma_value, &ma.cf, text ); + /* Check If this attribute is aliased */ + if ( is_aliased_attribute && ma.ma_desc && ( aa = is_aliased_attribute ( ma.ma_desc ) ) ) { + rc = get_aliased_filter ( op, &ma, aa, text ); if ( rc != LDAP_SUCCESS ) return rc; + } + else if ( ma.ma_rule && ma.ma_rule->smr_usage & SLAP_MR_COMPONENT ) { + /* Matching Rule for Component Matching */ + rc = get_comp_filter( op, &ma.ma_value, &ma.ma_cf, text ); + if ( rc != LDAP_SUCCESS ) return rc; + } #endif + length = sizeof(ma); /* Append rule_text to end of struct */ if (rule_text.bv_val) length += rule_text.bv_len + 1;