dovecot-2.0-pigeonhole: Imap4flags: fixed bug in setflag command...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Tue Aug 3 19:30:25 EEST 2010


details:   http://hg.rename-it.nl/dovecot-2.0-pigeonhole/rev/1c66cb52772d
changeset: 1356:1c66cb52772d
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Tue Aug 03 18:30:14 2010 +0200
description:
Imap4flags: fixed bug in setflag command; when parameter was a stringlist, only the last item was actually set.

diffstat:

 src/lib-sieve/plugins/imap4flags/cmd-flag.c              |  14 +---
 src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c |  80 ++++++++++++++------
 src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h |   8 +-
 tests/extensions/imap4flags/basic.svtest                 |  24 ++++++
 4 files changed, 86 insertions(+), 40 deletions(-)

diffs (194 lines):

diff -r 8ab83f81360e -r 1c66cb52772d src/lib-sieve/plugins/imap4flags/cmd-flag.c
--- a/src/lib-sieve/plugins/imap4flags/cmd-flag.c	Tue Aug 03 15:58:36 2010 +0200
+++ b/src/lib-sieve/plugins/imap4flags/cmd-flag.c	Tue Aug 03 18:30:14 2010 +0200
@@ -241,17 +241,7 @@
 		i_unreached();
 	}
 
-	/* Iterate through all flags and perform requested operation */
+	/* Perform requested operation */
 	
-	while ( (ret=sieve_stringlist_next_item(flag_list, &flag_item)) > 0 ) {
-		if ( (ret=flag_op(renv, storage, var_index, flag_item)) <= 0)
-			return ret;
-	}
-
-	if ( ret < 0 ) {	
-		sieve_runtime_trace_error(renv, "invalid flag-list item");
-		return SIEVE_EXEC_BIN_CORRUPT;
-	}
-
-	return SIEVE_EXEC_OK;
+	return flag_op(renv, storage, var_index, flag_list);
 }
diff -r 8ab83f81360e -r 1c66cb52772d src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c
--- a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c	Tue Aug 03 15:58:36 2010 +0200
+++ b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.c	Tue Aug 03 18:30:14 2010 +0200
@@ -457,9 +457,43 @@
 	flags_list_add_flags(flags_list, flags);
 }
 
+static void flags_list_clear_flags
+(string_t *flags_list)
+{
+	str_truncate(flags_list, 0);
+}
+
 int ext_imap4flags_set_flags
 (const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-	unsigned int var_index, string_t *flags)
+	unsigned int var_index, struct sieve_stringlist *flags)
+{
+	string_t *cur_flags;
+	
+	if ( storage != NULL ) {
+		if ( !sieve_variable_get_modifiable(storage, var_index, &cur_flags) )
+			return SIEVE_EXEC_BIN_CORRUPT;
+	} else {
+		cur_flags = _get_flags_string(renv->oprtn->ext, renv->result);
+	}
+	
+	if ( cur_flags != NULL ) {
+		string_t *flags_item;
+		int ret;
+
+		flags_list_clear_flags(cur_flags);
+		while ( (ret=sieve_stringlist_next_item(flags, &flags_item)) > 0 ) {
+			flags_list_add_flags(cur_flags, flags_item);
+		}
+
+		if ( ret < 0 ) return SIEVE_EXEC_BIN_CORRUPT;
+	}
+
+	return SIEVE_EXEC_OK;
+}
+
+int ext_imap4flags_add_flags
+(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, 
+	unsigned int var_index, struct sieve_stringlist *flags)
 {
 	string_t *cur_flags;
 	
@@ -469,15 +503,23 @@
 	} else
 		cur_flags = _get_flags_string(renv->oprtn->ext, renv->result);
 
-	if ( cur_flags != NULL )
-		flags_list_set_flags(cur_flags, flags);		
+	if ( cur_flags != NULL ) {
+		string_t *flags_item;
+		int ret;
+
+		while ( (ret=sieve_stringlist_next_item(flags, &flags_item)) > 0 ) {
+			flags_list_add_flags(cur_flags, flags_item);
+		}
+
+		if ( ret < 0 ) return SIEVE_EXEC_BIN_CORRUPT;
+	}
 
 	return SIEVE_EXEC_OK;
 }
 
-int ext_imap4flags_add_flags
+int ext_imap4flags_remove_flags
 (const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, 
-	unsigned int var_index, string_t *flags)
+	unsigned int var_index, struct sieve_stringlist *flags)
 {
 	string_t *cur_flags;
 	
@@ -487,26 +529,16 @@
 	} else
 		cur_flags = _get_flags_string(renv->oprtn->ext, renv->result);
 	
-	if ( cur_flags != NULL )
-		flags_list_add_flags(cur_flags, flags);
-	
-	return SIEVE_EXEC_OK;	
-}
+	if ( cur_flags != NULL ) {
+		string_t *flags_item;
+		int ret;
 
-int ext_imap4flags_remove_flags
-(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage, 
-	unsigned int var_index, string_t *flags)
-{
-	string_t *cur_flags;
-	
-	if ( storage != NULL ) {
-		if ( !sieve_variable_get_modifiable(storage, var_index, &cur_flags) )
-			return SIEVE_EXEC_BIN_CORRUPT;
-	} else
-		cur_flags = _get_flags_string(renv->oprtn->ext, renv->result);
-	
-	if ( cur_flags != NULL )
-		flags_list_remove_flags(cur_flags, flags);		
+		while ( (ret=sieve_stringlist_next_item(flags, &flags_item)) > 0 ) {
+			flags_list_remove_flags(cur_flags, flags_item);
+		}
+
+		if ( ret < 0 ) return SIEVE_EXEC_BIN_CORRUPT;
+	}
 
 	return SIEVE_EXEC_OK;
 }
diff -r 8ab83f81360e -r 1c66cb52772d src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h
--- a/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h	Tue Aug 03 15:58:36 2010 +0200
+++ b/src/lib-sieve/plugins/imap4flags/ext-imap4flags-common.h	Tue Aug 03 18:30:14 2010 +0200
@@ -90,17 +90,17 @@
 
 typedef int (*ext_imapflag_flag_operation_t)
 	(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-		unsigned int var_index, string_t *flags);
+		unsigned int var_index, struct sieve_stringlist *flags);
 
 int ext_imap4flags_set_flags
 	(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-		unsigned int var_index, string_t *flags);
+		unsigned int var_index, struct sieve_stringlist *flags);
 int ext_imap4flags_add_flags
 	(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-		unsigned int var_index, string_t *flags);
+		unsigned int var_index, struct sieve_stringlist *flags);
 int ext_imap4flags_remove_flags
 	(const struct sieve_runtime_env *renv, struct sieve_variable_storage *storage,
-		unsigned int var_index, string_t *flags);
+		unsigned int var_index, struct sieve_stringlist *flags);
 
 /* Flags access */
 
diff -r 8ab83f81360e -r 1c66cb52772d tests/extensions/imap4flags/basic.svtest
--- a/tests/extensions/imap4flags/basic.svtest	Tue Aug 03 15:58:36 2010 +0200
+++ b/tests/extensions/imap4flags/basic.svtest	Tue Aug 03 18:30:14 2010 +0200
@@ -104,6 +104,30 @@
 	}
 }
 
+test "Setflag; string list" {
+	setflag ["A B", "C D"];
+
+	if not hasflag "A" {
+		test_fail "hasflag misses A flag";
+	}
+
+	if not hasflag "B" {
+		test_fail "hasflag misses B flag";
+	}
+
+	if not hasflag "C" {
+		test_fail "hasflag misses C flag";
+	}
+
+	if not hasflag "D" {
+		test_fail "hasflag misses D flag";
+	}
+
+	if hasflag :comparator "i;ascii-numeric" :count "ne" "4" {
+		test_fail "hasflag sees incorrect number of flags";
+	}
+}
+
 test "Removal: one" {
 	setflag "\\seen";
 


More information about the dovecot-cvs mailing list