]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/mra.c
Sync with HEAD
[openldap] / servers / slapd / mra.c
index d9e1ec622647156e900da3cfd4134896095d60d7..54dde3964ee2b4e8bc5527705727094148ac450c 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * 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
 
 #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;