diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2007-10-01 15:05:54 +0200 |
---|---|---|
committer | Johannes Berg <johannes@sipsolutions.net> | 2007-10-01 15:05:54 +0200 |
commit | 2822b28cc9840b5ff3ea192aa12b8154fc3a163a (patch) | |
tree | a6a30b43df884945abe65006c4a76b9b7b9f654c /antispam-storage-1.0.c | |
parent | 74b2bd7184ad32939235be32452d3569bba67370 (diff) | |
download | dovecot-antispam-2822b28cc9840b5ff3ea192aa12b8154fc3a163a.tar.gz dovecot-antispam-2822b28cc9840b5ff3ea192aa12b8154fc3a163a.tar.xz dovecot-antispam-2822b28cc9840b5ff3ea192aa12b8154fc3a163a.zip |
this seems to make the storage-based plugin work
Diffstat (limited to '')
-rw-r--r-- | antispam-storage-1.0.c | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/antispam-storage-1.0.c b/antispam-storage-1.0.c index 73a7993..e8aa6bb 100644 --- a/antispam-storage-1.0.c +++ b/antispam-storage-1.0.c @@ -25,9 +25,17 @@ struct antispam_mail_storage { struct antispam *antispam; }; +enum mailbox_move_type { + MMT_UNINTERESTING, + MMT_FROM_SPAM, + MMT_TO_SPAM, +}; + struct antispam_mailbox { struct mailbox_vfuncs super; + enum mailbox_move_type movetype; + unsigned int save_hack:1; }; @@ -50,17 +58,33 @@ antispam_copy(struct mailbox_transaction_context *t, struct mail *mail, else copy_dest_mail = mail_alloc(t, MAIL_FETCH_PHYSICAL_SIZE, NULL); + i_assert(mail->box); + asbox->save_hack = FALSE; + asbox->movetype = MMT_UNINTERESTING; + + if (!mailbox_is_trash(mail->box) && + !mailbox_is_trash(t->box)) { + bool src_spam = mailbox_is_spam(mail->box); + bool dst_spam = mailbox_is_spam(t->box); + + if (src_spam && !dst_spam) + asbox->movetype = MMT_FROM_SPAM; + else if (!src_spam && dst_spam) + asbox->movetype = MMT_TO_SPAM; + } + if (asbox->super.copy(t, mail, flags, keywords, copy_dest_mail) < 0) return -1; /* * If copying used saving internally, we already have treated the mail */ - if (asbox->save_hack) + if (asbox->save_hack || asbox->movetype == MMT_UNINTERESTING) ret = 0; else - ret = backend_handle_mail(t, ast, copy_dest_mail); + ret = backend_handle_mail(t, ast, copy_dest_mail, + asbox->movetype == MMT_FROM_SPAM); if (copy_dest_mail != dest_mail) mail_free(©_dest_mail); @@ -87,7 +111,11 @@ static int antispam_save_finish(struct mail_save_context *ctx, return -1; asbox->save_hack = TRUE; - ret = backend_handle_mail(ctx->transaction, ast, save_dest_mail); + if (asbox->movetype != MMT_UNINTERESTING) + ret = backend_handle_mail(ctx->transaction, ast, save_dest_mail, + asbox->movetype == MMT_FROM_SPAM); + else + ret = 0; if (save_dest_mail != dest_mail) mail_free(&save_dest_mail); @@ -102,8 +130,6 @@ antispam_transaction_begin(struct mailbox *box) ast = backend_start(box); i_assert(ast != NULL); - debug("antispam: transaction %p begins on %s\n", ast, box->name); - return ast; } @@ -112,21 +138,19 @@ antispam_transaction_rollback(struct antispam_transaction_context **_ast) { struct antispam_transaction_context *ast = *_ast; - debug("antispam: transaction %p rolled back\n", ast); - backend_rollback(ast); *_ast = NULL; } static int -antispam_transaction_commit(struct antispam_transaction_context **_ast) +antispam_transaction_commit(struct mailbox_transaction_context *ctx, + struct antispam_transaction_context **_ast) { struct antispam_transaction_context *ast = *_ast; int ret; - ret = backend_commit(ast); + ret = backend_commit(ctx, ast); *_ast = NULL; - debug("antispam: transaction %p commit: %d\n", ast, ret); return ret; } @@ -152,7 +176,7 @@ antispam_mailbox_transaction_commit(struct mailbox_transaction_context *ctx, struct antispam_mailbox *asbox = ANTISPAM_CONTEXT(ctx->box); struct antispam_transaction_context *ast = ANTISPAM_CONTEXT(ctx); - if (antispam_transaction_commit(&ast) < 0) { + if (antispam_transaction_commit(ctx, &ast) < 0) { asbox->super.transaction_rollback(ctx); return -1; } else |