luaCtx.registerFunction<void(DNSResponse::*)(std::function<uint32_t(uint8_t section, uint16_t qclass, uint16_t qtype, uint32_t ttl)> editFunc)>("editTTLs", [](DNSResponse& dr, std::function<uint32_t(uint8_t section, uint16_t qclass, uint16_t qtype, uint32_t ttl)> editFunc) {
editDNSPacketTTL(reinterpret_cast<char *>(dr.getMutableData().data()), dr.getData().size(), editFunc);
});
+ luaCtx.registerFunction<bool(DNSResponse::*)()const>("getDO", [](const DNSResponse& dq) {
+ return getEDNSZ(dq) & EDNS_HEADER_FLAG_DO;
+ });
+ luaCtx.registerFunction<std::map<uint16_t, EDNSOptionView>(DNSResponse::*)()const>("getEDNSOptions", [](const DNSResponse& dq) {
+ if (dq.ednsOptions == nullptr) {
+ parseEDNSOptions(dq);
+ }
+
+ return *dq.ednsOptions;
+ });
luaCtx.registerFunction<std::string(DNSResponse::*)(void)const>("getTrailingData", [](const DNSResponse& dq) {
return dq.getTrailingData();
});
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
"""
%s
addAction(AllRule(), LuaAction(testEDNSOptions))
+ addResponseAction("ednsoptions-ecs.tests.powerdns.com.", LuaResponseAction(testEDNSOptionsInResponses))
newServer{address="127.0.0.1:%s", useClientSubnet=true}
"""