]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/mra.c
use slab memory for proxyauthz
[openldap] / servers / slapd / mra.c
index 688786e313d2e15c94948a79f7ce774b08063bb5..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,
@@ -31,7 +35,7 @@ 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
@@ -53,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 );
 
@@ -136,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;
+                       }
                }
        }
 
@@ -189,10 +199,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;
        }