]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Improve DNS failures when dealing with SPF
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 1 Aug 2016 15:51:12 +0000 (16:51 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 1 Aug 2016 15:51:12 +0000 (16:51 +0100)
src/libserver/spf.c

index aa777f85c9cdf42304dacf96f299a81bb12b928b..cacb1da75786831c16d5fac462c557f98f96edb9 100644 (file)
@@ -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,