From: Vsevolod Stakhov Date: Mon, 1 Aug 2016 15:51:12 +0000 (+0100) Subject: [Feature] Improve DNS failures when dealing with SPF X-Git-Tag: 1.3.2~86 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=62799e3adc1e9c854a9b58bfa58b21405ffb74e6;p=rspamd.git [Feature] Improve DNS failures when dealing with SPF --- 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,