From: Remi Gacogne Date: Tue, 6 Apr 2021 13:06:34 +0000 (+0200) Subject: dnsdist: Add missing getEDNSOptions and getDO bindings for DNSResponse X-Git-Tag: dnsdist-1.5.2~1^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F10355%2Fhead;p=thirdparty%2Fpdns.git dnsdist: Add missing getEDNSOptions and getDO bindings for DNSResponse (cherry picked from commit e292b91b89827450ca116a8fe7dbca146705ba3b) --- diff --git a/pdns/dnsdist-lua-bindings-dnsquestion.cc b/pdns/dnsdist-lua-bindings-dnsquestion.cc index 9c87d129c8..8d194a6c30 100644 --- a/pdns/dnsdist-lua-bindings-dnsquestion.cc +++ b/pdns/dnsdist-lua-bindings-dnsquestion.cc @@ -146,6 +146,16 @@ void setupLuaBindingsDNSQuestion() g_lua.registerFunction editFunc)>("editTTLs", [](const DNSResponse& dr, std::function editFunc) { editDNSPacketTTL((char*) dr.dh, dr.len, editFunc); }); + g_lua.registerFunction("getDO", [](const DNSResponse& dq) { + return getEDNSZ(dq) & EDNS_HEADER_FLAG_DO; + }); + g_lua.registerFunction(DNSResponse::*)()>("getEDNSOptions", [](DNSResponse& dq) { + if (dq.ednsOptions == nullptr) { + parseEDNSOptions(dq); + } + + return *dq.ednsOptions; + }); g_lua.registerFunction("getTrailingData", [](const DNSResponse& dq) { return dq.getTrailingData(); }); diff --git a/regression-tests.dnsdist/test_EDNSOptions.py b/regression-tests.dnsdist/test_EDNSOptions.py index f1e386e825..3f00834f24 100644 --- a/regression-tests.dnsdist/test_EDNSOptions.py +++ b/regression-tests.dnsdist/test_EDNSOptions.py @@ -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} """