]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth LUA: support returning empty set in filterForward
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 8 Mar 2024 13:51:55 +0000 (14:51 +0100)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Mon, 11 Mar 2024 10:30:05 +0000 (11:30 +0100)
fixes #12436

docs/lua-records/functions.rst
pdns/lua-record.cc
regression-tests.auth-py/test_LuaRecords.py

index 0c578c72d3834c1945aef1f1b9864b8572161153..c320903c6a5b0d1baceed1d546547f31794d9218 100644 (file)
@@ -442,6 +442,9 @@ Reverse DNS functions
 
     *.static4.example.com IN LUA A "filterForward(createForward(), newNMG({'192.0.2.0/24', '10.0.0.0/8'}))"
 
+  Since 4.9.0: if the fallback parameter is an empty string, ``filterForward`` returns an empty set, yielding a NODATA answer.
+  You cannot combine this feature with DNSSEC.
+
 Helper functions
 ~~~~~~~~~~~~~~~~
 
index 5f3e7cb6156b717e76d58d4d5a1a81afffc42f1c..ed1839c68dffa5d7425cea80a7e1e1d492f3b383 100644 (file)
@@ -1061,16 +1061,20 @@ static void setupLuaRecords(LuaContext& lua) // NOLINT(readability-function-cogn
       ComboAddress ca(address);
 
       if (nmg.match(ComboAddress(address))) {
-        return address;
+        return vector<string>{address};
       } else {
         if (fallback) {
-          return *fallback;
+          if (fallback->empty()) {
+            // if fallback is an empty string, return an empty array
+            return vector<string>{};
+          }
+          return vector<string>{*fallback};
         }
 
         if (ca.isIPv4()) {
-          return string("0.0.0.0");
+          return vector<string>{string("0.0.0.0")};
         } else {
-          return string("::");
+          return vector<string>{string("::")};
         }
       }
     });
index 42aac90372a838b4fa9ff5ffd4abbf70d6a384bc..8fc492e4aedfac030a5f76a9b01dd243b93518d1 100644 (file)
@@ -144,6 +144,8 @@ any              IN           TXT "hello there"
 
 resolve          IN    LUA    A   ";local r=resolve('localhost', 1) local t={{}} for _,v in ipairs(r) do table.insert(t, v:toString()) end return t"
 
+filterforwardempty IN LUA A "filterForward('192.0.2.1', newNMG{{'192.1.2.0/24'}}, '')"
+
 *.createforward  IN    LUA    A     "filterForward(createForward(), newNMG{{'1.0.0.0/8', '64.0.0.0/8'}})"
 *.createreverse  IN    LUA    PTR   "createReverse('%5%.example.com', {{['10.10.10.10'] = 'quad10.example.com.'}})"
 *.createreverse6 IN    LUA    PTR   "createReverse6('%33%.example.com', {{['2001:db8::1'] = 'example.example.com.'}})"
@@ -977,6 +979,18 @@ createforward6.example.org.                 3600 IN NS   ns2.example.org.
         self.assertRcodeEqual(res, dns.rcode.NOERROR)
         self.assertEqual(res.answer, response.answer)
 
+    def testFilterForwardEmpty(self):
+        """
+        Test filterForward() function with empty fallback
+        """
+        name = 'filterforwardempty.example.org.'
+
+        query = dns.message.make_query(name, 'A')
+
+        res = self.sendUDPQuery(query)
+        self.assertRcodeEqual(res, dns.rcode.NOERROR)
+        self.assertEqual(res.answer, [])
+
     def testCreateForwardAndReverse(self):
         expected = {
             ".createforward.example.org." : (dns.rdatatype.A, {