summaryrefslogtreecommitdiffstats
path: root/src/libserver/spf.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-08-01 16:51:12 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-08-01 16:51:12 +0100
commit62799e3adc1e9c854a9b58bfa58b21405ffb74e6 (patch)
tree8ddc6dba1135db42b0db28a682cec04489071fd5 /src/libserver/spf.c
parent9ae4337be55788314c1342d89c4186f8647a6b52 (diff)
downloadrspamd-62799e3adc1e9c854a9b58bfa58b21405ffb74e6.tar.gz
rspamd-62799e3adc1e9c854a9b58bfa58b21405ffb74e6.zip
[Feature] Improve DNS failures when dealing with SPF
Diffstat (limited to 'src/libserver/spf.c')
-rw-r--r--src/libserver/spf.c47
1 files changed, 44 insertions, 3 deletions
diff --git a/src/libserver/spf.c b/src/libserver/spf.c
index aa777f85c..cacb1da75 100644
--- a/src/libserver/spf.c
+++ b/src/libserver/spf.c
@@ -109,7 +109,7 @@ struct spf_dns_cb {
struct spf_record *rec;
struct spf_addr *addr;
struct spf_resolved_element *resolved;
- gchar *ptr_host;
+ const gchar *ptr_host;
spf_action_t cur_action;
gboolean in_include;
};
@@ -152,6 +152,41 @@ check_spf_mech (const gchar *elt, gboolean *need_shift)
}
}
+static const gchar *
+rspamd_spf_dns_action_to_str (spf_action_t act)
+{
+ const char *ret = "unknown";
+
+ switch (act) {
+ case SPF_RESOLVE_MX:
+ ret = "MX";
+ break;
+ case SPF_RESOLVE_A:
+ ret = "A";
+ break;
+ case SPF_RESOLVE_PTR:
+ ret = "PTR";
+ break;
+ case SPF_RESOLVE_AAA:
+ ret = "AAAA";
+ break;
+ case SPF_RESOLVE_REDIRECT:
+ ret = "REDIRECT";
+ break;
+ case SPF_RESOLVE_INCLUDE:
+ ret = "INCLUDE";
+ break;
+ case SPF_RESOLVE_EXISTS:
+ ret = "EXISTS";
+ break;
+ case SPF_RESOLVE_EXP:
+ ret = "EXP";
+ break;
+ }
+
+ return ret;
+}
+
static struct spf_addr *
rspamd_spf_new_addr (struct spf_record *rec,
struct spf_resolved_element *resolved, const gchar *elt)
@@ -707,11 +742,12 @@ spf_record_dns_callback (struct rdns_reply *reply, gpointer arg)
reply->code == RDNS_RC_TIMEOUT) {
cb->addr->flags |= RSPAMD_SPF_FLAG_TEMPFAIL;
msg_info_spf (
- "<%s>: spf error for domain %s: cannot resolve DNS record for"
+ "<%s>: spf error for domain %s: cannot resolve %s DNS record for"
" %s: %s",
task->message_id,
cb->rec->sender_domain,
- cb->resolved->cur_domain,
+ rspamd_spf_dns_action_to_str (cb->cur_action),
+ cb->ptr_host,
rdns_strerror (reply->code));
}
@@ -877,6 +913,7 @@ parse_spf_a (struct spf_record *rec,
rec->dns_requests++;
cb = rspamd_mempool_alloc (task->task_pool, sizeof (struct spf_dns_cb));
cb->rec = rec;
+ cb->ptr_host = host;
cb->addr = addr;
cb->cur_action = SPF_RESOLVE_A;
cb->resolved = resolved;
@@ -959,6 +996,7 @@ parse_spf_mx (struct spf_record *rec,
cb->rec = rec;
cb->addr = addr;
cb->cur_action = SPF_RESOLVE_MX;
+ cb->ptr_host = host;
cb->resolved = resolved;
msg_debug_spf ("resolve mx for %s", host);
@@ -1107,6 +1145,7 @@ parse_spf_include (struct spf_record *rec, struct spf_addr *addr)
cb->cur_action = SPF_RESOLVE_INCLUDE;
addr->m.idx = rec->resolved->len;
cb->resolved = rspamd_spf_new_addr_list (rec, domain);
+ cb->ptr_host = domain;
/* Set reference */
addr->flags |= RSPAMD_SPF_FLAG_REFRENCE;
msg_debug_spf ("resolve include %s", domain);
@@ -1159,6 +1198,7 @@ parse_spf_redirect (struct spf_record *rec,
cb->addr = addr;
cb->cur_action = SPF_RESOLVE_REDIRECT;
cb->resolved = rspamd_spf_new_addr_list (rec, domain);
+ cb->ptr_host = domain;
msg_debug_spf ("resolve redirect %s", domain);
if (make_dns_request_task_forced (task,
@@ -1196,6 +1236,7 @@ parse_spf_exists (struct spf_record *rec, struct spf_addr *addr)
cb->addr = addr;
cb->cur_action = SPF_RESOLVE_EXISTS;
cb->resolved = resolved;
+ cb->ptr_host = host;
msg_debug_spf ("resolve exists %s", host);
if (make_dns_request_task_forced (task,