dovecot-2.2-pigeonhole: lib-sieve: editheader extension: Fixed s...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Tue Aug 5 16:25:21 UTC 2014


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/1e388884d31c
changeset: 1907:1e388884d31c
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Tue Aug 05 18:25:12 2014 +0200
description:
lib-sieve: editheader extension: Fixed several problems in deleteheader command.

diffstat:

 src/lib-sieve/plugins/editheader/cmd-deleteheader.c |    6 +-
 src/lib-sieve/util/edit-mail.c                      |   36 +++--
 tests/extensions/editheader/deleteheader.svtest     |  131 +++++++++++++++++++-
 3 files changed, 154 insertions(+), 19 deletions(-)

diffs (250 lines):

diff -r 860c4e547490 -r 1e388884d31c src/lib-sieve/plugins/editheader/cmd-deleteheader.c
--- a/src/lib-sieve/plugins/editheader/cmd-deleteheader.c	Tue Aug 05 03:55:56 2014 +0200
+++ b/src/lib-sieve/plugins/editheader/cmd-deleteheader.c	Tue Aug 05 18:25:12 2014 +0200
@@ -472,7 +472,7 @@
 			mctx = sieve_match_begin(renv, &mcht, &cmp);
 
 			/* Match */
-			do {
+			for (;;) {
 				pos++;
 
 				/* Check index if any */
@@ -496,7 +496,9 @@
 					}
 				}
 
-			} while ( edit_mail_headers_iterate_next(edhiter) );
+				if ( !edit_mail_headers_iterate_next(edhiter) )
+					break;
+			}
 
 			/* Finish match */
 			mret = sieve_match_end(&mctx, &ret);
diff -r 860c4e547490 -r 1e388884d31c src/lib-sieve/util/edit-mail.c
--- a/src/lib-sieve/util/edit-mail.c	Tue Aug 05 03:55:56 2014 +0200
+++ b/src/lib-sieve/util/edit-mail.c	Tue Aug 05 18:25:12 2014 +0200
@@ -1115,6 +1115,7 @@
 {
 	struct edit_mail_header_iter *edhiter;
 	struct _header_index *header_idx = NULL;
+	struct _header_field_index *current = NULL;
 
 	/* Make sure headers are parsed */
 	if ( edit_mail_headers_parse(edmail) <= 0 ) {
@@ -1124,22 +1125,26 @@
 
 	header_idx = edit_mail_header_find(edmail, field_name);
 
+	if ( field_name != NULL && header_idx == NULL ) {
+		current = NULL;
+	} else if ( !reverse ) {
+		current =
+			( header_idx != NULL ? header_idx->first : edmail->header_fields_head );
+	} else {
+		current =
+			( header_idx != NULL ? header_idx->last : edmail->header_fields_tail );
+		if ( current->header == NULL )
+			current = current->prev;
+	}
+
+	if ( current ==  NULL )
+		return 0; 
+
  	edhiter = i_new(struct edit_mail_header_iter, 1);
 	edhiter->mail = edmail;
 	edhiter->header = header_idx;
 	edhiter->reverse = reverse;
-
-	if ( field_name != NULL && header_idx == NULL ) {
-		edhiter->current = NULL;
-	} else if ( !reverse ) {
-		edhiter->current =
-			( header_idx != NULL ? header_idx->first : edmail->header_fields_head );
-	} else {
-		edhiter->current =
-			( header_idx != NULL ? header_idx->last : edmail->header_fields_tail );
-		if ( edhiter->current->header == NULL )
-			edhiter->current = edhiter->current->prev;
-	}
+	edhiter->current = current;
 
 	*edhiter_r = edhiter;
 	return 1;
@@ -1171,9 +1176,12 @@
 bool edit_mail_headers_iterate_next
 (struct edit_mail_header_iter *edhiter)
 {
+	if ( edhiter->current == NULL )
+		return FALSE;
+
 	do {
-		edhiter->current =
-			( !edhiter->reverse ? edhiter->current->next : edhiter->current->next );
+		edhiter->current = 
+			( !edhiter->reverse ? edhiter->current->next : edhiter->current->prev );
 	} while ( edhiter->current != NULL && edhiter->current->header != NULL &&
 		edhiter->header != NULL && edhiter->current->header != edhiter->header );
 
diff -r 860c4e547490 -r 1e388884d31c tests/extensions/editheader/deleteheader.svtest
--- a/tests/extensions/editheader/deleteheader.svtest	Tue Aug 05 03:55:56 2014 +0200
+++ b/tests/extensions/editheader/deleteheader.svtest	Tue Aug 05 18:25:12 2014 +0200
@@ -99,6 +99,82 @@
 	}
 }
 
+test_set "message" "${message}";
+test "Deleteheader - nonexistent (match)" {
+	if size :over 288 {
+		test_fail "original message is longer than 288 bytes?!";
+	}
+
+	if size :under 288 {
+		test_fail "original message is shorter than 288 bytes?!";
+	}
+
+	deleteheader :matches "X-Z" "*frop*";
+
+	if size :under 288 {
+		test_fail "message is shorter than original";
+	}
+
+	if not header :is "subject" "Frop!" {
+		test_fail "original subject header not retained";
+	}
+
+	if not header :is "X-B" "omdat dit anders" {
+		test_fail "original X-B header not retained";
+	}
+
+	if not header :is "X-C" "niet via e-mail versturen" {
+		test_fail "original X-C header not retained";
+	}
+
+	redirect "frop at example.com";
+	fileinto :create "folder1b";
+
+	if not test_result_execute {
+		test_fail "failed to execute result";
+	}
+
+	if not test_message :folder "folder1b" 0 {
+		test_fail "message not stored";
+	}
+
+	if not header :is "subject" "Frop!" {
+		test_fail "original subject header not retained in stored mail";
+	}
+
+	if not header :is "X-B" "omdat dit anders" {
+		test_fail "original X-B header not retained in stored mail";
+	}
+
+	if not header :is "X-C" "niet via e-mail versturen" {
+		test_fail "original X-C header not retained in stored mail";
+	}
+
+	if not body :matches "Frop!*" {
+		test_fail "body not retained in stored mail";
+	}
+
+	if not test_message :smtp 0 {
+		test_fail "message not redirected";
+	}
+
+	if not header :is "subject" "Frop!" {
+		test_fail "original subject header not retained in redirected mail";
+	}
+
+	if not header :is "X-B" "omdat dit anders" {
+		test_fail "original X-B header not retained in redirected mail";
+	}
+
+	if not header :is "X-C" "niet via e-mail versturen" {
+		test_fail "original X-C header not retained in redirected mail";
+	}
+
+	if not body :matches "Frop!*" {
+		test_fail "body not retained in redirected mail";
+	}
+}
+
 test_result_reset;
 test_set "message" "${message}";
 test "Deleteheader - one" {
@@ -867,9 +943,7 @@
  *
  */
 
-test_result_reset;
-
-test_set "message" text:
+set "message2" text:
 X-A: Long folded header to test removal of folded
  headers from a message. This is the top header.
 X-B: First intermittent unfolded header
@@ -884,6 +958,8 @@
 .
 ;
 
+test_result_reset;
+test_set "message" "${message2}";
 test "Deleteheader - folded" {
 	deleteheader "X-A";
 
@@ -930,6 +1006,55 @@
 	}
 }
 
+test_result_reset;
+test_set "message" "${message2}";
+test "Deleteheader - folded (match)" {
+	deleteheader :matches "X-A" "*header*";
+
+	if exists "X-A" {
+		test_fail "original X-A (1) header not deleted";
+	}
+
+	if not header :is "X-B" "First intermittent unfolded header" {
+		test_fail "original X-B (2) header not retained";
+	}
+
+	if not header :is "X-B" "Second intermittent unfolded header" {
+		test_fail "original X-B (2) header not retained";
+	}
+
+	if not body :matches "Frop!*" {
+		test_fail "body not retained in redirected mail";
+	}
+
+	redirect "frop at example.com";
+
+	if not test_result_execute {
+		test_fail "failed to execute result";
+	}
+
+	if not test_message :smtp 0 {
+		test_fail "message not redirected";
+	}
+
+	if exists "X-A" {
+		test_fail "original X-A (1) header not deleted in redirected mail";
+	}
+
+	if not header :is "X-B" "First intermittent unfolded header" {
+		test_fail "original X-B (2) header not retained in redirected mail";
+	}
+
+	if not header :is "X-B" "Second intermittent unfolded header" {
+		test_fail "original X-B (2) header not retained in redirected mail";
+	}
+
+	if not body :matches "Frop!*" {
+		test_fail "body not retained in redirected mail";
+	}
+}
+
+
 /*
  * TEST: Ignoring whitespace
  */


More information about the dovecot-cvs mailing list