]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] DKIM signing: ensure variables in path are replaced 1526/head
authorAndrew Lewis <nerf@judo.za.org>
Wed, 15 Mar 2017 19:29:58 +0000 (21:29 +0200)
committerAndrew Lewis <nerf@judo.za.org>
Wed, 15 Mar 2017 19:29:58 +0000 (21:29 +0200)
 - Also use lpeg

src/plugins/lua/dkim_signing.lua

index 4f3e0dfc70486d79e488693f1741935c34a3ef0d..105ecf63b74738542ab19527de41c3cb7dd8f521 100644 (file)
@@ -40,6 +40,18 @@ local E = {}
 local N = 'dkim_signing'
 local redis_params
 
+local function simple_template(tmpl, keys)
+  local lpeg = require "lpeg"
+
+  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 rep = lpeg.Cs((var + var_braced + 1)^0)
+
+  return lpeg.match(rep, tmpl)
+end
+
 local function dkim_signing_cb(task)
   local auser = task:get_user()
   if settings.auth_only and not auser then
@@ -120,8 +132,6 @@ local function dkim_signing_cb(task)
   if not p.selector then
     p.selector = settings.selector
   end
-  p.key = string.gsub(p.key, '$selector', p.selector)
-  p.key = string.gsub(p.key, '$domain', dkim_domain)
   p.domain = dkim_domain
 
   if settings.selector_map then
@@ -171,6 +181,7 @@ local function dkim_signing_cb(task)
     end
   else
     if (p.key and p.selector) then
+      p.key = simple_template(p.key, {domain = p.domain, selector = p.selector})
       return rspamd_plugins.dkim.sign(task, p)
     else
       rspamd_logger.infox(task, 'key path or dkim selector unconfigured; no signing')