aboutsummaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-09-23 16:11:27 +0100
committerGitHub <noreply@github.com>2016-09-23 16:11:27 +0100
commit7b84e095b24fb2b7d4c0912a09397fdf489c61a7 (patch)
tree0299ed47cd348c0863d0715b6b95ccf3ef002dd9 /src/libserver
parentbf1b4bbe3dac782935c110e7e7673317639093db (diff)
parentbaf74ba8c1f6bff834d93aaee9e6afd6b5c97aef (diff)
downloadrspamd-7b84e095b24fb2b7d4c0912a09397fdf489c61a7.tar.gz
rspamd-7b84e095b24fb2b7d4c0912a09397fdf489c61a7.zip
Merge pull request #975 from fatalbanana/spf
[Feature] Add R_SPF_PERMFAIL symbol
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/spf.c68
-rw-r--r--src/libserver/spf.h4
2 files changed, 51 insertions, 21 deletions
diff --git a/src/libserver/spf.c b/src/libserver/spf.c
index 95bcc7628..dd7843eae 100644
--- a/src/libserver/spf.c
+++ b/src/libserver/spf.c
@@ -314,28 +314,33 @@ rspamd_spf_process_reference (struct spf_resolved *target,
if (!(cur->flags & RSPAMD_SPF_FLAG_PARSED)) {
/* Unresolved redirect */
msg_info_spf ("redirect to %s cannot be resolved", cur->spf_string);
- return;
+ cur->flags |= RSPAMD_SPF_FLAG_TEMPFAIL;
+ }
+ else {
+ g_assert (cur->flags & RSPAMD_SPF_FLAG_REFRENCE);
+ g_assert (cur->m.idx < rec->resolved->len);
+ relt = g_ptr_array_index (rec->resolved, cur->m.idx);
+ msg_debug_spf ("domain %s is redirected to %s", elt->cur_domain,
+ relt->cur_domain);
}
-
- g_assert (cur->flags & RSPAMD_SPF_FLAG_REFRENCE);
- g_assert (cur->m.idx < rec->resolved->len);
- relt = g_ptr_array_index (rec->resolved, cur->m.idx);
- msg_debug_spf ("domain %s is redirected to %s", elt->cur_domain,
- relt->cur_domain);
}
for (i = 0; i < elt->elts->len; i++) {
cur = g_ptr_array_index (elt->elts, i);
if (cur->flags & RSPAMD_SPF_FLAG_TEMPFAIL) {
- target->failed = TRUE;
+ target->temp_failed = TRUE;
continue;
}
- else if (!(cur->flags & RSPAMD_SPF_FLAG_PARSED)) {
+ if (cur->flags & RSPAMD_SPF_FLAG_NA) {
+ target->na = TRUE;
+ continue;
+ }
+ if (!(cur->flags & RSPAMD_SPF_FLAG_PARSED)) {
/* Ignore unparsed addrs */
continue;
}
- else if (cur->flags & RSPAMD_SPF_FLAG_REFRENCE) {
+ if (cur->flags & RSPAMD_SPF_FLAG_REFRENCE) {
/* Process reference */
if (cur->flags & RSPAMD_SPF_FLAG_REDIRECT) {
/* Stop on redirected domain */
@@ -371,15 +376,20 @@ rspamd_spf_record_flatten (struct spf_record *rec)
g_assert (rec != NULL);
- res = g_slice_alloc0 (sizeof (*res));
- res->elts = g_array_sized_new (FALSE, FALSE, sizeof (struct spf_addr),
- rec->resolved->len);
- res->domain = g_strdup (rec->sender_domain);
- res->ttl = rec->ttl;
- REF_INIT_RETAIN (res, rspamd_flatten_record_dtor);
+ if (rec->resolved) {
+ res = g_slice_alloc0 (sizeof (*res));
+ res->elts = g_array_sized_new (FALSE, FALSE, sizeof (struct spf_addr),
+ rec->resolved->len);
+ res->domain = g_strdup (rec->sender_domain);
+ res->ttl = rec->ttl;
+ REF_INIT_RETAIN (res, rspamd_flatten_record_dtor);
- if (rec->resolved->len > 0) {
- rspamd_spf_process_reference (res, NULL, rec, TRUE);
+ if (rec->resolved->len > 0) {
+ rspamd_spf_process_reference (res, NULL, rec, TRUE);
+ }
+ }
+ else {
+ return rec;
}
return res;
@@ -1787,8 +1797,26 @@ spf_dns_callback (struct rdns_reply *reply, gpointer arg)
/* Top level resolved element */
rec->ttl = reply->entries->ttl;
}
-
- spf_process_txt_record (rec, resolved, reply);
+ }
+ else if ((reply->code == RDNS_RC_NOREC || reply->code == RDNS_RC_NXDOMAIN)
+ && rec->dns_requests == 0) {
+ resolved = rspamd_spf_new_addr_list (rec, rec->sender_domain);
+ struct spf_addr *addr;
+ addr = g_slice_alloc0 (sizeof (*addr));
+ addr->flags = 0;
+ addr->flags |= RSPAMD_SPF_FLAG_NA;
+ g_ptr_array_insert(resolved->elts, 0, addr);
+ }
+
+ if (!spf_process_txt_record (rec, resolved, reply)) {
+ if (rec->dns_requests == 0) {
+ resolved = g_ptr_array_index (rec->resolved, 0);
+ struct spf_addr *addr;
+ addr = g_slice_alloc0 (sizeof (*addr));
+ addr->flags = 0;
+ addr->flags |= RSPAMD_SPF_FLAG_NA;
+ g_ptr_array_insert(resolved->elts, 0, addr);
+ }
}
rspamd_spf_maybe_return (rec);
diff --git a/src/libserver/spf.h b/src/libserver/spf.h
index 001d3775a..1e2bcfe45 100644
--- a/src/libserver/spf.h
+++ b/src/libserver/spf.h
@@ -38,6 +38,7 @@ typedef enum spf_action_e {
#define RSPAMD_SPF_FLAG_REFRENCE (1 << 6)
#define RSPAMD_SPF_FLAG_REDIRECT (1 << 7)
#define RSPAMD_SPF_FLAG_TEMPFAIL (1 << 8)
+#define RSPAMD_SPF_FLAG_NA (1 << 9)
struct spf_addr {
guchar addr6[sizeof (struct in6_addr)];
@@ -58,7 +59,8 @@ struct spf_addr {
struct spf_resolved {
gchar *domain;
guint ttl;
- gboolean failed;
+ gboolean temp_failed;
+ gboolean na;
GArray *elts; /* Flat list of struct spf_addr */
ref_entry_t ref; /* Refcounting */
};