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