diff --git a/src/lib-sieve/sieve-actions.c b/src/lib-sieve/sieve-actions.c index 1782170987749e157b981a87de7e58e70ea1ed69..3d7e04858889d4a1d8f66671b1ce0b7ebb01d8a3 100644 --- a/src/lib-sieve/sieve-actions.c +++ b/src/lib-sieve/sieve-actions.c @@ -780,6 +780,15 @@ void sieve_action_duplicate_mark senv->duplicate_mark(senv, id, id_size, time); } +void sieve_action_duplicate_flush +(const struct sieve_script_env *senv) +{ + if ( senv->duplicate_flush == NULL ) + return; + senv->duplicate_flush(senv); +} + + /* Rejecting the mail */ static bool sieve_action_do_reject_mail diff --git a/src/lib-sieve/sieve-actions.h b/src/lib-sieve/sieve-actions.h index 19bc139acd464ffb0a2ef3fcfd964bea7091829e..37d952290c246285ee8b7d27da9e2fdfade75d60 100644 --- a/src/lib-sieve/sieve-actions.h +++ b/src/lib-sieve/sieve-actions.h @@ -265,6 +265,8 @@ int sieve_action_duplicate_check void sieve_action_duplicate_mark (const struct sieve_script_env *senv, const void *id, size_t id_size, time_t time); +void sieve_action_duplicate_flush + (const struct sieve_script_env *senv); /* Rejecting mail */ diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c index 3e2813b5b17932a00c03057955e3a6df60730f55..9b6743fa42a1aa1ad9fe99467f3fd189b3e2f70f 100644 --- a/src/lib-sieve/sieve-result.c +++ b/src/lib-sieve/sieve-result.c @@ -1248,8 +1248,10 @@ static int sieve_result_transaction_commit_or_rollback struct sieve_result_action *last, bool *implicit_keep, bool *keep) { + const struct sieve_script_env *senv = result->action_env.scriptenv; struct sieve_result_action *rac; int commit_status = status; + bool dup_flushed = FALSE; /* First commit/rollback all storage actions */ rac = first; @@ -1262,6 +1264,11 @@ static int sieve_result_transaction_commit_or_rollback continue; } + if (!dup_flushed) { + sieve_action_duplicate_flush(senv); + dup_flushed = TRUE; + } + status = sieve_result_action_commit_or_rollback (result, rac, status, implicit_keep, keep, &commit_status); diff --git a/src/lib-sieve/sieve-types.h b/src/lib-sieve/sieve-types.h index 293e298882c191fd66fdd9a7513ba57b8f0cef87..8567dc4e299df94d491fd4919897731ac1a02989 100644 --- a/src/lib-sieve/sieve-types.h +++ b/src/lib-sieve/sieve-types.h @@ -206,6 +206,8 @@ struct sieve_script_env { void (*duplicate_mark) (const struct sieve_script_env *senv, const void *id, size_t id_size, time_t time); + void (*duplicate_flush) + (const struct sieve_script_env *senv); /* Interface for rejecting mail */ int (*reject_mail)(const struct sieve_script_env *senv, diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 406070b73048f6840c76d7fb68cb2caecf666825..183c22b63e6e6f4d7ac7e560e4c03f096e20cb91 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -132,6 +132,14 @@ static void lda_sieve_duplicate_mark duplicate_mark(dctx->dup_ctx, id, id_size, senv->user->username, time); } +static void lda_sieve_duplicate_flush +(const struct sieve_script_env *senv) +{ + struct mail_deliver_context *dctx = + (struct mail_deliver_context *) senv->script_context; + duplicate_flush(dctx->dup_ctx); +} + /* * Plugin implementation */ @@ -906,6 +914,7 @@ static int lda_sieve_execute scriptenv.smtp_finish = lda_sieve_smtp_finish; scriptenv.duplicate_mark = lda_sieve_duplicate_mark; scriptenv.duplicate_check = lda_sieve_duplicate_check; + scriptenv.duplicate_flush = lda_sieve_duplicate_flush; scriptenv.reject_mail = lda_sieve_reject_mail; scriptenv.script_context = (void *) mdctx; scriptenv.exec_status = &estatus;