summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2016-12-12 08:45:23 +0200
committerSergey Poznyakoff <gray@gnu.org>2016-12-12 08:45:23 +0200
commit81750c9d313c09c0af1b5087bf2b0f584256d416 (patch)
tree92c03c7e7f886c432752d4e94a092c6bf0ba5001
parent57e0b97994f04b8d3f36ef3c45a99941b4f011bc (diff)
downloadmailutils-81750c9d313c09c0af1b5087bf2b0f584256d416.tar.gz
mailutils-81750c9d313c09c0af1b5087bf2b0f584256d416.tar.bz2
Add tests for sieve environment. Initialize environment in maidag and inc
* sieve/tests/environment.at: New testcase. * sieve/tests/Makefile.am: Add new file. * sieve/tests/testsuite.at: Include new file. * lib/muscript.h (mu_script_init): Change signature. * lib/muscript_priv.h (mu_script_fun) <script_init>: Likewise. * lib/guile.c (scheme_init): Update. * lib/python.c (python_init): Update. * lib/script.c (mu_script_init): Pass environment to the script_init method. * lib/sieve.c (sieve_init): Set sieve environment. * maidag/script.c (apply_script): Set environment. * mh/inc.c: Likewise.
m---------gint0
-rw-r--r--lib/guile.c2
-rw-r--r--lib/muscript.h3
-rw-r--r--lib/muscript_priv.h2
-rw-r--r--lib/python.c2
-rw-r--r--lib/script.c5
-rw-r--r--lib/sieve.c31
-rw-r--r--maidag/script.c6
-rw-r--r--mh/inc.c4
-rw-r--r--sieve/tests/Makefile.am1
-rw-r--r--sieve/tests/environment.at46
-rw-r--r--sieve/tests/testsuite.at1
12 files changed, 93 insertions, 10 deletions
diff --git a/gint b/gint
-Subproject fd86bf7d44b0c970771830692ae7491447ebe8b
+Subproject 42f4712085b40173eaea58e14b1a579291a6fe3
diff --git a/lib/guile.c b/lib/guile.c
index f49c9d5b6..920b8d578 100644
--- a/lib/guile.c
+++ b/lib/guile.c
@@ -25,7 +25,7 @@
static int initialized;
static int
-scheme_init (const char *prog, mu_script_descr_t *pdescr)
+scheme_init (const char *prog, const char **env, mu_script_descr_t *pdescr)
{
if (!initialized)
{
diff --git a/lib/muscript.h b/lib/muscript.h
index 75ab0af63..04ca1664a 100644
--- a/lib/muscript.h
+++ b/lib/muscript.h
@@ -27,7 +27,8 @@ typedef struct mu_script_descr *mu_script_descr_t;
mu_script_t mu_script_lang_handler (const char *lang);
mu_script_t mu_script_suffix_handler (const char *name);
-int mu_script_init (mu_script_t scr, const char *name, mu_script_descr_t *);
+int mu_script_init (mu_script_t scr, const char *name, const char **env,
+ mu_script_descr_t *);
int mu_script_done (mu_script_t, mu_script_descr_t);
int mu_script_process_msg (mu_script_t, mu_script_descr_t, mu_message_t msg);
void mu_script_log_enable (mu_script_t scr, mu_script_descr_t descr,
diff --git a/lib/muscript_priv.h b/lib/muscript_priv.h
index f97899fa1..c7bcfd92d 100644
--- a/lib/muscript_priv.h
+++ b/lib/muscript_priv.h
@@ -2,7 +2,7 @@ struct mu_script_fun
{
char *lang;
char *suf;
- int (*script_init) (const char *, mu_script_descr_t *);
+ int (*script_init) (const char *, const char **, mu_script_descr_t *);
int (*script_done) (mu_script_descr_t);
int (*script_process) (mu_script_descr_t, mu_message_t);
int (*script_log_enable) (mu_script_descr_t descr, const char *name,
diff --git a/lib/python.c b/lib/python.c
index 673955f0a..7bd32914f 100644
--- a/lib/python.c
+++ b/lib/python.c
@@ -23,7 +23,7 @@
#include <string.h>
static int
-python_init (const char *prog, mu_script_descr_t *pdescr)
+python_init (const char *prog, const char **env, mu_script_descr_t *pdescr)
{
*pdescr = (mu_script_descr_t) strdup (prog);
if (!*pdescr)
diff --git a/lib/script.c b/lib/script.c
index 2ac5378c2..1660947af 100644
--- a/lib/script.c
+++ b/lib/script.c
@@ -108,9 +108,10 @@ mu_script_suffix_handler (const char *name)
}
int
-mu_script_init (mu_script_t scr, const char *name, mu_script_descr_t *pdescr)
+mu_script_init (mu_script_t scr, const char *name, const char **env,
+ mu_script_descr_t *pdescr)
{
- return scr->script_init ? scr->script_init (name, pdescr) : 0;
+ return scr->script_init ? scr->script_init (name, env, pdescr) : 0;
}
int
diff --git a/lib/sieve.c b/lib/sieve.c
index cfdadb65a..7e9bf306b 100644
--- a/lib/sieve.c
+++ b/lib/sieve.c
@@ -75,8 +75,36 @@ _sieve_action_log (mu_sieve_machine_t mach,
mu_stream_unref (stream);
}
+static void
+sieve_setenv (mu_sieve_machine_t mach, const char **env)
+{
+ if (env)
+ {
+ char *buffer = NULL;
+ size_t buflen = 0;
+ size_t i;
+ char *p;
+
+ for (i = 0; env[i]; i++)
+ {
+ if (buflen < strlen (env[i]) + 1)
+ {
+ buflen = strlen (env[i]) + 1;
+ buffer = mu_realloc (buffer, buflen);
+ }
+ strcpy (buffer, env[i]);
+ p = strchr (buffer, '=');
+ if (!p)
+ continue;
+ *p++ = 0;
+ mu_sieve_set_environ (mach, buffer, p);
+ }
+ free (buffer);
+ }
+}
+
static int
-sieve_init (const char *prog, mu_script_descr_t *pdescr)
+sieve_init (const char *prog, const char **env, mu_script_descr_t *pdescr)
{
int rc;
mu_sieve_machine_t mach;
@@ -86,6 +114,7 @@ sieve_init (const char *prog, mu_script_descr_t *pdescr)
{
if (mu_script_sieve_log)
mu_sieve_set_logger (mach, _sieve_action_log);
+ sieve_setenv (mach, env);
rc = mu_sieve_compile (mach, prog);
}
*pdescr = (mu_script_descr_t) mach;
diff --git a/maidag/script.c b/maidag/script.c
index fdb0b9235..5437ac408 100644
--- a/maidag/script.c
+++ b/maidag/script.c
@@ -58,6 +58,8 @@ struct apply_script_closure
mu_message_t msg;
};
+static char const *script_env[] = { "location=MDA", "phase=during", NULL };
+
static int
apply_script (void *item, void *data)
{
@@ -67,7 +69,7 @@ apply_script (void *item, void *data)
int rc;
struct stat st;
mu_script_descr_t sd;
-
+
progfile = mu_expand_path_pattern (scr->pat, clos->auth->name);
if (stat (progfile, &st))
{
@@ -79,7 +81,7 @@ apply_script (void *item, void *data)
return 0;
}
- rc = mu_script_init (scr->scr, progfile, &sd);
+ rc = mu_script_init (scr->scr, progfile, script_env, &sd);
if (rc)
mu_error (_("initialization of script %s failed: %s"),
progfile, mu_strerror (rc));
diff --git a/mh/inc.c b/mh/inc.c
index 1477dd546..b0ffa41eb 100644
--- a/mh/inc.c
+++ b/mh/inc.c
@@ -40,6 +40,7 @@ static const char *append_folder;
static const char *move_to_mailbox;
static const char *script_file;
static const char *script_lang;
+static char const *script_env[] = { "location=MUA", "phase=post", NULL };
static void
add_file (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
@@ -390,7 +391,8 @@ main (int argc, char **argv)
exit (1);
}
}
- rc = mu_script_init (incdat.handler, script_file, &incdat.descr);
+ rc = mu_script_init (incdat.handler, script_file, script_env,
+ &incdat.descr);
if (rc)
{
mu_error (_("script initialization failed: %s"),
diff --git a/sieve/tests/Makefile.am b/sieve/tests/Makefile.am
index 36a8be4e0..218d4ba36 100644
--- a/sieve/tests/Makefile.am
+++ b/sieve/tests/Makefile.am
@@ -49,6 +49,7 @@ TESTSUITE_AT = \
compile.at\
enc-char.at\
envelope.at\
+ environment.at\
exists.at\
ext.at\
false.at\
diff --git a/sieve/tests/environment.at b/sieve/tests/environment.at
new file mode 100644
index 000000000..51684193a
--- /dev/null
+++ b/sieve/tests/environment.at
@@ -0,0 +1,46 @@
+# This file is part of GNU Mailutils. -*- Autotest -*-
+# Copyright (C) 2016 Free Software Foundation, Inc.
+#
+# GNU Mailutils is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3, or (at
+# your option) any later version.
+#
+# GNU Mailutils is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>.
+
+AT_BANNER([environment])
+
+m4_pushdef([MUT_SIEVE_OPTIONS],[--environment=location=MUA])
+MUT_TESTCASE([match],[environment match],[
+require "environment";
+
+if environment "location" "MUA" {
+ discard;
+}
+],
+[],[0],[],
+[DISCARD on msg uid 1: marking as deleted
+DISCARD on msg uid 2: marking as deleted
+DISCARD on msg uid 3: marking as deleted
+])
+
+MUT_TESTCASE([no match], [environment unmatch],[
+require "environment";
+
+if environment "location" "MTA" {
+ discard;
+}
+],
+[],[0],[],
+[IMPLICIT KEEP on msg uid 1
+IMPLICIT KEEP on msg uid 2
+IMPLICIT KEEP on msg uid 3
+])
+m4_popdef([MUT_SIEVE_OPTIONS])
+
diff --git a/sieve/tests/testsuite.at b/sieve/tests/testsuite.at
index 748e06f64..9e3a86ed5 100644
--- a/sieve/tests/testsuite.at
+++ b/sieve/tests/testsuite.at
@@ -150,3 +150,4 @@ m4_include([delheader.at])
m4_include([vacation.at])
m4_include([variables.at])
+m4_include([environment.at])

Return to:

Send suggestions and report system problems to the System administrator.