From: Kees Monshouwer Date: Fri, 21 Oct 2016 20:53:47 +0000 (+0200) Subject: use DNSName for before and afternames in bind and gsql backends X-Git-Tag: dnsdist-1.1.0~4^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=29e0008a3586c420581ff11d373661a95002740b;p=thirdparty%2Fpdns.git use DNSName for before and afternames in bind and gsql backends --- diff --git a/modules/bindbackend/bindbackend2.cc b/modules/bindbackend/bindbackend2.cc index 8d833e65e2..0fdef3313c 100644 --- a/modules/bindbackend/bindbackend2.cc +++ b/modules/bindbackend/bindbackend2.cc @@ -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 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(*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; diff --git a/modules/bindbackend/bindbackend2.hh b/modules/bindbackend/bindbackend2.hh index ec6b0a444d..2f033fae3b 100644 --- a/modules/bindbackend/bindbackend2.hh +++ b/modules/bindbackend/bindbackend2.hh @@ -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&parts, Utility::pid_t ppid); static string DLListRejectsHandler(const vector&parts, Utility::pid_t ppid); diff --git a/pdns/backends/gsql/gsqlbackend.cc b/pdns/backends/gsql/gsqlbackend.cc index da28653d06..e1a1ab4913 100644 --- a/pdns/backends/gsql/gsqlbackend.cc +++ b/pdns/backends/gsql/gsqlbackend.cc @@ -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 (...) { diff --git a/pdns/backends/gsql/gsqlbackend.hh b/pdns/backends/gsql/gsqlbackend.hh index cfd3ff5420..66ee09bf44 100644 --- a/pdns/backends/gsql/gsqlbackend.hh +++ b/pdns/backends/gsql/gsqlbackend.hh @@ -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& insert ,set& erase, bool remove); diff --git a/pdns/dnsbackend.cc b/pdns/dnsbackend.cc index c987f095ac..6e70015602 100644 --- a/pdns/dnsbackend.cc +++ b/pdns/dnsbackend.cc @@ -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; } diff --git a/pdns/dnsbackend.hh b/pdns/dnsbackend.hh index 2c1adfd07e..de86ba146c 100644 --- a/pdns/dnsbackend.hh +++ b/pdns/dnsbackend.hh @@ -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!"<getBeforeAndAfterNamesAbsolute(id, toBase32Hex(hashed), unhashed, before, after); - before=fromBase32Hex(before); - after=fromBase32Hex(after); - } - // cerr<<"rgetNSEC3Hashes: "<= 2) + beforeName = hashedName; + ret=db->getBeforeAndAfterNamesAbsolute(id, hashedName, unhashed, beforeName, afterName); + before=fromBase32Hex(beforeName.toString()); + after=fromBase32Hex(afterName.toString()); + } return ret; }