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