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