throw std::runtime_error("Attempt to load a Lua script in a PowerDNS binary without Lua support");
}
-bool RecursorLua4::nxdomain(std::shared_ptr<DNSQuestion> dq, int& res)
+bool RecursorLua4::nxdomain(DNSQuestion& dq, int& res)
{
return false;
}
-bool RecursorLua4::nodata(std::shared_ptr<DNSQuestion> dq, int& res)
+bool RecursorLua4::nodata(DNSQuestion& dq, int& res)
{
return false;
}
-bool RecursorLua4::postresolve(std::shared_ptr<DNSQuestion> dq, int& res)
+bool RecursorLua4::postresolve(DNSQuestion& dq, int& res)
{
return false;
}
-bool RecursorLua4::prerpz(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::prerpz(DNSQuestion& dq, int& ret)
{
return false;
}
-bool RecursorLua4::preresolve(std::shared_ptr<DNSQuestion> dq, int& res)
+bool RecursorLua4::preresolve(DNSQuestion& dq, int& res)
{
return false;
}
d_gettag = d_lw->readVariable<boost::optional<gettag_t>>("gettag").get_value_or(0);
}
-bool RecursorLua4::prerpz(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::prerpz(DNSQuestion& dq, int& ret)
{
return genhook(d_prerpz, dq, ret);
}
-bool RecursorLua4::preresolve(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::preresolve(DNSQuestion& dq, int& ret)
{
return genhook(d_preresolve, dq, ret);
}
-bool RecursorLua4::nxdomain(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::nxdomain(DNSQuestion& dq, int& ret)
{
return genhook(d_nxdomain, dq, ret);
}
-bool RecursorLua4::nodata(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::nodata(DNSQuestion& dq, int& ret)
{
return genhook(d_nodata, dq, ret);
}
-bool RecursorLua4::postresolve(std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::postresolve(DNSQuestion& dq, int& ret)
{
return genhook(d_postresolve, dq, ret);
}
{
bool variableAnswer = false;
bool wantsRPZ = false;
- auto dq = std::make_shared<RecursorLua4::DNSQuestion>(requestor, ns, query, qtype.getCode(), isTcp, variableAnswer, wantsRPZ);
- dq->currentRecords = &res;
+ auto dq = RecursorLua4::DNSQuestion(requestor, ns, query, qtype.getCode(), isTcp, variableAnswer, wantsRPZ);
+ dq.currentRecords = &res;
return genhook(d_preoutquery, dq, ret);
}
return 0;
}
-bool RecursorLua4::genhook(luacall_t& func, std::shared_ptr<DNSQuestion> dq, int& ret)
+bool RecursorLua4::genhook(luacall_t& func, DNSQuestion& dq, int& ret)
{
if(!func)
return false;
- if (dq->currentRecords) {
- dq->records = *dq->currentRecords;
+ if (dq.currentRecords) {
+ dq.records = *dq.currentRecords;
} else {
- dq->records.clear();
+ dq.records.clear();
}
- dq->followupFunction.clear();
- dq->followupPrefix.clear();
- dq->followupName.clear();
- dq->udpQuery.clear();
- dq->udpAnswer.clear();
- dq->udpCallback.clear();
+ dq.followupFunction.clear();
+ dq.followupPrefix.clear();
+ dq.followupName.clear();
+ dq.udpQuery.clear();
+ dq.udpAnswer.clear();
+ dq.udpCallback.clear();
- dq->rcode = ret;
+ dq.rcode = ret;
bool handled=func(dq);
if(handled) {
loop:;
- ret=dq->rcode;
+ ret=dq.rcode;
- if(!dq->followupFunction.empty()) {
- if(dq->followupFunction=="followCNAMERecords") {
- ret = followCNAMERecords(dq->records, QType(dq->qtype));
+ if(!dq.followupFunction.empty()) {
+ if(dq.followupFunction=="followCNAMERecords") {
+ ret = followCNAMERecords(dq.records, QType(dq.qtype));
}
- else if(dq->followupFunction=="getFakeAAAARecords") {
- ret=getFakeAAAARecords(dq->followupName, dq->followupPrefix, dq->records);
+ else if(dq.followupFunction=="getFakeAAAARecords") {
+ ret=getFakeAAAARecords(dq.followupName, dq.followupPrefix, dq.records);
}
- else if(dq->followupFunction=="getFakePTRRecords") {
- ret=getFakePTRRecords(dq->followupName, dq->followupPrefix, dq->records);
+ else if(dq.followupFunction=="getFakePTRRecords") {
+ ret=getFakePTRRecords(dq.followupName, dq.followupPrefix, dq.records);
}
- else if(dq->followupFunction=="udpQueryResponse") {
- dq->udpAnswer = GenUDPQueryResponse(dq->udpQueryDest, dq->udpQuery);
- auto func = d_lw->readVariable<boost::optional<luacall_t>>(dq->udpCallback).get_value_or(0);
+ else if(dq.followupFunction=="udpQueryResponse") {
+ dq.udpAnswer = GenUDPQueryResponse(dq.udpQueryDest, dq.udpQuery);
+ auto func = d_lw->readVariable<boost::optional<luacall_t>>(dq.udpCallback).get_value_or(0);
if(!func) {
theL()<<Logger::Error<<"Attempted callback for Lua UDP Query/Response which could not be found"<<endl;
return false;
goto loop;
}
}
- if (dq->currentRecords) {
- *dq->currentRecords = dq->records;
+ if (dq.currentRecords) {
+ *dq.currentRecords = dq.records;
}
}
int gettag(const ComboAddress& remote, const Netmask& ednssubnet, const ComboAddress& local, const DNSName& qname, uint16_t qtype, std::vector<std::string>* policyTags);
- bool prerpz(std::shared_ptr<DNSQuestion> dq, int& ret);
- bool preresolve(std::shared_ptr<DNSQuestion> dq, int& ret);
- bool nxdomain(std::shared_ptr<DNSQuestion> dq, int& ret);
- bool nodata(std::shared_ptr<DNSQuestion> dq, int& ret);
- bool postresolve(std::shared_ptr<DNSQuestion> dq, int& ret);
+ bool prerpz(DNSQuestion& dq, int& ret);
+ bool preresolve(DNSQuestion& dq, int& ret);
+ bool nxdomain(DNSQuestion& dq, int& ret);
+ bool nodata(DNSQuestion& dq, int& ret);
+ bool postresolve(DNSQuestion& dq, int& ret);
bool preoutquery(const ComboAddress& ns, const ComboAddress& requestor, const DNSName& query, const QType& qtype, bool isTcp, vector<DNSRecord>& res, int& ret);
bool ipfilter(const ComboAddress& remote, const ComboAddress& local, const struct dnsheader&);
gettag_t d_gettag; // public so you can query if we have this hooked
private:
- typedef std::function<bool(std::shared_ptr<DNSQuestion>)> luacall_t;
+ typedef std::function<bool(DNSQuestion&)> luacall_t;
luacall_t d_prerpz, d_preresolve, d_nxdomain, d_nodata, d_postresolve, d_preoutquery, d_postoutquery;
- bool genhook(luacall_t& func, std::shared_ptr<DNSQuestion> dq, int& ret);
+ bool genhook(luacall_t& func, DNSQuestion& dq, int& ret);
typedef std::function<bool(ComboAddress,ComboAddress, struct dnsheader)> ipfilter_t;
ipfilter_t d_ipfilter;
};
int res;
DNSFilterEngine::Policy appliedPolicy;
DNSRecord spoofed;
- std::shared_ptr<RecursorLua4::DNSQuestion> dq = nullptr;
- if (t_pdl->get() && (*t_pdl)->needDQ()) {
- dq = std::make_shared<RecursorLua4::DNSQuestion>(dc->d_remote, dc->d_local, dc->d_mdp.d_qname, dc->d_mdp.d_qtype, dc->d_tcp, variableAnswer, wantsRPZ);
- dq->ednsFlags = &edo.d_Z;
- dq->ednsOptions = &dc->d_ednsOpts;
- dq->tag = dc->d_tag;
- dq->discardedPolicies = &sr.d_discardedPolicies;
- dq->policyTags = &dc->d_policyTags;
- dq->appliedPolicy = &appliedPolicy;
- dq->currentRecords = &ret;
- dq->dh = &dc->d_mdp.d_header;
- }
+ RecursorLua4::DNSQuestion dq(dc->d_remote, dc->d_local, dc->d_mdp.d_qname, dc->d_mdp.d_qtype, dc->d_tcp, variableAnswer, wantsRPZ);
+ dq.ednsFlags = &edo.d_Z;
+ dq.ednsOptions = &dc->d_ednsOpts;
+ dq.tag = dc->d_tag;
+ dq.discardedPolicies = &sr.d_discardedPolicies;
+ dq.policyTags = &dc->d_policyTags;
+ dq.appliedPolicy = &appliedPolicy;
+ dq.currentRecords = &ret;
+ dq.dh = &dc->d_mdp.d_header;
if(dc->d_mdp.d_qtype==QType::ANY && !dc->d_tcp && g_anyToTcp) {
pw.getHeader()->tc = 1;