diff --git a/configure.in b/configure.in index 7c91b43102a3e4d188adf9c9c78d138d1f139637..ff495a54276bfc86e074cff2c6f76edaedf2679e 100644 --- a/configure.in +++ b/configure.in @@ -105,13 +105,13 @@ if test $have_dovecot_sources = yes; then LIBDOVECOT_INCLUDE=' \ -I$(dovecot_incdir) \ -I$(dovecot_incdir)/src/lib \ + -I$(dovecot_incdir)/src/lib-dict \ -I$(dovecot_incdir)/src/lib-mail \ -I$(dovecot_incdir)/src/lib-storage \ -I$(dovecot_incdir)/src/lib-imap \ -I$(dovecot_incdir)/src/lib-master' LIBDOVECOT_LDA_INCLUDE=' \ - -I$(dovecot_incdir)/src/lib-dict \ -I$(dovecot_incdir)/src/lib-lda \ -I$(dovecot_incdir)/src/lda' @@ -130,8 +130,8 @@ else LIBDOVECOT_STORAGE='$(dovecot_libdir)/libdovecot-storage.la' LIBDOVECOT_INCLUDE='-I$(dovecot_incdir)' - LIBDOVECOT_LDA_INCLUDE='-I$(dovecot_incdir)' - LIBDOVECOT_STORAGE_INCLUDE='-I$(dovecot_incdir)' + LIBDOVECOT_LDA_INCLUDE='' + LIBDOVECOT_STORAGE_INCLUDE='' fi dovecot_pkglibexecdir='$(libexecdir)/dovecot' diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c index f39a00f706e4ac98345a86301385869361272fd7..6b69ec7f7adceafb1d3dcf1dff84484b1f917f76 100644 --- a/src/lib-sieve-tool/sieve-tool.c +++ b/src/lib-sieve-tool/sieve-tool.c @@ -3,12 +3,16 @@ #include "lib.h" #include "lib-signals.h" +#include "array.h" #include "ioloop.h" #include "ostream.h" #include "hostpid.h" +#include "dict.h" #include "mail-storage.h" #include "sieve.h" +#include "sieve-plugins.h" + #include "sieve-tool.h" #include <stdio.h> @@ -74,7 +78,7 @@ static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED) /* HACK */ static bool _init_lib = FALSE; -void sieve_tool_init(const struct sieve_environment *env, bool init_lib) +void sieve_tool_init(bool init_lib) { _init_lib = init_lib; @@ -89,7 +93,10 @@ void sieve_tool_init(const struct sieve_environment *env, bool init_lib) lib_signals_ignore(SIGPIPE, TRUE); lib_signals_ignore(SIGALRM, FALSE); } +} +void sieve_tool_sieve_init(const struct sieve_environment *env) +{ if ( env == NULL ) env = &sieve_tool_sieve_env; if ( (sieve_instance=sieve_init(env, NULL)) == NULL ) @@ -159,6 +166,27 @@ void sieve_tool_get_envelope_data *sender = "sender@example.com"; } +void sieve_tool_load_plugins(ARRAY_TYPE(const_string) *plugins) +{ + unsigned int i, count; + const char * const*_plugins; + + _plugins = array_get(plugins, &count); + for ( i = 0; i < count; i++ ) { + const char *path, *file = strrchr(_plugins[i], '/'); + + if ( file != NULL ) { + path = t_strdup_until(_plugins[i], file); + file = file+1; + } else { + path = NULL; + file = _plugins[i]; + } + + sieve_plugins_load(sieve_instance, path, file); + } +} + /* * Sieve script handling */ diff --git a/src/lib-sieve-tool/sieve-tool.h b/src/lib-sieve-tool/sieve-tool.h index 4b0286da6c2c3102566510db010aebfbd9c76b58..e3708105edcd05705f1c933c4f4539cd80fb4be0 100644 --- a/src/lib-sieve-tool/sieve-tool.h +++ b/src/lib-sieve-tool/sieve-tool.h @@ -23,7 +23,8 @@ const struct sieve_environment sieve_tool_env; * Initialization */ -void sieve_tool_init(const struct sieve_environment *env, bool init_lib); +void sieve_tool_init(bool init_lib); +void sieve_tool_sieve_init(const struct sieve_environment *env); void sieve_tool_deinit(void); /* @@ -35,6 +36,8 @@ const char *sieve_tool_get_user(void); void sieve_tool_get_envelope_data (struct mail *mail, const char **recipient, const char **sender); +void sieve_tool_load_plugins(ARRAY_TYPE(const_string) *plugins); + /* * Sieve script handling */ diff --git a/src/plugins/lda-sieve/Makefile.am b/src/plugins/lda-sieve/Makefile.am index fb5940b7e680c0e65548d8db0b5094a5478ec57e..2432e11ad4261aabed25a94c817b3ac35b8a7a2a 100644 --- a/src/plugins/lda-sieve/Makefile.am +++ b/src/plugins/lda-sieve/Makefile.am @@ -1,6 +1,7 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib-sieve \ $(LIBDOVECOT_INCLUDE) \ + $(LIBDOVECOT_DICT_INCLUDE) \ $(LIBDOVECOT_LDA_INCLUDE) lib90_sieve_plugin_la_LDFLAGS = -module -avoid-version diff --git a/src/sieve-tools/sieve-filter.c b/src/sieve-tools/sieve-filter.c index f18e0b1d292494087bba3716e657757020d39a23..9f2db1b40b7830b09dfa074bbefce816dba4d585 100644 --- a/src/sieve-tools/sieve-filter.c +++ b/src/sieve-tools/sieve-filter.c @@ -231,7 +231,7 @@ int main(int argc, char **argv) const char *user, *home, *folder; int i; - sieve_tool_init(NULL, FALSE); + sieve_tool_init(); /* Parse arguments */ scriptfile = recipient = sender = extensions = src_mailstore = dst_mailstore @@ -276,6 +276,8 @@ int main(int argc, char **argv) i_fatal("Missing <mailstore> argument"); } + sieve_tool_sieve_init(NULL, FALSE); + if ( extensions != NULL ) { sieve_set_extensions(sieve_instance, extensions); } diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c index c2ff765f5246ef39c552c1db2b5a360cacb48100..a16287ea00f3c5b159360f74cbda909e12834366 100644 --- a/src/sieve-tools/sieve-test.c +++ b/src/sieve-tools/sieve-test.c @@ -48,7 +48,8 @@ static void print_help(void) "Usage: sieve-test [-c] [-d <dump-filename>] [-e] [-f <envelope-sender>]\n" " [-l <mail-location>] [-m <default-mailbox>]\n" " [-r <recipient-address>] [-s <script-file>]\n" -" [-t] [-x <extensions>] <script-file> <mail-file>\n" +" [-t] [-P <plugin>] [-x <extensions>]\n" +" <script-file> <mail-file>\n" ); } @@ -107,7 +108,8 @@ int main(int argc, char **argv) struct mail_storage_service_user *service_user; struct mail_storage_service_input service_input; struct mail_user *mail_user_dovecot = NULL; - ARRAY_DEFINE(scriptfiles, const char *); + ARRAY_TYPE (const_string) scriptfiles; + ARRAY_TYPE (const_string) plugins; const char *scriptfile, *recipient, *sender, *mailbox, *dumpfile, *mailfile, *mailloc, *extensions; const char *user, *home, *errstr; @@ -125,11 +127,12 @@ int main(int argc, char **argv) int ret, c; master_service = master_service_init("sieve-test", - MASTER_SERVICE_FLAG_STANDALONE, &argc, &argv, "r:f:m:d:l:x:s:ect"); + MASTER_SERVICE_FLAG_STANDALONE, &argc, &argv, "r:f:m:d:l:x:s:ectP:"); - sieve_tool_init(NULL, FALSE); + sieve_tool_init(FALSE); t_array_init(&scriptfiles, 16); + t_array_init(&plugins, 4); user = getenv("USER"); @@ -171,6 +174,15 @@ int main(int argc, char **argv) array_append(&scriptfiles, &file, 1); } break; + case 'P': + /* Plugin */ + { + const char *plugin; + + plugin = t_strdup(optarg); + array_append(&plugins, &plugin, 1); + } + break; case 'e': execute = TRUE; break; @@ -206,6 +218,12 @@ int main(int argc, char **argv) i_fatal_status(EX_USAGE, "Unknown argument: %s", argv[optind]); } + sieve_tool_sieve_init(NULL); + + if ( array_count(&plugins) > 0 ) { + sieve_tool_load_plugins(&plugins); + } + if ( extensions != NULL ) { sieve_set_extensions(sieve_instance, extensions); } diff --git a/src/sieve-tools/sievec.c b/src/sieve-tools/sievec.c index ed52f85a3be31d28b7ac5b8f7359a158a41483df..32f0a029fd170c0a16a9d300b0df5c3f26421788 100644 --- a/src/sieve-tools/sievec.c +++ b/src/sieve-tools/sievec.c @@ -2,6 +2,7 @@ */ #include "lib.h" +#include "array.h" #include "sieve.h" #include "sieve-extensions.h" @@ -26,7 +27,8 @@ static void print_help(void) { printf( -"Usage: sievec [-d] [-x <extensions>] <script-file> [<out-file>]\n" +"Usage: sievec [-d] [-P <plugin>] [-x <extensions>] \n" +" <script-file> [<out-file>]\n" ); } @@ -34,14 +36,18 @@ static void print_help(void) * Tool implementation */ -int main(int argc, char **argv) { +int main(int argc, char **argv) +{ + ARRAY_TYPE(const_string) plugins; int i; struct stat st; struct sieve_binary *sbin; bool dump = FALSE; const char *scriptfile, *outfile, *extensions; - sieve_tool_init(NULL, TRUE); + sieve_tool_init(TRUE); + + t_array_init(&plugins, 4); scriptfile = outfile = extensions = NULL; for (i = 1; i < argc; i++) { @@ -56,6 +62,18 @@ int main(int argc, char **argv) { i_fatal("Missing -x argument"); } extensions = argv[i]; + } else if (strcmp(argv[i], "-P") == 0) { + const char *plugin; + + /* scriptfile executed before main script */ + i++; + if (i == argc) { + print_help(); + i_fatal("Missing -P argument"); + } + + plugin = t_strdup(argv[i]); + array_append(&plugins, &plugin, 1); } else if ( scriptfile == NULL ) { scriptfile = argv[i]; } else if ( outfile == NULL ) { @@ -74,6 +92,12 @@ int main(int argc, char **argv) { if ( outfile == NULL && dump ) outfile = "-"; + sieve_tool_sieve_init(NULL); + + if ( array_count(&plugins) > 0 ) { + sieve_tool_load_plugins(&plugins); + } + if ( extensions != NULL ) { sieve_set_extensions(sieve_instance, extensions); } diff --git a/src/sieve-tools/sieved.c b/src/sieve-tools/sieved.c index 084ed34b622b2cc99fd733c26955f7a9e0051ff9..5f5055b6c4f299bbb20836078112f56f828e8c80 100644 --- a/src/sieve-tools/sieved.c +++ b/src/sieve-tools/sieved.c @@ -2,6 +2,7 @@ */ #include "lib.h" +#include "array.h" #include "sieve.h" #include "sieve-extensions.h" @@ -24,7 +25,8 @@ static void print_help(void) { printf( -"Usage: sieved [-x <extensions>] <sieve-binary> [<out-file>]\n" +"Usage: sieved [-P <plugin>] [-x <extensions>]\n" +" <sieve-binary> [<out-file>]\n" ); } @@ -32,12 +34,16 @@ static void print_help(void) * Tool implementation */ -int main(int argc, char **argv) { +int main(int argc, char **argv) +{ + ARRAY_TYPE(const_string) plugins; int i; struct sieve_binary *sbin; const char *binfile, *outfile, *extensions; - sieve_tool_init(NULL, TRUE); + sieve_tool_init(TRUE); + + t_array_init(&plugins, 4); binfile = outfile = extensions = NULL; for (i = 1; i < argc; i++) { @@ -49,6 +55,18 @@ int main(int argc, char **argv) { i_fatal("Missing -x argument"); } extensions = argv[i]; + } else if (strcmp(argv[i], "-P") == 0) { + const char *plugin; + + /* scriptfile executed before main script */ + i++; + if (i == argc) { + print_help(); + i_fatal("Missing -P argument"); + } + + plugin = t_strdup(argv[i]); + array_append(&plugins, &plugin, 1); } else if ( binfile == NULL ) { binfile = argv[i]; } else if ( outfile == NULL ) { @@ -64,6 +82,12 @@ int main(int argc, char **argv) { i_fatal("missing <sieve-binary> argument"); } + sieve_tool_sieve_init(NULL); + + if ( array_count(&plugins) > 0 ) { + sieve_tool_load_plugins(&plugins); + } + if ( extensions != NULL ) { sieve_set_extensions(sieve_instance, extensions); } diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c index 65512e7b8fe83a460d6c247293c40b5921c16069..30287cf4d2424d878ac3184bdce144a37fde1dcd 100644 --- a/src/testsuite/testsuite.c +++ b/src/testsuite/testsuite.c @@ -47,7 +47,7 @@ const struct sieve_script_env *testsuite_scriptenv; #define DEFAULT_ENVELOPE_SENDER "MAILER-DAEMON" /* - * Testsuite initialization + * Testsuite Sieve environment */ static const struct sieve_environment testsuite_sieve_env = { @@ -55,26 +55,6 @@ static const struct sieve_environment testsuite_sieve_env = { testsuite_setting_get }; -static void testsuite_tool_init(const char *extensions, bool log_stdout) -{ - testsuite_settings_init(); - - sieve_tool_init(&testsuite_sieve_env, FALSE); - - sieve_extensions_set_string(sieve_instance, extensions); - - testsuite_init(sieve_instance, log_stdout); -} - -static void testsuite_tool_deinit(void) -{ - testsuite_deinit(); - - sieve_tool_deinit(); - - testsuite_settings_deinit(); -} - /* * Testsuite execution */ @@ -82,7 +62,9 @@ static void testsuite_tool_deinit(void) static void print_help(void) { printf( -"Usage: testsuite [-t][-E][-d <dump filename>] <scriptfile>\n" +"Usage: testsuite [-t] [-E] [-d <dump filename>]\n" +" [-P <plugin>] [-x <extensions>]\n" +" <scriptfile>\n" ); } @@ -134,6 +116,7 @@ int main(int argc, char **argv) struct mail_user *mail_user_dovecot; const char *scriptfile, *dumpfile, *extensions; const char *user, *home, *errstr; + ARRAY_TYPE(const_string) plugins; struct sieve_binary *sbin; const char *sieve_dir; bool trace = FALSE, log_stdout = FALSE; @@ -144,6 +127,10 @@ int main(int argc, char **argv) user = getenv("USER"); + sieve_tool_init(FALSE); + + t_array_init(&plugins, 4); + /* Parse arguments */ scriptfile = dumpfile = extensions = NULL; @@ -205,7 +192,11 @@ int main(int argc, char **argv) i_fatal("%s", errstr); /* Initialize testsuite */ - testsuite_tool_init(extensions, log_stdout); + testsuite_settings_init(); + sieve_tool_sieve_init(&testsuite_sieve_env); + sieve_tool_load_plugins(&plugins); + sieve_extensions_set_string(sieve_instance, extensions); + testsuite_init(sieve_instance, log_stdout); printf("Test case: %s:\n\n", scriptfile); @@ -214,8 +205,9 @@ int main(int argc, char **argv) sieve_dir = strrchr(scriptfile, '/'); if ( sieve_dir == NULL ) sieve_dir= "./"; - else + else { sieve_dir = t_strdup_until(scriptfile, sieve_dir+1); + } /* Currently needed for include (FIXME) */ testsuite_setting_set @@ -290,7 +282,9 @@ int main(int argc, char **argv) mail_user_unref(&mail_user_dovecot); /* De-initialize testsuite */ - testsuite_tool_deinit(); + testsuite_deinit(); + testsuite_settings_deinit(); + sieve_tool_deinit(); mail_storage_service_user_free(&service_user); mail_storage_service_deinit(&storage_service);