| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | local exports = {}local lpeg = require 'lpeg'local split_grammar = {}local function rspamd_str_split(s, sep)  local gr = split_grammar[sep]  if not gr then    local _sep = lpeg.P(sep)    local elem = lpeg.C((1 - _sep)^0)    local p = lpeg.Ct(elem * (_sep * elem)^0)    gr = p    split_grammar[sep] = gr  end  return gr:match(s)endexports.rspamd_str_split = rspamd_str_splitlocal space = lpeg.S' \t\n\v\f\r'local nospace = 1 - spacelocal ptrim = space^0 * lpeg.C((space^0 * nospace^1)^0)local match = lpeg.matchexports.rspamd_str_trim = function(s)  return match(ptrim, s)end-- Robert Jay Gould http://lua-users.org/wiki/SimpleRoundexports.round = function(num, numDecimalPlaces)  local mult = 10^(numDecimalPlaces or 0)  return math.floor(num * mult) / multendexports.template = function(tmpl, keys)  local var_lit = lpeg.P { lpeg.R("az") + lpeg.R("AZ") + lpeg.R("09") + "_" }  local var = lpeg.P { (lpeg.P("$") / "") * ((var_lit^1) / keys) }  local var_braced = lpeg.P { (lpeg.P("${") / "") * ((var_lit^1) / keys) * (lpeg.P("}") / "") }  local template_grammar = lpeg.Cs((var + var_braced + 1)^0)  return lpeg.match(template_grammar, tmpl)endexports.remove_email_aliases = function(email_addr)  local function check_gmail_user(addr)    -- Remove all points    local no_dots_user = string.gsub(addr.user, '%.', '')    local cap, pluses = string.match(no_dots_user, '^([^%+][^%+]*)(%+.*)$')    if cap then      return cap, rspamd_str_split(pluses, '+'), nil    elseif no_dots_user ~= addr.user then      return no_dots_user,{},nil    end    return nil  end  local function check_address(addr)    if addr.user then      local cap, pluses = string.match(addr.user, '^([^%+][^%+]*)(%+.*)$')      if cap then        return cap, rspamd_str_split(pluses, '+'), nil      end    end    return nil  end  local function set_addr(addr, new_user, new_domain)    if new_user then      addr.user = new_user    end    if new_domain then      addr.domain = new_domain    end    if addr.domain then      addr.addr = string.format('%s@%s', addr.user, addr.domain)    else      addr.addr = string.format('%s@', addr.user)    end    if addr.name and #addr.name > 0 then      addr.raw = string.format('"%s" <%s>', addr.name, addr.addr)    else      addr.raw = string.format('<%s>', addr.addr)    end  end  local function check_gmail(addr)    local nu, tags, nd = check_gmail_user(addr)    if nu then      return nu, tags, nd    end    return nil  end  local function check_googlemail(addr)    local nd = 'gmail.com'    local nu, tags = check_gmail_user(addr)    if nu then      return nu, tags, nd    end    return nil, nil, nd  end  local specific_domains = {    ['gmail.com'] = check_gmail,    ['googlemail.com'] = check_googlemail,  }  if email_addr then    if email_addr.domain and specific_domains[email_addr.domain] then      local nu, tags, nd = specific_domains[email_addr.domain](email_addr)      if nu or nd then        set_addr(email_addr, nu, nd)        return nu, tags      end    else      local nu, tags, nd = check_address(email_addr)      if nu or nd then        set_addr(email_addr, nu, nd)        return nu, tags      end    end    return nil  endendexports.is_rspamc_or_controller = function(task)  local ua = task:get_request_header('User-Agent') or ''  local pwd = task:get_request_header('Password')  local is_rspamc = false  if tostring(ua) == 'rspamc' or pwd then is_rspamc = true end  return is_rspamcendlocal unpack_function = table.unpack or unpackexports.unpack = function(t)  return unpack_function(t)endreturn exports
 |