]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Stop pretending UeberBackend is a normal DNSBackend
authorChristian Hofstaedtler <christian@hofstaedtler.name>
Mon, 26 Jan 2015 21:28:40 +0000 (22:28 +0100)
committerChristian Hofstaedtler <christian@hofstaedtler.name>
Sun, 1 Feb 2015 13:55:21 +0000 (14:55 +0100)
Makes it clear who calls what where.

17 files changed:
pdns/Makefile.am
pdns/communicator.hh
pdns/dbdnsseckeeper.cc
pdns/dnsbackend.hh
pdns/dnspacket.cc
pdns/dnspacket.hh
pdns/dnssecinfra.hh
pdns/dnsseckeeper.hh
pdns/dnssecsigner.cc
pdns/mastercommunicator.cc
pdns/packethandler.cc
pdns/packethandler.hh
pdns/resolver.hh
pdns/slavecommunicator.cc
pdns/testrunner.cc
pdns/ueberbackend.cc
pdns/ueberbackend.hh

index e92434e7e00d1ee04f883181a62fa416c3e7ad5c..805bccca80b59b7793f7d2cebc7db1822a590a55 100644 (file)
@@ -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
index dd03022b6f4db1417ed0fc698b35b9ee72d5c91b..1be3673ba8b70034cdcbbdefe9e6ae5953c99332 100644 (file)
@@ -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<pair<string,string>,time_t>d_holes;
   pthread_mutex_t d_holelock;
index 4f10bce1241c905c1ec57d124a314c6ae41b2d54..599df7d7ba9bd0219c7d96218637924b79f407f6 100644 (file)
@@ -315,11 +315,11 @@ DNSSECKeeper::keyset_t DNSSECKeeper::getKeys(const std::string& zone, boost::tri
     }
   }    
   keyset_t retkeyset, allkeyset;
-  vector<UeberBackend::KeyData> dbkeyset;
+  vector<DNSBackend::KeyData> 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<DNSResourceRecord>& rrsigs, uint32_t signTTL)
 {
index 794e38ac241e437c62d58b4f14e51d619c685e08..9db293a31e82407a5c30d249af1d783b1fd5a462 100644 (file)
@@ -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,
index b1b06a97e24bb2cc5f0525080d8c22283a8e6c09..bdb56fc64c7f990b872126651e0c73689b27dcc0 100644 (file)
@@ -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;
 
index f6c2646d2420717fd99f0950990628d6fdd5aef5..d3c2601bdfbd0e821d2425116dc1bf0bae05b438 100644 (file)
@@ -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
index 7bffd979ae5a77d1dab169cfbb04bae20af08d1a..55433e89344e579e4c516b3043a35e7c863923dc 100644 (file)
@@ -7,6 +7,7 @@
 #include <vector>
 #include <map>
 #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<shared_ptr<DNSRecordContent> >& 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<shared_ptr<DNSRecordContent> >& toSign, vector<DNSResourceRecord>& outsigned, uint32_t origTTL);
 int getRRSIGsForRRSET(DNSSECKeeper& dk, const std::string& signer, const std::string signQName, uint16_t signQType, uint32_t signTTL,
   vector<shared_ptr<DNSRecordContent> >& toSign, vector<RRSIGRecordContent> &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<string>& output);
 class DNSPacket;
-void addRRSigs(DNSSECKeeper& dk, DNSBackend& db, const std::set<string, CIStringCompare>& authMap, vector<DNSResourceRecord>& rrs);
+void addRRSigs(DNSSECKeeper& dk, UeberBackend& db, const std::set<string, CIStringCompare>& authMap, vector<DNSResourceRecord>& rrs);
 
 typedef enum { TSIG_MD5, TSIG_SHA1, TSIG_SHA224, TSIG_SHA256, TSIG_SHA384, TSIG_SHA512 } TSIGHashEnum;
 
index c373024c7308283bbfe61da6b5f4cce5dee9fbd8..9031eb946af95f74e2e7140561e0fd88b620cc56 100644 (file)
@@ -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<DNSResourceRecord>& 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<DNSResourceRecord>& rrsigs, uint32_t signTTL);
   bool isPresigned(const std::string& zname);
   bool setPresigned(const std::string& zname);
   bool unsetPresigned(const std::string& zname);
index dcf0cc90c3283ddd04953a416fdad8f808c70c04..077bee0f9b4a44a544aad8890686c930772dd1a0 100644 (file)
@@ -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<shared_ptr<DNSRecordContent> >& toSign, vector<DNSResourceRecord>& outsigned, uint32_t origTTL)
 {
@@ -196,7 +196,7 @@ static bool getBestAuthFromSet(const set<string, CIStringCompare>& authSet, cons
   return false;
 }
 
-void addRRSigs(DNSSECKeeper& dk, DNSBackend& db, const set<string, CIStringCompare>& authSet, vector<DNSResourceRecord>& rrs)
+void addRRSigs(DNSSECKeeper& dk, UeberBackend& db, const set<string, CIStringCompare>& authSet, vector<DNSResourceRecord>& rrs)
 {
   stable_sort(rrs.begin(), rrs.end(), rrsigncomp);
   
index a668ff7fae98bedd2e9381749333d84ae859a53e..5fd6638776d8e3e22df237e30d0d3b07ca3baa64 100644 (file)
@@ -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<string> nsset, ips;
@@ -124,7 +124,7 @@ void CommunicatorClass::masterUpdateCheck(PacketHandler *P)
   if(!::arg().mustDo("master"))
     return; 
 
-  UeberBackend *B=dynamic_cast<UeberBackend *>(P->getBackend());
+  UeberBackend *B=P->getBackend();
   vector<DomainInfo> cmdomains;
   B->getUpdatedMasters(&cmdomains);
   
index e6441b0d2efa5bb34e2be9b1d1836121ac2f1371..6332173bd587f94ca2d4d24916a778cb20ca3b33 100644 (file)
@@ -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 '"<<toBase32Hex(begin)<<"' - ('"<<toNSEC3<<"') - '"<<toBase32Hex(end)<<"' (unhashed: '"<<unhashed<<"')"<<endl;
   NSEC3RecordContent n3rc;
index cf20eaf57b9dfa5f1cceed3562eb6c723e4851e3..0c7d34084db2f2fe9b7590e777cffb8aaca6e474 100644 (file)
@@ -61,7 +61,7 @@ public:
   static int numRunning(){return s_count;}; //!< Returns the number of running PacketHandlers. Called by Distributor
  
   void soaMagic(DNSResourceRecord *rr);
-  DNSBackend *getBackend();
+  UeberBackend *getBackend();
 
   int trySuperMasterSynchronous(DNSPacket *p);
 
index 28fdb12a1bf3daac1aa2da14ed2388eb66269e9b..dddac3fb8d9a997f2b8397dc2972a269327f0f30 100644 (file)
@@ -38,6 +38,7 @@
 #include "dns.hh"
 #include "namespaces.hh"
 #include "dnsbackend.hh"
+#include "ueberbackend.hh"
 
 class ResolverException : public PDNSException
 {
@@ -113,35 +114,56 @@ class AXFRRetriever : public boost::noncopyable
 class FindNS
 {
 public:
-  vector<string> lookup(const string &name, DNSBackend *B)
+  vector<string> lookup(const string &name, DNSBackend *b)
   {
     vector<string> 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<string> lookup(const string &name, UeberBackend *b)
+  {
+    vector<string> 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<string>* 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;
   }
 };
 
index 2b4d843d97a561afbf18bc1ff856090d1ea4f8da..d44f8abcaee7af8ff86135507fa9333656ece9fb 100644 (file)
@@ -71,7 +71,7 @@ void CommunicatorClass::suck(const string &domain,const string &remote)
   di.backend=0;
   bool transaction=false;
   try {
-    UeberBackend *B=dynamic_cast<UeberBackend *>(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<UeberBackend *>(P->getBackend());
+  UeberBackend *B=P->getBackend();
   vector<DomainInfo> rdomains;
   vector<DomainNotificationInfo> sdomains; // the bool is for 'presigned'
   vector<DNSPacket> trysuperdomains;
index 320386679f1072511c760b80cdb83e6467b9362c..f27a6c3d1d82310f660060e1d6d8bef959a34a5f 100644 (file)
@@ -2,4 +2,7 @@
 #define BOOST_TEST_MAIN
 #define BOOST_TEST_MODULE unit
 
+#include "packetcache.hh"
+PacketCache PC;
+
 #include <boost/test/unit_test.hpp>
index 0c48f691611629994ffa083dda0c7063ec71da44..51b6f88daa10e13bc45179cf6796b0b3f85c03a9 100644 (file)
@@ -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<KeyData>& keys)
+bool UeberBackend::getDomainKeys(const string& name, unsigned int kind, std::vector<DNSBackend::KeyData>& keys)
 {
   BOOST_FOREACH(DNSBackend* db, backends) {
     if(db->getDomainKeys(name, kind, keys))
index 6837ed1b72baf6eb83d63d0ae1a1bf61a6aa01e2..b657b06c93e0d9e441dbe4b8f553c135ed9fdad1 100644 (file)
@@ -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<KeyData>& keys);
+  int addDomainKey(const string& name, const DNSBackend::KeyData& key);
+  bool getDomainKeys(const string& name, unsigned int kind, std::vector<DNSBackend::KeyData>& keys);
   bool getAllDomainMetadata(const string& name, std::map<std::string, std::vector<std::string> >& meta);
   bool getDomainMetadata(const string& name, const std::string& kind, std::vector<std::string>& meta);
   bool setDomainMetadata(const string& name, const std::string& kind, const std::vector<std::string>& meta);