From d2f97f2a10edc134099ae0ac396ce6112cf45a19 Mon Sep 17 00:00:00 2001 From: bert hubert Date: Fri, 22 Jan 2016 12:45:53 +0100 Subject: [PATCH] improve kv-example script, make sure we honor variable in there --- pdns/kv-example-script.lua | 29 +++++++++++++++-------------- pdns/lua-recursor4.cc | 27 +++++++++++++++------------ 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/pdns/kv-example-script.lua b/pdns/kv-example-script.lua index ae39cddb9..18b4df547 100644 --- a/pdns/kv-example-script.lua +++ b/pdns/kv-example-script.lua @@ -15,40 +15,41 @@ To test, use the 'kvresp' example program provided. function preresolve (dq) print ("prereesolve handler called for: "..dq.remoteaddr:toString().. ", local: ".. dq.localaddr:toString()..", ".. dq.qname:toString()..", ".. dq.qtype) dq.followupFunction="udpQueryResponse" - dq.udpCallback="gotipdetails" + dq.udpCallback="gotdomaindetails" dq.udpQueryDest=newCA("127.0.0.1:5555") - dq.udpQuery = "IP "..dq.remoteaddr:toString() - dq.variable = true; + dq.udpQuery = "DOMAIN "..dq.qname:toString() return true; end -function gotipdetails(dq) - print("gotipdetails called, got: "..dq.udpAnswer) - if(dq.udpAnswer ~= "1") +function gotdomaindetails(dq) + print("gotdomaindetails called, got: "..dq.udpAnswer) + if(dq.udpAnswer == "0") then - print("IP address wants no filtering, not looking up this domain") + print("This domain needs no filtering, not looking up this domain") dq.followupFunction="" return false end + print("Domain might need filtering for some users") + dq.variable = true -- disable packet cache local data={} - data["ipdetails"]= dq.udpAnswer + data["domaindetails"]= dq.udpAnswer dq.data=data - dq.udpQuery="DOMAIN "..dq.qname:toString() - dq.udpCallback="gotdomaindetails" + dq.udpQuery="IP "..dq.remoteaddr:toString() + dq.udpCallback="gotipdetails" print("returning true in gotipdetails") return true end -function gotdomaindetails(dq) +function gotipdetails(dq) dq.followupFunction="" - print("So status of domain is "..dq.udpAnswer.." and status of IP is "..dq.data.ipdetails) - if(dq.data.ipdetails=="1" and dq.udpAnswer=="1") + print("So status of IP is "..dq.udpAnswer.." and status of domain is "..dq.data.domaindetails) + if(dq.data.domaindetails=="1" and dq.udpAnswer=="1") then print("IP wants filtering and domain is of the filtered kind") dq:addAnswer(pdns.CNAME, "blocked.powerdns.com") return true else - print("Returning false (normal resolution should proceed)") + print("Returning false (normal resolution should proceed, for this user)") return false end end diff --git a/pdns/lua-recursor4.cc b/pdns/lua-recursor4.cc index fc87af208..2e1102e82 100644 --- a/pdns/lua-recursor4.cc +++ b/pdns/lua-recursor4.cc @@ -391,28 +391,31 @@ bool RecursorLua4::genhook(luacall_t& func, const ComboAddress& remote,const Com if(handled) { ret=dq->rcode; loop:; + if(!dq->followupFunction.empty()) { if(dq->followupFunction=="followCNAMERecords") { - ret = followCNAMERecords(dq->records, qtype); + ret = followCNAMERecords(dq->records, qtype); } else if(dq->followupFunction=="getFakeAAAARecords") { - ret=getFakeAAAARecords(dq->followupName, dq->followupPrefix, dq->records); + ret=getFakeAAAARecords(dq->followupName, dq->followupPrefix, dq->records); } else if(dq->followupFunction=="getFakePTRRecords") { - ret=getFakePTRRecords(dq->followupName, dq->followupPrefix, dq->records); + 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>(dq->udpCallback).get_value_or(0); - if(!func) { - theL()<udpAnswer = GenUDPQueryResponse(dq->udpQueryDest, dq->udpQuery); + auto func = d_lw->readVariable>(dq->udpCallback).get_value_or(0); + if(!func) { + theL()<variable; // could still be set to indicate this *name* is variable + if(!res) { + return false; + } + goto loop; } - } res=dq->records; } -- 2.40.0