diff --git a/src/lib-sieve/sieve-script.c b/src/lib-sieve/sieve-script.c index 1f70cce5077243b89234d2d5a1f7be2c49a57ab5..3af517002fdcaa19d31970daaeff132a7b05babf 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 5fd7787a61eece76766aeb610b1d831aa44f5b54..d032c7f2c58d4791fd20e205a38458d600c93cb0 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 9ab5ab3b302d56e36d3041b2501f10a3b788bf77..6b0c8cd1d999c54ae8469f97639a0f836ba63f2c 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 b57f94fa9f3fca8fae33d2d9ed103db689b52648..f611787612a3100704f9b9635db2121397d5b86b 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 a3e00ce735b46621856eaca28b08161704ac58f6..278d1cbdf64a157393c72756b84825a384006903 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;