]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/aclparse.c
Add error handling to BDB_INDEX code
[openldap] / servers / slapd / aclparse.c
index a67c0b9ad825dcd14a2e8165e008b506ab034dc1..a7df30bd8e71c844aa9e9e27501ced2d6d536221 100644 (file)
@@ -136,9 +136,9 @@ parse_acl(
                                split( argv[i], '=', &left, &right );
                                split( left, '.', &left, &style );
 
-                               if ( right == NULL || *right == '\0' ) {
+                               if ( right == NULL ) {
                                        fprintf( stderr,
-       "%s: line %d: missing \"=\" in (or value after) \"%s\" in to clause\n",
+       "%s: line %d: missing \"=\" in \"%s\" in to clause\n",
                                            fname, lineno, left );
                                        acl_usage();
                                }
@@ -258,7 +258,7 @@ parse_acl(
 
                        b = (Access *) ch_calloc( 1, sizeof(Access) );
 
-                       ACL_INVALIDATE( b->a_mask );
+                       ACL_INVALIDATE( b->a_access_mask );
 
                        if ( ++i == argc ) {
                                fprintf( stderr,
@@ -279,7 +279,7 @@ parse_acl(
                                {
                                        sty = ACL_STYLE_REGEX;
                                } else if ( strcasecmp( style, "exact" ) == 0 ) {
-                                       sty = ACL_STYLE_BASE;
+                                       sty = ACL_STYLE_EXACT;
                                } else if ( strcasecmp( style, "base" ) == 0 ) {
                                        sty = ACL_STYLE_BASE;
                                } else if ( strcasecmp( style, "one" ) == 0 ) {
@@ -393,7 +393,9 @@ parse_acl(
 
 
                                        if( !is_at_syntax( b->a_dn_at->ad_type,
-                                               SLAPD_DN_SYNTAX ) )
+                                               SLAPD_DN_SYNTAX ) &&
+                                               !is_at_syntax( b->a_dn_at->ad_type,
+                                               SLAPD_NAMEUID_SYNTAX ))
                                        {
                                                fprintf( stderr,
                                                        "%s: line %d: dnattr \"%s\": "
@@ -487,7 +489,7 @@ parse_acl(
                                        }
 
                                        if (name && *name) {
-                                               rc = slap_str2ad( right, &b->a_group_at, &text );
+                                               rc = slap_str2ad( name, &b->a_group_at, &text );
 
                                                if( rc != LDAP_SUCCESS ) {
                                                        fprintf( stderr,
@@ -508,7 +510,9 @@ parse_acl(
                                        }
 
                                        if( !is_at_syntax( b->a_group_at->ad_type,
-                                               SLAPD_DN_SYNTAX ) )
+                                               SLAPD_DN_SYNTAX ) &&
+                                           !is_at_syntax( b->a_group_at->ad_type,
+                                               SLAPD_NAMEUID_SYNTAX ) )
                                        {
                                                fprintf( stderr,
                                                        "%s: line %d: group \"%s\": inappropriate syntax: %s\n",
@@ -607,6 +611,27 @@ parse_acl(
                                        continue;
                                }
 
+                               if ( strcasecmp( left, "set" ) == 0 ) {
+                                       if( b->a_set_pat != NULL ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: set attribute already specified.\n",
+                                                       fname, lineno );
+                                               acl_usage();
+                                       }
+
+                                       if ( right == NULL || *right == '\0' ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: no set is defined\n",
+                                                       fname, lineno );
+                                               acl_usage();
+                                       }
+
+                                       b->a_set_style = sty;
+                                       b->a_set_pat = ch_strdup(right);
+
+                                       continue;
+                               }
+
 #ifdef SLAPD_ACI_ENABLED
                                if ( strcasecmp( left, "aci" ) == 0 ) {
                                        if( b->a_aci_at != NULL ) {
@@ -651,6 +676,110 @@ parse_acl(
                                }
 #endif /* SLAPD_ACI_ENABLED */
 
+                               if ( strcasecmp( left, "ssf" ) == 0 ) {
+                                       if( b->a_authz.sai_ssf ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: ssf attribute already specified.\n",
+                                                       fname, lineno );
+                                               acl_usage();
+                                       }
+
+                                       if ( right == NULL || *right == '\0' ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: no ssf is defined\n",
+                                                       fname, lineno );
+                                               acl_usage();
+                                       }
+
+                                       b->a_authz.sai_ssf = atoi( right );
+
+                                       if( !b->a_authz.sai_ssf ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: invalid ssf value (%s)\n",
+                                                       fname, lineno, right );
+                                               acl_usage();
+                                       }
+                                       continue;
+                               }
+
+                               if ( strcasecmp( left, "transport_ssf" ) == 0 ) {
+                                       if( b->a_authz.sai_transport_ssf ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: transport_ssf attribute already specified.\n",
+                                                       fname, lineno );
+                                               acl_usage();
+                                       }
+
+                                       if ( right == NULL || *right == '\0' ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: no transport_ssf is defined\n",
+                                                       fname, lineno );
+                                               acl_usage();
+                                       }
+
+                                       b->a_authz.sai_transport_ssf = atoi( right );
+
+                                       if( !b->a_authz.sai_transport_ssf ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: invalid transport_ssf value (%s)\n",
+                                                       fname, lineno, right );
+                                               acl_usage();
+                                       }
+                                       continue;
+                               }
+
+                               if ( strcasecmp( left, "tls_ssf" ) == 0 ) {
+                                       if( b->a_authz.sai_tls_ssf ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: tls_ssf attribute already specified.\n",
+                                                       fname, lineno );
+                                               acl_usage();
+                                       }
+
+                                       if ( right == NULL || *right == '\0' ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: no tls_ssf is defined\n",
+                                                       fname, lineno );
+                                               acl_usage();
+                                       }
+
+                                       b->a_authz.sai_tls_ssf = atoi( right );
+
+                                       if( !b->a_authz.sai_tls_ssf ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: invalid tls_ssf value (%s)\n",
+                                                       fname, lineno, right );
+                                               acl_usage();
+                                       }
+                                       continue;
+                               }
+
+                               if ( strcasecmp( left, "sasl_ssf" ) == 0 ) {
+                                       if( b->a_authz.sai_sasl_ssf ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: sasl_ssf attribute already specified.\n",
+                                                       fname, lineno );
+                                               acl_usage();
+                                       }
+
+                                       if ( right == NULL || *right == '\0' ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: no sasl_ssf is defined\n",
+                                                       fname, lineno );
+                                               acl_usage();
+                                       }
+
+                                       b->a_authz.sai_sasl_ssf = atoi( right );
+
+                                       if( !b->a_authz.sai_sasl_ssf ) {
+                                               fprintf( stderr,
+                                                       "%s: line %d: invalid sasl_ssf value (%s)\n",
+                                                       fname, lineno, right );
+                                               acl_usage();
+                                       }
+                                       continue;
+                               }
+
                                if( right != NULL ) {
                                        /* unsplit */
                                        right[-1] = '=';
@@ -661,7 +790,7 @@ parse_acl(
                        if( i == argc || ( strcasecmp( left, "stop" ) == 0 )) { 
                                /* out of arguments or plain stop */
 
-                               ACL_PRIV_ASSIGN(b->a_mask, ACL_PRIV_ADDITIVE);
+                               ACL_PRIV_ASSIGN(b->a_access_mask, ACL_PRIV_ADDITIVE);
                                b->a_type = ACL_STOP;
 
                                access_append( &a->acl_access, b );
@@ -671,7 +800,7 @@ parse_acl(
                        if( strcasecmp( left, "continue" ) == 0 ) {
                                /* plain continue */
 
-                               ACL_PRIV_ASSIGN(b->a_mask, ACL_PRIV_ADDITIVE);
+                               ACL_PRIV_ASSIGN(b->a_access_mask, ACL_PRIV_ADDITIVE);
                                b->a_type = ACL_CONTINUE;
 
                                access_append( &a->acl_access, b );
@@ -681,7 +810,7 @@ parse_acl(
                        if( strcasecmp( left, "break" ) == 0 ) {
                                /* plain continue */
 
-                               ACL_PRIV_ASSIGN(b->a_mask, ACL_PRIV_ADDITIVE);
+                               ACL_PRIV_ASSIGN(b->a_access_mask, ACL_PRIV_ADDITIVE);
                                b->a_type = ACL_BREAK;
 
                                access_append( &a->acl_access, b );
@@ -691,7 +820,7 @@ parse_acl(
                        if ( strcasecmp( left, "by" ) == 0 ) {
                                /* we've gone too far */
                                --i;
-                               ACL_PRIV_ASSIGN(b->a_mask, ACL_PRIV_ADDITIVE);
+                               ACL_PRIV_ASSIGN(b->a_access_mask, ACL_PRIV_ADDITIVE);
                                b->a_type = ACL_STOP;
 
                                access_append( &a->acl_access, b );
@@ -701,13 +830,13 @@ parse_acl(
                        /* get <access> */
                        if( strncasecmp( left, "self", 4 ) == 0 ) {
                                b->a_dn_self = 1;
-                               ACL_PRIV_ASSIGN( b->a_mask, str2accessmask( &left[4] ) );
+                               ACL_PRIV_ASSIGN( b->a_access_mask, str2accessmask( &left[4] ) );
 
                        } else {
-                               ACL_PRIV_ASSIGN( b->a_mask, str2accessmask( left ) );
+                               ACL_PRIV_ASSIGN( b->a_access_mask, str2accessmask( left ) );
                        }
 
-                       if( ACL_IS_INVALID( b->a_mask ) ) {
+                       if( ACL_IS_INVALID( b->a_access_mask ) ) {
                                fprintf( stderr,
                                        "%s: line %d: expecting <access> got \"%s\"\n",
                                        fname, lineno, left );
@@ -772,7 +901,7 @@ parse_acl(
 }
 
 char *
-accessmask2str( slap_access_mask_t mask, char *buf )
+accessmask2str( slap_mask_t mask, char *buf )
 {
        int none=1;
 
@@ -859,10 +988,10 @@ accessmask2str( slap_access_mask_t mask, char *buf )
        return buf;
 }
 
-slap_access_mask_t
+slap_mask_t
 str2accessmask( const char *str )
 {
-       slap_access_mask_t      mask;
+       slap_mask_t     mask;
 
        if( !ASCII_ALPHA(str[0]) ) {
                int i;
@@ -948,6 +1077,7 @@ acl_usage( void )
 #ifdef SLAPD_ACI_ENABLED
                        "\t[aci=<attrname>]\n"
 #endif
+                       "\t[ssf=<n>] [transport_ssf=<n>] [tls_ssf=<n>] [sasl_ssf=<n>]\n"
                "<access> ::= [self]{<level>|<priv>}\n"
                "<level> ::= none | auth | compare | search | read | write\n"
                "<priv> ::= {=|+|-}{w|r|s|c|x}+\n"
@@ -1108,9 +1238,27 @@ print_access( Access *b )
        }
 #endif
 
+       /* Security Strength Factors */
+       if ( b->a_authz.sai_ssf ) {
+               fprintf( stderr, " ssf=%u",
+                       b->a_authz.sai_ssf );
+       }
+       if ( b->a_authz.sai_transport_ssf ) {
+               fprintf( stderr, " transport_ssf=%u",
+                       b->a_authz.sai_transport_ssf );
+       }
+       if ( b->a_authz.sai_tls_ssf ) {
+               fprintf( stderr, " tls_ssf=%u",
+                       b->a_authz.sai_tls_ssf );
+       }
+       if ( b->a_authz.sai_sasl_ssf ) {
+               fprintf( stderr, " sasl_ssf=%u",
+                       b->a_authz.sai_sasl_ssf );
+       }
+
        fprintf( stderr, " %s%s",
                b->a_dn_self ? "self" : "",
-               accessmask2str( b->a_mask, maskbuf ) );
+               accessmask2str( b->a_access_mask, maskbuf ) );
 
        if( b->a_type == ACL_BREAK ) {
                fprintf( stderr, " break" );