X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Faclparse.c;h=00c93c23b1ea036d99c88214c4cd57981883ffd9;hb=0f30fb0d8f0adbbb7b41fd455c57aa56d64c9853;hp=c18f36e27f3559bde7306282e50c8025d53b6587;hpb=0e16f6acf9efe4a3dd2b413418213431ec86c33d;p=openldap diff --git a/servers/slapd/aclparse.c b/servers/slapd/aclparse.c index c18f36e27f..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); @@ -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", @@ -419,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", @@ -438,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); @@ -548,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", @@ -557,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", @@ -573,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", @@ -589,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", @@ -605,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; } @@ -1065,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[/[/]][.