diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-08-01 16:51:12 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-08-01 16:51:12 +0100 |
commit | 62799e3adc1e9c854a9b58bfa58b21405ffb74e6 (patch) | |
tree | 8ddc6dba1135db42b0db28a682cec04489071fd5 /src/libserver/spf.c | |
parent | 9ae4337be55788314c1342d89c4186f8647a6b52 (diff) | |
download | rspamd-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.c | 47 |
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, |