commit 99aaa9b: [Minor] Spf: Ignore redirect if `all` is also in a record
Vsevolod Stakhov
vsevolod at highsecure.ru
Tue Dec 17 15:14:09 UTC 2019
Author: Vsevolod Stakhov
Date: 2019-12-17 15:11:03 +0000
URL: https://github.com/rspamd/rspamd/commit/99aaa9bbb378dd6f902901230dbe9ce9ae3ac038 (HEAD -> master)
[Minor] Spf: Ignore redirect if `all` is also in a record
---
src/libserver/spf.c | 38 ++++++++++++++++++++++++++++++++++----
1 file changed, 34 insertions(+), 4 deletions(-)
diff --git a/src/libserver/spf.c b/src/libserver/spf.c
index 762f77a75..ef542a7f5 100644
--- a/src/libserver/spf.c
+++ b/src/libserver/spf.c
@@ -2100,8 +2100,10 @@ expand_spf_macro (struct spf_record *rec, struct spf_resolved_element *resolved,
/* Read current element and try to parse record */
static gboolean
-parse_spf_record (struct spf_record *rec, struct spf_resolved_element *resolved,
- const gchar *elt)
+spf_process_element (struct spf_record *rec,
+ struct spf_resolved_element *resolved,
+ const gchar *elt,
+ const gchar **elts)
{
struct spf_addr *addr = NULL;
gboolean res = FALSE;
@@ -2197,7 +2199,35 @@ parse_spf_record (struct spf_record *rec, struct spf_resolved_element *resolved,
/* redirect */
if (g_ascii_strncasecmp (begin, SPF_REDIRECT,
sizeof (SPF_REDIRECT) - 1) == 0) {
- res = parse_spf_redirect (rec, resolved, addr);
+ /*
+ * According to https://tools.ietf.org/html/rfc7208#section-6.1
+ * There must be no ALL element anywhere in the record,
+ * redirect must be ignored
+ */
+ gboolean ignore_redirect = FALSE;
+
+ for (const gchar **tmp = elts; *tmp != NULL; tmp ++) {
+ if (g_ascii_strcasecmp ((*tmp) + 1, "all") == 0) {
+ ignore_redirect = TRUE;
+ break;
+ }
+ }
+
+ if (!ignore_redirect) {
+ res = parse_spf_redirect (rec, resolved, addr);
+ }
+ else {
+ msg_info_spf ("ignore SPF redirect (%s) for domain %s as there is also all element",
+ begin, rec->sender_domain);
+
+ /* Pop the current addr as it is ignored */
+ g_free (addr->spf_string);
+ g_ptr_array_remove_index_fast (resolved->elts,
+ resolved->elts->len - 1);
+ g_free (addr);
+
+ return TRUE;
+ }
}
else {
msg_info_spf ("spf error for domain %s: bad spf command %s",
@@ -2306,7 +2336,7 @@ start_spf_parse (struct spf_record *rec, struct spf_resolved_element *resolved,
cur_elt = elts;
while (*cur_elt) {
- parse_spf_record (rec, resolved, *cur_elt);
+ spf_process_element (rec, resolved, *cur_elt, (const gchar **)elts);
cur_elt++;
}
More information about the Commits
mailing list