]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/aclparse.c
More system schema checks
[openldap] / servers / slapd / aclparse.c
index 5a28ebfd749d5f0e1759ee02390f412c1b5b0f21..d93f34ce0c25a25343cb83b78fd671e91f9bd2f9 100644 (file)
@@ -1,7 +1,7 @@
 /* aclparse.c - routines to parse and check acl's */
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -202,8 +202,14 @@ parse_acl(
                                        }
 
                                } else if ( strncasecmp( left, "attr", 4 ) == 0 ) {
-                                       a->acl_attrs = str2bvec( a->acl_attrs,
+                                       a->acl_attrs = str2anlist( a->acl_attrs,
                                                right, "," );
+                                       if ( a->acl_attrs == NULL ) {
+                                               fprintf( stderr,
+                               "%s: line %d: unknown attr \"%s\" in to clause\n",
+                                                   fname, lineno, right );
+                                               acl_usage();
+                                       }
                                } else {
                                        fprintf( stderr,
                                                "%s: line %d: expecting <what> got \"%s\"\n",
@@ -221,11 +227,10 @@ parse_acl(
                        if( a->acl_dn_pat.bv_len != 0 ) {
                                if ( a->acl_dn_style != ACL_STYLE_REGEX )
                                {
-                                       struct berval *bv = NULL;
-                                       dnNormalize( NULL, &a->acl_dn_pat, &bv);
+                                       struct berval bv;
+                                       dnNormalize2( NULL, &a->acl_dn_pat, &bv);
                                        free( a->acl_dn_pat.bv_val );
-                                       a->acl_dn_pat = *bv;
-                                       free( bv );
+                                       a->acl_dn_pat = bv;
                                } else {
                                        int e = regcomp( &a->acl_dn_re, a->acl_dn_pat.bv_val,
                                                         REG_EXTENDED | REG_ICASE );
@@ -378,10 +383,7 @@ parse_acl(
                                        }
 
                                        if ( sty != ACL_STYLE_REGEX ) {
-                                               struct berval *ndn = NULL;
-                                               dnNormalize(NULL, &bv, &ndn);
-                                               b->a_dn_pat = *ndn;
-                                               free(ndn);
+                                               dnNormalize2(NULL, &bv, &b->a_dn_pat);
                                                free(bv.bv_val);
                                        } else {
                                                b->a_dn_pat = bv;
@@ -473,11 +475,8 @@ parse_acl(
                                                regtest(fname, lineno, bv.bv_val);
                                                b->a_group_pat = bv;
                                        } else {
-                                               struct berval *ndn = NULL;
                                                ber_str2bv( right, 0, 0, &bv );
-                                               dnNormalize( NULL, &bv, &ndn );
-                                               b->a_group_pat = *ndn;
-                                               free(ndn);
+                                               dnNormalize2( NULL, &bv, &b->a_group_pat );
                                        }
 
                                        if (value && *value) {
@@ -559,13 +558,11 @@ parse_acl(
 
                                        {
                                                int rc;
-                                               struct berval val;
-                                               struct berval *vals[2];
+                                               struct berval vals[2];
 
-                                               val.bv_val = b->a_group_oc->soc_oid;
-                                               val.bv_len = strlen(val.bv_val);
-                                               vals[0] = &val;
-                                               vals[1] = NULL;
+                                               vals[0].bv_val = b->a_group_oc->soc_oid;
+                                               vals[0].bv_len = strlen(vals[0].bv_val);
+                                               vals[1].bv_val = NULL;
 
 
                                                rc = oc_check_allowed( b->a_group_at->ad_type, vals, NULL );
@@ -983,6 +980,7 @@ char *
 accessmask2str( slap_mask_t mask, char *buf )
 {
        int none=1;
+       char *ptr = buf;
 
        assert( buf != NULL );
 
@@ -994,76 +992,79 @@ accessmask2str( slap_mask_t mask, char *buf )
 
        if ( ACL_IS_LEVEL( mask ) ) {
                if ( ACL_LVL_IS_NONE(mask) ) {
-                       strcat( buf, "none" );
+                       ptr = slap_strcopy( ptr, "none" );
 
                } else if ( ACL_LVL_IS_AUTH(mask) ) {
-                       strcat( buf, "auth" );
+                       ptr = slap_strcopy( ptr, "auth" );
 
                } else if ( ACL_LVL_IS_COMPARE(mask) ) {
-                       strcat( buf, "compare" );
+                       ptr = slap_strcopy( ptr, "compare" );
 
                } else if ( ACL_LVL_IS_SEARCH(mask) ) {
-                       strcat( buf, "search" );
+                       ptr = slap_strcopy( ptr, "search" );
 
                } else if ( ACL_LVL_IS_READ(mask) ) {
-                       strcat( buf, "read" );
+                       ptr = slap_strcopy( ptr, "read" );
 
                } else if ( ACL_LVL_IS_WRITE(mask) ) {
-                       strcat( buf, "write" );
+                       ptr = slap_strcopy( ptr, "write" );
                } else {
-                       strcat( buf, "unknown" );
+                       ptr = slap_strcopy( ptr, "unknown" );
                }
                
-               strcat(buf, " (");
+               *ptr++ = '(';
        }
 
        if( ACL_IS_ADDITIVE( mask ) ) {
-               strcat( buf, "+" );
+               *ptr++ = '+';
 
        } else if( ACL_IS_SUBTRACTIVE( mask ) ) {
-               strcat( buf, "-" );
+               *ptr++ = '-';
 
        } else {
-               strcat( buf, "=" );
+               *ptr++ = '=';
        }
 
        if ( ACL_PRIV_ISSET(mask, ACL_PRIV_WRITE) ) {
                none = 0;
-               strcat( buf, "w" );
+               *ptr++ = 'w';
        } 
 
        if ( ACL_PRIV_ISSET(mask, ACL_PRIV_READ) ) {
                none = 0;
-               strcat( buf, "r" );
+               *ptr++ = 'r';
        } 
 
        if ( ACL_PRIV_ISSET(mask, ACL_PRIV_SEARCH) ) {
                none = 0;
-               strcat( buf, "s" );
+               *ptr++ = 's';
        } 
 
        if ( ACL_PRIV_ISSET(mask, ACL_PRIV_COMPARE) ) {
                none = 0;
-               strcat( buf, "c" );
+               *ptr++ = 'c';
        } 
 
        if ( ACL_PRIV_ISSET(mask, ACL_PRIV_AUTH) ) {
                none = 0;
-               strcat( buf, "x" );
+               *ptr++ = 'x';
        } 
 
        if ( none && ACL_PRIV_ISSET(mask, ACL_PRIV_NONE) ) {
                none = 0;
-               strcat( buf, "n" );
+               *ptr++ = 'n';
        } 
 
        if ( none ) {
-               strcat( buf, "0" );
+               *ptr++ = '0';
        }
 
        if ( ACL_IS_LEVEL( mask ) ) {
-               strcat(buf, ")");
-       } 
+               *ptr++ = ')';
+       }
+
+       *ptr = '\0';
+
        return buf;
 }
 
@@ -1188,6 +1189,12 @@ acl_regex_normalized_dn(
        for ( p = str; p && p[ 0 ]; p++ ) {
                /* escape */
                if ( p[ 0 ] == '\\' ) {
+                       /* 
+                        * if escaping a hex pair we should
+                        * increment p twice; however, in that 
+                        * case the second hex number does 
+                        * no harm
+                        */
                        p++;
                }
 
@@ -1195,6 +1202,10 @@ acl_regex_normalized_dn(
                        if ( p[ 1 ] == ' ' ) {
                                char *q;
                        
+                               /*
+                                * too much space should be 
+                                * an error if we are pedantic
+                                */
                                for ( q = &p[ 2 ]; q[ 0 ] == ' '; q++ ) {
                                        /* DO NOTHING */ ;
                                }
@@ -1264,13 +1275,18 @@ void
 acl_free( AccessControl *a )
 {
        Access *n;
+       AttributeName *an;
 
        if ( a->acl_filter )
                filter_free( a->acl_filter );
        if ( a->acl_dn_pat.bv_len )
                free ( a->acl_dn_pat.bv_val );
-       if ( a->acl_attrs )
-               ber_bvecfree( a->acl_attrs );
+       if ( a->acl_attrs ) {
+               for ( an = a->acl_attrs; an->an_name.bv_val; an++ ) {
+                       free( an->an_name.bv_val );
+               }
+               free( a->acl_attrs );
+       }
        for (; a->acl_access; a->acl_access = n) {
                n = a->acl_access->a_next;
                access_free( a->acl_access );
@@ -1475,15 +1491,16 @@ print_acl( Backend *be, AccessControl *a )
        }
 
        if ( a->acl_attrs != NULL ) {
-               int     i, first = 1;
+               int     first = 1;
+               AttributeName *an;
                to++;
 
                fprintf( stderr, " attrs=" );
-               for ( i = 0; a->acl_attrs[i] != NULL; i++ ) {
+               for ( an = a->acl_attrs; an && an->an_name.bv_val; an++ ) {
                        if ( ! first ) {
                                fprintf( stderr, "," );
                        }
-                       fputs( a->acl_attrs[i]->bv_val, stderr );
+                       fputs( an->an_name.bv_val, stderr );
                        first = 0;
                }
                fprintf(  stderr, "\n" );