]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/acl.c
Read config tree from back-ldif
[openldap] / servers / slapd / acl.c
index 5f31a8ce5ede1f7ff370788d0083b3ab0c53be88..6babdba3390e2b99a823f28f490c83677cf7fec6 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-2005 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -253,7 +253,7 @@ access_allowed_mask(
                    "<= root access granted\n",
                        0, 0, 0 );
                if ( maskp ) {
-                       mask = ACL_LVL_WRITE;
+                       mask = ACL_LVL_MANAGE;
                }
 
                goto done;
@@ -394,7 +394,7 @@ vd_access:
                "=> access_allowed: %s access %s by %s\n",
                access2str( access ),
                ACL_GRANT(mask, access) ? "granted" : "denied",
-               accessmask2str( mask, accessmaskbuf ) );
+               accessmask2str( mask, accessmaskbuf, 1 ) );
 
        ret = ACL_GRANT(mask, access);
 
@@ -541,8 +541,11 @@ acl_get(
                                Debug( LDAP_DEBUG_ACL,
                                        "acl_get: valpat %s\n",
                                        a->acl_attrval.bv_val, 0, 0 );
-                               if (regexec(&a->acl_attrval_re, val->bv_val, 0, NULL, 0))
+                               if ( regexec( &a->acl_attrval_re, val->bv_val, 0, NULL, 0 ) )
+                               {
                                        continue;
+                               }
+
                        } else {
                                int match = 0;
                                const char *text;
@@ -675,7 +678,7 @@ acl_mask(
                "=> acl_mask: to %s by \"%s\", (%s) \n",
                val ? "value" : "all values",
                op->o_ndn.bv_val ?  op->o_ndn.bv_val : "",
-               accessmask2str( *mask, accessmaskbuf ) );
+               accessmask2str( *mask, accessmaskbuf, 1) );
 
 
        if( state && ( state->as_recorded & ACL_STATE_RECORDED_VD )
@@ -705,21 +708,21 @@ acl_mask(
                         */
                        /*
                         * NOTE: styles "anonymous", "users" and "self" 
-                        * have been moved to an enumeration, * whose value
-                        * is set in a_dn_style; however, the string
+                        * have been moved to enum slap_style_t, whose 
+                        * value is set in a_dn_style; however, the string
                         * is maintaned in a_dn_pat.
                         */
-                       if ( b->a_dn_style == ACL_STYLE_ANONYMOUS /* bvmatch( &b->a_dn_pat, &aci_bv_anonymous ) */ ) {
+                       if ( b->a_dn_style == ACL_STYLE_ANONYMOUS ) {
                                if ( op->o_ndn.bv_len != 0 ) {
                                        continue;
                                }
 
-                       } else if ( b->a_dn_style == ACL_STYLE_USERS /* bvmatch( &b->a_dn_pat, &aci_bv_users ) */ ) {
+                       } else if ( b->a_dn_style == ACL_STYLE_USERS ) {
                                if ( op->o_ndn.bv_len == 0 ) {
                                        continue;
                                }
 
-                       } else if ( b->a_dn_style == ACL_STYLE_SELF /* bvmatch( &b->a_dn_pat, &aci_bv_self ) */ ) {
+                       } else if ( b->a_dn_style == ACL_STYLE_SELF ) {
                                if ( op->o_ndn.bv_len == 0 ) {
                                        continue;
                                }
@@ -1540,8 +1543,8 @@ dn_match_cleanup:;
                                        }
                                }
                                Debug(LDAP_DEBUG_ACL, "<= aci_mask grant %s deny %s\n",
-                                         accessmask2str(tgrant,accessmaskbuf), 
-                                         accessmask2str(tdeny, accessmaskbuf1), 0);
+                                         accessmask2str(tgrant,accessmaskbuf, 1), 
+                                         accessmask2str(tdeny, accessmaskbuf1, 1), 0);
 
                        }
                        /* If the entry level aci didn't contain anything valid for the 
@@ -1581,8 +1584,8 @@ dn_match_cleanup:;
                                                                }
                                                        }
                                                        Debug(LDAP_DEBUG_ACL, "<= aci_mask grant %s deny %s\n", 
-                                                               accessmask2str(tgrant,accessmaskbuf),
-                                                               accessmask2str(tdeny, accessmaskbuf1), 0);
+                                                               accessmask2str(tgrant,accessmaskbuf, 1),
+                                                               accessmask2str(tdeny, accessmaskbuf1, 1), 0);
                                                }
                                                break;
 
@@ -1648,7 +1651,7 @@ dn_match_cleanup:;
 
                Debug( LDAP_DEBUG_ACL,
                        "<= acl_mask: [%d] applying %s (%s)\n",
-                       i, accessmask2str( modmask, accessmaskbuf ), 
+                       i, accessmask2str( modmask, accessmaskbuf, 1 ), 
                        b->a_type == ACL_CONTINUE
                                ? "continue"
                                : b->a_type == ACL_BREAK
@@ -1678,7 +1681,7 @@ dn_match_cleanup:;
 
                Debug( LDAP_DEBUG_ACL,
                        "<= acl_mask: [%d] mask: %s\n",
-                       i, accessmask2str(*mask, accessmaskbuf), 0 );
+                       i, accessmask2str(*mask, accessmaskbuf, 1), 0 );
 
                if( b->a_type == ACL_CONTINUE ) {
                        continue;
@@ -1696,7 +1699,7 @@ dn_match_cleanup:;
 
        Debug( LDAP_DEBUG_ACL,
                "<= acl_mask: no more <who> clauses, returning %s (stop)\n",
-               accessmask2str(*mask, accessmaskbuf), 0, 0 );
+               accessmask2str(*mask, accessmaskbuf, 1), 0, 0 );
        return ACL_STOP;
 }
 
@@ -1741,7 +1744,9 @@ acl_check_modlist(
                Debug( LDAP_DEBUG_ACL,
                        "=> access_allowed: backend default %s access %s to \"%s\"\n",
                        access2str( ACL_WRITE ),
-                       op->o_bd->be_dfltaccess >= ACL_WRITE ? "granted" : "denied", op->o_dn.bv_val );
+                       op->o_bd->be_dfltaccess >= ACL_WRITE
+                               ? "granted" : "denied",
+                       op->o_dn.bv_val );
                ret = (op->o_bd->be_dfltaccess >= ACL_WRITE);
                goto done;
        }
@@ -2025,27 +2030,18 @@ aci_set_gather( SetCookie *cookie, struct berval *name, AttributeDescription *de
        
        p.cookie = cookie;
        
+       op2.o_hdr = cp->op->o_hdr;
        op2.o_tag = LDAP_REQ_SEARCH;
-       op2.o_protocol = LDAP_VERSION3;
        op2.o_ndn = op2.o_bd->be_rootndn;
        op2.o_callback = &cb;
        op2.o_time = slap_get_time();
        op2.o_do_not_cache = 1;
        op2.o_is_auth_check = 0;
-       op2.o_threadctx = cp->op->o_threadctx;
-       op2.o_tmpmemctx = cp->op->o_tmpmemctx;
-       op2.o_tmpmfuncs = cp->op->o_tmpmfuncs;
-#ifdef LDAP_SLAPI
-       op2.o_pb = cp->op->o_pb;
-#endif
-       op2.o_conn = cp->op->o_conn;
-       op2.o_connid = cp->op->o_connid;
        ber_dupbv_x( &op2.o_req_dn, &op2.o_req_ndn, cp->op->o_tmpmemctx );
        op2.ors_slimit = SLAP_NO_LIMIT;
        op2.ors_tlimit = SLAP_NO_LIMIT;
        op2.ors_attrs = anlistp;
        op2.ors_attrsonly = 0;
-       op2.o_sync_slog_size = -1;
 
        cb.sc_private = &p;
 
@@ -2120,8 +2116,9 @@ aci_match_set (
        int             rc = 0;
        AciSetCookie    cookie;
 
-       if (setref == 0) {
+       if ( setref == 0 ) {
                ber_dupbv_x( &set, subj, op->o_tmpmemctx );
+
        } else {
                struct berval           subjdn, ndn = BER_BVNULL;
                struct berval           setat;
@@ -2131,7 +2128,7 @@ aci_match_set (
 
                /* format of string is "entry/setAttrName" */
                if ( aci_get_part( subj, 0, '/', &subjdn ) < 0 ) {
-                       return(0);
+                       return 0;
                }
 
                if ( aci_get_part( subj, 1, '/', &setat ) < 0 ) {
@@ -2643,8 +2640,6 @@ aci_mask(
        return 0;
 }
 
-#endif /* SLAPD_ACI_ENABLED */
-
 #ifdef SLAP_DYNACL
 static int
 dynacl_aci_parse( const char *fname, int lineno, slap_style_t sty, const char *right, void **privp )
@@ -2685,13 +2680,17 @@ dynacl_aci_parse( const char *fname, int lineno, slap_style_t sty, const char *r
 }
 
 static int
-dynacl_aci_print( void *priv )
+dynacl_aci_unparse( void *priv, struct berval *bv )
 {
        AttributeDescription    *ad = ( AttributeDescription * )priv;
+       char *ptr;
 
        assert( ad );
 
-       fprintf( stderr, " aci=%s", ad->ad_cname.bv_val );
+       bv->bv_val = ch_malloc( STRLENOF(" aci=") + ad->ad_cname.bv_len + 1 );
+       ptr = lutil_strcopy( bv->bv_val, " aci=" );
+       ptr = lutil_strcopy( ptr, ad->ad_cname.bv_val );
+       bv->bv_len = ptr - bv->bv_val;
 
        return 0;
 }
@@ -2741,8 +2740,8 @@ dynacl_aci_mask(
                }
                
                Debug( LDAP_DEBUG_ACL, "<= aci_mask grant %s deny %s\n",
-                         accessmask2str( tgrant, accessmaskbuf ), 
-                         accessmask2str( tdeny, accessmaskbuf1 ), 0 );
+                         accessmask2str( tgrant, accessmaskbuf, 1 ), 
+                         accessmask2str( tdeny, accessmaskbuf1, 1 ), 0 );
        }
 
        /* If the entry level aci didn't contain anything valid for the 
@@ -2808,8 +2807,8 @@ dynacl_aci_mask(
                                                }
                                        }
                                        Debug( LDAP_DEBUG_ACL, "<= aci_mask grant %s deny %s\n", 
-                                               accessmask2str( tgrant, accessmaskbuf ),
-                                               accessmask2str( tdeny, accessmaskbuf1 ), 0 );
+                                               accessmask2str( tgrant, accessmaskbuf, 1 ),
+                                               accessmask2str( tdeny, accessmaskbuf1, 1 ), 0 );
                                }
                                break;
 
@@ -2849,18 +2848,18 @@ dynacl_aci_mask(
 static slap_dynacl_t   dynacl_aci = {
        "aci",
        dynacl_aci_parse,
-       dynacl_aci_print,
+       dynacl_aci_unparse,
        dynacl_aci_mask,
        NULL,
        NULL,
        NULL
 };
 
-int
-aci_init( void )
-{
-       return slap_dynacl_register( &dynacl_aci );
-}
+#endif /* SLAP_DYNACL */
+
+#endif /* SLAPD_ACI_ENABLED */
+
+#ifdef SLAP_DYNACL
 
 /*
  * dynamic ACL infrastructure
@@ -2920,23 +2919,26 @@ slap_dynacl_get( const char *name )
 int
 acl_init( void )
 {
+       int             i, rc;
 #ifdef SLAP_DYNACL
-       int             rc;
-
-       da_list = NULL;
-
+       slap_dynacl_t   *known_dynacl[] = {
 #ifdef SLAPD_ACI_ENABLED
-       rc = aci_init();
-       if ( rc ) {
-               return rc;
+               &dynacl_aci,
+#endif  /* SLAPD_ACI_ENABLED */
+               NULL
+       };
+
+       for ( i = 0; known_dynacl[ i ]; i++ ) {
+               rc = slap_dynacl_register( known_dynacl[ i ] ); 
+               if ( rc ) {
+                       return rc;
+               }
        }
-#endif /* SLAPD_ACI_ENABLED */
 #endif /* SLAP_DYNACL */
 
        return 0;
 }
 
-
 static int
 string_expand(
        struct berval   *bv,