From: georgeto Date: Fri, 13 Nov 2020 13:05:36 +0000 (+0100) Subject: dnsdist: Improve const-correctness of Lua bindings X-Git-Tag: auth-4.4.0-beta1~15^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F9721%2Fhead;p=thirdparty%2Fpdns.git dnsdist: Improve const-correctness of Lua bindings Since LuaWrapper enforces const-correctness, a const (shared) pointer to an object can only read members and call const methods. Therefore we have to take care to use the const qualifier during registration of constant lambda Lua function bindings. An example where the absence of the const qualifier was problematic is LuaRule, which invokes its user provided match function with a constant DNSQuestion object. Because the functions of DNSQuestion lacked the const qualifier (e.g. getTag()), it was not possible to call them from within the LuaRule match function. --- diff --git a/pdns/dnsdist-ecs.cc b/pdns/dnsdist-ecs.cc index 76f0129c20..000ad409c4 100644 --- a/pdns/dnsdist-ecs.cc +++ b/pdns/dnsdist-ecs.cc @@ -493,7 +493,7 @@ static bool replaceEDNSClientSubnetOption(char * const packet, const size_t pack /* This function looks for an OPT RR, return true if a valid one was found (even if there was no options) and false otherwise. */ -bool parseEDNSOptions(DNSQuestion& dq) +bool parseEDNSOptions(const DNSQuestion& dq) { assert(dq.dh != nullptr); assert(dq.consumed <= dq.len); diff --git a/pdns/dnsdist-ecs.hh b/pdns/dnsdist-ecs.hh index 293bc0cd92..7a34084b41 100644 --- a/pdns/dnsdist-ecs.hh +++ b/pdns/dnsdist-ecs.hh @@ -42,7 +42,7 @@ bool setNegativeAndAdditionalSOA(DNSQuestion& dq, bool nxd, const DNSName& zone, bool handleEDNSClientSubnet(DNSQuestion& dq, bool& ednsAdded, bool& ecsAdded, bool preserveTrailingData); bool handleEDNSClientSubnet(char* packet, size_t packetSize, unsigned int consumed, uint16_t* len, bool& ednsAdded, bool& ecsAdded, bool overrideExisting, const string& newECSOption, bool preserveTrailingData); -bool parseEDNSOptions(DNSQuestion& dq); +bool parseEDNSOptions(const DNSQuestion& dq); int getEDNSZ(const DNSQuestion& dq); bool queryHasEDNS(const DNSQuestion& dq); diff --git a/pdns/dnsdist-lua-actions.cc b/pdns/dnsdist-lua-actions.cc index dbbcaadfda..aef1511f46 100644 --- a/pdns/dnsdist-lua-actions.cc +++ b/pdns/dnsdist-lua-actions.cc @@ -1549,7 +1549,7 @@ void setupLuaActions(LuaContext& luaCtx) addAction(&g_selfansweredresprulactions, var, boost::get >(era), params); }); - luaCtx.registerFunction("printStats", [](const DNSAction& ta) { + luaCtx.registerFunction("printStats", [](const DNSAction& ta) { setLuaNoSideEffect(); auto stats = ta.getStats(); for(const auto& s : stats) { diff --git a/pdns/dnsdist-lua-bindings-dnsquestion.cc b/pdns/dnsdist-lua-bindings-dnsquestion.cc index eaa1ef31bc..b0b4a2f39c 100644 --- a/pdns/dnsdist-lua-bindings-dnsquestion.cc +++ b/pdns/dnsdist-lua-bindings-dnsquestion.cc @@ -52,25 +52,25 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) dq.tempFailureTTL = newValue; } ); - luaCtx.registerFunction("getDO", [](const DNSQuestion& dq) { + luaCtx.registerFunction("getDO", [](const DNSQuestion& dq) { return getEDNSZ(dq) & EDNS_HEADER_FLAG_DO; }); - luaCtx.registerFunction(DNSQuestion::*)()>("getEDNSOptions", [](DNSQuestion& dq) { + luaCtx.registerFunction(DNSQuestion::*)()const>("getEDNSOptions", [](const DNSQuestion& dq) { if (dq.ednsOptions == nullptr) { parseEDNSOptions(dq); } return *dq.ednsOptions; }); - luaCtx.registerFunction("getTrailingData", [](const DNSQuestion& dq) { + luaCtx.registerFunction("getTrailingData", [](const DNSQuestion& dq) { return dq.getTrailingData(); }); luaCtx.registerFunction("setTrailingData", [](DNSQuestion& dq, const std::string& tail) { return dq.setTrailingData(tail); }); - luaCtx.registerFunction("getServerNameIndication", [](const DNSQuestion& dq) { + luaCtx.registerFunction("getServerNameIndication", [](const DNSQuestion& dq) { return dq.sni; }); @@ -97,7 +97,7 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) dq.qTag->insert({tag.first, tag.second}); } }); - luaCtx.registerFunction("getTag", [](const DNSQuestion& dq, const std::string& strLabel) { + luaCtx.registerFunction("getTag", [](const DNSQuestion& dq, const std::string& strLabel) { if (!dq.qTag) { return string(); } @@ -109,7 +109,7 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) } return it->second; }); - luaCtx.registerFunction("getTagArray", [](const DNSQuestion& dq) { + luaCtx.registerFunction("getTagArray", [](const DNSQuestion& dq) { if (!dq.qTag) { QTag empty; return empty; @@ -146,7 +146,7 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) luaCtx.registerFunction editFunc)>("editTTLs", [](const DNSResponse& dr, std::function editFunc) { editDNSPacketTTL((char*) dr.dh, dr.len, editFunc); }); - luaCtx.registerFunction("getTrailingData", [](const DNSResponse& dq) { + luaCtx.registerFunction("getTrailingData", [](const DNSResponse& dq) { return dq.getTrailingData(); }); luaCtx.registerFunction("setTrailingData", [](DNSResponse& dq, const std::string& tail) { @@ -169,7 +169,7 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) dr.qTag->insert({tag.first, tag.second}); } }); - luaCtx.registerFunction("getTag", [](const DNSResponse& dr, const std::string& strLabel) { + luaCtx.registerFunction("getTag", [](const DNSResponse& dr, const std::string& strLabel) { if (!dr.qTag) { return string(); } @@ -181,7 +181,7 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) } return it->second; }); - luaCtx.registerFunction("getTagArray", [](const DNSResponse& dr) { + luaCtx.registerFunction("getTagArray", [](const DNSResponse& dr) { if (!dr.qTag) { QTag empty; return empty; @@ -199,35 +199,35 @@ void setupLuaBindingsDNSQuestion(LuaContext& luaCtx) }); #ifdef HAVE_DNS_OVER_HTTPS - luaCtx.registerFunction("getHTTPPath", [](const DNSQuestion& dq) { + luaCtx.registerFunction("getHTTPPath", [](const DNSQuestion& dq) { if (dq.du == nullptr) { return std::string(); } return dq.du->getHTTPPath(); }); - luaCtx.registerFunction("getHTTPQueryString", [](const DNSQuestion& dq) { + luaCtx.registerFunction("getHTTPQueryString", [](const DNSQuestion& dq) { if (dq.du == nullptr) { return std::string(); } return dq.du->getHTTPQueryString(); }); - luaCtx.registerFunction("getHTTPHost", [](const DNSQuestion& dq) { + luaCtx.registerFunction("getHTTPHost", [](const DNSQuestion& dq) { if (dq.du == nullptr) { return std::string(); } return dq.du->getHTTPHost(); }); - luaCtx.registerFunction("getHTTPScheme", [](const DNSQuestion& dq) { + luaCtx.registerFunction("getHTTPScheme", [](const DNSQuestion& dq) { if (dq.du == nullptr) { return std::string(); } return dq.du->getHTTPScheme(); }); - luaCtx.registerFunction(DNSQuestion::*)(void)>("getHTTPHeaders", [](const DNSQuestion& dq) { + luaCtx.registerFunction(DNSQuestion::*)(void)const>("getHTTPHeaders", [](const DNSQuestion& dq) { if (dq.du == nullptr) { return std::unordered_map(); } diff --git a/pdns/dnsdist-lua-bindings.cc b/pdns/dnsdist-lua-bindings.cc index 2b348ac59e..50e95bf60a 100644 --- a/pdns/dnsdist-lua-bindings.cc +++ b/pdns/dnsdist-lua-bindings.cc @@ -42,7 +42,7 @@ void setupLuaBindings(LuaContext& luaCtx, bool client) }); /* Exceptions */ - luaCtx.registerFunction("__tostring", [](const std::exception_ptr& eptr) { + luaCtx.registerFunction("__tostring", [](const std::exception_ptr& eptr) { try { if (eptr) { std::rethrow_exception(eptr); @@ -102,8 +102,8 @@ void setupLuaBindings(LuaContext& luaCtx, bool client) g_pools.setState(localPools); s->pools.erase(pool); }); - luaCtx.registerFunction("getOutstanding", [](const DownstreamState& s) { return s.outstanding.load(); }); - luaCtx.registerFunction("getLatency", [](const DownstreamState& s) { return s.latencyUsec; }); + luaCtx.registerFunction("getOutstanding", [](const DownstreamState& s) { return s.outstanding.load(); }); + luaCtx.registerFunction("getLatency", [](const DownstreamState& s) { return s.latencyUsec; }); luaCtx.registerFunction("isUp", &DownstreamState::isUp); luaCtx.registerFunction("setDown", &DownstreamState::setDown); luaCtx.registerFunction("setUp", &DownstreamState::setUp); @@ -113,8 +113,8 @@ void setupLuaBindings(LuaContext& luaCtx, bool client) } s.setAuto(); }); - luaCtx.registerFunction("getName", [](const DownstreamState& s) { return s.getName(); }); - luaCtx.registerFunction("getNameWithAddr", [](const DownstreamState& s) { return s.getNameWithAddr(); }); + luaCtx.registerFunction("getName", [](const DownstreamState& s) { return s.getName(); }); + luaCtx.registerFunction("getNameWithAddr", [](const DownstreamState& s) { return s.getNameWithAddr(); }); luaCtx.registerMember("upStatus", &DownstreamState::upStatus); luaCtx.registerMember("weight", [](const DownstreamState& s) -> int {return s.weight;}, @@ -122,7 +122,7 @@ void setupLuaBindings(LuaContext& luaCtx, bool client) ); luaCtx.registerMember("order", &DownstreamState::order); luaCtx.registerMember("name", [](const DownstreamState& backend) -> const std::string { return backend.getName(); }, [](DownstreamState& backend, const std::string& newName) { backend.setName(newName); }); - luaCtx.registerFunction("getID", [](const DownstreamState& s) { return boost::uuids::to_string(s.id); }); + luaCtx.registerFunction("getID", [](const DownstreamState& s) { return boost::uuids::to_string(s.id); }); /* dnsheader */ luaCtx.registerFunction("setRD", [](dnsheader& dh, bool v) { @@ -199,40 +199,40 @@ void setupLuaBindings(LuaContext& luaCtx, bool client) } return ComboAddress(); }); - luaCtx.registerFunction("tostring", [](const ComboAddress& ca) { return ca.toString(); }); - luaCtx.registerFunction("tostringWithPort", [](const ComboAddress& ca) { return ca.toStringWithPort(); }); - luaCtx.registerFunction("toString", [](const ComboAddress& ca) { return ca.toString(); }); - luaCtx.registerFunction("toStringWithPort", [](const ComboAddress& ca) { return ca.toStringWithPort(); }); - luaCtx.registerFunction("getPort", [](const ComboAddress& ca) { return ntohs(ca.sin4.sin_port); } ); + luaCtx.registerFunction("tostring", [](const ComboAddress& ca) { return ca.toString(); }); + luaCtx.registerFunction("tostringWithPort", [](const ComboAddress& ca) { return ca.toStringWithPort(); }); + luaCtx.registerFunction("toString", [](const ComboAddress& ca) { return ca.toString(); }); + luaCtx.registerFunction("toStringWithPort", [](const ComboAddress& ca) { return ca.toStringWithPort(); }); + luaCtx.registerFunction("getPort", [](const ComboAddress& ca) { return ntohs(ca.sin4.sin_port); } ); luaCtx.registerFunction("truncate", [](ComboAddress& ca, unsigned int bits) { ca.truncate(bits); }); - luaCtx.registerFunction("isIPv4", [](const ComboAddress& ca) { return ca.sin4.sin_family == AF_INET; }); - luaCtx.registerFunction("isIPv6", [](const ComboAddress& ca) { return ca.sin4.sin_family == AF_INET6; }); - luaCtx.registerFunction("isMappedIPv4", [](const ComboAddress& ca) { return ca.isMappedIPv4(); }); - luaCtx.registerFunction("mapToIPv4", [](const ComboAddress& ca) { return ca.mapToIPv4(); }); + luaCtx.registerFunction("isIPv4", [](const ComboAddress& ca) { return ca.sin4.sin_family == AF_INET; }); + luaCtx.registerFunction("isIPv6", [](const ComboAddress& ca) { return ca.sin4.sin_family == AF_INET6; }); + luaCtx.registerFunction("isMappedIPv4", [](const ComboAddress& ca) { return ca.isMappedIPv4(); }); + luaCtx.registerFunction("mapToIPv4", [](const ComboAddress& ca) { return ca.mapToIPv4(); }); luaCtx.registerFunction("match", [](nmts_t& s, const ComboAddress& ca) { return s.match(ca); }); /* DNSName */ luaCtx.registerFunction("isPartOf", &DNSName::isPartOf); luaCtx.registerFunction("chopOff", [](DNSName&dn ) { return dn.chopOff(); }); - luaCtx.registerFunction("countLabels", [](const DNSName& name) { return name.countLabels(); }); - luaCtx.registerFunction("hash", [](const DNSName& name) { return name.hash(); }); - luaCtx.registerFunction("wirelength", [](const DNSName& name) { return name.wirelength(); }); - luaCtx.registerFunction("tostring", [](const DNSName&dn ) { return dn.toString(); }); - luaCtx.registerFunction("toString", [](const DNSName&dn ) { return dn.toString(); }); - luaCtx.registerFunction("toDNSString", [](const DNSName&dn ) { return dn.toDNSString(); }); + luaCtx.registerFunction("countLabels", [](const DNSName& name) { return name.countLabels(); }); + luaCtx.registerFunction("hash", [](const DNSName& name) { return name.hash(); }); + luaCtx.registerFunction("wirelength", [](const DNSName& name) { return name.wirelength(); }); + luaCtx.registerFunction("tostring", [](const DNSName&dn ) { return dn.toString(); }); + luaCtx.registerFunction("toString", [](const DNSName&dn ) { return dn.toString(); }); + luaCtx.registerFunction("toDNSString", [](const DNSName&dn ) { return dn.toDNSString(); }); luaCtx.writeFunction("newDNSName", [](const std::string& name) { return DNSName(name); }); luaCtx.writeFunction("newDNSNameFromRaw", [](const std::string& name) { return DNSName(name.c_str(), name.size(), 0, false); }); luaCtx.writeFunction("newSuffixMatchNode", []() { return SuffixMatchNode(); }); luaCtx.writeFunction("newDNSNameSet", []() { return DNSNameSet(); }); /* DNSNameSet */ - luaCtx.registerFunction("toString", [](const DNSNameSet&dns ) { return dns.toString(); }); + luaCtx.registerFunction("toString", [](const DNSNameSet&dns ) { return dns.toString(); }); luaCtx.registerFunction("add", [](DNSNameSet& dns, DNSName& dn) { dns.insert(dn); }); luaCtx.registerFunction("check", [](DNSNameSet& dns, DNSName& dn) { return dns.find(dn) != dns.end(); }); luaCtx.registerFunction("delete",(size_t (DNSNameSet::*)(const DNSName&)) &DNSNameSet::erase); luaCtx.registerFunction("size",(size_t (DNSNameSet::*)() const) &DNSNameSet::size); luaCtx.registerFunction("clear",(void (DNSNameSet::*)()) &DNSNameSet::clear); - luaCtx.registerFunction("empty",(bool (DNSNameSet::*)()) &DNSNameSet::empty); + luaCtx.registerFunction("empty",(bool (DNSNameSet::*)() const) &DNSNameSet::empty); /* SuffixMatchNode */ luaCtx.registerFunction>, vector>> &name)>("add", [](SuffixMatchNode &smn, const boost::variant>, vector>> &name) { @@ -309,8 +309,8 @@ void setupLuaBindings(LuaContext& luaCtx, bool client) }); luaCtx.registerFunction("empty", &Netmask::empty); luaCtx.registerFunction("getBits", &Netmask::getBits); - luaCtx.registerFunction("getNetwork", [](const Netmask& nm) { return nm.getNetwork(); } ); // const reference makes this necessary - luaCtx.registerFunction("getMaskedNetwork", [](const Netmask& nm) { return nm.getMaskedNetwork(); } ); + luaCtx.registerFunction("getNetwork", [](const Netmask& nm) { return nm.getNetwork(); } ); // const reference makes this necessary + luaCtx.registerFunction("getMaskedNetwork", [](const Netmask& nm) { return nm.getMaskedNetwork(); } ); luaCtx.registerFunction("isIpv4", &Netmask::isIPv4); luaCtx.registerFunction("isIPv4", &Netmask::isIPv4); luaCtx.registerFunction("isIpv6", &Netmask::isIPv6); @@ -336,14 +336,14 @@ void setupLuaBindings(LuaContext& luaCtx, bool client) luaCtx.registerFunction("match", (bool (NetmaskGroup::*)(const ComboAddress&) const)&NetmaskGroup::match); luaCtx.registerFunction("size", &NetmaskGroup::size); luaCtx.registerFunction("clear", &NetmaskGroup::clear); - luaCtx.registerFunction("toString", [](const NetmaskGroup& nmg ) { return "NetmaskGroup " + nmg.toString(); }); + luaCtx.registerFunction("toString", [](const NetmaskGroup& nmg ) { return "NetmaskGroup " + nmg.toString(); }); /* QPSLimiter */ luaCtx.writeFunction("newQPSLimiter", [](int rate, int burst) { return QPSLimiter(rate, burst); }); luaCtx.registerFunction("check", &QPSLimiter::check); /* ClientState */ - luaCtx.registerFunction("toString", [](const ClientState& fe) { + luaCtx.registerFunction("toString", [](const ClientState& fe) { setLuaNoSideEffect(); return fe.local.toStringWithPort(); }); @@ -392,7 +392,7 @@ void setupLuaBindings(LuaContext& luaCtx, bool client) } }); - luaCtx.registerFunction::*)()>("getStats", [](const std::shared_ptr bpf) { + luaCtx.registerFunction::*)()const>("getStats", [](const std::shared_ptr bpf) { setLuaNoSideEffect(); std::string res; if (bpf) { @@ -470,10 +470,10 @@ void setupLuaBindings(LuaContext& luaCtx, bool client) #endif /* HAVE_EBPF */ /* EDNSOptionView */ - luaCtx.registerFunction("count", [](const EDNSOptionView& option) { + luaCtx.registerFunction("count", [](const EDNSOptionView& option) { return option.values.size(); }); - luaCtx.registerFunction(EDNSOptionView::*)()>("getValues", [] (const EDNSOptionView& option) { + luaCtx.registerFunction(EDNSOptionView::*)()const>("getValues", [] (const EDNSOptionView& option) { std::vector values; for (const auto& value : option.values) { values.push_back(std::string(value.content, value.size)); diff --git a/pdns/dnsdist-lua-rules.cc b/pdns/dnsdist-lua-rules.cc index 54b65e770b..a3124d758d 100644 --- a/pdns/dnsdist-lua-rules.cc +++ b/pdns/dnsdist-lua-rules.cc @@ -223,7 +223,7 @@ void setupLuaRules(LuaContext& luaCtx) { luaCtx.writeFunction("makeRule", makeRule); - luaCtx.registerFunction::*)()>("toString", [](const std::shared_ptr& rule) { return rule->toString(); }); + luaCtx.registerFunction::*)()const>("toString", [](const std::shared_ptr& rule) { return rule->toString(); }); luaCtx.writeFunction("showResponseRules", [](boost::optional vars) { showRules(&g_resprulactions, vars); diff --git a/pdns/dnsdist.hh b/pdns/dnsdist.hh index 55c0868647..d9b447e6b7 100644 --- a/pdns/dnsdist.hh +++ b/pdns/dnsdist.hh @@ -86,7 +86,7 @@ struct DNSQuestion const ComboAddress* remote{nullptr}; std::shared_ptr qTag{nullptr}; std::unique_ptr> proxyProtocolValues{nullptr}; - std::shared_ptr > ednsOptions; + mutable std::shared_ptr > ednsOptions; std::shared_ptr dnsCryptQuery{nullptr}; std::shared_ptr packetCache{nullptr}; struct dnsheader* dh{nullptr}; diff --git a/pdns/dnsdistdist/dnsdist-lua-bindings-dnscrypt.cc b/pdns/dnsdistdist/dnsdist-lua-bindings-dnscrypt.cc index ff2a13ee15..e15ed0b8a1 100644 --- a/pdns/dnsdistdist/dnsdist-lua-bindings-dnscrypt.cc +++ b/pdns/dnsdistdist/dnsdist-lua-bindings-dnscrypt.cc @@ -30,7 +30,7 @@ void setupLuaBindingsDNSCrypt(LuaContext& luaCtx) { #ifdef HAVE_DNSCRYPT /* DNSCryptContext bindings */ - luaCtx.registerFunction("getProviderName", [](const DNSCryptContext& ctx) { return ctx.getProviderName().toStringNoDot(); }); + luaCtx.registerFunction("getProviderName", [](const DNSCryptContext& ctx) { return ctx.getProviderName().toStringNoDot(); }); luaCtx.registerFunction("markActive", &DNSCryptContext::markActive); luaCtx.registerFunction("markInactive", &DNSCryptContext::markInactive); luaCtx.registerFunction("removeInactiveCertificate", &DNSCryptContext::removeInactiveCertificate); @@ -92,7 +92,7 @@ void setupLuaBindingsDNSCrypt(LuaContext& luaCtx) throw std::runtime_error("This DNSCrypt context has no certificate at index " + std::to_string(idx)); }); - luaCtx.registerFunction::*)()>("printCertificates", [](const std::shared_ptr ctx) { + luaCtx.registerFunction::*)()const>("printCertificates", [](const std::shared_ptr ctx) { ostringstream ret; if (ctx != nullptr) { @@ -127,13 +127,13 @@ void setupLuaBindingsDNSCrypt(LuaContext& luaCtx) }); /* DNSCryptCertificatePair */ - luaCtx.registerFunction::*)()>("getCertificate", [](const std::shared_ptr pair) { + luaCtx.registerFunction::*)()const>("getCertificate", [](const std::shared_ptr pair) { if (pair == nullptr) { throw std::runtime_error("DNSCryptCertificatePair::getCertificate() called on a nil value"); } return pair->cert; }); - luaCtx.registerFunction::*)()>("isActive", [](const std::shared_ptr pair) { + luaCtx.registerFunction::*)()const>("isActive", [](const std::shared_ptr pair) { if (pair == nullptr) { throw std::runtime_error("DNSCryptCertificatePair::isActive() called on a nil value"); } @@ -141,14 +141,14 @@ void setupLuaBindingsDNSCrypt(LuaContext& luaCtx) }); /* DNSCryptCert */ - luaCtx.registerFunction("getMagic", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.magic), sizeof(cert.magic)); }); - luaCtx.registerFunction("getEsVersion", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.esVersion), sizeof(cert.esVersion)); }); - luaCtx.registerFunction("getProtocolMinorVersion", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.protocolMinorVersion), sizeof(cert.protocolMinorVersion)); }); - luaCtx.registerFunction("getSignature", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.signature), sizeof(cert.signature)); }); - luaCtx.registerFunction("getResolverPublicKey", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.signedData.resolverPK), sizeof(cert.signedData.resolverPK)); }); - luaCtx.registerFunction("getClientMagic", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.signedData.clientMagic), sizeof(cert.signedData.clientMagic)); }); - luaCtx.registerFunction("getSerial", [](const DNSCryptCert& cert) { return cert.getSerial(); }); - luaCtx.registerFunction("getTSStart", [](const DNSCryptCert& cert) { return ntohl(cert.getTSStart()); }); - luaCtx.registerFunction("getTSEnd", [](const DNSCryptCert& cert) { return ntohl(cert.getTSEnd()); }); + luaCtx.registerFunction("getMagic", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.magic), sizeof(cert.magic)); }); + luaCtx.registerFunction("getEsVersion", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.esVersion), sizeof(cert.esVersion)); }); + luaCtx.registerFunction("getProtocolMinorVersion", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.protocolMinorVersion), sizeof(cert.protocolMinorVersion)); }); + luaCtx.registerFunction("getSignature", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.signature), sizeof(cert.signature)); }); + luaCtx.registerFunction("getResolverPublicKey", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.signedData.resolverPK), sizeof(cert.signedData.resolverPK)); }); + luaCtx.registerFunction("getClientMagic", [](const DNSCryptCert& cert) { return std::string(reinterpret_cast(cert.signedData.clientMagic), sizeof(cert.signedData.clientMagic)); }); + luaCtx.registerFunction("getSerial", [](const DNSCryptCert& cert) { return cert.getSerial(); }); + luaCtx.registerFunction("getTSStart", [](const DNSCryptCert& cert) { return ntohl(cert.getTSStart()); }); + luaCtx.registerFunction("getTSEnd", [](const DNSCryptCert& cert) { return ntohl(cert.getTSEnd()); }); #endif } diff --git a/pdns/dnsdistdist/dnsdist-lua-bindings-packetcache.cc b/pdns/dnsdistdist/dnsdist-lua-bindings-packetcache.cc index 2183231b90..90a102389c 100644 --- a/pdns/dnsdistdist/dnsdist-lua-bindings-packetcache.cc +++ b/pdns/dnsdistdist/dnsdist-lua-bindings-packetcache.cc @@ -98,13 +98,13 @@ void setupLuaBindingsPacketCache(LuaContext& luaCtx) return res; }); - luaCtx.registerFunction::*)()>("toString", [](const std::shared_ptr& cache) { + luaCtx.registerFunction::*)()const>("toString", [](const std::shared_ptr& cache) { if (cache) { return cache->toString(); } return std::string(); }); - luaCtx.registerFunction::*)()>("isFull", [](const std::shared_ptr& cache) { + luaCtx.registerFunction::*)()const>("isFull", [](const std::shared_ptr& cache) { if (cache) { return cache->isFull(); } @@ -138,7 +138,7 @@ void setupLuaBindingsPacketCache(LuaContext& luaCtx) g_outputBuffer="Expunged " + std::to_string(cache->expungeByName(qname, qtype ? *qtype : QType(QType::ANY).getCode(), suffixMatch ? *suffixMatch : false)) + " records\n"; } }); - luaCtx.registerFunction::*)()>("printStats", [](const std::shared_ptr& cache) { + luaCtx.registerFunction::*)()const>("printStats", [](const std::shared_ptr& cache) { if (cache) { g_outputBuffer="Entries: " + std::to_string(cache->getEntriesCount()) + "/" + std::to_string(cache->getMaxEntries()) + "\n"; g_outputBuffer+="Hits: " + std::to_string(cache->getHits()) + "\n"; @@ -150,7 +150,7 @@ void setupLuaBindingsPacketCache(LuaContext& luaCtx) g_outputBuffer+="TTL Too Shorts: " + std::to_string(cache->getTTLTooShorts()) + "\n"; } }); - luaCtx.registerFunction(std::shared_ptr::*)()>("getStats", [](const std::shared_ptr& cache) { + luaCtx.registerFunction(std::shared_ptr::*)()const>("getStats", [](const std::shared_ptr& cache) { std::unordered_map stats; if (cache) { stats["entries"] = cache->getEntriesCount(); @@ -165,7 +165,7 @@ void setupLuaBindingsPacketCache(LuaContext& luaCtx) } return stats; }); - luaCtx.registerFunction::*)(const std::string& fname)>("dump", [](const std::shared_ptr& cache, const std::string& fname) { + luaCtx.registerFunction::*)(const std::string& fname)const>("dump", [](const std::shared_ptr& cache, const std::string& fname) { if (cache) { int fd = open(fname.c_str(), O_CREAT | O_EXCL | O_WRONLY, 0660); diff --git a/pdns/dnsdistdist/dnsdist-lua-bindings-protobuf.cc b/pdns/dnsdistdist/dnsdist-lua-bindings-protobuf.cc index c8aade0aff..f834abf6a2 100644 --- a/pdns/dnsdistdist/dnsdist-lua-bindings-protobuf.cc +++ b/pdns/dnsdistdist/dnsdist-lua-bindings-protobuf.cc @@ -52,10 +52,10 @@ static void parseFSTRMOptions(const boost::optional("ipencrypt", [](const ComboAddress& ca, const std::string& key) { + luaCtx.registerFunction("ipencrypt", [](const ComboAddress& ca, const std::string& key) { return encryptCA(ca, key); }); - luaCtx.registerFunction("ipdecrypt", [](const ComboAddress& ca, const std::string& key) { + luaCtx.registerFunction("ipdecrypt", [](const ComboAddress& ca, const std::string& key) { return decryptCA(ca, key); }); @@ -88,7 +88,7 @@ void setupLuaBindingsProtoBuf(LuaContext& luaCtx, bool client, bool configCheck) luaCtx.registerFunction("setTime", [](DNSDistProtoBufMessage& message, time_t sec, uint32_t usec) { message.setTime(sec, usec); }); luaCtx.registerFunction("setQueryTime", [](DNSDistProtoBufMessage& message, time_t sec, uint32_t usec) { message.setQueryTime(sec, usec); }); luaCtx.registerFunction("setResponseCode", [](DNSDistProtoBufMessage& message, uint8_t rcode) { message.setResponseCode(rcode); }); - luaCtx.registerFunction("toDebugString", [](const DNSDistProtoBufMessage& message) { return message.toDebugString(); }); + luaCtx.registerFunction("toDebugString", [](const DNSDistProtoBufMessage& message) { return message.toDebugString(); }); luaCtx.registerFunction)>("setRequestor", [](DNSDistProtoBufMessage& message, const ComboAddress& addr, boost::optional port) { message.setRequestor(addr); if (port) { @@ -117,7 +117,7 @@ void setupLuaBindingsProtoBuf(LuaContext& luaCtx, bool client, bool configCheck) message.setServerIdentity(str); }); - luaCtx.registerFunction("toDebugString", [](const DnstapMessage& message) { return message.toDebugString(); }); + luaCtx.registerFunction("toDebugString", [](const DnstapMessage& message) { return message.toDebugString(); }); luaCtx.registerFunction("setExtra", [](DnstapMessage& message, const std::string& str) { message.setExtra(str); }); @@ -158,7 +158,7 @@ void setupLuaBindingsProtoBuf(LuaContext& luaCtx, bool client, bool configCheck) #endif /* HAVE_FSTRM */ }); - luaCtx.registerFunction::*)()>("toString", [](const std::shared_ptr& logger) { + luaCtx.registerFunction::*)()const>("toString", [](const std::shared_ptr& logger) { if (logger) { return logger->toString(); } diff --git a/regression-tests.dnsdist/test_Advanced.py b/regression-tests.dnsdist/test_Advanced.py index be89a2611e..8fe66ac9f2 100644 --- a/regression-tests.dnsdist/test_Advanced.py +++ b/regression-tests.dnsdist/test_Advanced.py @@ -1936,12 +1936,20 @@ class TestAdvancedLuaRule(DNSDistTest): _config_template = """ function luarulefunction(dq) - if dq.qname:toString() == 'lua-rule.advanced.tests.powerdns.com.' then - return true + if dq:getTag('a-tag') ~= 'a-value' then + print('invalid tag value') + return false + end + + if dq.qname:toString() ~= 'lua-rule.advanced.tests.powerdns.com.' then + print('invalid qname') + return false end - return false + + return true end + addAction(AllRule(), TagAction('a-tag', 'a-value')) addAction(LuaRule(luarulefunction), RCodeAction(DNSRCode.NOTIMP)) addAction(AllRule(), RCodeAction(DNSRCode.REFUSED)) -- newServer{address="127.0.0.1:%s"}