]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Use generic global string split function
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 28 May 2016 21:26:40 +0000 (22:26 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 28 May 2016 21:26:40 +0000 (22:26 +0100)
src/lua/global_functions.lua
src/plugins/lua/hfilter.lua
src/plugins/lua/ratelimit.lua

index d2c742a9c1f377ccae5d4b28dc8b8b83ab642ab8..9cf5f9a6fa2c441ebaa6d312d3525056fa8ae4a5 100644 (file)
@@ -55,3 +55,11 @@ function rspamd_parse_redis_server(module_name)
 
   return ret
 end
+
+function rspamd_str_split(s, sep)
+  local lpeg = require "lpeg"
+  sep = lpeg.P(sep)
+  local elem = lpeg.C((1 - sep)^0)
+  local p = lpeg.Ct(elem * (sep * elem)^0)   -- make a table capture
+  return lpeg.match(p, s)
+end
\ No newline at end of file
index 1785e8a7bbc3ea528534b6e31216c25479191f1d..3e39638a67d25115f43c3ad2055eb2cafde6fd17 100644 (file)
@@ -125,31 +125,6 @@ local function check_regexp(str, regexp_text)
   return false
 end
 
-local function split(str, delim, maxNb)
-  -- Eliminate bad cases...
-  if string.find(str, delim) == nil then
-    return { str }
-  end
-  if maxNb == nil or maxNb < 1 then
-    maxNb = 0    -- No limit
-  end
-  local result = {}
-  local pat = "(.-)" .. delim .. "()"
-  local nb = 0
-  local lastPos
-  for part, pos in string.gmatch(str, pat) do
-    nb = nb + 1
-    result[nb] = part
-    lastPos = pos
-    if nb == maxNb then break end
-  end
-  -- Handle the last field
-  if nb ~= maxNb then
-    result[nb + 1] = string.sub(str, lastPos)
-  end
-  return result
-end
-
 local function check_fqdn(domain)
   if check_regexp(domain, '(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\\.)+[a-zA-Z0-9-]{2,63}\\.?$)') then
     return true
@@ -407,7 +382,7 @@ local function hfilter(task)
     if from then
       --FROM host check
       for _,fr in ipairs(from) do
-        local fr_split = split(fr['addr'], '@', 0)
+        local fr_split = rspamd_str_split(fr['addr'], '@')
         if table.maxn(fr_split) == 2 then
           check_host(task, fr_split[2], 'FROMHOST', '', '')
           if fr_split[1] == 'postmaster' then
@@ -440,7 +415,7 @@ local function hfilter(task)
   if config['mid_enabled'] then
     local message_id = task:get_message_id()
     if message_id then
-      local mid_split = split(message_id, '@', 0)
+      local mid_split = rspamd_str_split(message_id, '@')
       if table.maxn(mid_split) == 2 and not string.find(mid_split[2], 'local') then
         check_host(task, mid_split[2], 'MID')
       end
index 42ae569c683d324a475690e0aa3379e136e00f96..1032a35b9958cb7445edafc96e6288cce201a79c 100644 (file)
@@ -51,36 +51,10 @@ local rspamd_util = require "rspamd_util"
 local _ = require "fun"
 --local dumper = require 'pl.pretty'.dump
 
---- Utility function for split string to table
-local function split(str, delim, maxNb)
-  -- Eliminate bad cases...
-  if string.find(str, delim) == nil then
-    return { str }
-  end
-  if maxNb == nil or maxNb < 1 then
-    maxNb = 0    -- No limit
-  end
-  local result = {}
-  local pat = "(.-)" .. delim .. "()"
-  local nb = 0
-  local lastPos
-  for part, pos in string.gmatch(str, pat) do
-    nb = nb + 1
-    result[nb] = part
-    lastPos = pos
-    if nb == maxNb then break end
-  end
-  -- Handle the last field
-  if nb ~= maxNb then
-    result[nb + 1] = string.sub(str, lastPos)
-  end
-  return result
-end
-
 --- Parse atime and bucket of limit
 local function parse_limits(data)
   local function parse_limit_elt(str)
-    local elts = split(str, ':', 3)
+    local elts = rspamd_str_split(str, ':')
     if not elts or #elts < 2 then
       return {0, 0, 0}
     else
@@ -341,7 +315,7 @@ end
 
 --- Parse a single limit description
 local function parse_limit(str)
-  local params = split(str, ':', 0)
+  local params = rspamd_str_split(str, ':')
 
   local function set_limit(limit, burst, rate)
     limit[1] = tonumber(burst)
@@ -396,7 +370,7 @@ if opts then
   rspamd_logger.infox(rspamd_config, 'enabled rate buckets: %s', enabled_limits)
 
   if opts['whitelisted_rcpts'] and type(opts['whitelisted_rcpts']) == 'string' then
-    whitelisted_rcpts = split(opts['whitelisted_rcpts'], ',')
+    whitelisted_rcpts = rspamd_str_split(opts['whitelisted_rcpts'], ',')
   elseif type(opts['whitelisted_rcpts']) == 'table' then
     whitelisted_rcpts = opts['whitelisted_rcpts']
   end