commit - a28aed5294bf63bca867930a579f60c9cd7e5688
commit + a287838f380d0bec3fca2f273a88d5e466dde790
blob - f43c6b6c7d3d57314501b4c03b9399996f51e308
blob + d0cf8e8bd3eb3c1e829fe329c62f4a20cc5b2298
--- main.c
+++ main.c
#include <arpa/inet.h>
#include <errno.h>
#include <event.h>
+#include <inttypes.h>
#include <netdb.h>
#include <stdlib.h>
#include <stdio.h>
uint64_t token;
char addr[INET6_ADDRSTRLEN];
int listed;
+ int set_header;
+ int logged_mark;
struct dnsbl_query *query;
RB_ENTRY(dnsbl_session) entry;
};
void usage(void);
void dnsbl_connect(char *, int, struct timespec *, char *, char *, uint64_t,
uint64_t, char *, struct inx_addr *);
+void dnsbl_data(char *, int, struct timespec *, char *, char *, uint64_t,
+ uint64_t);
void dnsbl_dataline(char *, int, struct timespec *, char *, char *, uint64_t,
uint64_t, char *);
void dnsbl_disconnect(char *, int, struct timespec *, char *, char *, uint64_t);
blacklists[i] = argv[optind + i];
smtp_register_filter_connect(dnsbl_connect);
- if (markspam)
+ if (markspam) {
+ smtp_register_filter_data(dnsbl_data);
smtp_register_filter_dataline(dnsbl_dataline);
+ }
smtp_in_register_report_disconnect(dnsbl_disconnect);
smtp_run(debug);
session->reqid = reqid;
session->token = token;
session->listed = -1;
+ session->set_header = 0;
+ session->logged_mark = 0;
if (inet_ntop(xaddr->af, xaddr->af == AF_INET ?
(void *)&(xaddr->addr) : (void *)&(xaddr->addr6), session->addr,
sizeof(session->addr)) == NULL)
if (!markspam) {
smtp_filter_disconnect(session->reqid, session->token,
"Listed at %s", blacklists[query->blacklist]);
- log_info("Rejected %s: listed at %s", session->addr,
- blacklists[query->blacklist]);
+ log_info("%016"PRIx64" listed at %s: rejected",
+ session->reqid, blacklists[query->blacklist]);
dnsbl_session_free(session);
} else {
dnsbl_session_query_done(session);
session->listed = query->blacklist;
smtp_filter_proceed(session->reqid, session->token);
- log_info("Marked as spam %s: listed at %s", session->addr,
- blacklists[query->blacklist]);
+ /* Delay logging until we have a message */
}
return;
}
return;
}
smtp_filter_proceed(session->reqid, session->token);
- log_info("%s not listed", session->addr);
+ log_info("%016"PRIx64" not listed", session->reqid);
if (!markspam)
dnsbl_session_free(session);
}
}
void
+dnsbl_data(char *type, int version, struct timespec *tm, char *direction,
+ char *phase, uint64_t reqid, uint64_t token)
+{
+ struct dnsbl_session *session, search;
+
+ search.reqid = reqid;
+ session = RB_FIND(dnsbl_sessions, &dnsbl_sessions, &search);
+
+ if (session->listed != -1) {
+ if (!session->logged_mark) {
+ log_info("%016"PRIx64" listed at %s: Marking as spam",
+ session->reqid, blacklists[session->listed]);
+ session->logged_mark = 1;
+ }
+ session->set_header = 1;
+ }
+ smtp_filter_proceed(reqid, token);
+}
+
+void
dnsbl_dataline(char *type, int version, struct timespec *tm, char *direction,
char *phase, uint64_t reqid, uint64_t token, char *line)
{
search.reqid = reqid;
session = RB_FIND(dnsbl_sessions, &dnsbl_sessions, &search);
- if (session->listed != -1) {
+ if (session->set_header) {
smtp_filter_dataline(reqid, token, "X-Spam: yes");
smtp_filter_dataline(reqid, token, "X-Spam-DNSBL: Listed at %s",
blacklists[session->listed]);
- session->listed = -1;
+ session->set_header = 0;
+
}
smtp_filter_dataline(reqid, token, "%s", line);
}