dovecot-2.2-pigeonhole: lib-sieve: Added sieve_enabled setting t...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Thu Oct 29 21:20:53 UTC 2015


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/96d06e6a9127
changeset: 2124:96d06e6a9127
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Thu Oct 29 22:14:32 2015 +0100
description:
lib-sieve: Added sieve_enabled setting that defaults to "yes".
This allows completely disabling Sieve processing for a particular user.

diffstat:

 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(-)

diffs (144 lines):

diff -r 49391f7404ab -r 96d06e6a9127 src/lib-sieve/sieve-storage.c
--- a/src/lib-sieve/sieve-storage.c	Thu Oct 29 22:14:24 2015 +0100
+++ b/src/lib-sieve/sieve-storage.c	Thu Oct 29 22:14:32 2015 +0100
@@ -378,7 +378,7 @@
 			/* 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 @@
 	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 @@
 	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 @@
 		/* 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 -r 49391f7404ab -r 96d06e6a9127 src/managesieve/managesieve-client.c
--- a/src/managesieve/managesieve-client.c	Thu Oct 29 22:14:24 2015 +0100
+++ b/src/managesieve/managesieve-client.c	Thu Oct 29 22:14:32 2015 +0100
@@ -64,14 +64,23 @@
 	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 -r 49391f7404ab -r 96d06e6a9127 src/plugins/lda-sieve/lda-sieve-plugin.c
--- a/src/plugins/lda-sieve/lda-sieve-plugin.c	Thu Oct 29 22:14:24 2015 +0100
+++ b/src/plugins/lda-sieve/lda-sieve-plugin.c	Thu Oct 29 22:14:32 2015 +0100
@@ -181,6 +181,7 @@
 	*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 @@
 
 	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 @@
 	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 */


More information about the dovecot-cvs mailing list