]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist addAction: Also DNSName(s) 5070/head
authorPieter Lexis <pieter.lexis@powerdns.com>
Wed, 22 Feb 2017 17:04:22 +0000 (18:04 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Thu, 2 Mar 2017 10:35:07 +0000 (11:35 +0100)
pdns/README-dnsdist.md
pdns/dnsdist-lua.cc
pdns/dnsdist-lua.hh
regression-tests.dnsdist/test_Basics.py

index e3d615be80ae1dd356e1d62efd2eaf05c8141884..01fb4b039610b50348acbcadb2a90bb529a66368 100644 (file)
@@ -412,6 +412,10 @@ Cache Hit Response rules, triggered on a cache hit, can be added via:
 
 A DNS rule can be:
 
+ * A string that is either a domain name or netmask
+ * A list of strings that are either domain names or netmasks
+ * A DNSName
+ * A list of DNSNames
  * an AllRule
  * an AndRule
  * a DNSSECRule
index 3a662e713c5d892ad3db48a5520919f99cfc35e0..fe0abd01be683d969a43fb96c31dca68f20dae49 100644 (file)
@@ -91,16 +91,13 @@ private:
   func_t d_func;
 };
 
-typedef boost::variant<string,vector<pair<int, string>>, std::shared_ptr<DNSRule> > luadnsrule_t;
-
 std::shared_ptr<DNSRule> makeRule(const luadnsrule_t& var)
 {
-  if(auto src = boost::get<std::shared_ptr<DNSRule>>(&var))
-    return *src;
-  
+  if (var.type() == typeid(std::shared_ptr<DNSRule>))
+    return *boost::get<std::shared_ptr<DNSRule>>(&var);
+
   SuffixMatchNode smn;
   NetmaskGroup nmg;
-
   auto add=[&](string src) {
     try {
       nmg.addMask(src); // need to try mask first, all masks are domain names!
@@ -108,13 +105,21 @@ std::shared_ptr<DNSRule> makeRule(const luadnsrule_t& var)
       smn.add(DNSName(src));
     }
   };
-  if(auto src = boost::get<string>(&var))
-    add(*src);
-  else {
-    for(auto& a : boost::get<vector<pair<int, string>>>(var)) {
+
+  if (var.type() == typeid(string))
+    add(*boost::get<string>(&var));
+
+  else if (var.type() == typeid(vector<pair<int, string>>))
+    for(const auto& a : *boost::get<vector<pair<int, string>>>(&var))
       add(a.second);
-    }
-  }
+
+  else if (var.type() == typeid(DNSName))
+    smn.add(*boost::get<DNSName>(&var));
+
+  else if (var.type() == typeid(vector<pair<int, DNSName>>))
+    for(const auto& a : *boost::get<vector<pair<int, DNSName>>>(&var))
+      smn.add(a.second);
+
   if(nmg.empty())
     return std::make_shared<SuffixMatchNodeRule>(smn);
   else
index 5e88dfa91f0bef2913786ef56788cb3a86cec810..5a91e69549a5a3e0a8ec087daa4159631cf66cdd 100644 (file)
@@ -21,5 +21,5 @@
  */
 #pragma once
 
-typedef boost::variant<string,vector<pair<int, string>>, std::shared_ptr<DNSRule> > luadnsrule_t;
+typedef boost::variant<string, vector<pair<int, string>>, std::shared_ptr<DNSRule>, DNSName, vector<pair<int, DNSName> > > luadnsrule_t;
 std::shared_ptr<DNSRule> makeRule(const luadnsrule_t& var);
index 496e6410b0744598039b2aafb45ccac86f3892f7..a4b891269edab51008c548f8d8c6fc6d7868d271 100644 (file)
@@ -15,6 +15,8 @@ class TestBasics(DNSDistTest):
     mySMN:add(newDNSName("nameAndQtype.tests.powerdns.com."))
     addAction(AndRule{SuffixMatchNodeRule(mySMN), QTypeRule("TXT")}, RCodeAction(dnsdist.NOTIMP))
     addAction(makeRule("drop.test.powerdns.com."), DropAction())
+    addAction(newDNSName("dnsname.addaction.powerdns.com."), RCodeAction(dnsdist.REFUSED))
+    addAction({newDNSName("dnsname-table1.addaction.powerdns.com."), newDNSName("dnsname-table2.addaction.powerdns.com.")}, RCodeAction(dnsdist.REFUSED))
     block=newDNSName("powerdns.org.")
     function blockFilter(dq)
         if(dq.qname:isPartOf(block))
@@ -380,6 +382,29 @@ class TestBasics(DNSDistTest):
         self.assertEquals(query, receivedQuery)
         self.assertEquals(receivedResponse, None)
 
+    def testAddActionDNSName(self):
+        """
+        Basics: test if addAction accepts a DNSName
+        """
+        name = 'dnsname.addaction.powerdns.com.'
+        query = dns.message.make_query(name, 'A', 'IN')
+        expectedResponse = dns.message.make_response(query)
+        expectedResponse.set_rcode(dns.rcode.REFUSED)
+
+        (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False)
+        self.assertEquals(receivedResponse, expectedResponse)
+
+    def testAddActionDNSNames(self):
+        """
+        Basics: test if addAction accepts a table of DNSNames
+        """
+        for name in ['dnsname-table{}.addaction.powerdns.com.'.format(i) for i in range(1,2)]:
+            query = dns.message.make_query(name, 'A', 'IN')
+            expectedResponse = dns.message.make_response(query)
+            expectedResponse.set_rcode(dns.rcode.REFUSED)
+
+            (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False)
+            self.assertEquals(receivedResponse, expectedResponse)
 
 if __name__ == '__main__':
     unittest.main()