]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/controls.c
streamline group attr specification/diagnostics
[openldap] / servers / slapd / controls.c
index 857a13e57387e1887941f82a8001f43ad90cd4c8..f9e9b9b076fafb20c3d4ecc418f81c53628de850 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2006 The OpenLDAP Foundation.
+ * Copyright 1998-2007 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include "../../libraries/liblber/lber-int.h"
 
 static SLAP_CTRL_PARSE_FN parseAssert;
-static SLAP_CTRL_PARSE_FN parsePreRead;
-static SLAP_CTRL_PARSE_FN parsePostRead;
-static SLAP_CTRL_PARSE_FN parseProxyAuthz;
+static SLAP_CTRL_PARSE_FN parseDomainScope;
 static SLAP_CTRL_PARSE_FN parseDontUseCopy;
-#ifdef SLAP_RELAX
-static SLAP_CTRL_PARSE_FN parseManageDIT;
-#endif
 static SLAP_CTRL_PARSE_FN parseManageDSAit;
 static SLAP_CTRL_PARSE_FN parseNoOp;
 static SLAP_CTRL_PARSE_FN parsePagedResults;
+static SLAP_CTRL_PARSE_FN parsePermissiveModify;
+static SLAP_CTRL_PARSE_FN parsePreRead, parsePostRead;
+static SLAP_CTRL_PARSE_FN parseProxyAuthz;
+static SLAP_CTRL_PARSE_FN parseRelax;
+static SLAP_CTRL_PARSE_FN parseSearchOptions;
 #ifdef SLAP_SORTEDRESULTS
 static SLAP_CTRL_PARSE_FN parseSortedResults;
 #endif
-static SLAP_CTRL_PARSE_FN parseValuesReturnFilter;
-static SLAP_CTRL_PARSE_FN parsePermissiveModify;
-static SLAP_CTRL_PARSE_FN parseDomainScope;
+static SLAP_CTRL_PARSE_FN parseSubentries;
 #ifdef SLAP_CONTROL_X_TREE_DELETE
 static SLAP_CTRL_PARSE_FN parseTreeDelete;
 #endif
-static SLAP_CTRL_PARSE_FN parseSearchOptions;
-static SLAP_CTRL_PARSE_FN parseSubentries;
+static SLAP_CTRL_PARSE_FN parseValuesReturnFilter;
 
 #undef sc_mask /* avoid conflict with Irix 6.5 <sys/signal.h> */
 
@@ -177,13 +174,11 @@ static struct slap_control control_defs[] = {
                SLAP_CTRL_ACCESS|SLAP_CTRL_HIDE,
                NULL, NULL,
                parseNoOp, LDAP_SLIST_ENTRY_INITIALIZER(next) },
-#ifdef SLAP_RELAX
        { LDAP_CONTROL_RELAX,
-               (int)offsetof(struct slap_control_ids, sc_manageDIT),
+               (int)offsetof(struct slap_control_ids, sc_relax),
                SLAP_CTRL_GLOBAL|SLAP_CTRL_UPDATE|SLAP_CTRL_HIDE,
                NULL, NULL,
-               parseManageDIT, LDAP_SLIST_ENTRY_INITIALIZER(next) },
-#endif
+               parseRelax, LDAP_SLIST_ENTRY_INITIALIZER(next) },
 #ifdef LDAP_X_TXN
        { LDAP_CONTROL_X_TXN_SPEC,
                (int)offsetof(struct slap_control_ids, sc_txnSpec),
@@ -868,13 +863,12 @@ static int parseDontUseCopy (
        return LDAP_SUCCESS;
 }
 
-#ifdef SLAP_RELAX
-static int parseManageDIT (
+static int parseRelax (
        Operation *op,
        SlapReply *rs,
        LDAPControl *ctrl )
 {
-       if ( op->o_managedit != SLAP_CONTROL_NONE ) {
+       if ( op->o_relax != SLAP_CONTROL_NONE ) {
                rs->sr_text = "relax control specified multiple times";
                return LDAP_PROTOCOL_ERROR;
        }
@@ -884,13 +878,12 @@ static int parseManageDIT (
                return LDAP_PROTOCOL_ERROR;
        }
 
-       op->o_managedit = ctrl->ldctl_iscritical
+       op->o_relax = ctrl->ldctl_iscritical
                ? SLAP_CONTROL_CRITICAL
                : SLAP_CONTROL_NONCRITICAL;
 
        return LDAP_SUCCESS;
 }
-#endif
 
 static int parseManageDSAit (
        Operation *op,
@@ -998,7 +991,6 @@ static int parseProxyAuthz (
        op->o_ndn = dn;
        ber_dupbv( &op->o_dn, &dn );
 
-
        Statslog( LDAP_DEBUG_STATS, "%s PROXYAUTHZ dn=\"%s\"\n",
            op->o_log_prefix, dn.bv_val, 0, 0, 0 );
 
@@ -1301,18 +1293,37 @@ static int parsePostRead (
                goto done;
        }
 
-       for( i=0; i<siz; i++ ) {
+       for ( i = 0; i < siz; i++ ) {
                const char      *dummy = NULL;
+               int             rc;
 
                an[i].an_desc = NULL;
                an[i].an_oc = NULL;
                an[i].an_oc_exclude = 0;
-               rs->sr_err = slap_bv2ad( &an[i].an_name, &an[i].an_desc, &dummy );
-               if ( rs->sr_err != LDAP_SUCCESS && ctrl->ldctl_iscritical ) {
-                       rs->sr_text = dummy
-                               ? dummy
-                               : "postread control: unknown attributeType";
-                       goto done;
+               rc = slap_bv2ad( &an[i].an_name, &an[i].an_desc, &dummy );
+               if ( rc != LDAP_SUCCESS ) {
+                       int                     i;
+                       static struct berval    special_attrs[] = {
+                               BER_BVC( LDAP_NO_ATTRS ),
+                               BER_BVC( LDAP_ALL_USER_ATTRIBUTES ),
+                               BER_BVC( LDAP_ALL_OPERATIONAL_ATTRIBUTES ),
+                               BER_BVNULL
+                       };
+
+                       /* deal with special attribute types */
+                       for ( i = 0; !BER_BVISNULL( &special_attrs[ i ] ); i++ ) {
+                               if ( bvmatch( &an[i].an_name, &special_attrs[ i ] ) ) {
+                                       break;
+                               }
+                       }
+
+                       if ( BER_BVISNULL( &special_attrs[ i ] ) && ctrl->ldctl_iscritical ) {
+                               rs->sr_err = rc;
+                               rs->sr_text = dummy
+                                       ? dummy
+                                       : "postread control: unknown attributeType";
+                               goto done;
+                       }
                }
        }