From 8ff3a4e3a217bcc5a6064206d9a46ed81cd67205 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Mon, 28 Nov 2011 08:53:43 +0100
Subject: [PATCH] lib-sieve: editheader: fixed normal implicit keep. This was
 broken by previous change. It now properly uses the final version of the
 message instead of the original.

---
 src/lib-sieve/sieve-result.c                  |  7 ++-
 tests/extensions/editheader/addheader.svtest  | 46 +++++++++++++++++++
 .../extensions/editheader/deleteheader.svtest | 40 +++++++++++++++-
 3 files changed, 90 insertions(+), 3 deletions(-)

diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index a6d5e1a5a..eb720e320 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -912,10 +912,13 @@ static bool _sieve_result_implicit_keep
 	void *tr_context = NULL;
 	struct sieve_action act_keep;
 	
-	if ( rollback )
+	if ( rollback ) {
 		act_keep = result->failure_action;
-	else 
+		act_keep.mail = NULL;
+	} else {
 		act_keep = result->keep_action;
+		act_keep.mail = sieve_message_get_mail(result->action_env.msgctx);
+	}
 	
 	/* If keep is a non-action, return right away */
 	if ( act_keep.def == NULL ) return TRUE; 
diff --git a/tests/extensions/editheader/addheader.svtest b/tests/extensions/editheader/addheader.svtest
index 27fe56863..c0da0ff55 100644
--- a/tests/extensions/editheader/addheader.svtest
+++ b/tests/extensions/editheader/addheader.svtest
@@ -477,5 +477,51 @@ This is somewhat longer header content
 	}
 }
 
+test_result_reset;
+
+test_set "message" "${message}";
+test "Addheader - implicit keep" {
+	if size :over 76 {
+		test_fail "original message is longer than 76 bytes?!";
+	}
+
+	addheader "X-Some-Header" "Header content";
+
+	if not test_result_execute {
+		test_fail "failed to execute result";
+	}
+
+	if not test_message :folder "INBOX" 0 {
+		test_fail "message not stored";
+	}
+
+	if not size :over 76 {
+		test_fail "stored mail is not larger";
+	}
+	
+	if size :over 107 {
+		test_fail "stored mail is too large";
+	}
+
+	if size :under 100 {
+		test_fail "stored mail is too small";
+	}
+
+	if not header :is "subject" "Frop!" {
+		test_fail "original subject header not retained in stored message";
+	}
+
+	if not exists "x-some-header" {
+		test_fail "header not added to stored message";
+	}
+
+	if not header :is "x-some-header" "Header content" {
+		test_fail "wrong content added to stored message";
+	}
+
+	if not body :matches "Frop!*" {
+		test_fail "body not retained in stored mail";
+	}
+}
 
 
diff --git a/tests/extensions/editheader/deleteheader.svtest b/tests/extensions/editheader/deleteheader.svtest
index 85254a5e7..0d476b3bb 100644
--- a/tests/extensions/editheader/deleteheader.svtest
+++ b/tests/extensions/editheader/deleteheader.svtest
@@ -610,6 +610,44 @@ test "Deleteheader - :index :last" {
 	}
 }
 
+test_result_reset;
+test_set "message" "${message}";
+test "Deleteheader - implicit keep" {
+	deleteheader "X-D";
+
+	if not test_result_execute {
+		test_fail "failed to execute result";
+	}
+
+	if not test_message :folder "INBOX" 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 exists "X-D" {
+		test_fail "X-D header not deleted in stored mail";
+	}
+
+	if not body :matches "Frop!*" {
+		test_fail "body not retained in stored mail";
+	}
+}
+
+/*
+ *
+ */
+
 test_result_reset;
 
 test_set "message" text:
@@ -846,7 +884,7 @@ Frop!
 .
 ;
 
-test "Deleteheader - :matches" {
+test "Deleteheader - folded" {
 	deleteheader "X-A";
 
 	if exists "X-A" {
-- 
GitLab