diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index ddbaf266e50914a15c3d8d58614490426629044f..bded5d827881f649305734b76ee02d86765effea 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -543,6 +543,14 @@ int sieve_test * Script execution */ +int sieve_script_env_init(struct sieve_script_env *senv, + struct mail_user *user, const char **error_r ATTR_UNUSED) +{ + i_zero(senv); + senv->user = user; + return 0; +} + int sieve_execute (struct sieve_binary *sbin, const struct sieve_message_data *msgdata, const struct sieve_script_env *senv, diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h index 54b1ac24477a70c688db02f4186fd150c8bc975b..8f68d2e5de92c301a39ff8b54eee556ffa1e463e 100644 --- a/src/lib-sieve/sieve.h +++ b/src/lib-sieve/sieve.h @@ -164,6 +164,13 @@ int sieve_test * Script execution */ +/* sieve_script_env_init: + * + * Initializes the scirpt environment from the given mail_user. + */ +int sieve_script_env_init(struct sieve_script_env *senv, + struct mail_user *user, const char **error_r); + /* sieve_execute: * * Executes the binary, including the result. diff --git a/src/plugins/imapsieve/imap-sieve.c b/src/plugins/imapsieve/imap-sieve.c index 61cdd15ef55cb6b370843d6a3852bc7e4f8709a5..712d08ec1f842ce7dc82314ed2e7412c702d98cf 100644 --- a/src/plugins/imapsieve/imap-sieve.c +++ b/src/plugins/imapsieve/imap-sieve.c @@ -713,6 +713,7 @@ int imap_sieve_run_mail struct imap_sieve_context context; struct sieve_trace_config trace_config; struct sieve_trace_log *trace_log; + const char *error; int ret; i_zero(&context); @@ -744,26 +745,32 @@ int imap_sieve_run_mail /* Compose script execution environment */ - i_zero(&scriptenv); - i_zero(&estatus); - scriptenv.default_mailbox = mailbox_get_vname(mail->box); - scriptenv.user = user; - scriptenv.smtp_start = imap_sieve_smtp_start; - scriptenv.smtp_add_rcpt = imap_sieve_smtp_add_rcpt; - scriptenv.smtp_send = imap_sieve_smtp_send; - scriptenv.smtp_abort = imap_sieve_smtp_abort; - scriptenv.smtp_finish = imap_sieve_smtp_finish; - scriptenv.duplicate_mark = imap_sieve_duplicate_mark; - scriptenv.duplicate_check = imap_sieve_duplicate_check; - scriptenv.duplicate_flush = imap_sieve_duplicate_flush; - scriptenv.exec_status = &estatus; - scriptenv.trace_log = trace_log; - scriptenv.trace_config = trace_config; - scriptenv.script_context = (void *)&context; - - /* Execute script(s) */ - - ret = imap_sieve_run_scripts(isrun, &msgdata, &scriptenv); + if (sieve_script_env_init(&scriptenv, user, &error) < 0) { + sieve_sys_error(svinst, + "Failed to initialize script execution: %s", + error); + ret = -1; + } else { + scriptenv.default_mailbox = mailbox_get_vname(mail->box); + scriptenv.smtp_start = imap_sieve_smtp_start; + scriptenv.smtp_add_rcpt = imap_sieve_smtp_add_rcpt; + scriptenv.smtp_send = imap_sieve_smtp_send; + scriptenv.smtp_abort = imap_sieve_smtp_abort; + scriptenv.smtp_finish = imap_sieve_smtp_finish; + scriptenv.duplicate_mark = imap_sieve_duplicate_mark; + scriptenv.duplicate_check = imap_sieve_duplicate_check; + scriptenv.duplicate_flush = imap_sieve_duplicate_flush; + scriptenv.trace_log = trace_log; + scriptenv.trace_config = trace_config; + scriptenv.script_context = (void *)&context; + + i_zero(&estatus); + scriptenv.exec_status = &estatus; + + /* Execute script(s) */ + + ret = imap_sieve_run_scripts(isrun, &msgdata, &scriptenv); + } } T_END; if ( trace_log != NULL ) diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 2d5a32570f24538bd56d3664b3759e9982baebe0..836010658bf89711bba87758367bfa7fc645d53f 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -800,6 +800,7 @@ static int lda_sieve_execute struct sieve_trace_config trace_config; struct sieve_trace_log *trace_log; bool debug = mdctx->rcpt_user->mail_debug; + const char *error; int ret; /* Check whether there are any scripts to execute at all */ @@ -855,13 +856,17 @@ static int lda_sieve_execute /* Compose script execution environment */ - i_zero(&scriptenv); - i_zero(&estatus); + if (sieve_script_env_init(&scriptenv, mdctx->rcpt_user, &error) < 0) { + sieve_sys_error(svinst, + "Failed to initialize script execution: %s", error); + if ( trace_log != NULL ) + sieve_trace_log_free(&trace_log); + return -1; + } scriptenv.default_mailbox = mdctx->rcpt_default_mailbox; scriptenv.mailbox_autocreate = mdctx->set->lda_mailbox_autocreate; scriptenv.mailbox_autosubscribe = mdctx->set->lda_mailbox_autosubscribe; - scriptenv.user = mdctx->rcpt_user; scriptenv.smtp_start = lda_sieve_smtp_start; scriptenv.smtp_add_rcpt = lda_sieve_smtp_add_rcpt; scriptenv.smtp_send = lda_sieve_smtp_send; @@ -874,6 +879,8 @@ static int lda_sieve_execute scriptenv.script_context = (void *) mdctx; scriptenv.trace_log = trace_log; scriptenv.trace_config = trace_config; + + i_zero(&estatus); scriptenv.exec_status = &estatus; srctx->scriptenv = &scriptenv; diff --git a/src/sieve-tools/sieve-filter.c b/src/sieve-tools/sieve-filter.c index a3a9015087a8db930b7a3bf996229eab89f67a07..30e86523c063d3e148e4dce127df8a7d67396509 100644 --- a/src/sieve-tools/sieve-filter.c +++ b/src/sieve-tools/sieve-filter.c @@ -366,6 +366,7 @@ int main(int argc, char **argv) struct mailbox *src_box = NULL, *move_box = NULL; enum mailbox_flags open_flags = MAILBOX_FLAG_IGNORE_ACLS; enum mail_error error; + const char *errstr; int c; sieve_tool = sieve_tool_init("sieve-filter", &argc, &argv, @@ -541,10 +542,10 @@ int main(int argc, char **argv) } /* Compose script environment */ - i_zero(&scriptenv); + if (sieve_script_env_init(&scriptenv, mail_user, &errstr) < 0) + i_fatal("Failed to initialize script execution: %s", errstr); scriptenv.mailbox_autocreate = FALSE; scriptenv.default_mailbox = dst_mailbox; - scriptenv.user = mail_user; /* Compose filter context */ i_zero(&sfdata); diff --git a/src/sieve-tools/sieve-test.c b/src/sieve-tools/sieve-test.c index de0496b86418b70f68c507dfa3e1c6381029a23a..81b31afa0927de5cc9483b06bb1d0ccc120c68e0 100644 --- a/src/sieve-tools/sieve-test.c +++ b/src/sieve-tools/sieve-test.c @@ -316,9 +316,11 @@ int main(int argc, char **argv) } /* Compose script environment */ - i_zero(&scriptenv); + if (sieve_script_env_init(&scriptenv, + sieve_tool_get_mail_user(sieve_tool), &errstr) < 0) + i_fatal("Failed to initialize script execution: %s", errstr); + scriptenv.default_mailbox = mailbox; - scriptenv.user = sieve_tool_get_mail_user(sieve_tool); scriptenv.smtp_start = sieve_smtp_start; scriptenv.smtp_add_rcpt = sieve_smtp_add_rcpt; scriptenv.smtp_send = sieve_smtp_send; @@ -328,6 +330,8 @@ int main(int argc, char **argv) scriptenv.duplicate_check = duplicate_check; scriptenv.trace_log = trace_log; scriptenv.trace_config = trace_config; + + i_zero(&estatus); scriptenv.exec_status = &estatus; /* Run the test */ diff --git a/src/testsuite/testsuite-script.c b/src/testsuite/testsuite-script.c index 6d3a1cc67f770f7ff99c13151615cb51e0318869..b7d5347070e7cb430fcef6f65850d532d8055059 100644 --- a/src/testsuite/testsuite-script.c +++ b/src/testsuite/testsuite-script.c @@ -88,11 +88,13 @@ bool testsuite_script_is_subtest(const struct sieve_runtime_env *renv) bool testsuite_script_run(const struct sieve_runtime_env *renv) { + const struct sieve_script_env *senv = renv->scriptenv; struct testsuite_interpreter_context *ictx = testsuite_interpreter_context_get(renv->interp, testsuite_ext); struct sieve_script_env scriptenv; struct sieve_result *result; struct sieve_interpreter *interp; + const char *error; int ret; i_assert(ictx != NULL); @@ -106,7 +108,12 @@ bool testsuite_script_run(const struct sieve_runtime_env *renv) testsuite_log_clear_messages(); /* Compose script execution environment */ - i_zero(&scriptenv); + if (sieve_script_env_init(&scriptenv, senv->user, &error) < 0) { + sieve_runtime_error(renv, NULL, + "testsuite: failed to initialize script execution: %s", + error); + return FALSE; + } scriptenv.default_mailbox = "INBOX"; scriptenv.smtp_start = NULL; scriptenv.smtp_add_rcpt = NULL; @@ -114,7 +121,6 @@ bool testsuite_script_run(const struct sieve_runtime_env *renv) scriptenv.smtp_finish = NULL; scriptenv.duplicate_mark = NULL; scriptenv.duplicate_check = NULL; - scriptenv.user = renv->scriptenv->user; scriptenv.trace_log = renv->scriptenv->trace_log; scriptenv.trace_config = renv->scriptenv->trace_config; @@ -168,9 +174,11 @@ bool testsuite_script_multiscript (const struct sieve_runtime_env *renv, ARRAY_TYPE (const_string) *scriptfiles) { struct sieve_instance *svinst = testsuite_sieve_instance; + const struct sieve_script_env *senv = renv->scriptenv; struct sieve_script_env scriptenv; struct sieve_multiscript *mscript; const char *const *scripts; + const char *error; unsigned int count, i; bool more = TRUE; bool result = TRUE; @@ -178,7 +186,12 @@ bool testsuite_script_multiscript testsuite_log_clear_messages(); /* Compose script execution environment */ - i_zero(&scriptenv); + if (sieve_script_env_init(&scriptenv, senv->user, &error) < 0) { + sieve_runtime_error(renv, NULL, + "testsuite: failed to initialize script execution: %s", + error); + return FALSE; + } scriptenv.default_mailbox = "INBOX"; scriptenv.smtp_start = NULL; scriptenv.smtp_add_rcpt = NULL; @@ -186,7 +199,6 @@ bool testsuite_script_multiscript scriptenv.smtp_finish = NULL; scriptenv.duplicate_mark = NULL; scriptenv.duplicate_check = NULL; - scriptenv.user = renv->scriptenv->user; scriptenv.trace_log = renv->scriptenv->trace_log; scriptenv.trace_config = renv->scriptenv->trace_config; diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c index 212d2b390287a90d063c2964af85879234eba509..5cfc31e6162732f88df60e22a27f6fd974cd68e5 100644 --- a/src/testsuite/testsuite.c +++ b/src/testsuite/testsuite.c @@ -182,8 +182,10 @@ int main(int argc, char **argv) testsuite_mailstore_init(); testsuite_message_init(); - i_zero(&scriptenv); - scriptenv.user = testsuite_mailstore_get_user(); + if (sieve_script_env_init(&scriptenv, + testsuite_mailstore_get_user(), &error) < 0) + i_fatal("Failed to initialize script execution: %s", error); + scriptenv.default_mailbox = "INBOX"; scriptenv.smtp_start = testsuite_smtp_start; scriptenv.smtp_add_rcpt = testsuite_smtp_add_rcpt;