]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add missing getEDNSOptions and getDO bindings for DNSResponse 10355/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 6 Apr 2021 13:06:34 +0000 (15:06 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 4 May 2021 16:15:47 +0000 (18:15 +0200)
(cherry picked from commit e292b91b89827450ca116a8fe7dbca146705ba3b)

pdns/dnsdist-lua-bindings-dnsquestion.cc
regression-tests.dnsdist/test_EDNSOptions.py

index 9c87d129c8f9b65c2893f8aed69493b6820810e4..8d194a6c301089b28f990aa52177d8fd11c54efb 100644 (file)
@@ -146,6 +146,16 @@ void setupLuaBindingsDNSQuestion()
   g_lua.registerFunction<void(DNSResponse::*)(std::function<uint32_t(uint8_t section, uint16_t qclass, uint16_t qtype, uint32_t ttl)> editFunc)>("editTTLs", [](const DNSResponse& dr, std::function<uint32_t(uint8_t section, uint16_t qclass, uint16_t qtype, uint32_t ttl)> editFunc) {
         editDNSPacketTTL((char*) dr.dh, dr.len, editFunc);
       });
+  g_lua.registerFunction<bool(DNSResponse::*)()const>("getDO", [](const DNSResponse& dq) {
+      return getEDNSZ(dq) & EDNS_HEADER_FLAG_DO;
+    });
+  g_lua.registerFunction<std::map<uint16_t, EDNSOptionView>(DNSResponse::*)()>("getEDNSOptions", [](DNSResponse& dq) {
+      if (dq.ednsOptions == nullptr) {
+        parseEDNSOptions(dq);
+      }
+
+      return *dq.ednsOptions;
+    });
   g_lua.registerFunction<std::string(DNSResponse::*)(void)>("getTrailingData", [](const DNSResponse& dq) {
       return dq.getTrailingData();
     });
index f1e386e82546fc40a81ab819f370e54903f972e4..3f00834f24f308844ec7ffa289fae52c32e97bef 100644 (file)
@@ -58,6 +58,43 @@ class EDNSOptionsBase(DNSDistTest):
 
       return DNSAction.None, ""
 
+    end
+
+    function testEDNSOptionsInResponses(dr)
+      local options = dr:getEDNSOptions()
+      local qname = tostring(dr.qname)
+
+      if string.match(qname, 'multiplecookies') then
+        return DNSAction.None, ""
+      elseif string.match(qname, 'cookie') then
+        if options[EDNSOptionCode.COOKIE] == nil then
+          return DNSAction.Spoof, "192.0.2.1"
+        end
+        if options[EDNSOptionCode.COOKIE]:count() ~= 1 or options[EDNSOptionCode.COOKIE]:getValues()[1]:len() ~= 16 then
+          return DNSAction.Spoof, "192.0.2.2"
+        end
+      end
+
+      if string.match(qname, 'ecs4') then
+        if options[EDNSOptionCode.ECS] == nil then
+          return DNSAction.Spoof, "192.0.2.51"
+        end
+        if options[EDNSOptionCode.ECS]:count() ~= 1 or options[EDNSOptionCode.ECS]:getValues()[1]:len() ~= 7 then
+          return DNSAction.Spoof, "192.0.2.52"
+        end
+      end
+
+      if string.match(qname, 'ecs6') then
+        if options[EDNSOptionCode.ECS] == nil then
+          return DNSAction.Spoof, "192.0.2.101"
+        end
+        if options[EDNSOptionCode.ECS]:count() ~= 1 or options[EDNSOptionCode.ECS]:getValues()[1]:len() ~= 11 then
+          return DNSAction.Spoof, "192.0.2.102"
+        end
+      end
+
+      return DNSAction.None, ""
+
     end
     """
 
@@ -224,6 +261,7 @@ class TestEDNSOptionsAddingECS(EDNSOptionsBase):
     %s
 
     addAction(AllRule(), LuaAction(testEDNSOptions))
+    addResponseAction("ednsoptions-ecs.tests.powerdns.com.", LuaResponseAction(testEDNSOptionsInResponses))
 
     newServer{address="127.0.0.1:%s", useClientSubnet=true}
     """