]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Add mempool maps in multimap 857/head
authorAndrew Lewis <nerf@judo.za.org>
Thu, 18 Aug 2016 09:23:30 +0000 (11:23 +0200)
committerAndrew Lewis <nerf@judo.za.org>
Thu, 18 Aug 2016 09:23:30 +0000 (11:23 +0200)
src/plugins/lua/multimap.lua
test/functional/cases/102_multimap.robot
test/functional/configs/multimap.conf

index a4577676a884d1780d94583d9c4599b19a277ab4..b36fe9f794c65a32c778210f2c2c9f55c7bcf1ea 100644 (file)
@@ -201,6 +201,30 @@ local function apply_filename_filter(task, filter, fn, r)
   return fn
 end
 
+local function apply_regexp_filter(task, filter, fn, r)
+  if string.find(filter, 'regexp:') then
+    if not r['re_filter'] then
+      local type,pat = string.match(filter, '(regexp:)(.+)')
+      if type and pat then
+        r['re_filter'] = regexp.create(pat)
+      end
+    end
+
+    if not r['re_filter'] then
+      rspamd_logger.errx(task, 'bad search filter: %s', filter)
+    else
+      local results = r['re_filter']:search(fn)
+      if results then
+        return results[1]
+      else
+        return nil
+      end
+    end
+  end
+
+  return fn
+end
+
 local function apply_content_filter(task, filter, r)
   if filter == 'body' then
     return {task:get_rawbody()}
@@ -239,6 +263,7 @@ local multimap_filters = {
   header = apply_addr_filter,
   url = apply_url_filter,
   filename = apply_filename_filter,
+  mempool = apply_regex_filter,
   --content = apply_content_filter, -- Content filters are special :(
 }
 
@@ -519,6 +544,11 @@ local function multimap_callback(task, rule)
     if country then
       match_rule(rule, country)
     end
+  elseif rt == 'mempool' then
+    local var = task:get_mempool():get_variable(rule['variable'])
+    if var then
+      match_rule(rule, var)
+    end
   end
 end
 
@@ -547,6 +577,10 @@ local function add_multimap_rule(key, newrule)
     newrule['description'] = string.format('multimap, type %s: %s', newrule['type'],
       newrule['symbol'])
   end
+  if newrule['type'] == 'mempool' and not newrule['variable'] then
+    rspamd_logger.errx(rspamd_config, 'mempool map requires variable')
+    return nil
+  end
   -- Check cdb flag
   if string.find(newrule['map'], '^cdb://.*$') then
     local test = cdb.create(newrule['map'])
@@ -607,7 +641,8 @@ local function add_multimap_rule(key, newrule)
         or newrule['type'] == 'content'
         or newrule['type'] == 'hostname'
         or newrule['type'] == 'asn'
-        or newrule['type'] == 'country' then
+        or newrule['type'] == 'country'
+        or newrule['type'] == 'mempool' then
         if newrule['regexp'] then
           newrule['hash'] = rspamd_config:add_map ({
             url = newrule['map'],
index de35953784164145b9a054cf7eb692b42814ddc8..abe79f51289d220ffeb0493d7ee9d51ea3d4b852 100644 (file)
@@ -224,10 +224,19 @@ MAP - REDIS - CC - HIT
   ${result} =  Scan Message With Rspamc  ${MESSAGE}  -i  8.8.8.8
   Check Rspamc  ${result}  REDIS_COUNTRY
 
-MAP - REDIS - ASN - MISS
+MAP - REDIS - CC - MISS
   ${result} =  Scan Message With Rspamc  ${MESSAGE}  -i  46.228.47.114
   Check Rspamc  ${result}  REDIS_COUNTRY  inverse=1
 
+MAP - REDIS - ASN FILTERED - HIT
+  Redis HSET  asn  1  ${EMPTY}
+  ${result} =  Scan Message With Rspamc  ${MESSAGE}  -i  8.8.8.8
+  Check Rspamc  ${result}  REDIS_ASN_FILTERED
+
+MAP - REDIS - ASN FILTERED - MISS
+  ${result} =  Scan Message With Rspamc  ${MESSAGE}  -i  46.228.47.114
+  Check Rspamc  ${result}  REDIS_ASN_FILTERED  inverse=1
+
 *** Keywords ***
 Multimap Setup
   ${PLUGIN_CONFIG} =  Get File  ${TESTDIR}/configs/multimap.conf
index 3823914cfd89e6342a382f76345a9723bab8e274..fc20fa14c598d147ae5c8e0f10d6834587cc49a1 100644 (file)
@@ -106,4 +106,10 @@ multimap {
     type = "asn";
     map = "redis://asn";
   }
+  REDIS_ASN_FILTERED {
+    type = "mempool";
+    variable = "asn";
+    map = "redis://asn";
+    filter = "regexp:/^(\d).*/";
+  }
 }