dovecot-2.2-pigeonhole: lib-sieve: mime extension: Fixed the hea...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Sun Jan 3 15:35:16 UTC 2016


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/1d2a29f9799b
changeset: 2195:1d2a29f9799b
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sun Jan 03 16:33:39 2016 +0100
description:
lib-sieve: mime extension: Fixed the header :mime :anychild test to work properly outside a foreverypart loop.

diffstat:

 src/lib-sieve/plugins/mime/tag-mime.c     |  18 +++++++--
 src/lib-sieve/sieve-message.c             |  53 +++++++++++++++++++-------
 src/lib-sieve/sieve-message.h             |   7 +++-
 tests/extensions/mime/foreverypart.svtest |   5 --
 tests/extensions/mime/header.svtest       |  62 +++++++++++++++++++++++++++++++
 5 files changed, 120 insertions(+), 25 deletions(-)

diffs (280 lines):

diff -r dc9bf28c241b -r 1d2a29f9799b src/lib-sieve/plugins/mime/tag-mime.c
--- a/src/lib-sieve/plugins/mime/tag-mime.c	Sun Jan 03 16:32:27 2016 +0100
+++ b/src/lib-sieve/plugins/mime/tag-mime.c	Sun Jan 03 16:33:39 2016 +0100
@@ -699,6 +699,7 @@
 	struct ext_foreverypart_runtime_loop *sfploop;
 	struct sieve_header_list *headers;
 	struct sieve_stringlist *values;
+	int ret;
 
 	sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
 		"header mime override:");
@@ -713,13 +714,22 @@
 	}
 
 	sfploop = ext_foreverypart_runtime_loop_get_current(renv);
-	if ( sfploop == NULL ) {
-		headers = sieve_message_header_list_create
-			(renv, *headers_r, mime_decode);
-	} else {
+	if ( sfploop != NULL ) {
 		headers = sieve_mime_header_list_create
 			(renv, *headers_r, &sfploop->part_iter,
 				mime_decode, ctx->anychild);
+	} else if ( ctx->anychild ) {
+		struct sieve_message_part_iter part_iter;
+
+		if ( (ret=sieve_message_part_iter_init
+			(&part_iter, renv)) <= 0 )
+			return ret;
+
+		headers = sieve_mime_header_list_create
+			(renv, *headers_r, &part_iter, mime_decode, TRUE);
+	} else {
+		headers = sieve_message_header_list_create
+			(renv, *headers_r, mime_decode);
 	}
 	values = &headers->strlist;
 
diff -r dc9bf28c241b -r 1d2a29f9799b src/lib-sieve/sieve-message.c
--- a/src/lib-sieve/sieve-message.c	Sun Jan 03 16:32:27 2016 +0100
+++ b/src/lib-sieve/sieve-message.c	Sun Jan 03 16:33:39 2016 +0100
@@ -1572,6 +1572,7 @@
 	memset(iter, 0, sizeof(*iter));
 	iter->renv = renv;
 	iter->index = 0;
+	iter->offset = 0;
 
 	parts = array_get(&msgctx->cached_body_parts, &count);
 	if (count == 0)
@@ -1582,6 +1583,24 @@
 	return SIEVE_EXEC_OK;
 }
 
+void sieve_message_part_iter_subtree(struct sieve_message_part_iter *iter,
+	struct sieve_message_part_iter *subtree)
+{
+	const struct sieve_runtime_env *renv = iter->renv;
+	struct sieve_message_context *msgctx = renv->msgctx;
+	struct sieve_message_part *const *parts;
+	unsigned int count;
+
+	*subtree = *iter;
+
+	parts = array_get(&msgctx->cached_body_parts, &count);
+	if ( subtree->index >= count)
+		subtree->root = NULL;
+	else
+		subtree->root = parts[subtree->index];
+	subtree->offset = subtree->index;
+}
+
 void sieve_message_part_iter_children(struct sieve_message_part_iter *iter,
 	struct sieve_message_part_iter *child)
 {
@@ -1593,10 +1612,11 @@
 	*child = *iter;
 
 	parts = array_get(&msgctx->cached_body_parts, &count);	
-	if ( child->index >= count || parts[child->index]->children == NULL)
+	if ( (child->index+1) >= count || parts[child->index]->children == NULL)
 		child->root = NULL;
-	else	
+	else
 		child->root = parts[child->index++];
+	child->offset = child->index;
 }
 
 struct sieve_message_part *sieve_message_part_iter_current
@@ -1614,10 +1634,10 @@
 	if ( iter->index >= count )
 		return NULL;
 	do {
-		if ( parts[iter->index] == iter->root->next ||
-			parts[iter->index] == iter->root->parent ) {
+		if ( parts[iter->index] == iter->root->next )
 			return NULL;
-		}
+		if ( parts[iter->index] == iter->root->parent )
+			return NULL;
 	} while ( parts[iter->index]->epilogue && ++iter->index < count );
 	if ( iter->index >= count )
 		return NULL;
@@ -1637,6 +1657,12 @@
 	return sieve_message_part_iter_current(iter);
 }
 
+void sieve_message_part_iter_reset
+(struct sieve_message_part_iter *iter)
+{
+	iter->index = iter->offset;
+}
+
 /*
  * MIME header list
  */
@@ -1658,14 +1684,14 @@
 
 	struct sieve_stringlist *field_names;
 
-	struct sieve_message_part_iter *part_iter, child_iter;
+	struct sieve_message_part_iter part_iter;
 
 	const char *header_name;
 	const struct sieve_message_header *headers;
 	unsigned int headers_index, headers_count;
 
 	unsigned int mime_decode:1;
-	unsigned int children;
+	unsigned int children:1;
 };
 
 struct sieve_header_list *sieve_mime_header_list_create
@@ -1683,10 +1709,11 @@
 	hdrlist->hdrlist.strlist.reset = sieve_mime_header_list_reset;
 	hdrlist->hdrlist.next_item = sieve_mime_header_list_next_item;
 	hdrlist->field_names = field_names;
-	hdrlist->part_iter = part_iter;
 	hdrlist->mime_decode = mime_decode;
 	hdrlist->children = children;
 
+	sieve_message_part_iter_subtree(part_iter, &hdrlist->part_iter);
+
 	return &hdrlist->hdrlist;
 }
 
@@ -1697,12 +1724,8 @@
 {
 	struct sieve_message_part *mpart;
 
-	if ( hdrlist->children ) {
-		sieve_message_part_iter_children
-			(hdrlist->part_iter, &hdrlist->child_iter);
-	}
-
-	mpart = sieve_message_part_iter_current(hdrlist->part_iter);
+	sieve_message_part_iter_reset(&hdrlist->part_iter);
+	mpart = sieve_message_part_iter_current(&hdrlist->part_iter);
 
 	if ( mpart != NULL && array_is_created(&mpart->headers) ) {
 		hdrlist->headers = array_get
@@ -1740,7 +1763,7 @@
 			if ( hdrlist->header_name != NULL && hdrlist->children ) {
 				struct sieve_message_part *mpart;
 
-				mpart = sieve_message_part_iter_next(&hdrlist->child_iter);
+				mpart = sieve_message_part_iter_next(&hdrlist->part_iter);
 				if ( mpart != NULL && array_is_created(&mpart->headers) ) {
 					hdrlist->headers = array_get
 						(&mpart->headers, &hdrlist->headers_count);
diff -r dc9bf28c241b -r 1d2a29f9799b src/lib-sieve/sieve-message.h
--- a/src/lib-sieve/sieve-message.h	Sun Jan 03 16:32:27 2016 +0100
+++ b/src/lib-sieve/sieve-message.h	Sun Jan 03 16:33:39 2016 +0100
@@ -233,12 +233,14 @@
 struct sieve_message_part_iter {
 	const struct sieve_runtime_env *renv;
 	struct sieve_message_part *root;
-	unsigned int index;
+	unsigned int index, offset;
 };
 
 int sieve_message_part_iter_init
 (struct sieve_message_part_iter *iter,
 	const struct sieve_runtime_env *renv);
+void sieve_message_part_iter_subtree(struct sieve_message_part_iter *iter,
+	struct sieve_message_part_iter *subtree);
 void sieve_message_part_iter_children(struct sieve_message_part_iter *iter,
 	struct sieve_message_part_iter *child);
 
@@ -247,6 +249,9 @@
 struct sieve_message_part *sieve_message_part_iter_next
 (struct sieve_message_part_iter *iter);
 
+void sieve_message_part_iter_reset
+(struct sieve_message_part_iter *iter);
+
 /*
  * MIME header list
  */
diff -r dc9bf28c241b -r 1d2a29f9799b tests/extensions/mime/foreverypart.svtest
--- a/tests/extensions/mime/foreverypart.svtest	Sun Jan 03 16:32:27 2016 +0100
+++ b/tests/extensions/mime/foreverypart.svtest	Sun Jan 03 16:33:39 2016 +0100
@@ -176,8 +176,3 @@
 	}
 }
 
-
-
-
-
-
diff -r dc9bf28c241b -r 1d2a29f9799b tests/extensions/mime/header.svtest
--- a/tests/extensions/mime/header.svtest	Sun Jan 03 16:32:27 2016 +0100
+++ b/tests/extensions/mime/header.svtest	Sun Jan 03 16:33:39 2016 +0100
@@ -379,4 +379,66 @@
 	}
 }
 
+/*
+ * Multipart anychild
+ */
 
+test_set "message" text:
+From: Hendrik <hendrik at example.com>
+To: Harrie <harrie at example.com>
+Date: Sat, 11 Oct 2010 00:31:44 +0200
+Subject: Harrie is een prutser
+Content-Type: multipart/mixed; boundary=AA
+X-Test: AA
+
+This is a multi-part message in MIME format.
+--AA
+Content-Type: multipart/mixed; boundary=BB
+X-Test: BB
+
+This is a multi-part message in MIME format.
+--BB
+Content-Type: text/plain; charset="us-ascii"
+X-Test: CC
+
+Hello
+
+--BB
+Content-Type: text/plain; charset="us-ascii"
+X-Test: DD
+
+Hello again
+
+--BB--
+This is the end of MIME multipart.
+
+--AA
+Content-Type: text/plain; charset="us-ascii"
+X-Test: EE
+
+And again
+
+--AA--
+This is the end of  MIME multipart.
+.
+;
+
+test "Multipart anychild" {
+	if not header :mime :anychild "X-Test" "AA" {
+		test_fail "No AA";
+	}
+	if not header :mime :anychild "X-Test" "BB" {
+		test_fail "No BB";
+	}
+	if not header :mime :anychild "X-Test" "CC" {
+		test_fail "No CC";
+	}
+	if not header :mime :anychild "X-Test" "DD" {
+		test_fail "No DD";
+	}
+	if not header :mime :anychild "X-Test" "EE" {
+		test_fail "No EE";
+	}
+}
+
+


More information about the dovecot-cvs mailing list