From 42693b979559f9c03bb2f7b1dfe17b74e37cc191 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Mon, 27 Oct 2014 21:58:13 +0100
Subject: [PATCH] doveadm-sieve: Fixed problem with synchronizing the active
 script.

---
 src/lib-sieve/sieve-script.c                  |  8 +++--
 src/lib-sieve/sieve-storage-private.h         |  6 ++++
 src/lib-sieve/sieve-storage-sync.c            | 30 +++++++++++++++++++
 src/lib-sieve/sieve-storage.c                 |  7 +++--
 .../doveadm-sieve/doveadm-sieve-plugin.c      |  2 +-
 5 files changed, 48 insertions(+), 5 deletions(-)

diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c
index 1f70cce50..3af517002 100644
--- a/src/lib-sieve/sieve-script.c
+++ b/src/lib-sieve/sieve-script.c
@@ -520,15 +520,19 @@ int sieve_script_is_active(struct sieve_script *script)
 
 int sieve_script_activate(struct sieve_script *script, time_t mtime)
 {
+	struct sieve_storage *storage = script->storage;
 	int ret;
 
-	i_assert( (script->storage->flags & SIEVE_STORAGE_FLAG_READWRITE) != 0 );
+	i_assert( (storage->flags & SIEVE_STORAGE_FLAG_READWRITE) != 0 );
 	i_assert( script->open ); // FIXME: auto-open?
 
 	i_assert( script->v.activate != NULL );
 	ret = script->v.activate(script);
 
-	sieve_storage_set_modified(script->storage, mtime);
+	if (ret >= 0) {
+		sieve_storage_set_modified(storage, mtime);
+		sieve_storage_sync_script_activate(storage);
+	}
 
 	return ret;
 }
diff --git a/src/lib-sieve/sieve-storage-private.h b/src/lib-sieve/sieve-storage-private.h
index 5fd7787a6..d032c7f2c 100644
--- a/src/lib-sieve/sieve-storage-private.h
+++ b/src/lib-sieve/sieve-storage-private.h
@@ -243,4 +243,10 @@ void sieve_storage_sync_script_rename
 void sieve_storage_sync_script_delete
 	(struct sieve_storage *storage, const char *name);
 
+void sieve_storage_sync_script_activate
+(struct sieve_storage *storage);
+void sieve_storage_sync_deactivate
+(struct sieve_storage *storage);
+
+
 #endif
diff --git a/src/lib-sieve/sieve-storage-sync.c b/src/lib-sieve/sieve-storage-sync.c
index 9ab5ab3b3..6b0c8cd1d 100644
--- a/src/lib-sieve/sieve-storage-sync.c
+++ b/src/lib-sieve/sieve-storage-sync.c
@@ -134,3 +134,33 @@ void sieve_storage_sync_script_delete
 	mail_index_attribute_unset(t->itrans, TRUE, key, ioloop_time);
 	sieve_storage_sync_transaction_finish(storage, &t);
 }
+
+void sieve_storage_sync_script_activate
+(struct sieve_storage *storage)
+{
+	struct mailbox_transaction_context *t;
+
+	if (storage->sync_inbox == NULL)
+		return;
+
+	t = mailbox_transaction_begin(storage->sync_inbox, 0);	
+	mail_index_attribute_set
+		(t->itrans, TRUE, MAILBOX_ATTRIBUTE_SIEVE_DEFAULT, ioloop_time, 0);
+	sieve_storage_sync_transaction_finish(storage, &t);
+}
+
+void sieve_storage_sync_deactivate
+(struct sieve_storage *storage)
+{
+	struct mailbox_transaction_context *t;
+
+	if (storage->sync_inbox == NULL)
+		return;
+	
+	t = mailbox_transaction_begin(storage->sync_inbox, 0);	
+	mail_index_attribute_unset
+		(t->itrans, TRUE, MAILBOX_ATTRIBUTE_SIEVE_DEFAULT, ioloop_time);
+	sieve_storage_sync_transaction_finish(storage, &t);
+}
+
+
diff --git a/src/lib-sieve/sieve-storage.c b/src/lib-sieve/sieve-storage.c
index b57f94fa9..f61178761 100644
--- a/src/lib-sieve/sieve-storage.c
+++ b/src/lib-sieve/sieve-storage.c
@@ -670,8 +670,11 @@ int sieve_storage_deactivate
 
 	i_assert(storage->v.deactivate != NULL);
 	ret = storage->v.deactivate(storage);
-
-	sieve_storage_set_modified(storage, mtime);
+	
+	if (ret >= 0) {
+		sieve_storage_set_modified(storage, mtime);
+		sieve_storage_sync_deactivate(storage);
+	}
 
 	return ret;
 }
diff --git a/src/plugins/doveadm-sieve/doveadm-sieve-plugin.c b/src/plugins/doveadm-sieve/doveadm-sieve-plugin.c
index a3e00ce73..278d1cbdf 100644
--- a/src/plugins/doveadm-sieve/doveadm-sieve-plugin.c
+++ b/src/plugins/doveadm-sieve/doveadm-sieve-plugin.c
@@ -188,7 +188,7 @@ sieve_attribute_unset_active_script(struct mail_storage *storage,
 {
 	int ret;
 
-	if ((ret=sieve_storage_is_singular(svstorage)) <= 0) {
+	if ((ret=sieve_storage_is_singular(svstorage)) != 0) {
 		if (ret < 0)
 			mail_storage_set_internal_error(storage);
 		return ret;
-- 
GitLab