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