[Dovecot] antispam plugin claims "antispam signature not found"
Johannes Berg
johannes at sipsolutions.net
Tue Nov 11 13:07:59 EET 2008
On Tue, 2008-11-11 at 11:42 +0100, Johannes Berg wrote:
> Not sure, I personally think that moving them silently makes errors
> harder to diagnose. I'll add an option since then you can set this
> option (antispam_missing_signature = [error|move]) to move after you've
> tested and verified that it works just fine.
Try this patch please, I have only compiled it so far. (there might be
rejects in the signature-log.c file unless you update to the current git
tree but you don't care about that)
diff --git a/antispam.7 b/antispam.7
index d07c1d0..e26db69 100644
--- a/antispam.7
+++ b/antispam.7
@@ -108,6 +108,13 @@ plugin {
# mail signature (used with any backend requiring a signature)
antispam_signature = X-DSPAM-Signature
+ # action to take on mails without signature
+ # (used with any backend requiring a signature)
+ # (we recommend only setting this to 'move' after verifying that the
+ # whole setup is working)
+ # antispam_signature_missing = move # move silently without training
+ antispam_signature_missing = error
+
# semicolon-separated list of Trash folders (default unset i.e. none)
# antispam_trash =
# antispam_trash = trash;Trash;Deleted Items
diff --git a/signature-log.c b/signature-log.c
index ab8cd6d..5b7b306 100644
--- a/signature-log.c
+++ b/signature-log.c
@@ -99,7 +99,12 @@ int backend_handle_mail(struct mailbox_transaction_context *t,
return -1;
}
- signature = signature_extract(t, mail);
+ ret = signature_extract(t, mail, &signature);
+ if (ret)
+ return ret;
+
+ if (!signature)
+ return 0;
switch (wanted) {
case CLASS_SPAM:
diff --git a/signature.c b/signature.c
index 7f9d83b..7ad29d6 100644
--- a/signature.c
+++ b/signature.c
@@ -5,6 +5,7 @@
#include "mail-storage-private.h"
const char *signature_hdr = "X-DSPAM-Signature";
+static int signature_nosig_ignore = 0;
void signature_init(void)
{
@@ -12,6 +13,16 @@ void signature_init(void)
if (tmp)
signature_hdr = tmp;
debug("signature header line is \"%s\"\n", signature_hdr);
+
+ tmp = get_setting("SIGNATURE_MISSING");
+ if (!tmp)
+ tmp = "error";
+ if (strcmp(tmp, "move") == 0) {
+ signature_nosig_ignore = 1;
+ debug("will silently move mails with missing signature\n");
+ } else if (strcmp(tmp, "error") != 0) {
+ debug("invalid signature_missing setting '%s', ignoring\n", tmp);
+ }
}
int signature_extract_to_list(struct mailbox_transaction_context *t,
@@ -23,10 +34,14 @@ int signature_extract_to_list(struct mailbox_transaction_context *t,
signatures = get_mail_headers(mail, signature_hdr);
if (!signatures || !signatures[0]) {
- mail_storage_set_error(t->box->storage,
- ME(NOTPOSSIBLE)
- "antispam signature not found");
- return -1;
+ if (!signature_nosig_ignore) {
+ mail_storage_set_error(t->box->storage,
+ ME(NOTPOSSIBLE)
+ "antispam signature not found");
+ return -1;
+ } else {
+ return 0;
+ }
}
while (signatures[1])
@@ -42,23 +57,30 @@ int signature_extract_to_list(struct mailbox_transaction_context *t,
return 0;
}
-const char *signature_extract(struct mailbox_transaction_context *t,
- struct mail *mail)
+int signature_extract(struct mailbox_transaction_context *t,
+ struct mail *mail, const char **signature)
{
const char *const *signatures;
signatures = get_mail_headers(mail, signature_hdr);
if (!signatures || !signatures[0]) {
- mail_storage_set_error(t->box->storage,
- ME(NOTPOSSIBLE)
- "antispam signature not found");
- return NULL;
+ if (!signature_nosig_ignore) {
+ mail_storage_set_error(t->box->storage,
+ ME(NOTPOSSIBLE)
+ "antispam signature not found");
+ return -1;
+ } else {
+ *signature = NULL;
+ return 0;
+ }
}
while (signatures[1])
signatures++;
- return signatures[0];
+ *signature = signatures[0];
+
+ return 0;
}
void signature_list_free(struct siglist **list)
diff --git a/signature.h b/signature.h
index e25d1b5..1384924 100644
--- a/signature.h
+++ b/signature.h
@@ -16,8 +16,8 @@ void signature_init(void);
int signature_extract_to_list(struct mailbox_transaction_context *t,
struct mail *mail, struct siglist **list,
enum classification wanted);
-const char *signature_extract(struct mailbox_transaction_context *t,
- struct mail *mail);
+int signature_extract(struct mailbox_transaction_context *t,
+ struct mail *mail, const char **signature);
void signature_list_free(struct siglist **list);
extern const char *signature_hdr;
More information about the dovecot
mailing list