Diff for /servers/slapd/acl.c between versions 1.356 and 1.357

version 1.356, 2011/01/04 23:43:12 version 1.357, 2011/01/26 23:50:26
Line 1 Line 1
 /* acl.c - routines to parse and check acl's */  /* acl.c - routines to parse and check acl's */
 /* $OpenLDAP: pkg/ldap/servers/slapd/acl.c,v 1.355 2010/11/15 15:27:56 ralf Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/acl.c,v 1.356 2011/01/04 23:43:12 kurt Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 1998-2011 The OpenLDAP Foundation.   * Copyright 1998-2011 The OpenLDAP Foundation.
Line 57  static AccessControl * slap_acl_get( Line 57  static AccessControl * slap_acl_get(
         AccessControlState *state );          AccessControlState *state );
   
 static slap_control_t slap_acl_mask(  static slap_control_t slap_acl_mask(
         AccessControl *ac, slap_mask_t *mask,          AccessControl *ac,
           AccessControl *prev,
           slap_mask_t *mask,
         Operation *op, Entry *e,          Operation *op, Entry *e,
         AttributeDescription *desc,          AttributeDescription *desc,
         struct berval *val,          struct berval *val,
Line 141  slap_access_allowed( Line 143  slap_access_allowed(
 {  {
         int                             ret = 1;          int                             ret = 1;
         int                             count;          int                             count;
         AccessControl                   *a = NULL;          AccessControl                   *a, *prev;
   
 #ifdef LDAP_DEBUG  #ifdef LDAP_DEBUG
         char                            accessmaskbuf[ACCESSMASK_MAXLEN];          char                            accessmaskbuf[ACCESSMASK_MAXLEN];
Line 236  slap_access_allowed( Line 238  slap_access_allowed(
         }          }
   
         MATCHES_MEMSET( &matches );          MATCHES_MEMSET( &matches );
           prev = a;
   
         while ( ( a = slap_acl_get( a, &count, op, e, desc, val,          while ( ( a = slap_acl_get( a, &count, op, e, desc, val,
                 &matches, &mask, state ) ) != NULL )                  &matches, &mask, state ) ) != NULL )
Line 282  slap_access_allowed( Line 285  slap_access_allowed(
                         Debug( LDAP_DEBUG_ACL, "\n", 0, 0, 0 );                          Debug( LDAP_DEBUG_ACL, "\n", 0, 0, 0 );
                 }                  }
   
                 control = slap_acl_mask( a, &mask, op,                  control = slap_acl_mask( a, prev, &mask, op,
                         e, desc, val, &matches, count, state, access );                          e, desc, val, &matches, count, state, access );
   
                 if ( control != ACL_BREAK ) {                  if ( control != ACL_BREAK ) {
Line 290  slap_access_allowed( Line 293  slap_access_allowed(
                 }                  }
   
                 MATCHES_MEMSET( &matches );                  MATCHES_MEMSET( &matches );
                   prev = a;
         }          }
   
         if ( ACL_IS_INVALID( mask ) ) {          if ( ACL_IS_INVALID( mask ) ) {
Line 717  slap_acl_get( Line 721  slap_acl_get(
 #define ACL_RECORD_VALUE_STATE do { \  #define ACL_RECORD_VALUE_STATE do { \
                 if( state && !state->as_vd_acl_present ) { \                  if( state && !state->as_vd_acl_present ) { \
                         state->as_vd_acl_present = 1; \                          state->as_vd_acl_present = 1; \
                         state->as_vd_acl = a; \                          state->as_vd_acl = prev; \
                         state->as_vd_acl_count = count; \                          state->as_vd_acl_count = count - 1; \
                         ACL_PRIV_ASSIGN( state->as_vd_mask, *mask ); \                          ACL_PRIV_ASSIGN( state->as_vd_mask, *mask ); \
                 } \                  } \
         } while( 0 )          } while( 0 )
Line 1072  acl_mask_dnattr( Line 1076  acl_mask_dnattr(
                 if ( ! bdn->a_self )                  if ( ! bdn->a_self )
                         return 1;                          return 1;
   
                 ACL_RECORD_VALUE_STATE;  
   
                 /* this is a self clause, check if the target is an                  /* this is a self clause, check if the target is an
                  * attribute.                   * attribute.
                  */                   */
Line 1108  acl_mask_dnattr( Line 1110  acl_mask_dnattr(
 static slap_control_t  static slap_control_t
 slap_acl_mask(  slap_acl_mask(
         AccessControl           *a,          AccessControl           *a,
           AccessControl           *prev,
         slap_mask_t             *mask,          slap_mask_t             *mask,
         Operation               *op,          Operation               *op,
         Entry                   *e,          Entry                   *e,
Line 1155  slap_acl_mask( Line 1158  slap_acl_mask(
   
                 ACL_INVALIDATE( modmask );                  ACL_INVALIDATE( modmask );
   
                   /* check for the "self" modifier in the <access> field */
                   if ( b->a_dn.a_self ) {
                           const char *dummy;
                           int rc, match = 0;
   
                           ACL_RECORD_VALUE_STATE;
   
                           /* must have DN syntax */
                           if ( desc->ad_type->sat_syntax != slap_schema.si_syn_distinguishedName &&
                                   !is_at_syntax( desc->ad_type, SLAPD_NAMEUID_SYNTAX )) continue;
   
                           /* check if the target is an attribute. */
                           if ( val == NULL ) continue;
   
                           /* a DN must be present */
                           if ( BER_BVISEMPTY( &op->o_ndn ) ) {
                                   continue;
                           }
   
                           /* target is attribute, check if the attribute value
                            * is the op dn.
                            */
                           rc = value_match( &match, desc,
                                   desc->ad_type->sat_equality, 0,
                                   val, &op->o_ndn, &dummy );
                           /* on match error or no match, fail the ACL clause */
                           if ( rc != LDAP_SUCCESS || match != 0 )
                                   continue;
                   }
   
                 /* AND <who> clauses */                  /* AND <who> clauses */
                 if ( !BER_BVISEMPTY( &b->a_dn_pat ) ) {                  if ( !BER_BVISEMPTY( &b->a_dn_pat ) ) {
                         Debug( LDAP_DEBUG_ACL, "<= check a_dn_pat: %s\n",                          Debug( LDAP_DEBUG_ACL, "<= check a_dn_pat: %s\n",
Line 1726  slap_acl_mask( Line 1759  slap_acl_mask(
                         }                          }
                 }                  }
   
                 /* check for the "self" modifier in the <access> field */  
                 if ( b->a_dn.a_self ) {  
                         const char *dummy;  
                         int rc, match = 0;  
   
                         ACL_RECORD_VALUE_STATE;  
   
                         /* must have DN syntax */  
                         if ( desc->ad_type->sat_syntax != slap_schema.si_syn_distinguishedName &&  
                                 !is_at_syntax( desc->ad_type, SLAPD_NAMEUID_SYNTAX )) continue;  
   
                         /* check if the target is an attribute. */  
                         if ( val == NULL ) continue;  
   
                         /* a DN must be present */  
                         if ( BER_BVISEMPTY( &op->o_ndn ) ) {  
                                 continue;  
                         }  
   
                         /* target is attribute, check if the attribute value  
                          * is the op dn.  
                          */  
                         rc = value_match( &match, desc,  
                                 desc->ad_type->sat_equality, 0,  
                                 val, &op->o_ndn, &dummy );  
                         /* on match error or no match, fail the ACL clause */  
                         if ( rc != LDAP_SUCCESS || match != 0 )  
                                 continue;  
                 }  
   
 #ifdef SLAP_DYNACL  #ifdef SLAP_DYNACL
                 if ( b->a_dynacl ) {                  if ( b->a_dynacl ) {
                         slap_dynacl_t   *da;                          slap_dynacl_t   *da;

Removed from v.1.356  
changed lines
  Added in v.1.357


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org