From d2a75724985c66aeb2decdd6272d4f21255284c9 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Thu, 29 Oct 2015 22:14:32 +0100 Subject: [PATCH] lib-sieve: Added sieve_enabled setting that defaults to "yes". This allows completely disabling Sieve processing for a particular user. --- src/lib-sieve/sieve-storage.c | 39 ++++++++++++++++++------ src/managesieve/managesieve-client.c | 13 ++++++-- src/plugins/lda-sieve/lda-sieve-plugin.c | 12 ++++++-- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c index 76ba2879d..30cff91cc 100644 --- a/src/lib-sieve/sieve-storage.c +++ b/src/lib-sieve/sieve-storage.c @@ -378,7 +378,7 @@ static struct sieve_storage *sieve_storage_do_create_main /* disabled */ if ( debug ) { sieve_sys_debug(svinst, "storage: " - "Sieve is disabled (sieve=\"\")"); + "Personal storage is disabled (sieve=\"\")"); } *error_r = SIEVE_ERROR_NOT_FOUND; return NULL; @@ -478,7 +478,8 @@ struct sieve_storage *sieve_storage_create_main enum sieve_storage_flags flags, enum sieve_error *error_r) { struct sieve_storage *storage; - const char *set_default, *set_default_name; + const char *set_enabled, *set_default, *set_default_name; + bool debug = svinst->debug; enum sieve_error error; if ( error_r != NULL ) @@ -486,6 +487,18 @@ struct sieve_storage *sieve_storage_create_main else error_r = &error; + /* Check whether Sieve is disabled for this user */ + if ( (set_enabled=sieve_setting_get + (svinst, "sieve_enabled")) != NULL && + strcasecmp(set_enabled, "no") == 0) { + if ( debug ) { + sieve_sys_debug(svinst, + "Sieve is disabled for this user"); + } + *error_r = SIEVE_ERROR_NOT_POSSIBLE; + return NULL; + } + /* Determine location for default script */ set_default = sieve_setting_get(svinst, "sieve_default"); @@ -527,21 +540,27 @@ struct sieve_storage *sieve_storage_create_main /* Failed; try using default script location (not for temporary failures, read/write access, or dsync) */ if ( set_default == NULL ) { - sieve_sys_debug(svinst, "storage: " - "No default script location configured"); + if ( debug ) { + sieve_sys_debug(svinst, "storage: " + "No default script location configured"); + } } else { - sieve_sys_debug(svinst, "storage: " - "Trying default script location `%s'", - set_default); + if ( debug ) { + sieve_sys_debug(svinst, "storage: " + "Trying default script location `%s'", + set_default); + } storage = sieve_storage_create (svinst, set_default, 0, error_r); if ( storage == NULL ) { switch ( *error_r ) { case SIEVE_ERROR_NOT_FOUND: - sieve_sys_debug(svinst, "storage: " - "Default script location `%s' not found", - set_default); + if ( debug ) { + sieve_sys_debug(svinst, "storage: " + "Default script location `%s' not found", + set_default); + } break; case SIEVE_ERROR_TEMP_FAILURE: sieve_sys_error(svinst, "storage: " diff --git a/src/managesieve/managesieve-client.c b/src/managesieve/managesieve-client.c index d5f3c1e69..0798c2a24 100644 --- a/src/managesieve/managesieve-client.c +++ b/src/managesieve/managesieve-client.c @@ -64,14 +64,23 @@ static struct sieve_storage *client_get_storage struct sieve_storage *storage; enum sieve_error error; + /* Open personal script storage */ + storage = sieve_storage_create_main (svinst, user, SIEVE_STORAGE_FLAG_READWRITE, &error); if (storage == NULL) { switch (error) { + case SIEVE_ERROR_NOT_POSSIBLE: + printf("BYE \"Sieve processing is disabled for this user.\"\n"); + + i_fatal("Failed to open Sieve storage: " + "Sieve is disabled for this user."); + break; case SIEVE_ERROR_NOT_FOUND: - printf("BYE \"Sieve filtering is disabled for this user.\"\n"); + printf("BYE \"This user cannot manage personal Sieve scripts.\"\n"); - i_fatal("Failed to open Sieve storage: Sieve disabled for user"); + i_fatal("Failed to open Sieve storage: " + "Personal script storage disabled or not found."); break; default: { diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index e9ecaa9ed..f9cd05fc6 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -181,6 +181,7 @@ static int lda_sieve_get_personal_storage *storage_r = sieve_storage_create_main(svinst, user, 0, &error); if (*storage_r == NULL) { switch (error) { + case SIEVE_ERROR_NOT_POSSIBLE: case SIEVE_ERROR_NOT_FOUND: break; case SIEVE_ERROR_TEMP_FAILURE: @@ -640,6 +641,8 @@ static int lda_sieve_find_scripts(struct lda_sieve_run_context *srctx) ret = lda_sieve_get_personal_storage (svinst, mdctx->dest_user, &main_storage); + if ( ret == 0 && error == SIEVE_ERROR_NOT_POSSIBLE ) + return 0; if ( ret > 0 ) { srctx->main_script = sieve_storage_active_script_open(main_storage, &error); @@ -920,11 +923,14 @@ static int lda_sieve_deliver_mail T_BEGIN { if (lda_sieve_find_scripts(&srctx) < 0) ret = -1; - else + else if ( srctx.scripts == NULL ) + ret = 0; + else { ret = lda_sieve_execute(&srctx, storage_r); - for ( i = 0; i < srctx.script_count; i++ ) - sieve_script_unref(&srctx.scripts[i]); + for ( i = 0; i < srctx.script_count; i++ ) + sieve_script_unref(&srctx.scripts[i]); + } } T_END; /* Clean up */ -- GitLab