]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/mra.c
ITS#6024 Don't send cookies without csn.
[openldap] / servers / slapd / mra.c
index 097f34b25c7bda96525b1d8af9539c7af211e7f0..9fe245f0f2b5f1dd60885a20784890f262acefa9 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-2009 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,
@@ -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);
        }