]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
use DNSName for before and afternames in bind and gsql backends
authorKees Monshouwer <mind04@monshouwer.org>
Fri, 21 Oct 2016 20:53:47 +0000 (22:53 +0200)
committermind04 <mind04@monshouwer.org>
Sun, 23 Oct 2016 18:10:27 +0000 (20:10 +0200)
modules/bindbackend/bindbackend2.cc
modules/bindbackend/bindbackend2.hh
pdns/backends/gsql/gsqlbackend.cc
pdns/backends/gsql/gsqlbackend.hh
pdns/dnsbackend.cc
pdns/dnsbackend.hh
pdns/packethandler.cc

index 8d833e65e2242ce2a67227b69eddb4dd6b31ae6b..0fdef3313cc48b6acb0aff37e082cb876f0315d8 100644 (file)
@@ -924,7 +924,7 @@ void Bind2Backend::queueReloadAndStore(unsigned int id)
   }
 }
 
-bool Bind2Backend::findBeforeAndAfterUnhashed(BB2DomainInfo& bbd, const DNSName& qname, DNSName& unhashed, string& before, string& after)
+bool Bind2Backend::findBeforeAndAfterUnhashed(BB2DomainInfo& bbd, const DNSName& qname, DNSName& unhashed, DNSName& before, DNSName& after)
 {
   shared_ptr<const recordstorage_t> records = bbd.d_records.get();
 
@@ -939,7 +939,7 @@ bool Bind2Backend::findBeforeAndAfterUnhashed(BB2DomainInfo& bbd, const DNSName&
     --iterBefore;
   while((!iterBefore->auth && iterBefore->qtype != QType::NS) || !iterBefore->qtype)
     --iterBefore;
-  before=iterBefore->qname.labelReverse().toString(" ",false);
+  before=iterBefore->qname;
 
   if(iterAfter == records->end()) {
     iterAfter = records->begin();
@@ -952,12 +952,12 @@ bool Bind2Backend::findBeforeAndAfterUnhashed(BB2DomainInfo& bbd, const DNSName&
       }
     }
   }
-  after = iterAfter->qname.labelReverse().toString(" ",false);
+  after = iterAfter->qname;
 
   return true;
 }
 
-bool Bind2Backend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string& qname, DNSName& unhashed, std::string& before, std::string& after)
+bool Bind2Backend::getBeforeAndAfterNamesAbsolute(uint32_t id, const DNSName& qname, DNSName& unhashed, DNSName& before, DNSName& after)
 {
   BB2DomainInfo bbd;
   safeGetBBDomainInfo(id, &bbd);
@@ -972,9 +972,9 @@ bool Bind2Backend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string
     nsec3zone=getNSEC3PARAM(bbd.d_name, &ns3pr);
 
   if(!nsec3zone) {
-    DNSName dqname(DNSName(boost::replace_all_copy(qname," ",".")).labelReverse()); // the horror
-    return findBeforeAndAfterUnhashed(bbd, dqname, unhashed, before, after);
-  else {
+    return findBeforeAndAfterUnhashed(bbd, qname, unhashed, before, after);
+  }
+  else {
     auto& hashindex=boost::multi_index::get<NSEC3Tag>(*bbd.d_records.getWRITABLE());
 
     // for(auto iter = first; iter != hashindex.end(); iter++)
@@ -985,15 +985,15 @@ bool Bind2Backend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string
 
     if (iter == hashindex.end()) {
       --iter;
-      before = iter->nsec3hash;
-      after = first->nsec3hash;
+      before = DNSName(iter->nsec3hash);
+      after = DNSName(first->nsec3hash);
     } else {
-      after = iter->nsec3hash;
+      after = DNSName(iter->nsec3hash);
       if (iter != first)
         --iter;
       else
         iter = --hashindex.end();
-      before = iter->nsec3hash;
+      before = DNSName(iter->nsec3hash);
     }
     unhashed = iter->qname+bbd.d_name;
 
index ec6b0a444d3d610ca449f3b41ddb563d0041deef..2f033fae3bf672b0ad88b8d9c375ed96da91b24b 100644 (file)
@@ -193,7 +193,7 @@ public:
   bool getDomainInfo(const DNSName &domain, DomainInfo &di);
   time_t getCtime(const string &fname);
    // DNSSEC
-  virtual bool getBeforeAndAfterNamesAbsolute(uint32_t id, const string& qname, DNSName& unhashed, string& before, string& after);
+  virtual bool getBeforeAndAfterNamesAbsolute(uint32_t id, const DNSName& qname, DNSName& unhashed, DNSName& before, DNSName& after);
   void lookup(const QType &, const DNSName &qdomain, DNSPacket *p=0, int zoneId=-1);
   bool list(const DNSName &target, int id, bool include_disabled=false);
   bool get(DNSResourceRecord &);
@@ -316,7 +316,7 @@ private:
   BB2DomainInfo createDomainEntry(const DNSName& domain, const string &filename); //!< does not insert in s_state
 
   void queueReloadAndStore(unsigned int id);
-  bool findBeforeAndAfterUnhashed(BB2DomainInfo& bbd, const DNSName& qname, DNSName& unhashed, string& before, string& after);
+  bool findBeforeAndAfterUnhashed(BB2DomainInfo& bbd, const DNSName& qname, DNSName& unhashed, DNSName& before, DNSName& after);
   void reload();
   static string DLDomStatusHandler(const vector<string>&parts, Utility::pid_t ppid);
   static string DLListRejectsHandler(const vector<string>&parts, Utility::pid_t ppid);
index da28653d0620ab10cfbca6dd39f20c48dcfd839a..e1a1ab49139dee469e025233109fb7203e1aef84 100644 (file)
@@ -548,7 +548,7 @@ bool GSQLBackend::doesDNSSEC()
     return d_dnssecQueries;
 }
 
-bool GSQLBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const string& qname, DNSName& unhashed, std::string& before, std::string& after)
+bool GSQLBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const DNSName& qname, DNSName& unhashed, DNSName& before, DNSName& after)
 {
   if(!d_dnssecQueries)
     return false;
@@ -558,13 +558,13 @@ bool GSQLBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const string& qnam
   SSqlStatement::row_t row;
   try {
     d_afterOrderQuery_stmt->
-      bind("ordername", qname)->
+      bind("ordername", qname.labelReverse().toString(" ", false))->
       bind("domain_id", id)->
       execute();
     while(d_afterOrderQuery_stmt->hasNextRow()) {
       d_afterOrderQuery_stmt->nextRow(row);
       ASSERT_ROW_COLUMNS("get-order-after-query", row, 1);
-      after=row[0];
+      after=DNSName(boost::replace_all_copy(row[0]," ",".")).labelReverse();
     }
     d_afterOrderQuery_stmt->reset();
   }
@@ -572,7 +572,7 @@ bool GSQLBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const string& qnam
     throw PDNSException("GSQLBackend unable to find before/after (after) for domain_id "+itoa(id)+": "+e.txtReason());
   }
 
-  if(after.empty() && !qname.empty()) {
+  if(after.empty()) {
     try {
       d_firstOrderQuery_stmt->
         bind("domain_id", id)->
@@ -580,7 +580,7 @@ bool GSQLBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const string& qnam
       while(d_firstOrderQuery_stmt->hasNextRow()) {
         d_firstOrderQuery_stmt->nextRow(row);
         ASSERT_ROW_COLUMNS("get-order-first-query", row, 1);
-        after=row[0];
+        after=DNSName(boost::replace_all_copy(row[0]," ",".")).labelReverse();
       }
       d_firstOrderQuery_stmt->reset();
     }
@@ -594,13 +594,13 @@ bool GSQLBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const string& qnam
 
     try {
       d_beforeOrderQuery_stmt->
-        bind("ordername", qname)->
+        bind("ordername", qname.labelReverse().toString(" ", false))->
         bind("domain_id", id)->
         execute();
       while(d_beforeOrderQuery_stmt->hasNextRow()) {
         d_beforeOrderQuery_stmt->nextRow(row);
         ASSERT_ROW_COLUMNS("get-order-before-query", row, 2);
-        before=row[0];
+        before=DNSName(boost::replace_all_copy(row[0]," ",".")).labelReverse();
         try {
           unhashed=DNSName(row[1]);
         } catch (...) {
@@ -626,7 +626,7 @@ bool GSQLBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const string& qnam
       while(d_lastOrderQuery_stmt->hasNextRow()) {
         d_lastOrderQuery_stmt->nextRow(row);
         ASSERT_ROW_COLUMNS("get-order-last-query", row, 2);
-        before=row[0];
+        before=DNSName(boost::replace_all_copy(row[0]," ",".")).labelReverse();
         try {
           unhashed=DNSName(row[1]);
         } catch (...) {
index cfd3ff54208bd19711c0c2e1abe8a926f3ddb66b..66ee09bf44eef23345dd2368a019efd67dd2f8aa 100644 (file)
@@ -207,7 +207,7 @@ public:
   bool setKind(const DNSName &domain, const DomainInfo::DomainKind kind);
   bool setAccount(const DNSName &domain, const string &account);
 
-  virtual bool getBeforeAndAfterNamesAbsolute(uint32_t id, const string& qname, DNSName& unhashed, std::string& before, std::string& after);
+  virtual bool getBeforeAndAfterNamesAbsolute(uint32_t id, const DNSName& qname, DNSName& unhashed, DNSName& before, DNSName& after);
   virtual bool updateDNSSECOrderNameAndAuth(uint32_t domain_id, const DNSName& zonename, const DNSName& qname, const DNSName& ordername, bool auth, const uint16_t=QType::ANY);
 
   virtual bool updateEmptyNonTerminals(uint32_t domain_id, const DNSName& zonename, set<DNSName>& insert ,set<DNSName>& erase, bool remove);
index c987f095ac5a48380c9b609ef8d5ff328dc3c7d3..6e70015602e6c34f09495444b03bd08fc7fa3adf 100644 (file)
@@ -311,25 +311,11 @@ bool DNSBackend::get(DNSZoneRecord& dzr)
 
 bool DNSBackend::getBeforeAndAfterNames(uint32_t id, const DNSName& zonename, const DNSName& qname, DNSName& before, DNSName& after)
 {
-  // FIXME400 FIXME400 FIXME400
-  // string lcqname=toLower(qname); FIXME400 tolower?
-  // string lczonename=toLower(zonename); FIXME400 tolower?
-  // lcqname=makeRelative(lcqname, lczonename);
-  DNSName lczonename = zonename.makeLowerCase(); 
-  // lcqname=labelReverse(lcqname);
-  DNSName dnc;
-  string relqname, sbefore, safter;
-  relqname=qname.makeRelative(zonename).labelReverse().toString(" ", false);
-  //sbefore = before.toString();
-  //safter = after.toString();
-  bool ret = this->getBeforeAndAfterNamesAbsolute(id, relqname, dnc, sbefore, safter);
-  boost::replace_all(sbefore, " ", ".");
-  boost::replace_all(safter, " ", ".");
-  before = DNSName(sbefore).labelReverse() + lczonename;
-  after = DNSName(safter).labelReverse() + lczonename;
-
-  // before=dotConcat(labelReverse(before), lczonename); FIXME400
-  // after=dotConcat(labelReverse(after), lczonename); FIXME400
+  DNSName unhashed;
+  bool ret = this->getBeforeAndAfterNamesAbsolute(id, qname.makeRelative(zonename).makeLowerCase(), unhashed, before, after);
+  DNSName lczonename = zonename.makeLowerCase();
+  before += lczonename;
+  after += lczonename;
   return ret;
 }
 
index 2c1adfd07e956e04d8d83cf0b66a035bea028ead..de86ba146cc5d85c452e9fce7505c15d5c651046 100644 (file)
@@ -189,7 +189,7 @@ public:
   virtual bool deleteTSIGKey(const DNSName& name) { return false; }
   virtual bool getTSIGKeys(std::vector< struct TSIGKey > &keys) { return false; }
 
-  virtual bool getBeforeAndAfterNamesAbsolute(uint32_t id, const string& qname, DNSName& unhashed, string& before, string& after)
+  virtual bool getBeforeAndAfterNamesAbsolute(uint32_t id, const DNSName& qname, DNSName& unhashed, DNSName& before, DNSName& after)
   {
     std::cerr<<"Default beforeAndAfterAbsolute called!"<<std::endl;
     abort();
index f850742c17843a14ae5b33c268484ea72368d6a3..af3c0d169081d393398552984c2e41113b663d37 100644 (file)
@@ -576,7 +576,7 @@ static void decrementHash(std::string& raw) // I wonder if this is correct, cmou
 }
 
 
-bool getNSEC3Hashes(bool narrow, DNSBackend* db, int id, const std::string& hashed, bool decrement, DNSName& unhashed, string& before, string& after, int mode)
+bool getNSEC3Hashes(bool narrow, DNSBackend* db, int id, const std::string& hashed, bool decrement, DNSName& unhashed, std::string& before, std::string& after, int mode)
 {
   bool ret;
   if(narrow) { // nsec3-narrow
@@ -590,15 +590,14 @@ bool getNSEC3Hashes(bool narrow, DNSBackend* db, int id, const std::string& hash
     incrementHash(after);
   }
   else {
-    if (decrement || mode <= 1)
-      before.clear();
-    else
-      before=' ';
-    ret=db->getBeforeAndAfterNamesAbsolute(id, toBase32Hex(hashed), unhashed, before, after);
-    before=fromBase32Hex(before);
-    after=fromBase32Hex(after);
-  }
-  // cerr<<"rgetNSEC3Hashes: "<<hashed<<", "<<unhashed<<", "<<before<<", "<<after<<endl;
+    DNSName hashedName = DNSName(toBase32Hex(hashed));
+    DNSName beforeName, afterName;
+    if (!decrement && mode >= 2)
+      beforeName = hashedName;
+    ret=db->getBeforeAndAfterNamesAbsolute(id, hashedName, unhashed, beforeName, afterName);
+    before=fromBase32Hex(beforeName.toString());
+    after=fromBase32Hex(afterName.toString());
+  }
   return ret;
 }