dovecot-2.2-pigeonhole: lib-sieve: storage: Added parameter to s...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Tue May 12 18:53:57 UTC 2015


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/9308f3f2e4d4
changeset: 2059:9308f3f2e4d4
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Tue May 12 20:53:46 2015 +0200
description:
lib-sieve: storage: Added parameter to sieve_script_delete() to allow ignoring the active status of the script.
Normally, the active script cannot be deleted.
This change is necessary to handle doveadm sieve delete -a correctly when the provided script is the default.

diffstat:

 src/lib-sieve/sieve-script.c                         |  23 +++++++++++++------
 src/lib-sieve/sieve-script.h                         |   6 +++-
 src/lib-sieve/sieve-storage.c                        |   2 +-
 src/managesieve/cmd-deletescript.c                   |   2 +-
 src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c |   8 +-----
 src/plugins/doveadm-sieve/doveadm-sieve-sync.c       |   2 +-
 6 files changed, 25 insertions(+), 18 deletions(-)

diffs (126 lines):

diff -r 59d59552247c -r 9308f3f2e4d4 src/lib-sieve/sieve-script.c
--- a/src/lib-sieve/sieve-script.c	Mon May 11 23:05:24 2015 +0200
+++ b/src/lib-sieve/sieve-script.c	Tue May 12 20:53:46 2015 +0200
@@ -592,7 +592,7 @@
 				} else if ( sieve_script_activate(newscript, (time_t)-1) < 0 ) {
 					/* Failed to activate; roll back */
 					ret = -1;
-					(void)sieve_script_delete(newscript);
+					(void)sieve_script_delete(newscript, TRUE);
 					sieve_script_unref(&newscript);
 				}
 
@@ -611,20 +611,25 @@
 	return ret;
 }
 
-int sieve_script_delete(struct sieve_script *script)
+int sieve_script_delete(struct sieve_script *script,
+	bool ignore_active)
 {
 	struct sieve_storage *storage = script->storage;
+	bool is_active = FALSE;
 	int ret = 0;
 
 	i_assert( script->open ); // FIXME: auto-open?
 
 	/* Is the requested script active? */
 	if ( sieve_script_is_active(script) > 0 ) {
-		sieve_script_set_error(script, SIEVE_ERROR_ACTIVE,
-			"Cannot delete the active Sieve script.");
-		if (storage->default_for != NULL)
-			sieve_storage_copy_error(storage->default_for, storage);
-		return -1;
+		is_active = TRUE;
+		if ( !ignore_active ) {
+			sieve_script_set_error(script, SIEVE_ERROR_ACTIVE,
+				"Cannot delete the active Sieve script.");
+			if (storage->default_for != NULL)
+				sieve_storage_copy_error(storage->default_for, storage);
+			return -1;
+		}
 	}
 
 	/* Trying to delete the default script? */
@@ -635,6 +640,10 @@
 
 	i_assert( (script->storage->flags & SIEVE_STORAGE_FLAG_READWRITE) != 0 );
 
+	/* Deactivate it explicity */
+	if ( ignore_active && is_active )
+		(void)sieve_storage_deactivate(storage, (time_t)-1);
+
 	i_assert( script->v.delete != NULL );
 	ret = script->v.delete(script);
 
diff -r 59d59552247c -r 9308f3f2e4d4 src/lib-sieve/sieve-script.h
--- a/src/lib-sieve/sieve-script.h	Mon May 11 23:05:24 2015 +0200
+++ b/src/lib-sieve/sieve-script.h	Tue May 12 20:53:46 2015 +0200
@@ -102,8 +102,10 @@
 int sieve_script_rename
 	(struct sieve_script *script, const char *newname);
 int sieve_script_is_active(struct sieve_script *script);
-int sieve_script_activate(struct sieve_script *script, time_t mtime);
-int sieve_script_delete(struct sieve_script *script);
+int sieve_script_activate
+	(struct sieve_script *script, time_t mtime);
+int sieve_script_delete
+	(struct sieve_script *script, bool ignore_active);
 
 /*
  * Properties
diff -r 59d59552247c -r 9308f3f2e4d4 src/lib-sieve/sieve-storage.c
--- a/src/lib-sieve/sieve-storage.c	Mon May 11 23:05:24 2015 +0200
+++ b/src/lib-sieve/sieve-storage.c	Tue May 12 20:53:46 2015 +0200
@@ -1140,7 +1140,7 @@
 		} else if ( sieve_script_activate(script, (time_t)-1) < 0 ) {
 			/* Failed to activate; roll back */
 			ret = -1;
-			(void)sieve_script_delete(script);
+			(void)sieve_script_delete(script, TRUE);
 			sieve_script_unref(&script);
 		}
 
diff -r 59d59552247c -r 9308f3f2e4d4 src/managesieve/cmd-deletescript.c
--- a/src/managesieve/cmd-deletescript.c	Mon May 11 23:05:24 2015 +0200
+++ b/src/managesieve/cmd-deletescript.c	Tue May 12 20:53:46 2015 +0200
@@ -28,7 +28,7 @@
 		return TRUE;
 	}
 
-	if ( sieve_script_delete(script) < 0 ) {
+	if ( sieve_script_delete(script, FALSE) < 0 ) {
 		client_send_storage_error(client, storage);
 	} else {
 		client_send_ok(client, "Deletescript completed.");
diff -r 59d59552247c -r 9308f3f2e4d4 src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c
--- a/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c	Mon May 11 23:05:24 2015 +0200
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-cmd-delete.c	Tue May 12 20:53:46 2015 +0200
@@ -39,13 +39,9 @@
 		if (script == NULL) {
 			sret =  -1;
 		} else {
-			if (sieve_script_delete(script) < 0) {
+			if (sieve_script_delete(script, ctx->ignore_active) < 0) {
 				(void)sieve_storage_get_last_error(storage, &error);
-				if (!ctx->ignore_active || error != SIEVE_ERROR_ACTIVE ||
-					sieve_storage_deactivate(storage, (time_t)-1) < 0 ||
-					sieve_script_delete(script) < 0) {
-					sret = -1;
-				}
+				sret = -1;
 			}
 			sieve_script_unref(&script);
 		}
diff -r 59d59552247c -r 9308f3f2e4d4 src/plugins/doveadm-sieve/doveadm-sieve-sync.c
--- a/src/plugins/doveadm-sieve/doveadm-sieve-sync.c	Mon May 11 23:05:24 2015 +0200
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-sync.c	Tue May 12 20:53:46 2015 +0200
@@ -118,7 +118,7 @@
 	if (script == NULL) { 
 		ret = -1;
 	} else {
-		ret = sieve_script_delete(script);
+		ret = sieve_script_delete(script, TRUE);
 		sieve_script_unref(&script);
 	}
 


More information about the dovecot-cvs mailing list