Makes it clear who calls what where.
bindparser.yy \
dns.cc \
dns_random.cc \
+ dnsbackend.cc \
dnslabeltext.cc \
dnspacket.cc \
dnsparser.cc \
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
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;
}
}
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;
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)
{
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,
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;
#endif // HAVE_CONFIG_H
-class DNSBackend;
+class UeberBackend;
class DNSSECKeeper;
//! This class represents DNS packets, either received or to be sent.
};
-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
#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!
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);
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;
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);
}
// 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)
{
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);
#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;
if(!::arg().mustDo("master"))
return;
- UeberBackend *B=dynamic_cast<UeberBackend *>(P->getBackend());
+ UeberBackend *B=P->getBackend();
vector<DomainInfo> cmdomains;
B->getUpdatedMasters(&cmdomains);
}
-DNSBackend *PacketHandler::getBackend()
+UeberBackend *PacketHandler::getBackend()
{
return &B;
}
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;
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);
#include "dns.hh"
#include "namespaces.hh"
#include "dnsbackend.hh"
+#include "ueberbackend.hh"
class ResolverException : public PDNSException
{
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;
}
};
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
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;
#define BOOST_TEST_MAIN
#define BOOST_TEST_MODULE unit
+#include "packetcache.hh"
+PacketCache PC;
+
#include <boost/test/unit_test.hpp>
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) {
}
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))
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");
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);
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);