From 31b6fa13b80f3e8d27f0fb7f9e669302d7f9aa44 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan.bosch@open-xchange.com> Date: Mon, 28 Oct 2024 22:08:47 +0100 Subject: [PATCH] plugins: imap-filter-sieve: imap-filter-sieve - Open global script directly Later, this is needed to allow retrieving a global script from one of many storages, rather than just one. --- .../imap-filter-sieve/imap-filter-sieve.c | 85 ++++--------------- 1 file changed, 18 insertions(+), 67 deletions(-) diff --git a/src/plugins/imap-filter-sieve/imap-filter-sieve.c b/src/plugins/imap-filter-sieve/imap-filter-sieve.c index 13b3ff9f3..1bc4f5295 100644 --- a/src/plugins/imap-filter-sieve/imap-filter-sieve.c +++ b/src/plugins/imap-filter-sieve/imap-filter-sieve.c @@ -44,7 +44,6 @@ struct imap_filter_sieve_user { struct sieve_instance *svinst; struct sieve_storage *storage; - struct sieve_storage *global_storage; struct mail_duplicate_db *dup_db; @@ -216,66 +215,6 @@ imap_filter_sieve_get_personal_storage(struct imap_filter_sieve_context *sctx, return -1; } -static int -imap_filter_sieve_get_global_storage(struct imap_filter_sieve_context *sctx, - struct sieve_storage **storage_r, - enum mail_error *error_code_r, - const char **error_r) -{ - struct mail_user *user = sctx->user; - struct imap_filter_sieve_user *ifsuser = - IMAP_FILTER_SIEVE_USER_CONTEXT_REQUIRE(user); - struct sieve_instance *svinst; - const char *location; - enum sieve_error error_code; - - *error_code_r = MAIL_ERROR_NONE; - *error_r = NULL; - - if (ifsuser->global_storage != NULL) { - *storage_r = ifsuser->global_storage; - return 0; - } - - svinst = imap_filter_sieve_get_svinst(sctx); - if (svinst == NULL) { - *error_r = "Sieve processing is not available"; - *error_code_r = MAIL_ERROR_UNAVAILABLE; - return -1; - } - - location = mail_user_plugin_getenv(user, "sieve_global"); - if (location == NULL) { - e_info(sieve_get_event(svinst), - "include: sieve_global is unconfigured; " - "include of ':global' script is therefore not possible"); - *error_code_r = MAIL_ERROR_NOTFOUND; - *error_r = "No global Sieve scripts available"; - return -1; - } - if (sieve_storage_create(svinst, svinst->event, location, 0, - &ifsuser->global_storage, - &error_code, NULL) == 0) { - *storage_r = ifsuser->global_storage; - return 0; - } - - switch (error_code) { - case SIEVE_ERROR_NOT_POSSIBLE: - case SIEVE_ERROR_NOT_FOUND: - *error_r = "No global Sieve scripts available"; - *error_code_r = MAIL_ERROR_NOTFOUND; - break; - default: - *error_r = t_strflocaltime(MAIL_ERRSTR_CRITICAL_MSG_STAMP, - ioloop_time); - *error_code_r = MAIL_ERROR_TEMP; - break; - } - - return -1; -} - /* * */ @@ -553,17 +492,30 @@ int imap_filter_sieve_open_global(struct imap_filter_sieve_context *sctx, enum mail_error *error_code_r, const char **error_r) { - struct sieve_storage *storage; + struct sieve_instance *svinst; + const char *location; struct sieve_script *script; enum sieve_error error_code; - if (imap_filter_sieve_get_global_storage(sctx, &storage, - error_code_r, error_r) < 0) + svinst = imap_filter_sieve_get_svinst(sctx); + if (svinst == NULL) { + *error_r = "Sieve processing is not available"; + *error_code_r = MAIL_ERROR_UNAVAILABLE; return -1; + } - if (sieve_storage_open_script(storage, name, &script, NULL) < 0) { - *error_r = sieve_storage_get_last_error(storage, &error_code); + location = mail_user_plugin_getenv(sctx->user, "sieve_global"); + if (location == NULL) { + e_info(sieve_get_event(svinst), + "include: sieve_global is unconfigured; " + "include of ':global' script is therefore not possible"); + *error_code_r = MAIL_ERROR_NOTFOUND; + *error_r = "No global Sieve scripts available"; + return -1; + } + if (sieve_script_create_open(svinst, location, name, + &script, &error_code, error_r) < 0) { switch (error_code) { case SIEVE_ERROR_NOT_FOUND: *error_code_r = MAIL_ERROR_NOTFOUND; @@ -1152,7 +1104,6 @@ static void imap_filter_sieve_user_deinit(struct mail_user *user) sieve_error_handler_unref(&ifsuser->master_ehandler); sieve_storage_unref(&ifsuser->storage); - sieve_storage_unref(&ifsuser->global_storage); sieve_deinit(&ifsuser->svinst); if (ifsuser->dup_db != NULL) mail_duplicate_db_deinit(&ifsuser->dup_db); -- GitLab