]> granicus.if.org Git - pdns/commitdiff
SuffixMatchNode:add: Accept more types
authorPieter Lexis <pieter.lexis@powerdns.com>
Tue, 25 Jun 2019 13:36:31 +0000 (15:36 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Tue, 25 Jun 2019 13:36:31 +0000 (15:36 +0200)
The SuffixMatchNode now also accepts a table of DNSNames, a table of
string, and singular strings.

pdns/dnsdist-lua-bindings.cc
pdns/dnsdistdist/docs/reference/config.rst
pdns/dnsname.hh
regression-tests.dnsdist/test_CheckConfig.py

index d29081e100603277f9e85f57d2a0a9f2d1a8a4fd..322ae318e3244fb60bcab8d646e175deb3e42345 100644 (file)
@@ -205,7 +205,32 @@ void setupLuaBindings(bool client)
   g_lua.registerFunction("empty",(bool (DNSNameSet::*)()) &DNSNameSet::empty);
 
   /* SuffixMatchNode */
-  g_lua.registerFunction("add",(void (SuffixMatchNode::*)(const DNSName&)) &SuffixMatchNode::add);
+  g_lua.registerFunction<void (SuffixMatchNode::*)(const boost::variant<DNSName, string, vector<pair<int, DNSName>>, vector<pair<int, string>>> &name)>("add", [](SuffixMatchNode &smn, const boost::variant<DNSName, string, vector<pair<int, DNSName>>, vector<pair<int, string>>> &name) {
+      if (name.type() == typeid(DNSName)) {
+          auto n = boost::get<DNSName>(name);
+          smn.add(n);
+          return;
+      }
+      if (name.type() == typeid(string)) {
+          auto n = boost::get<string>(name);
+          smn.add(n);
+          return;
+      }
+      if (name.type() == typeid(vector<pair<int, DNSName>>)) {
+          auto names = boost::get<vector<pair<int, DNSName>>>(name);
+          for (auto const n : names) {
+            smn.add(n.second);
+          }
+          return;
+      }
+      if (name.type() == typeid(vector<pair<int, string>>)) {
+          auto names = boost::get<vector<pair<int, string>>>(name);
+          for (auto const n : names) {
+            smn.add(n.second);
+          }
+          return;
+      }
+  });
   g_lua.registerFunction("check",(bool (SuffixMatchNode::*)(const DNSName&) const) &SuffixMatchNode::check);
 
   /* NetmaskGroup */
index 34f876e7ba7a216a3091459a77d38f9f39a0e5e5..958843125d3260c2e87ed3ecd414a8892199c801 100644 (file)
@@ -1072,10 +1072,14 @@ If you are looking for exact name matching, your might want to consider using a
   Represent a set of DNS suffixes for quick matching.
 
   .. method:: SuffixMatchNode:add(name)
+    .. versionchanged:: 1.4.0
+      This method now accepts strings, lists of DNSNames and lists of strings.
 
     Add a suffix to the current set.
 
     :param DNSName name: The suffix to add to the set.
+    :param string name: The suffix to add to the set.
+    :param table name: The suffixes to add to the set. Elements of the table should be of the same type, either DNSName or string.
 
   .. method:: SuffixMatchNode:check(name) -> bool
 
index d4e429c9cd65c260f598e9ee467de294fe5921ad..5b571085e51ca4ac1a143495d547eadc09b69a86 100644 (file)
@@ -394,6 +394,11 @@ struct SuffixMatchNode
       d_nodes.insert(dnsname);
     }
 
+    void add(const std::string& name)
+    {
+      add(DNSName(name));
+    }
+
     void add(std::vector<std::string> labels)
     {
       d_tree.add(labels, true);
index ce9345c05ed68d684a370432a925b3033617c0a1..835d7ae8dd5b016d0edef6e1af9f87555d97b8dc 100644 (file)
@@ -37,6 +37,10 @@ class TestCheckConfig(unittest.TestCase):
             addAction(RegexRule("evil[0-9]{4,}\\\\.regex\\\\.tests\\\\.powerdns\\\\.com$"), RCodeAction(DNSRCode.REFUSED))
             mySMN = newSuffixMatchNode()
             mySMN:add(newDNSName("nameAndQtype.tests.powerdns.com."))
+            mySMN:add("string.smn.tests.powerdns.com.")
+            mySMN:add("string-no-dot.smn.tests.powerdns.com")
+            mySMN:add({"string-one.smn.tests.powerdns.com", "string-two.smn.tests.powerdns.com"})
+            mySMN:add({newDNSName("dnsname-one.smn.tests.powerdns.com"), newDNSName("dnsname-two.smn.tests.powerdns.com")})
             addAction(AndRule{SuffixMatchNodeRule(mySMN), QTypeRule("TXT")}, RCodeAction(DNSRCode.NOTIMP))
             addAction(makeRule("drop.test.powerdns.com."), DropAction())
         """