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.6.0-rc1~19^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e292b91b89827450ca116a8fe7dbca146705ba3b;p=thirdparty%2Fpdns.git dnsdist: Add missing getEDNSOptions and getDO bindings for DNSResponse --- diff --git a/pdns/dnsdist-lua-bindings-dnsquestion.cc b/pdns/dnsdist-lua-bindings-dnsquestion.cc index 0e63a819e2..0c1bf156d0 100644 --- a/pdns/dnsdist-lua-bindings-dnsquestion.cc +++ b/pdns/dnsdist-lua-bindings-dnsquestion.cc @@ -193,6 +193,16 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) luaCtx.registerFunction editFunc)>("editTTLs", [](DNSResponse& dr, std::function editFunc) { editDNSPacketTTL(reinterpret_cast(dr.getMutableData().data()), dr.getData().size(), editFunc); }); + luaCtx.registerFunction("getDO", [](const DNSResponse& dq) { + return getEDNSZ(dq) & EDNS_HEADER_FLAG_DO; + }); + luaCtx.registerFunction(DNSResponse::*)()const>("getEDNSOptions", [](const DNSResponse& dq) { + if (dq.ednsOptions == nullptr) { + parseEDNSOptions(dq); + } + + return *dq.ednsOptions; + }); luaCtx.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 2bf76b9706..fbe762453e 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} """