]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth: Handle ANY queries with Lua records
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 26 Nov 2018 11:11:14 +0000 (12:11 +0100)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Mon, 26 Nov 2018 16:10:57 +0000 (17:10 +0100)
pdns/dnsrecords.cc
pdns/dnsrecords.hh
pdns/lua-record.cc
pdns/packethandler.cc

index eec772c36806618819b8eb5b5e13064d298ecc4b..4109a70c616215f9a7421f69cecd7987c641a508 100644 (file)
@@ -162,7 +162,7 @@ boilerplate_conv(OPT, QType::OPT,
                  );
 
 #ifdef HAVE_LUA_RECORDS
-string LUARecordContent::getCode()
+string LUARecordContent::getCode() const
 {
   // in d_code, series of "part1" "part2"
   vector<string> parts;
index 8f7ad2a6aba1a11935c5dddf00dcc3bb7f243ac6..353bbef31a4e7b310132ed52a6ab5c40c431ae26 100644 (file)
@@ -195,7 +195,7 @@ class LUARecordContent : public DNSRecordContent
 {
 public:
   includeboilerplate(LUA)
-  string getCode();
+  string getCode() const;
   uint16_t d_type;
   string d_code;
 };
index 07aecc0bbd5bf8d1bb16506d06e082b0f0e2226c..9f189537daa66103a1b14a5faec97484c2a0cc2a 100644 (file)
@@ -860,9 +860,9 @@ std::vector<shared_ptr<DNSRecordContent>> luaSynth(const std::string& code, cons
 
     for(const auto& content: contents) {
       if(qtype==QType::TXT)
-        ret.push_back(std::shared_ptr<DNSRecordContent>(DNSRecordContent::mastermake(qtype, 1, '"'+content+'"' )));
+        ret.push_back(DNSRecordContent::mastermake(qtype, QClass::IN, '"'+content+'"' ));
       else
-        ret.push_back(std::shared_ptr<DNSRecordContent>(DNSRecordContent::mastermake(qtype, 1, content )));
+        ret.push_back(DNSRecordContent::mastermake(qtype, QClass::IN, content ));
     }
   } catch(std::exception &e) {
     g_log<<Logger::Error<<"Lua record reported: "<<e.what()<<endl;
index 6fa2a7be292d335fdf8368510d81cd1bf40c4d50..92b10ecad3f57ca823b320ffbb1fad86a800f0ca 100644 (file)
@@ -383,7 +383,10 @@ bool PacketHandler::getBestWildcard(DNSPacket *p, SOAData& sd, const DNSName &ta
         DLOG(g_log<<"Have a wildcard LUA match"<<endl);
         
         auto rec=getRR<LUARecordContent>(rr.dr);
-        if(rec->d_type == QType::CNAME || rec->d_type == p->qtype.getCode()) {
+        if (!rec) {
+          continue;
+        }
+        if(rec->d_type == QType::CNAME || rec->d_type == p->qtype.getCode() || (p->qtype.getCode() == QType::ANY && rec->d_type != QType::RRSIG)) {
           //    noCache=true;
           DLOG(g_log<<"Executing Lua: '"<<rec->getCode()<<"'"<<endl);
           try {
@@ -1362,7 +1365,10 @@ DNSPacket *PacketHandler::doQuestion(DNSPacket *p)
         if(!doLua)
           continue;
         auto rec=getRR<LUARecordContent>(rr.dr);
-        if(rec->d_type == QType::CNAME || rec->d_type == p->qtype.getCode()) {
+        if (!rec) {
+          continue;
+        }
+        if(rec->d_type == QType::CNAME || rec->d_type == p->qtype.getCode() || (p->qtype.getCode() == QType::ANY && rec->d_type != QType::RRSIG)) {
           noCache=true;
           try {
             auto recvec=luaSynth(rec->getCode(), target, sd.qname, sd.domain_id, *p, rec->d_type);