Browse Source

[Feature] Improve DNS failures when dealing with SPF

tags/1.3.2
Vsevolod Stakhov 8 years ago
parent
commit
62799e3adc
1 changed files with 44 additions and 3 deletions
  1. 44
    3
      src/libserver/spf.c

+ 44
- 3
src/libserver/spf.c View 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,

Loading…
Cancel
Save