diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c index 6466603adedc7a83ae32df01332e758947c66c56..1e9b77ffad8ef94baf59e8a5bb184b45986e3331 100644 --- a/src/lib-sieve/plugins/variables/cmd-set.c +++ b/src/lib-sieve/plugins/variables/cmd-set.c @@ -230,7 +230,9 @@ static bool cmd_set_validate(struct sieve_validator *validator, return FALSE; } - ext_variables_variable_argument_activate(validator, arg); + if ( !ext_variables_variable_assignment_activate(validator, arg, cmd) ) { + return FALSE; + } arg = sieve_ast_argument_next(arg); diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.c b/src/lib-sieve/plugins/variables/ext-variables-common.c index a7c43358a1beb9e16f23d9611354a9d51659e37a..39704ccd021bb4d23719da37e59f5d2e935e60f2 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-common.c +++ b/src/lib-sieve/plugins/variables/ext-variables-common.c @@ -283,18 +283,57 @@ static struct sieve_ast_argument *ext_variables_variable_argument_create return arg; } -void ext_variables_variable_argument_activate -(struct sieve_validator *validator, struct sieve_ast_argument *arg) +bool ext_variables_variable_assignment_activate +(struct sieve_validator *validator, struct sieve_ast_argument *arg, + struct sieve_command_context *cmd) { struct ext_variables_validator_context *ctx; struct sieve_variable *var; + string_t *variable; + const char *varstr, *varend; + ARRAY_TYPE(ext_variable_name) vname; + int nelements = 0; + + t_array_init(&vname, 2); - ctx = ext_variables_validator_context_get(validator); - var = sieve_variable_scope_get_variable(ctx->main_scope, - sieve_ast_argument_strc(arg)); + variable = sieve_ast_argument_str(arg); + varstr = str_c(variable); + varend = PTR_OFFSET(varstr, str_len(variable)); + nelements = ext_variable_name_parse(&vname, &varstr, varend); + + if ( nelements < 0 || varstr != varend ) { + sieve_command_validate_error(validator, cmd, + "invalid variable name in assignment"); + return FALSE; + } + + if ( nelements == 1 ) { + const struct ext_variable_name *cur_element = + array_idx(&vname, 0); - arg->argument = &variable_argument; - arg->context = (void *) var; + if ( cur_element->num_variable == -1 ) { + ctx = ext_variables_validator_context_get(validator); + var = sieve_variable_scope_get_variable + (ctx->main_scope, str_c(cur_element->identifier)); + + arg->argument = &variable_argument; + arg->context = (void *) var; + + return TRUE; + } else { + sieve_command_validate_error(validator, cmd, + "cannot assign to match variable"); + } + } else { + const struct ext_variable_name *cur_element = + array_idx(&vname, 0); + + /* FIXME: Variable namespaces unsupported. */ + sieve_command_validate_error(validator, cmd, + "cannot assign to variable in unknown namespace '%s'", + str_c(cur_element->identifier)); + } + return FALSE; } static bool arg_variable_generate diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.h b/src/lib-sieve/plugins/variables/ext-variables-common.h index 416fb2fce3c682c661922d8e1de86e83319fd8bc..c00a96104a924f19487e93bf3446909b33f09957 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-common.h +++ b/src/lib-sieve/plugins/variables/ext-variables-common.h @@ -64,8 +64,9 @@ bool ext_variables_opr_variable_read void ext_variables_opr_variable_string_emit (struct sieve_binary *sbin, unsigned int elements); -void ext_variables_variable_argument_activate - (struct sieve_validator *validator, struct sieve_ast_argument *arg); +bool ext_variables_variable_assignment_activate +(struct sieve_validator *validator, struct sieve_ast_argument *arg, + struct sieve_command_context *cmd); struct sieve_variable *ext_variables_validator_get_variable (struct sieve_validator *validator, const char *variable); diff --git a/src/lib-sieve/plugins/variables/variables-errors.sieve b/src/lib-sieve/plugins/variables/variables-errors.sieve index 2f2b6af1785aa476f39828b82ab0c8037765dc62..02590cef36a9bc51002c3c7bdb88a61a02d491e4 100644 --- a/src/lib-sieve/plugins/variables/variables-errors.sieve +++ b/src/lib-sieve/plugins/variables/variables-errors.sieve @@ -6,3 +6,7 @@ set :lowerfirst :upperfirst "friep" "Friep"; fileinto "${frop}"; fileinto "${friep}"; + +set "0" "Frop"; +set "frop." "Friep"; +set "frop.friep" "Frml";