commit - ce0770853228bfae4f35c3e93f93e264fe9b572d
commit + 1aa52bf5bfaea1110d1e02b20808fea070f36ea8
blob - ad6eda64449218610b05e064084c348bdd205291
blob + 6a47d4f782c2fd6c6f807350ab57c00dc9e86614
--- filter-dnsbl.8
+++ filter-dnsbl.8
For more verbose logging the
.Fl v
flag can be used.
+.Pp
+Lists matching the IP address are echoed back to the sender.
+Paid services from Abusix and Spamhaus have their key stripped.
.Sh SEE ALSO
.Xr smtpd 8
blob - b2cf9f56d5beadc7d947e9de4fad4d2f5f466f65
blob + 085bc7ac72402f2b4ce1f9743231d8c23d3685e9
--- main.c
+++ main.c
struct osmtpd_ctx *ctx;
};
-static char **blacklists = NULL;
+static const char **blacklists = NULL;
+static const char **printblacklists;
static size_t nblacklists = 0;
static int markspam = 0;
static int verbose = 0;
-void usage(void);
+const char *dnsbl_printblacklist(const char *);
void dnsbl_connect(struct osmtpd_ctx *, const char *,
struct sockaddr_storage *);
void dnsbl_begin(struct osmtpd_ctx *, uint32_t);
void dnsbl_session_query_done(struct dnsbl_session *);
void *dnsbl_session_new(struct osmtpd_ctx *);
void dnsbl_session_free(struct osmtpd_ctx *, void *);
+void usage(void);
int
main(int argc, char *argv[])
if ((nblacklists = argc - optind) == 0)
osmtpd_errx(1, "No blacklist specified");
- if ((blacklists = calloc(nblacklists, sizeof(*blacklists))) == NULL)
+ blacklists = calloc(nblacklists, sizeof(*blacklists));
+ printblacklists = calloc(nblacklists, sizeof(*printblacklists));
+ if (printblacklists == NULL || blacklists == NULL)
osmtpd_err(1, "malloc");
- for (i = 0; i < nblacklists; i++)
+ for (i = 0; i < nblacklists; i++) {
blacklists[i] = argv[optind + i];
+ printblacklists[i] = dnsbl_printblacklist(argv[optind + i]);
+ }
osmtpd_register_filter_connect(dnsbl_connect);
osmtpd_local_session(dnsbl_session_new, dnsbl_session_free);
osmtpd_run();
return 0;
+}
+
+const char *
+dnsbl_printblacklist(const char *blacklist)
+{
+ /* All of abusix is paid and has a key in the first spot */
+ if (strcasestr(blacklist, ".mail.abusix.zone") != NULL)
+ return strchr(blacklist, '.') + 1;
+ /* XXX assume dq.spamhaus.net is paid and has a key in the first spot */
+ if (strcasestr(blacklist, ".dq.spamhaus.net") != NULL)
+ return strchr(blacklist, '.') + 1;
+ return blacklist;
}
void
if (result->ar_hostent != NULL) {
if (!markspam) {
osmtpd_filter_disconnect(session->ctx, "Listed at %s",
- blacklists[query->blacklist]);
+ printblacklists[query->blacklist]);
fprintf(stderr, "%016"PRIx64" listed at %s: rejected\n",
- session->ctx->reqid, blacklists[query->blacklist]);
+ session->ctx->reqid,
+ printblacklists[query->blacklist]);
} else {
session->listed = query->blacklist;
osmtpd_filter_proceed(session->ctx);
}
if (result->ar_h_errno != HOST_NOT_FOUND) {
osmtpd_filter_disconnect(session->ctx, "DNS error on %s",
- blacklists[query->blacklist]);
+ printblacklists[query->blacklist]);
dnsbl_session_query_done(session);
return;
}
if (session->listed != -1) {
if (!session->logged_mark) {
fprintf(stderr, "%016"PRIx64" listed at %s: Marking as "
- "spam\n", ctx->reqid, blacklists[session->listed]);
+ "spam\n", ctx->reqid,
+ printblacklists[session->listed]);
session->logged_mark = 1;
}
session->set_header = 1;
if (session->set_header) {
osmtpd_filter_dataline(ctx, "X-Spam: yes");
osmtpd_filter_dataline(ctx, "X-Spam-DNSBL: Listed at %s",
- blacklists[session->listed]);
+ printblacklists[session->listed]);
session->set_header = 0;
}