X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Faclparse.c;h=00c93c23b1ea036d99c88214c4cd57981883ffd9;hb=0f30fb0d8f0adbbb7b41fd455c57aa56d64c9853;hp=d3b88bc6ec6b3b0be789085e7ddb4b0dddb014c7;hpb=63ae1d22e527b3fac81ed0ece6a4f718a48c9350;p=openldap diff --git a/servers/slapd/aclparse.c b/servers/slapd/aclparse.c index d3b88bc6ec..00c93c23b1 100644 --- a/servers/slapd/aclparse.c +++ b/servers/slapd/aclparse.c @@ -21,6 +21,8 @@ static void split(char *line, int splitchar, char **left, char **right); static void access_append(Access **l, Access *a); static void acl_usage(void) LDAP_GCCATTR((noreturn)); +static char *acl_regex_normalized_dn(const char *pattern); + #ifdef LDAP_DEBUG static void print_acl(Backend *be, AccessControl *a); static void print_access(Access *b); @@ -136,9 +138,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(); } @@ -167,7 +169,7 @@ parse_acl( a->acl_dn_pat = ch_strdup( "*" ); } else { - a->acl_dn_pat = ch_strdup( right ); + a->acl_dn_pat = acl_regex_normalized_dn( right ); } } else if ( strcasecmp( style, "base" ) == 0 ) { a->acl_dn_style = ACL_STYLE_BASE; @@ -342,8 +344,8 @@ parse_acl( pat = ch_strdup( "*" ); } else { - regtest(fname, lineno, right); - pat = ch_strdup( right ); + pat = acl_regex_normalized_dn( right ); + regtest(fname, lineno, pat); } } else if ( right == NULL || *right == '\0' ) { fprintf( stderr, @@ -375,6 +377,13 @@ parse_acl( } if ( strcasecmp( left, "dnattr" ) == 0 ) { + if ( right == NULL || right[ 0 ] == '\0' ) { + fprintf( stderr, + "%s: line %d: missing \"=\" in (or value after) \"%s\" in by clause\n", + fname, lineno, left ); + acl_usage(); + } + if( b->a_dn_at != NULL ) { fprintf( stderr, "%s: line %d: dnattr already specified.\n", @@ -393,7 +402,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\": " @@ -417,6 +428,13 @@ parse_acl( char *name = NULL; char *value = NULL; + if ( right == NULL || right[ 0 ] == '\0' ) { + fprintf( stderr, + "%s: line %d: missing \"=\" in (or value after) \"%s\" in by clause\n", + fname, lineno, left ); + acl_usage(); + } + if( b->a_group_pat != NULL ) { fprintf( stderr, "%s: line %d: group pattern already specified.\n", @@ -436,8 +454,9 @@ parse_acl( b->a_group_style = sty; if (sty == ACL_STYLE_REGEX) { - regtest(fname, lineno, right); - b->a_group_pat = ch_strdup( right ); + char *tmp = acl_regex_normalized_dn( right ); + regtest(fname, lineno, tmp); + b->a_group_pat = tmp; } else { b->a_group_pat = ch_strdup( right ); dn_normalize(b->a_group_pat); @@ -508,7 +527,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", @@ -535,7 +556,7 @@ parse_acl( fprintf( stderr, "%s: line %d: group: \"%s\" not allowed by \"%s\"\n", fname, lineno, - b->a_group_at->ad_cname->bv_val, + b->a_group_at->ad_cname.bv_val, b->a_group_oc->soc_oid ); acl_usage(); } @@ -544,6 +565,13 @@ parse_acl( } if ( strcasecmp( left, "peername" ) == 0 ) { + if ( right == NULL || right[ 0 ] == '\0' ) { + fprintf( stderr, + "%s: line %d: missing \"=\" in (or value after) \"%s\" in by clause\n", + fname, lineno, left ); + acl_usage(); + } + if( b->a_peername_pat != NULL ) { fprintf( stderr, "%s: line %d: peername pattern already specified.\n", @@ -553,13 +581,23 @@ parse_acl( b->a_peername_style = sty; if (sty == ACL_STYLE_REGEX) { - regtest(fname, lineno, right); + char *tmp = acl_regex_normalized_dn( right ); + regtest(fname, lineno, tmp); + b->a_peername_pat = tmp; + } else { + b->a_peername_pat = ch_strdup( right ); } - b->a_peername_pat = ch_strdup( right ); continue; } if ( strcasecmp( left, "sockname" ) == 0 ) { + if ( right == NULL || right[ 0 ] == '\0' ) { + fprintf( stderr, + "%s: line %d: missing \"=\" in (or value after) \"%s\" in by clause\n", + fname, lineno, left ); + acl_usage(); + } + if( b->a_sockname_pat != NULL ) { fprintf( stderr, "%s: line %d: sockname pattern already specified.\n", @@ -569,13 +607,23 @@ parse_acl( b->a_sockname_style = sty; if (sty == ACL_STYLE_REGEX) { - regtest(fname, lineno, right); + char *tmp = acl_regex_normalized_dn( right ); + regtest(fname, lineno, tmp); + b->a_sockname_pat = tmp; + } else { + b->a_sockname_pat = ch_strdup( right ); } - b->a_sockname_pat = ch_strdup( right ); continue; } if ( strcasecmp( left, "domain" ) == 0 ) { + if ( right == NULL || right[ 0 ] == '\0' ) { + fprintf( stderr, + "%s: line %d: missing \"=\" in (or value after) \"%s\" in by clause\n", + fname, lineno, left ); + acl_usage(); + } + if( b->a_domain_pat != NULL ) { fprintf( stderr, "%s: line %d: domain pattern already specified.\n", @@ -585,13 +633,23 @@ parse_acl( b->a_domain_style = sty; if (sty == ACL_STYLE_REGEX) { - regtest(fname, lineno, right); + char *tmp = acl_regex_normalized_dn( right ); + regtest(fname, lineno, tmp); + b->a_domain_pat = tmp; + } else { + b->a_domain_pat = ch_strdup( right ); } - b->a_domain_pat = ch_strdup( right ); continue; } if ( strcasecmp( left, "sockurl" ) == 0 ) { + if ( right == NULL || right[ 0 ] == '\0' ) { + fprintf( stderr, + "%s: line %d: missing \"=\" in (or value after) \"%s\" in by clause\n", + fname, lineno, left ); + acl_usage(); + } + if( b->a_sockurl_pat != NULL ) { fprintf( stderr, "%s: line %d: sockurl pattern already specified.\n", @@ -601,9 +659,12 @@ parse_acl( b->a_sockurl_style = sty; if (sty == ACL_STYLE_REGEX) { - regtest(fname, lineno, right); + char *tmp = acl_regex_normalized_dn( right ); + regtest(fname, lineno, tmp); + b->a_sockurl_pat = tmp; + } else { + b->a_sockurl_pat = ch_strdup( right ); } - b->a_sockurl_pat = ch_strdup( right ); continue; } @@ -1061,19 +1122,22 @@ acl_usage( void ) { fprintf( stderr, "\n" " ::= access to " - "[ by ]+ \n" - " ::= * | [dn=] [filter=] [attrs=]\n" + "[ by [ ] ]+ \n" + " ::= * | [dn[.]=] [filter=] [attrs=]\n" " ::= | , \n" " ::= | entry | children\n" - " ::= [ * | anonymous | users | self | dn= ]\n" + " ::= [ * | anonymous | users | self | dn[.]= ]\n" "\t[dnattr=]\n" - "\t[group[/[/]]=]\n" - "\t[peername=] [sockname=]\n" - "\t[domain=] [sockurl=]\n" + "\t[group[/[/]][.