}
g_assert (cur != NULL);
- if (!(cur->flags & RSPAMD_SPF_FLAG_PARSED)) {
+ if (!(cur->flags & (RSPAMD_SPF_FLAG_PARSED|RSPAMD_SPF_FLAG_RESOLVED))) {
/* Unresolved redirect */
msg_info_spf ("redirect to %s cannot be resolved", cur->spf_string);
}
target->na = TRUE;
continue;
}
- if (!(cur->flags & RSPAMD_SPF_FLAG_PARSED)) {
+ if ((cur->flags & (RSPAMD_SPF_FLAG_PARSED|RSPAMD_SPF_FLAG_RESOLVED)) !=
+ (RSPAMD_SPF_FLAG_RESOLVED|RSPAMD_SPF_FLAG_PARSED)) {
/* Ignore unparsed addrs */
continue;
}
}
}
else {
+ cb->addr->flags |= RSPAMD_SPF_FLAG_RESOLVED;
+ cb->addr->flags &= ~RSPAMD_SPF_FLAG_PERMFAIL;
spf_record_process_addr (rec, addr, elt_data);
}
break;
case SPF_RESOLVE_A:
case SPF_RESOLVE_AAA:
- cb->addr->flags |= RSPAMD_SPF_FLAG_PARSED;
+ cb->addr->flags |= RSPAMD_SPF_FLAG_RESOLVED;
cb->addr->flags &= ~RSPAMD_SPF_FLAG_PERMFAIL;
spf_record_process_addr (rec, addr, elt_data);
break;
}
}
else {
+ cb->addr->flags |= RSPAMD_SPF_FLAG_RESOLVED;
spf_record_process_addr (rec, addr, elt_data);
}
break;
case SPF_RESOLVE_REDIRECT:
if (elt_data->type == RDNS_REQUEST_TXT) {
if (spf_process_txt_record (rec, cb->resolved, reply)) {
- cb->addr->flags |= RSPAMD_SPF_FLAG_PARSED;
+ cb->addr->flags |= RSPAMD_SPF_FLAG_RESOLVED;
}
else {
- cb->addr->flags &= ~RSPAMD_SPF_FLAG_PARSED;
+ cb->addr->flags &= ~RSPAMD_SPF_FLAG_RESOLVED;
cb->addr->flags |= RSPAMD_SPF_FLAG_PERMFAIL;
}
}
case SPF_RESOLVE_INCLUDE:
if (elt_data->type == RDNS_REQUEST_TXT) {
if (spf_process_txt_record (rec, cb->resolved, reply)) {
- cb->addr->flags |= RSPAMD_SPF_FLAG_PARSED;
+ cb->addr->flags |= RSPAMD_SPF_FLAG_RESOLVED;
}
else {
- cb->addr->flags &= ~RSPAMD_SPF_FLAG_PARSED;
+ cb->addr->flags &= ~RSPAMD_SPF_FLAG_RESOLVED;
}
}
goto end;
case SPF_RESOLVE_EXISTS:
if (elt_data->type == RDNS_REQUEST_A ||
elt_data->type == RDNS_REQUEST_AAAA) {
- /* If specified address resolves, we can accept connection from every IP */
+ /*
+ * If specified address resolves, we can accept
+ * connection from every IP
+ */
+ addr->flags |= RSPAMD_SPF_FLAG_RESOLVED;
spf_record_addr_set (addr, TRUE);
}
break;
else if (reply->code == RDNS_RC_NXDOMAIN || reply->code == RDNS_RC_NOREC) {
switch (cb->cur_action) {
case SPF_RESOLVE_MX:
- if (!rdns_request_has_type (reply->request, RDNS_REQUEST_MX)
- && !rdns_request_has_type (reply->request, RDNS_REQUEST_A)
- && !rdns_request_has_type (reply->request, RDNS_REQUEST_AAAA)) {
- cb->addr->flags &= ~RSPAMD_SPF_FLAG_PARSED;
+ if (!(cb->addr->flags & RSPAMD_SPF_FLAG_RESOLVED)) {
cb->addr->flags |= RSPAMD_SPF_FLAG_PERMFAIL;
msg_debug_spf (
"<%s>: spf error for domain %s: cannot find MX"
rdns_strerror (reply->code));
spf_record_addr_set (addr, FALSE);
}
- else if (!rdns_request_has_type (reply->request, RDNS_REQUEST_A)
- && !rdns_request_has_type (reply->request, RDNS_REQUEST_AAAA)) {
- cb->addr->flags &= ~RSPAMD_SPF_FLAG_PARSED;
+ break;
+ case SPF_RESOLVE_A:
+ if (!(cb->addr->flags & RSPAMD_SPF_FLAG_RESOLVED)) {
cb->addr->flags |= RSPAMD_SPF_FLAG_PERMFAIL;
msg_debug_spf (
- "<%s>: spf error for domain %s: cannot resolve MX"
+ "<%s>: spf error for domain %s: cannot resolve A"
" record for %s: %s",
task->message_id,
cb->rec->sender_domain,
cb->resolved->cur_domain,
rdns_strerror (reply->code));
- spf_record_addr_set (addr, FALSE);
- }
- break;
- case SPF_RESOLVE_A:
- cb->addr->flags &= ~RSPAMD_SPF_FLAG_PARSED;
- cb->addr->flags |= RSPAMD_SPF_FLAG_PERMFAIL;
- msg_debug_spf (
- "<%s>: spf error for domain %s: cannot resolve A"
- " record for %s: %s",
- task->message_id,
- cb->rec->sender_domain,
- cb->resolved->cur_domain,
- rdns_strerror (reply->code));
-
- if (rdns_request_has_type (reply->request, RDNS_REQUEST_A)) {
- spf_record_addr_set (addr, FALSE);
+
+ if (rdns_request_has_type (reply->request, RDNS_REQUEST_A)) {
+ spf_record_addr_set (addr, FALSE);
+ }
}
break;
case SPF_RESOLVE_AAA:
- if (!(cb->addr->flags & RSPAMD_SPF_FLAG_PARSED)) {
+ if (!(cb->addr->flags & RSPAMD_SPF_FLAG_RESOLVED)) {
cb->addr->flags |= RSPAMD_SPF_FLAG_PERMFAIL;
msg_debug_spf (
"<%s>: spf error for domain %s: cannot resolve AAAA"
}
break;
case SPF_RESOLVE_PTR:
- if (!(cb->addr->flags & RSPAMD_SPF_FLAG_PARSED)) {
+ if (!(cb->addr->flags & RSPAMD_SPF_FLAG_RESOLVED)) {
msg_debug_spf (
"<%s>: spf error for domain %s: cannot resolve PTR"
" record for %s: %s",
cb->rec->sender_domain,
cb->resolved->cur_domain,
rdns_strerror (reply->code));
-
- cb->addr->flags &= ~RSPAMD_SPF_FLAG_PARSED;
cb->addr->flags |= RSPAMD_SPF_FLAG_PERMFAIL;
spf_record_addr_set (addr, FALSE);
}
break;
case SPF_RESOLVE_REDIRECT:
- if (!(cb->addr->flags & RSPAMD_SPF_FLAG_PARSED)) {
- cb->addr->flags &= ~RSPAMD_SPF_FLAG_PARSED;
+ if (!(cb->addr->flags & RSPAMD_SPF_FLAG_RESOLVED)) {
cb->addr->flags |= RSPAMD_SPF_FLAG_PERMFAIL;
msg_debug_spf (
"<%s>: spf error for domain %s: cannot resolve REDIRECT"
break;
case SPF_RESOLVE_INCLUDE:
- if (!(cb->addr->flags & RSPAMD_SPF_FLAG_PARSED)) {
+ if (!(cb->addr->flags & RSPAMD_SPF_FLAG_RESOLVED)) {
msg_debug_spf (
"<%s>: spf error for domain %s: cannot resolve INCLUDE"
" record for %s: %s",
rdns_strerror (reply->code));
cb->addr->flags |= RSPAMD_SPF_FLAG_PERMFAIL;
- cb->addr->flags &= ~RSPAMD_SPF_FLAG_PARSED;
}
break;
case SPF_RESOLVE_EXP:
break;
case SPF_RESOLVE_EXISTS:
- if (!(cb->addr->flags & RSPAMD_SPF_FLAG_PARSED)) {
+ if (!(cb->addr->flags & RSPAMD_SPF_FLAG_RESOLVED)) {
msg_debug_spf (
"<%s>: spf error for domain %s: cannot resolve EXISTS"
" record for %s: %s",
memset (&addr->addr6, 0, sizeof (addr->addr6));
/* Here we set all masks to 0 */
addr->m.idx = 0;
- addr->flags |= RSPAMD_SPF_FLAG_ANY;
+ addr->flags |= RSPAMD_SPF_FLAG_ANY|RSPAMD_SPF_FLAG_RESOLVED;
msg_debug_spf ("parsed all elt");
return TRUE;
addr->m.dual.mask_v4 = 32;
}
- addr->flags |= RSPAMD_SPF_FLAG_IPV4;
+ addr->flags |= RSPAMD_SPF_FLAG_IPV4|RSPAMD_SPF_FLAG_RESOLVED;
msg_debug_spf ("parsed ipv4 record %s/%d", ipbuf, addr->m.dual.mask_v4);
return TRUE;
addr->m.dual.mask_v6 = 128;
}
- addr->flags |= RSPAMD_SPF_FLAG_IPV6;
+ addr->flags |= RSPAMD_SPF_FLAG_IPV6|RSPAMD_SPF_FLAG_RESOLVED;
msg_debug_spf ("parsed ipv6 record %s/%d", ipbuf, addr->m.dual.mask_v6);
return TRUE;