]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Auth: remove a '// HACK FIXME400' and fix the bugs it was hiding 9478/head
authorKees Monshouwer <mind04@monshouwer.org>
Mon, 14 Sep 2020 21:56:44 +0000 (23:56 +0200)
committermind04 <mind04@monshouwer.org>
Wed, 16 Sep 2020 14:41:01 +0000 (16:41 +0200)
- LMDB backend was not handling out of zone additionals well.
- doAdditionalProcessingAndDropAA() was wasting backend queries for out of zone records.
- Remove the 'do-ipv6-additional-processing' setting, processing is now always on.
- Some cleanup in zone2sql.

docs/settings.rst
modules/lmdbbackend/lmdbbackend.cc
pdns/common_startup.cc
pdns/dnsname.cc
pdns/packethandler.cc
pdns/packethandler.hh
pdns/zone2sql.cc

index 6ded6eaa4d61024df3719d2621f32818519c9d1f..8b5121125810aa761771755d504cfc18de1f815e 100644 (file)
@@ -612,6 +612,9 @@ Enable/Disable DNS update (RFC2136) support. See :doc:`dnsupdate` for more.
 -  Boolean
 -  Default: yes
 
+.. versionchanged:: 4.4.0
+  This setting has been removed
+
 Perform AAAA additional processing. This sends AAAA records in the
 ADDITIONAL section when sending a referral.
 
index c7ec4d4a01ec29f324fad6e346adc40d6671463e..fa3f09cc274895c6cbfa6ebb22d175e61dee40c9 100644 (file)
@@ -595,6 +595,11 @@ void LMDBBackend::lookup(const QType &type, const DNSName &qdomain, int zoneId,
   }
     
   DNSName relqname = qdomain.makeRelative(hunt);
+
+  if(relqname.empty()) {
+    throw DBException("lookup for out of zone rrset");
+  }
+
   //  cout<<"get will look for "<<relqname<< " in zone "<<hunt<<" with id "<<zoneId<<endl;
   d_rotxn = getRecordsROTransaction(zoneId, d_rwtxn);
 
index fe4994cc1392e12ad86babd5a76d95682f7e0ba1..05b0cca5716b54b764c48faabeeeb6187ecb43fc 100644 (file)
@@ -166,7 +166,6 @@ void declareArguments()
   ::arg().set("webserver-loglevel", "Amount of logging in the webserver (none, normal, detailed)") = "normal";
   ::arg().set("webserver-max-bodysize","Webserver/API maximum request/response body size in megabytes")="2";
 
-  ::arg().setSwitch("do-ipv6-additional-processing", "Do AAAA additional processing")="yes";
   ::arg().setSwitch("query-logging","Hint backends that queries should be logged")="no";
 
   ::arg().set("carbon-namespace", "If set overwrites the first part of the carbon string")="pdns";
index 810b86a134efbb862ec1314ab9d11e1359a6abcb..3c360f18a0d21ea2761b0fb450283865f50b241c 100644 (file)
@@ -256,8 +256,9 @@ DNSName DNSName::makeRelative(const DNSName& zone) const
 {
   DNSName ret(*this);
   ret.makeUsRelative(zone);
-  return ret.empty() ? zone : ret; // HACK FIXME400
+  return ret;
 }
+
 void DNSName::makeUsRelative(const DNSName& zone) 
 {
   if (isPartOf(zone)) {
index f4e95534b6ecb26db33684c620fde8a975609989..be2e392b8b64ba852d44c35ea905748328156ae6 100644 (file)
@@ -63,7 +63,6 @@ PacketHandler::PacketHandler():B(s_programname), d_dk(&B)
   d_doDNAME=::arg().mustDo("dname-processing");
   d_doExpandALIAS = ::arg().mustDo("expand-alias");
   d_logDNSDetails= ::arg().mustDo("log-dns-details");
-  d_doIPv6AdditionalProcessing = ::arg().mustDo("do-ipv6-additional-processing");
   string fname= ::arg()["lua-prequery-script"];
   if(fname.empty())
   {
@@ -439,61 +438,45 @@ bool PacketHandler::getBestWildcard(DNSPacket& p, const SOAData& sd, const DNSNa
   return haveSomething;
 }
 
-/** dangling is declared true if we were unable to resolve everything */
-int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const SOAData& soadata, bool retargeted)
-{
-  DNSZoneRecord rr;
-  SOAData sd;
-  sd.db = nullptr;
-
-  if(p.qtype.getCode()!=QType::AXFR) { // this packet needs additional processing
-    // we now have a copy, push_back on packet might reallocate!
-    auto& records = r->getRRS();
-    vector<DNSZoneRecord> toAdd;
-
-    for(auto i = records.cbegin() ; i!= records.cend(); ++i) {
-      if(i->dr.d_place==DNSResourceRecord::ADDITIONAL ||
-         !(i->dr.d_type==QType::MX || i->dr.d_type==QType::NS || i->dr.d_type==QType::SRV))
-        continue;
-
-      if(r->d.aa && i->dr.d_name.countLabels() && i->dr.d_type==QType::NS && !B.getSOA(i->dr.d_name,sd) && !retargeted) { // drop AA in case of non-SOA-level NS answer, except for root referral
-        r->setA(false);
-        //        i->d_place=DNSResourceRecord::AUTHORITY; // XXX FIXME
-      }
-
-      DNSName lookup;
-
-      if(i->dr.d_type == QType::MX)
-        lookup = getRR<MXRecordContent>(i->dr)->d_mxname;
-      else if(i->dr.d_type == QType::SRV)
-        lookup = getRR<SRVRecordContent>(i->dr)->d_target;
-      else if(i->dr.d_type == QType::NS) 
-        lookup = getRR<NSRecordContent>(i->dr)->getNS();
-      else
-        continue;
-
-      B.lookup(QType(d_doIPv6AdditionalProcessing ? QType::ANY : QType::A), lookup, soadata.domain_id, &p);
 
-      while(B.get(rr)) {
-        if(rr.dr.d_type != QType::A && rr.dr.d_type!=QType::AAAA)
-          continue;
-        if(!rr.dr.d_name.isPartOf(soadata.qname)) {
-          // FIXME we might still pass on the record if it is occluded and the
-          // backend uses a single id for all zones
+void PacketHandler::doAdditionalProcessing(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const SOAData& soadata)
+{
+  DNSName content;
+  std::unordered_set<DNSName> lookup;
+  const auto& rrs = r->getRRS();
+  lookup.reserve(rrs.size());
+  for(auto& rr : rrs) {
+    if(rr.dr.d_place != DNSResourceRecord::ADDITIONAL) {
+      switch(rr.dr.d_type) {
+        case QType::NS:
+          content=std::move(getRR<NSRecordContent>(rr.dr)->getNS());
+          break;
+        case QType::MX:
+          content=std::move(getRR<MXRecordContent>(rr.dr)->d_mxname);
+          break;
+        case QType::SRV:
+          content=std::move(getRR<SRVRecordContent>(rr.dr)->d_target);
+          break;
+        default:
           continue;
-        }
-        rr.dr.d_place=DNSResourceRecord::ADDITIONAL;
-        toAdd.push_back(rr);
+      }
+      if(content.isPartOf(soadata.qname)) {
+        lookup.emplace(std::move(content));
       }
     }
+  }
 
-    for(auto& rec : toAdd) {
-      r->addRecord(std::move(rec));
+  DNSZoneRecord dzr;
+  for(const auto& name : lookup) {
+    B.lookup(QType(QType::ANY), name, soadata.domain_id, &p);
+    while(B.get(dzr)) {
+      if(dzr.dr.d_type == QType::A || dzr.dr.d_type == QType::AAAA) {
+        dzr.dr.d_place=DNSResourceRecord::ADDITIONAL;
+        r->addRecord(std::move(dzr));
+      }
     }
-    
-    //records.insert(records.end(), toAdd.cbegin(), toAdd.cend()); // would be faster, but no dedup
   }
-  return 1;
 }
 
 
@@ -1552,9 +1535,7 @@ std::unique_ptr<DNSPacket> PacketHandler::doQuestion(DNSPacket& p)
     }
     
   sendit:;
-    if(doAdditionalProcessingAndDropAA(p, r, sd, retargetcount)<0) {
-      return 0;
-    }
+    doAdditionalProcessing(p, r, sd);
 
     for(const auto& loopRR: r->getRRS()) {
       if(loopRR.scopeMask) {
index b196d984da35659819161ac071367ec351983bbd..e2d7bee939c6ceec2dd3f455fb018228c05680af 100644 (file)
@@ -74,7 +74,7 @@ private:
   bool addCDNSKEY(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const SOAData& sd);
   bool addCDS(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const SOAData& sd);
   bool addNSEC3PARAM(const DNSPacket& p, std::unique_ptr<DNSPacket>& r, const SOAData& sd);
-  int doAdditionalProcessingAndDropAA(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const SOAData& sd, bool retargeted);
+  void doAdditionalProcessing(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const SOAData& sd);
   void addNSECX(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const DNSName &target, const DNSName &wildcard, const DNSName &auth, int mode);
   void addNSEC(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const DNSName &target, const DNSName &wildcard, const DNSName& auth, int mode);
   void addNSEC3(DNSPacket& p, std::unique_ptr<DNSPacket>& r, const DNSName &target, const DNSName &wildcard, const DNSName& auth, const NSEC3PARAMRecordContent& nsec3param, bool narrow, int mode);
@@ -104,7 +104,6 @@ private:
   static AtomicCounter s_count;
   static std::mutex s_rfc2136lock;
   bool d_logDNSDetails;
-  bool d_doIPv6AdditionalProcessing;
   bool d_doDNAME;
   bool d_doExpandALIAS;
   bool d_dnssec;
index 08fca465d4ada00c430e17772c2e974b61a51844..5b8c2bb6b52f3bca99fd5db8e088e41e18f164a4 100644 (file)
@@ -175,29 +175,14 @@ static void emitRecord(const DNSName& zoneName, const DNSName &DNSqname, const s
     trim_left(content);
   }
 
-  bool auth = true;
-  if(qtype == "NS" && !pdns_iequals(qname, zname)) {
-    auth=false;
-  }
-
-  if(g_mode==MYSQL || g_mode==SQLITE) {
-    cout<<"insert into records (domain_id, name, type,content,ttl,prio,disabled) select id ,"<<
-      sqlstr(toLower(qname))<<", "<<
-      sqlstr(qtype)<<", "<<
-      sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", "<<disabled<<
-      " from domains where name="<<toLower(sqlstr(zname))<<";\n";
-
-    if(!recordcomment.empty()) {
-      cout<<"insert into comments (domain_id,name,type,modified_at, comment) select id, "<<toLower(sqlstr(stripDot(qname)))<<", "<<sqlstr(qtype)<<", "<<time(0)<<", "<<sqlstr(recordcomment)<<" from domains where name="<<toLower(sqlstr(zname))<<";\n";
-    }
-  }
-  else if(g_mode==POSTGRES) {
-    cout<<"insert into records (domain_id, name, ordername, auth, type,content,ttl,prio,disabled) select id ,"<<
-      sqlstr(toLower(qname))<<", "<<
-      sqlstr(DNSName(qname).makeRelative(DNSName(zname)).makeLowerCase().labelReverse().toString(" ", false))<<", '"<< (auth  ? 't' : 'f') <<"', "<<
-      sqlstr(qtype)<<", "<<
-      sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", '"<<(disabled ? 't': 'f') <<
-      "' from domains where name="<<toLower(sqlstr(zname))<<";\n";
+  cout<<"insert into records (domain_id, name, type,content,ttl,prio,disabled) select id ,"<<
+    sqlstr(toLower(qname))<<", "<<
+    sqlstr(qtype)<<", "<<
+    sqlstr(stripDotContent(content))<<", "<<ttl<<", "<<prio<<", "<<(g_mode==POSTGRES ? (disabled ? "'t'" : "'f'") : std::to_string(disabled))<<
+    " from domains where name="<<toLower(sqlstr(zname))<<";\n";
+
+  if(!recordcomment.empty()) {
+    cout<<"insert into comments (domain_id,name,type,modified_at, comment) select id, "<<toLower(sqlstr(stripDot(qname)))<<", "<<sqlstr(qtype)<<", "<<time(0)<<", "<<sqlstr(recordcomment)<<" from domains where name="<<toLower(sqlstr(zname))<<";\n";
   }
 }