X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmra.c;h=9fe245f0f2b5f1dd60885a20784890f262acefa9;hb=f30269f5d2e4bb5ee7486fe6542078d1b59dba6d;hp=097f34b25c7bda96525b1d8af9539c7af211e7f0;hpb=71e78dd7f9abf7ad73dce19a3ceb44af99efe009;p=openldap diff --git a/servers/slapd/mra.c b/servers/slapd/mra.c index 097f34b25c..9fe245f0f2 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-2009 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,6 +23,10 @@ #include "slap.h" +#ifdef LDAP_COMP_MATCH +#include "component.h" +#endif + void mra_free( Operation *op, @@ -31,11 +35,14 @@ mra_free( { #ifdef LDAP_COMP_MATCH /* free component assertion */ - if ( mra->ma_rule->smr_usage & SLAP_MR_COMPONENT ) + 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 ( mra->ma_desc && mra->ma_desc->ad_flags & SLAP_DESC_TEMPORARY ) + op->o_tmpfree( mra->ma_desc, op->o_tmpmemctx ); if ( freeit ) op->o_tmpfree( (char *) mra, op->o_tmpmemctx ); } @@ -43,7 +50,7 @@ int get_mra( Operation *op, BerElement *ber, - MatchingRuleAssertion **mra, + Filter *f, const char **text ) { int rc; @@ -52,9 +59,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 ); @@ -135,7 +143,14 @@ get_mra( if( type.bv_val != NULL ) { rc = slap_bv2ad( &type, &ma.ma_desc, text ); if( rc != LDAP_SUCCESS ) { - return rc; + f->f_choice |= SLAPD_FILTER_UNDEFINED; + rc = slap_bv2undef_ad( &type, &ma.ma_desc, text, + SLAP_AD_PROXIED|SLAP_AD_NOINSERT ); + + if( rc != LDAP_SUCCESS ) { + ma.ma_desc = slap_bv2tmp_ad( &type, op->o_tmpmemctx ); + rc = LDAP_SUCCESS; + } } } @@ -188,10 +203,13 @@ get_mra( 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 ) { + /* 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; } @@ -200,12 +218,12 @@ get_mra( length = sizeof(ma); /* Append rule_text to end of struct */ if (rule_text.bv_val) length += rule_text.bv_len + 1; - *mra = op->o_tmpalloc( length, op->o_tmpmemctx ); - **mra = ma; + f->f_mra = op->o_tmpalloc( length, op->o_tmpmemctx ); + *f->f_mra = ma; if (rule_text.bv_val) { - (*mra)->ma_rule_text.bv_len = rule_text.bv_len; - (*mra)->ma_rule_text.bv_val = (char *)(*mra+1); - AC_MEMCPY((*mra)->ma_rule_text.bv_val, rule_text.bv_val, + f->f_mra->ma_rule_text.bv_len = rule_text.bv_len; + f->f_mra->ma_rule_text.bv_val = (char *)(f->f_mra+1); + AC_MEMCPY(f->f_mra->ma_rule_text.bv_val, rule_text.bv_val, rule_text.bv_len+1); }