Re: [Dovecot] antispam plugin claims "antispam signature not found"
Jakob Curdes wrote
Some weeks ago I asked a question on the antispam plugin; obviously nobody could help me. I just worked on it again but made no progress. Is actually anybody out there running the antispam plugin with dspam?? I am willing to write a Wiki page for configuring this as soon as I get it to work. .....
- as soon as I move a message into the spam folder it gives an error message saying "antispam signature not found"
Just had this error myself. In my case, the cause was a large spam message (above the configured MaxMessageSize parameter for DSPAM) that was skipped during tests and thus no signature was added. Might this be true in your case?
As a general suggestion for Johannes: maybe it is better to ignore this error silently, just move the message and don't call DSPAM?
I checked that the given location for the dspam executable is correct, that the user executing it (dovecot?) is actually able to execute dspam and that dspam trusts this user. I triple-checked that the signature is configured correctly. I have lines like
X-DSPAM-Signature: 1,49084a24139132188715614
Another guess: if that comma is not a misprint, something is wrong in your setup.
Regards Eugene
On Tue, 2008-11-11 at 01:04 +0100, Eugene wrote:
Just had this error myself. In my case, the cause was a large spam message (above the configured MaxMessageSize parameter for DSPAM) that was skipped during tests and thus no signature was added. Might this be true in your case?
As a general suggestion for Johannes: maybe it is better to ignore this error silently, just move the message and don't call DSPAM?
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.
johannes
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;
Johannes Berg a écrit :
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;
This message contains information that may be privileged or confidential and is the property of the Capgemini Group. It is intended only for the person to whom it is addressed. If you are not the intended recipient, you are not authorized to read, print, retain, copy, disseminate, distribute, or use this message or any part thereof. If you receive this message in error, please notify the sender immediately and delete all copies of this message.
Eugene wrote (somte time ago, I am just now recollecting my threads):
Jakob Curdes wrote
Some weeks ago I asked a question on the antispam plugin; obviously nobody could help me. I just worked on it again but made no progress. Is actually anybody out there running the antispam plugin with dspam?? I am willing to write a Wiki page for configuring this as soon as I get it to work. .....
- as soon as I move a message into the spam folder it gives an error message saying "antispam signature not found"
Just had this error myself. In my case, the cause was a large spam message (above the configured MaxMessageSize parameter for DSPAM) that was skipped during tests and thus no signature was added. Might this be true in your case? Might be for some messages as I just detected that some messages have a signature and others don't. BUT I also cannot move messages into spam that carry a signature. When I feed the message corpus on the command line it works, but not via the antispam plugin.
X-DSPAM-Signature: 1,49084a24139132188715614
Another guess: if that comma is not a misprint, something is wrong in your setup.
Why? Mine all look like that; are the signatures configurable somewhere in dspam?
JC
On Thu, 2008-11-27 at 20:01 +0100, Jakob Curdes wrote:
Eugene wrote (somte time ago, I am just now recollecting my threads):
Jakob Curdes wrote
Some weeks ago I asked a question on the antispam plugin; obviously nobody could help me. I just worked on it again but made no progress. Is actually anybody out there running the antispam plugin with dspam?? I am willing to write a Wiki page for configuring this as soon as I get it to work. .....
- as soon as I move a message into the spam folder it gives an error message saying "antispam signature not found"
Just had this error myself. In my case, the cause was a large spam message (above the configured MaxMessageSize parameter for DSPAM) that was skipped during tests and thus no signature was added. Might this be true in your case? Might be for some messages as I just detected that some messages have a signature and others don't. BUT I also cannot move messages into spam that carry a signature. When I feed the message corpus on the command line it works, but not via the antispam plugin.
X-DSPAM-Signature: 1,49084a24139132188715614
Another guess: if that comma is not a misprint, something is wrong in your setup. Why? Mine all look like that; are the signatures configurable somewhere in dspam?
DSPAM's signature contains a comma if MySQLUIDInSignature is enabled. That setting does not affect dovecot-antispam though.
Thorsten
participants (5)
-
Eugene
-
Guillaume HILT
-
Jakob Curdes
-
Johannes Berg
-
Thorsten Vollmer