From: Christian Hofstaedtler Date: Mon, 26 Jan 2015 21:28:40 +0000 (+0100) Subject: Stop pretending UeberBackend is a normal DNSBackend X-Git-Tag: dnsdist-1.0.0-alpha1~306^2~1^2~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3971cf5302754ac4223eb55f8705a0441e81c9cf;p=thirdparty%2Fpdns.git Stop pretending UeberBackend is a normal DNSBackend Makes it clear who calls what where. --- diff --git a/pdns/Makefile.am b/pdns/Makefile.am index e92434e7e0..805bccca80 100644 --- a/pdns/Makefile.am +++ b/pdns/Makefile.am @@ -876,6 +876,7 @@ testrunner_SOURCES = \ bindparser.yy \ dns.cc \ dns_random.cc \ + dnsbackend.cc \ dnslabeltext.cc \ dnspacket.cc \ dnsparser.cc \ @@ -910,15 +911,18 @@ testrunner_SOURCES = \ test-sha_hh.cc \ packetcache.cc \ unix_utility.cc \ + ueberbackend.cc \ zoneparser-tng.cc zoneparser-tng.hh testrunner_LDFLAGS = \ $(AM_LDFLAGS) \ - $(BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS) + $(BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS) \ + $(BOOST_SERIALIZATION_LDFLAGS) testrunner_LDADD = \ $(POLARSSL_LIBS) \ - $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) + $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) \ + $(BOOST_SERIALIZATION_LIBS) if PKCS11 testrunner_SOURCES += pkcs11signers.cc pkcs11signers.hh diff --git a/pdns/communicator.hh b/pdns/communicator.hh index dd03022b6f..1be3673ba8 100644 --- a/pdns/communicator.hh +++ b/pdns/communicator.hh @@ -181,7 +181,7 @@ public: bool notifyDomain(const string &domain); private: void makeNotifySockets(); - void queueNotifyDomain(const string &domain, DNSBackend *B); + void queueNotifyDomain(const string &domain, UeberBackend *B); int d_nsock4, d_nsock6; map,time_t>d_holes; pthread_mutex_t d_holelock; diff --git a/pdns/dbdnsseckeeper.cc b/pdns/dbdnsseckeeper.cc index 4f10bce124..599df7d7ba 100644 --- a/pdns/dbdnsseckeeper.cc +++ b/pdns/dbdnsseckeeper.cc @@ -315,11 +315,11 @@ DNSSECKeeper::keyset_t DNSSECKeeper::getKeys(const std::string& zone, boost::tri } } keyset_t retkeyset, allkeyset; - vector dbkeyset; + vector dbkeyset; d_keymetadb->getDomainKeys(zone, 0, dbkeyset); - BOOST_FOREACH(UeberBackend::KeyData& kd, dbkeyset) + BOOST_FOREACH(DNSBackend::KeyData& kd, dbkeyset) { DNSSECPrivateKey dpk; @@ -363,7 +363,7 @@ bool DNSSECKeeper::secureZone(const std::string& name, int algorithm, int size) return addKey(name, true, algorithm, size); } -bool DNSSECKeeper::getPreRRSIGs(DNSBackend& db, const std::string& signer, const std::string& qname, +bool DNSSECKeeper::getPreRRSIGs(UeberBackend& db, const std::string& signer, const std::string& qname, const std::string& wildcardname, const QType& qtype, DNSPacketWriter::Place signPlace, vector& rrsigs, uint32_t signTTL) { diff --git a/pdns/dnsbackend.hh b/pdns/dnsbackend.hh index 794e38ac24..9db293a31e 100644 --- a/pdns/dnsbackend.hh +++ b/pdns/dnsbackend.hh @@ -90,7 +90,7 @@ struct TSIGKey { class DNSPacket; -//! This virtual base class defines the interface for backends for the ahudns. +//! This virtual base class defines the interface for backends for the ahudns. /** To create a backend, inherit from this class and implement functions for all virtual methods. Methods should not throw an exception if they are sure they did not find the requested data. However, if an error occurred which prevented them temporarily from performing a lockup, they should throw a DBException, diff --git a/pdns/dnspacket.cc b/pdns/dnspacket.cc index b1b06a97e2..bdb56fc64c 100644 --- a/pdns/dnspacket.cc +++ b/pdns/dnspacket.cc @@ -589,7 +589,7 @@ void DNSPacket::commitD() d_rawpacket.replace(0,12,(char *)&d,12); // copy in d } -bool checkForCorrectTSIG(const DNSPacket* q, DNSBackend* B, string* keyname, string* secret, TSIGRecordContent* trc) +bool checkForCorrectTSIG(const DNSPacket* q, UeberBackend* B, string* keyname, string* secret, TSIGRecordContent* trc) { string message; diff --git a/pdns/dnspacket.hh b/pdns/dnspacket.hh index f6c2646d24..d3c2601bdf 100644 --- a/pdns/dnspacket.hh +++ b/pdns/dnspacket.hh @@ -60,7 +60,7 @@ #endif // HAVE_CONFIG_H -class DNSBackend; +class UeberBackend; class DNSSECKeeper; //! This class represents DNS packets, either received or to be sent. @@ -179,6 +179,6 @@ private: }; -bool checkForCorrectTSIG(const DNSPacket* q, DNSBackend* B, string* keyname, string* secret, TSIGRecordContent* trc); +bool checkForCorrectTSIG(const DNSPacket* q, UeberBackend* B, string* keyname, string* secret, TSIGRecordContent* trc); #endif diff --git a/pdns/dnssecinfra.hh b/pdns/dnssecinfra.hh index 7bffd979ae..55433e8934 100644 --- a/pdns/dnssecinfra.hh +++ b/pdns/dnssecinfra.hh @@ -7,6 +7,7 @@ #include #include #include "misc.hh" +#include "ueberbackend.hh" // rules of the road: Algorithm must be set in 'make' for each KeyEngine, and will NEVER change! @@ -119,7 +120,7 @@ struct DNSSECPrivateKey; void fillOutRRSIG(DNSSECPrivateKey& dpk, const std::string& signQName, RRSIGRecordContent& rrc, vector >& toSign); uint32_t getStartOfWeek(); -void addSignature(DNSSECKeeper& dk, DNSBackend& db, const std::string& signer, const std::string signQName, const std::string& wildcardname, uint16_t signQType, uint32_t signTTL, DNSPacketWriter::Place signPlace, +void addSignature(DNSSECKeeper& dk, UeberBackend& db, const std::string& signer, const std::string signQName, const std::string& wildcardname, uint16_t signQType, uint32_t signTTL, DNSPacketWriter::Place signPlace, vector >& toSign, vector& outsigned, uint32_t origTTL); int getRRSIGsForRRSET(DNSSECKeeper& dk, const std::string& signer, const std::string signQName, uint16_t signQType, uint32_t signTTL, vector >& toSign, vector &rrc); @@ -127,7 +128,7 @@ int getRRSIGsForRRSET(DNSSECKeeper& dk, const std::string& signer, const std::st std::string hashQNameWithSalt(unsigned int times, const std::string& salt, const std::string& qname); void decodeDERIntegerSequence(const std::string& input, vector& output); class DNSPacket; -void addRRSigs(DNSSECKeeper& dk, DNSBackend& db, const std::set& authMap, vector& rrs); +void addRRSigs(DNSSECKeeper& dk, UeberBackend& db, const std::set& authMap, vector& rrs); typedef enum { TSIG_MD5, TSIG_SHA1, TSIG_SHA224, TSIG_SHA256, TSIG_SHA384, TSIG_SHA512 } TSIGHashEnum; diff --git a/pdns/dnsseckeeper.hh b/pdns/dnsseckeeper.hh index c373024c73..9031eb946a 100644 --- a/pdns/dnsseckeeper.hh +++ b/pdns/dnsseckeeper.hh @@ -86,7 +86,7 @@ public: bool unsetNSEC3PARAM(const std::string& zname); void clearAllCaches(); void clearCaches(const std::string& name); - bool getPreRRSIGs(DNSBackend& db, const std::string& signer, const std::string& qname, const std::string& wildcardname, const QType& qtype, DNSPacketWriter::Place, vector& rrsigs, uint32_t signTTL); + bool getPreRRSIGs(UeberBackend& db, const std::string& signer, const std::string& qname, const std::string& wildcardname, const QType& qtype, DNSPacketWriter::Place, vector& rrsigs, uint32_t signTTL); bool isPresigned(const std::string& zname); bool setPresigned(const std::string& zname); bool unsetPresigned(const std::string& zname); diff --git a/pdns/dnssecsigner.cc b/pdns/dnssecsigner.cc index dcf0cc90c3..077bee0f9b 100644 --- a/pdns/dnssecsigner.cc +++ b/pdns/dnssecsigner.cc @@ -86,7 +86,7 @@ int getRRSIGsForRRSET(DNSSECKeeper& dk, const std::string& signer, const std::st } // this is the entrypoint from DNSPacket -void addSignature(DNSSECKeeper& dk, DNSBackend& db, const std::string& signer, const std::string signQName, const std::string& wildcardname, uint16_t signQType, +void addSignature(DNSSECKeeper& dk, UeberBackend& db, const std::string& signer, const std::string signQName, const std::string& wildcardname, uint16_t signQType, uint32_t signTTL, DNSPacketWriter::Place signPlace, vector >& toSign, vector& outsigned, uint32_t origTTL) { @@ -196,7 +196,7 @@ static bool getBestAuthFromSet(const set& authSet, cons return false; } -void addRRSigs(DNSSECKeeper& dk, DNSBackend& db, const set& authSet, vector& rrs) +void addRRSigs(DNSSECKeeper& dk, UeberBackend& db, const set& authSet, vector& rrs) { stable_sort(rrs.begin(), rrs.end(), rrsigncomp); diff --git a/pdns/mastercommunicator.cc b/pdns/mastercommunicator.cc index a668ff7fae..5fd6638776 100644 --- a/pdns/mastercommunicator.cc +++ b/pdns/mastercommunicator.cc @@ -40,7 +40,7 @@ #include "namespaces.hh" -void CommunicatorClass::queueNotifyDomain(const string &domain, DNSBackend *B) +void CommunicatorClass::queueNotifyDomain(const string &domain, UeberBackend *B) { bool hasQueuedItem=false; set nsset, ips; @@ -124,7 +124,7 @@ void CommunicatorClass::masterUpdateCheck(PacketHandler *P) if(!::arg().mustDo("master")) return; - UeberBackend *B=dynamic_cast(P->getBackend()); + UeberBackend *B=P->getBackend(); vector cmdomains; B->getUpdatedMasters(&cmdomains); diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index e6441b0d2e..6332173bd5 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -80,7 +80,7 @@ PacketHandler::PacketHandler():B(s_programname) } -DNSBackend *PacketHandler::getBackend() +UeberBackend *PacketHandler::getBackend() { return &B; } @@ -410,7 +410,7 @@ void PacketHandler::emitNSEC(const std::string& begin, const std::string& end, c r->addRecord(rr); } -void emitNSEC3(DNSBackend& B, const NSEC3PARAMRecordContent& ns3prc, const SOAData& sd, const std::string& unhashed, const std::string& begin, const std::string& end, const std::string& toNSEC3, DNSPacket *r, int mode) +void emitNSEC3(UeberBackend& B, const NSEC3PARAMRecordContent& ns3prc, const SOAData& sd, const std::string& unhashed, const std::string& begin, const std::string& end, const std::string& toNSEC3, DNSPacket *r, int mode) { // cerr<<"We should emit NSEC3 '"< lookup(const string &name, DNSBackend *B) + vector lookup(const string &name, DNSBackend *b) { vector addresses; + + this->resolve_name(&addresses, name); + b->lookup(QType(QType::ANY),name); + DNSResourceRecord rr; + while(b->get(rr)) + if(rr.qtype.getCode() == QType::A || rr.qtype.getCode()==QType::AAAA) + addresses.push_back(rr.content); // SOL if you have a CNAME for an NS + + return addresses; + } + + vector lookup(const string &name, UeberBackend *b) + { + vector addresses; + + this->resolve_name(&addresses, name); + + b->lookup(QType(QType::ANY),name); + DNSResourceRecord rr; + while(b->get(rr)) + if(rr.qtype.getCode() == QType::A || rr.qtype.getCode()==QType::AAAA) + addresses.push_back(rr.content); // SOL if you have a CNAME for an NS + + return addresses; + } + +private: + void resolve_name(vector* addresses, const string& name) + { struct addrinfo* res; struct addrinfo hints; memset(&hints, 0, sizeof(hints)); - + for(int n = 0; n < 2; ++n) { hints.ai_family = n ? AF_INET : AF_INET6; ComboAddress remote; remote.sin4.sin_family = AF_INET6; - if(!getaddrinfo(name.c_str(), 0, &hints, &res)) { + if(!getaddrinfo(name.c_str(), 0, &hints, &res)) { struct addrinfo* address = res; do { memcpy(&remote, address->ai_addr, address->ai_addrlen); - addresses.push_back(remote.toString()); + addresses->push_back(remote.toString()); } while((address = address->ai_next)); freeaddrinfo(res); } } - - B->lookup(QType(QType::ANY),name); - DNSResourceRecord rr; - while(B->get(rr)) - if(rr.qtype.getCode() == QType::A || rr.qtype.getCode()==QType::AAAA) - addresses.push_back(rr.content); // SOL if you have a CNAME for an NS - - return addresses; } }; diff --git a/pdns/slavecommunicator.cc b/pdns/slavecommunicator.cc index 2b4d843d97..d44f8abcae 100644 --- a/pdns/slavecommunicator.cc +++ b/pdns/slavecommunicator.cc @@ -71,7 +71,7 @@ void CommunicatorClass::suck(const string &domain,const string &remote) di.backend=0; bool transaction=false; try { - UeberBackend *B=dynamic_cast(P.getBackend()); // copy of the same UeberBackend + UeberBackend *B=P.getBackend(); // copy of the same UeberBackend DNSSECKeeper dk (B); // reuse our UeberBackend copy for DNSSECKeeper if(!B->getDomainInfo(domain, di) || !di.backend) { // di.backend and B are mostly identical @@ -519,7 +519,7 @@ void CommunicatorClass::addTrySuperMasterRequest(DNSPacket *p) void CommunicatorClass::slaveRefresh(PacketHandler *P) { - UeberBackend *B=dynamic_cast(P->getBackend()); + UeberBackend *B=P->getBackend(); vector rdomains; vector sdomains; // the bool is for 'presigned' vector trysuperdomains; diff --git a/pdns/testrunner.cc b/pdns/testrunner.cc index 320386679f..f27a6c3d1d 100644 --- a/pdns/testrunner.cc +++ b/pdns/testrunner.cc @@ -2,4 +2,7 @@ #define BOOST_TEST_MAIN #define BOOST_TEST_MODULE unit +#include "packetcache.hh" +PacketCache PC; + #include diff --git a/pdns/ueberbackend.cc b/pdns/ueberbackend.cc index 0c48f69161..51b6f88daa 100644 --- a/pdns/ueberbackend.cc +++ b/pdns/ueberbackend.cc @@ -108,7 +108,7 @@ bool UeberBackend::createDomain(const string &domain) return false; } -int UeberBackend::addDomainKey(const string& name, const KeyData& key) +int UeberBackend::addDomainKey(const string& name, const DNSBackend::KeyData& key) { int ret; BOOST_FOREACH(DNSBackend* db, backends) { @@ -117,7 +117,7 @@ int UeberBackend::addDomainKey(const string& name, const KeyData& key) } return -1; } -bool UeberBackend::getDomainKeys(const string& name, unsigned int kind, std::vector& keys) +bool UeberBackend::getDomainKeys(const string& name, unsigned int kind, std::vector& keys) { BOOST_FOREACH(DNSBackend* db, backends) { if(db->getDomainKeys(name, kind, keys)) diff --git a/pdns/ueberbackend.hh b/pdns/ueberbackend.hh index 6837ed1b72..b657b06c93 100644 --- a/pdns/ueberbackend.hh +++ b/pdns/ueberbackend.hh @@ -52,7 +52,7 @@ class BackendReporter; The UeberBackend is transparent for exceptions, which should fall straight through. */ -class UeberBackend : public DNSBackend, public boost::noncopyable +class UeberBackend : public boost::noncopyable { public: UeberBackend(const string &pname="default"); @@ -113,11 +113,6 @@ public: void lookup(const QType &, const string &qdomain, DNSPacket *pkt_p=0, int zoneId=-1); - /* 5-arg version is only valid for backends and should never be called directly */ - virtual bool getAuth(DNSPacket *p, SOAData *sd, const string &target, int *zoneId, const int best_match_len) { - throw PDNSException("5-arg version of getAuth should not be called in UeberBackend"); - } - bool getAuth(DNSPacket *p, SOAData *sd, const string &target, int *zoneId); bool getSOA(const string &domain, SOAData &sd, DNSPacket *p=0); bool list(const string &target, int domain_id, bool include_disabled=false); @@ -132,8 +127,8 @@ public: bool getDomainInfo(const string &domain, DomainInfo &di); bool createDomain(const string &domain); - int addDomainKey(const string& name, const KeyData& key); - bool getDomainKeys(const string& name, unsigned int kind, std::vector& keys); + int addDomainKey(const string& name, const DNSBackend::KeyData& key); + bool getDomainKeys(const string& name, unsigned int kind, std::vector& keys); bool getAllDomainMetadata(const string& name, std::map >& meta); bool getDomainMetadata(const string& name, const std::string& kind, std::vector& meta); bool setDomainMetadata(const string& name, const std::string& kind, const std::vector& meta);