@@ -240,8 +240,8 @@ local function gen_dmarc_grammar() | |||
lpeg.locale(lpeg) | |||
local space = lpeg.space ^ 0 | |||
local name = lpeg.C(lpeg.alpha ^ 1) * space | |||
local sep = space * (lpeg.S("\\;") * space) + (lpeg.space ^ 1) | |||
local value = lpeg.C(lpeg.P(lpeg.graph - sep) ^ 1) | |||
local sep = space * (lpeg.S("\\;") * space) + (lpeg.P(lpeg.graph - lpeg.P(',')) * lpeg.space ^ 1) | |||
local value = lpeg.C(lpeg.P(lpeg.P(lpeg.graph + lpeg.space) - sep) ^ 1) | |||
local pair = lpeg.Cg(name * "=" * space * value) * sep ^ -1 | |||
local list = lpeg.Cf(lpeg.Ct("") * pair ^ 0, rawset) | |||
local version = lpeg.P("v") * space * lpeg.P("=") * space * lpeg.P("DMARC1") |
@@ -24,6 +24,7 @@ local rspamd_url = require "rspamd_url" | |||
local rspamd_text = require "rspamd_text" | |||
local rspamd_util = require "rspamd_util" | |||
local rspamd_dns = require "rspamd_dns" | |||
local fun = require "fun" | |||
local N = 'dmarc_report' | |||
@@ -288,11 +289,9 @@ end | |||
-- Process a single rua entry, validating in DNS if needed | |||
local function process_rua(dmarc_domain, rua) | |||
local parts = lua_util.str_split(rua, ',') | |||
-- Remove size limitation, as we don't care about them | |||
local addrs = {} | |||
for _, rua_part in ipairs(parts) do | |||
for _, rua_part in fun.map(lua_util.str_trim, lua_util.str_split(rua, ',')) do | |||
local u = rspamd_url.create(pool, rua_part:gsub('!%d+[kmg]?$', '')) | |||
local u2 = rspamd_url.create(pool, dmarc_domain) | |||
if u and (u:get_protocol() or '') == 'mailto' and u:get_user() then | |||
@@ -331,7 +330,7 @@ local function process_rua(dmarc_domain, rua) | |||
end | |||
end | |||
else | |||
logger.errx('invalid rua url: "%s""', tostring(u or 'null')) | |||
logger.errx('invalid rua url: "%s""', rua_part) | |||
end | |||
end | |||
@@ -559,7 +559,6 @@ void rspamd_url_init(const char *tld_file) | |||
sizeof(struct url_matcher), 13000); | |||
url_scanner->search_trie_full = rspamd_multipattern_create_sized(13000, | |||
RSPAMD_MULTIPATTERN_ICASE | RSPAMD_MULTIPATTERN_UTF8); | |||
url_scanner->has_tld_file = true; | |||
} | |||
else { | |||
url_scanner->matchers_full = NULL; | |||
@@ -572,6 +571,10 @@ void rspamd_url_init(const char *tld_file) | |||
if (tld_file != NULL) { | |||
ret = rspamd_url_parse_tld_file(tld_file, url_scanner); | |||
if (ret) { | |||
url_scanner->has_tld_file = true; | |||
} | |||
} | |||
if (url_scanner->matchers_full && url_scanner->matchers_full->len > 1000) { | |||
@@ -2525,8 +2528,13 @@ rspamd_url_parse(struct rspamd_url *uri, | |||
} | |||
} | |||
else { | |||
/* Ignore IP like domains for mailto, as it is really never supported */ | |||
return URI_ERRNO_TLD_MISSING; | |||
if (url_scanner->has_tld_file) { | |||
/* Ignore IP like domains for mailto, as it is really never supported */ | |||
return URI_ERRNO_TLD_MISSING; | |||
} | |||
else { | |||
uri->flags |= RSPAMD_URL_FLAG_NO_TLD; | |||
} | |||
} | |||
} | |||
} |