dovecot-2.2-pigeonhole: lib-sieve: mime/foreverypart: Properly i...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Fri Dec 4 22:20:14 UTC 2015


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/3d55727da1c7
changeset: 2158:3d55727da1c7
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Fri Dec 04 23:20:05 2015 +0100
description:
lib-sieve: mime/foreverypart: Properly implemented interaction with include extension.
Included scripts now execute in the context of the inner parent foreverypart loop.

diffstat:

 src/lib-sieve/plugins/mime/ext-mime-common.c              |   2 +-
 src/lib-sieve/sieve-interpreter.c                         |  27 ++++++-
 src/lib-sieve/sieve-interpreter.h                         |   8 +-
 tests/extensions/mime/errors.svtest                       |  56 +++++++++++++++
 tests/extensions/mime/foreverypart.svtest                 |  43 +++++++++++
 tests/extensions/mime/included/include-foreverypart.sieve |  44 +++++++++++
 6 files changed, 177 insertions(+), 3 deletions(-)

diffs (275 lines):

diff -r 2e5041947bf3 -r 3d55727da1c7 src/lib-sieve/plugins/mime/ext-mime-common.c
--- a/src/lib-sieve/plugins/mime/ext-mime-common.c	Fri Dec 04 22:58:35 2015 +0100
+++ b/src/lib-sieve/plugins/mime/ext-mime-common.c	Fri Dec 04 23:20:05 2015 +0100
@@ -13,7 +13,7 @@
 	struct sieve_interpreter_loop *loop;
 	struct ext_foreverypart_runtime_loop *fploop;
 
-	loop = sieve_interpreter_loop_get_surrounding
+	loop = sieve_interpreter_loop_get_global
 		(renv->interp, NULL, &foreverypart_extension);
 	if ( loop == NULL ) {
 		fploop = NULL;
diff -r 2e5041947bf3 -r 3d55727da1c7 src/lib-sieve/sieve-interpreter.c
--- a/src/lib-sieve/sieve-interpreter.c	Fri Dec 04 22:58:35 2015 +0100
+++ b/src/lib-sieve/sieve-interpreter.c	Fri Dec 04 23:20:05 2015 +0100
@@ -56,6 +56,7 @@
 
 struct sieve_interpreter {
 	pool_t pool;
+	struct sieve_interpreter *parent;
 
 	/* Runtime data for extensions */
 	ARRAY(struct sieve_interpreter_extension_reg) extensions;
@@ -107,6 +108,7 @@
 
 	pool = pool_alloconly_create("sieve_interpreter", 4096);
 	interp = p_new(pool, struct sieve_interpreter, 1);
+	interp->parent = parent;
 	interp->pool = pool;
 
 	interp->runenv.ehandler = ehandler;
@@ -297,6 +299,12 @@
 	return interp->pool;
 }
 
+struct sieve_interpreter *
+sieve_interpreter_get_parent(struct sieve_interpreter *interp)
+{
+	return interp->parent;
+}
+
 struct sieve_script *sieve_interpreter_script
 (struct sieve_interpreter *interp)
 {
@@ -687,7 +695,7 @@
 	return sieve_interpreter_loop_break(interp, &loops[i]);
 }
 
-struct sieve_interpreter_loop *sieve_interpreter_loop_get_surrounding
+struct sieve_interpreter_loop *sieve_interpreter_loop_get_local
 (struct sieve_interpreter *interp,
 	struct sieve_interpreter_loop *loop,
 	const struct sieve_extension_def *ext_def)
@@ -708,6 +716,23 @@
 	return NULL;
 }
 
+struct sieve_interpreter_loop *sieve_interpreter_loop_get_global
+(struct sieve_interpreter *interp,
+	struct sieve_interpreter_loop *loop,
+	const struct sieve_extension_def *ext_def)
+{
+	struct sieve_interpreter_loop *result;
+
+	while (interp != NULL) {
+		result = sieve_interpreter_loop_get_local
+			(interp, loop, ext_def);
+		if (result != NULL)
+			return result;
+		interp = interp->parent;
+	}
+	return NULL;
+}
+
 pool_t sieve_interpreter_loop_get_pool
 (struct sieve_interpreter_loop *loop)
 {
diff -r 2e5041947bf3 -r 3d55727da1c7 src/lib-sieve/sieve-interpreter.h
--- a/src/lib-sieve/sieve-interpreter.h	Fri Dec 04 22:58:35 2015 +0100
+++ b/src/lib-sieve/sieve-interpreter.h	Fri Dec 04 23:20:05 2015 +0100
@@ -40,6 +40,8 @@
 
 pool_t sieve_interpreter_pool
 	(struct sieve_interpreter *interp);
+struct sieve_interpreter *
+sieve_interpreter_get_parent(struct sieve_interpreter *interp);
 struct sieve_script *sieve_interpreter_script
 	(struct sieve_interpreter *interp);
 struct sieve_error_handler *sieve_interpreter_get_error_handler
@@ -74,7 +76,11 @@
 	(struct sieve_interpreter *interp,
 		struct sieve_interpreter_loop *loop);
 
-struct sieve_interpreter_loop *sieve_interpreter_loop_get_surrounding
+struct sieve_interpreter_loop *sieve_interpreter_loop_get_local
+(struct sieve_interpreter *interp,
+	struct sieve_interpreter_loop *loop,
+	const struct sieve_extension_def *ext_def) ATTR_NULL(2, 3);
+struct sieve_interpreter_loop *sieve_interpreter_loop_get_global
 (struct sieve_interpreter *interp,
 	struct sieve_interpreter_loop *loop,
 	const struct sieve_extension_def *ext_def) ATTR_NULL(2, 3);
diff -r 2e5041947bf3 -r 3d55727da1c7 tests/extensions/mime/errors.svtest
--- a/tests/extensions/mime/errors.svtest	Fri Dec 04 22:58:35 2015 +0100
+++ b/tests/extensions/mime/errors.svtest	Fri Dec 04 23:20:05 2015 +0100
@@ -63,6 +63,62 @@
 	}
 }
 
+test_set "message" text:
+From: Whomever <whoever at example.com>
+To: Someone <someone at example.com>
+Date: Sat, 10 Oct 2009 00:30:04 +0200
+Subject: whatever
+Content-Type: multipart/mixed; boundary=AA
+
+This is a multi-part message in MIME format.
+
+--AA
+Content-Type: multipart/alternative; boundary=BB
+
+This is a multi-part message in MIME format.
+
+--BB
+Content-Type: multipart/alternative; boundary=CC
+
+This is a multi-part message in MIME format.
+
+--CC
+Content-Type: multipart/alternative; boundary=DD
+
+This is a multi-part message in MIME format.
+
+--DD
+Content-Type: multipart/alternative; boundary=EE
+
+This is a nested multi-part message in MIME format.
+
+--EE
+Content-Type: text/plain; charset="us-ascii"
+
+Hello
+
+--EE--
+
+This is the end of the inner MIME multipart.
+
+--DD--
+
+This is the end of the MIME multipart.
+
+--CC--
+
+This is the end of the MIME multipart.
+
+--BB--
+
+This is the end of the MIME multipart.
+
+--AA--
+
+This is the end of the MIME multipart.
+.
+;
+
 test "Limits - include" {
 	if not test_script_compile "errors/limits-include.sieve" {
 		test_fail "script compile failed";
diff -r 2e5041947bf3 -r 3d55727da1c7 tests/extensions/mime/foreverypart.svtest
--- a/tests/extensions/mime/foreverypart.svtest	Fri Dec 04 22:58:35 2015 +0100
+++ b/tests/extensions/mime/foreverypart.svtest	Fri Dec 04 23:20:05 2015 +0100
@@ -3,6 +3,7 @@
 require "foreverypart";
 require "mime";
 require "variables";
+require "include";
 
 test_set "message" text:
 From: Hendrik <hendrik at example.com>
@@ -136,5 +137,47 @@
 	}
 }
 
+test "Double loop - include" {
+	global "in";
+	global "error";
+	set "in" "a";
+	foreverypart {
+		set :length "la" "${in}";
 
+		if string "${in}" "in" {
+			if not header :mime "X-Test" "AA" {
+				test_fail "wrong header extracted (${la})";
+			}
+		} elsif string "${in}" "aaaaaa" {
+			if not header :mime "X-Test" "BB" {
+				test_fail "wrong header extracted (${la})";
+			}
+		} elsif string "${in}" "aaaaaaaaa" {
+			if not header :mime "X-Test" "CC" {
+				test_fail "wrong header extracted (${la})";
+			}
+		} elsif string "${in}" "aaaaaaaaaa" {
+			if not header :mime "X-Test" "DD" {
+				test_fail "wrong header extracted (${la})";
+			}
+		} elsif string "${in}" "aaaaaaaaaaa" {
+			if not header :mime "X-Test" "EE" {
+				test_fail "wrong header extracted (${la})";
+			}
+		}
 
+		set "in" "a${in}";
+
+		include "include-foreverypart";
+
+		if not string "${error}" "" {
+			test_fail "INCLUDED: ${error}";
+		}
+	}
+}
+
+
+
+
+
+
diff -r 2e5041947bf3 -r 3d55727da1c7 tests/extensions/mime/included/include-foreverypart.sieve
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/extensions/mime/included/include-foreverypart.sieve	Fri Dec 04 23:20:05 2015 +0100
@@ -0,0 +1,44 @@
+require "include";
+require "foreverypart";
+require "mime";
+require "variables";
+
+global "in";
+global "error";
+
+foreverypart {
+	set :length "la" "${in}";
+
+	if string "${in}" "aa" {
+		if not header :mime "X-Test" "BB" {
+			set "error" "wrong header extracted (${la})";
+			return;
+		}
+	} elsif string "${in}" "aaa" {
+		if not header :mime "X-Test" "CC" {
+			set "error" "wrong header extracted (${la})";
+			return;
+		}
+	} elsif string "${in}" "aaaa" {
+		if not header :mime "X-Test" "DD" {
+			set "error" "wrong header extracted (${la})";
+			return;
+		}
+	} elsif string "${in}" "aaaaa" {
+		if not header :mime "X-Test" "EE" {
+			set "error" "wrong header extracted (${la})";
+			return;
+		}
+	} elsif string "${in}" "aaaaaaa" {
+		if not header :mime "X-Test" "CC" {
+			set "error" "wrong header extracted (${la})";
+			return;
+		}
+	} elsif string "${in}" "aaaaaaaa" {
+		if not header :mime "X-Test" "DD" {
+			set "error" "wrong header extracted (${la})";
+			return;
+		}
+	}
+	set "in" "a${in}";
+}


More information about the dovecot-cvs mailing list