On 11/28/2016 3:28 PM, Volker Wysk wrote:
Hi!
"Dovecot always logs a detailed error message if something goes wrong. If it doesn't, it's considered a bug and will be fixed." (http:// wiki2.dovecot.org/Logging)
I'm trying to set up a spam filter with dovecot-antispam and dspam as backend.
When I move a spam message from INBOX to Spam, I get this in syslog:
Nov 28 21:15:58 desktop imap: antispam: mailbox_is_unsure(Spam): 0 Nov 28 21:15:58 desktop imap: antispam: mailbox_is_trash(INBOX): 0 Nov 28 21:15:58 desktop imap: antispam: mailbox_is_trash(Spam): 0 Nov 28 21:15:58 desktop imap: antispam: mail copy: from trash: 0, to trash: 0 Nov 28 21:15:58 desktop imap: antispam: mailbox_is_spam(INBOX): 0 Nov 28 21:15:58 desktop imap: antispam: mailbox_is_spam(Spam): 1 Nov 28 21:15:58 desktop imap: antispam: mailbox_is_unsure(INBOX): 0 Nov 28 21:15:58 desktop imap: antispam: mail copy: src spam: 0, dst spam: 1, src unsure: 0
There are no log entries about how dspam is called, or what goes on. Indeed, dspam doesn't get called at all. I know, because I've examined the antispam- plugin source code. There would be a log message if dspam was called.
It's hard to study the source code, because there are hardly any comments.
I have been able to trace the problem to function signature_extract_to_list() in signature.c. There, -1 is returned:
int signature_extract_to_list(const struct signature_config *cfg, struct mailbox_transaction_context *t, struct mail *mail, struct siglist **list, enum classification wanted) { const char *const *signatures; struct siglist *item;
signatures = get_mail_headers(mail, cfg->signature_hdr); if (!signatures || !signatures[0]) { if (!cfg->signature_nosig_ignore) {
mail_storage_set_error(t->box->storage, ME(NOTPOSSIBLE) "antispam signature not found"); return -1; /* <-- HERE */ } else { return 0; }
}
while (signatures[1]) signatures++;
item = i_new(struct siglist, 1); item->next = *list; item->wanted = wanted; item->sig = i_strdup(signatures[0]);
*list = item;
return 0; }
So, what's happening is "antispam signature not found". My question: What does this mean? What's going on?
I too encountered this same issue after upgrading to 2.2.27. I traced it to an apparent change in Dovecot's mail_get_headers() function, which now returns a non-zero value even when the header is found. This wasn't the behavior in 2.2.24, though I'm not sure if it was in .25 or .26. I haven't tracked down the details further.
Anyway, the antispam plugin uses this API to find the X-DSPAM-Signature header, and the change causes the plugin to abort. This happens in the plugin's antispam-plugin.h wrapper, which I modified as follows.
I'm confused why the dovecot API behavior changed, but I hope this helps!
Tom.
*** antispam-plugin.h 2016-12-17 17:25:48.571704442 -0500 --- antispam-plugin.h.orig 2016-12-17 17:24:55.010093416 -0500
*** 268,275 **** static inline const char *const * get_mail_headers(struct mail *mail, const char *hdr) { ! const char *const *ret = NULL; ! mail_get_headers(mail, hdr, &ret); return ret; }
--- 268,276 ---- static inline const char *const * get_mail_headers(struct mail *mail, const char *hdr) { ! const char *const *ret; ! if (mail_get_headers(mail, hdr, &ret)) ! return NULL; return ret; }