From 65fe3d7caa3b43f64c9d571b6b60c2afc5242435 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Thu, 28 Feb 2008 23:21:03 +0100 Subject: [PATCH] Variables: added variable name parsing to the set command and added error handling. --- src/lib-sieve/plugins/variables/cmd-set.c | 4 +- .../plugins/variables/ext-variables-common.c | 53 ++++++++++++++++--- .../plugins/variables/ext-variables-common.h | 5 +- .../plugins/variables/variables-errors.sieve | 4 ++ 4 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c index 6466603ad..1e9b77ffa 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 a7c43358a..39704ccd0 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 416fb2fce..c00a96104 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 2f2b6af17..02590cef3 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"; -- GitLab