]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/controls.c
streamline group attr specification/diagnostics
[openldap] / servers / slapd / controls.c
index b6c356e7413293b2f07234363f799e970749b2e3..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
@@ -991,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 );
 
@@ -1294,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;
+                       }
                }
        }