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