}
return false;
}
+
+bool DNSSECKeeper::getTSIGForAcces(const string& zone, const string& master, string* keyname)
+{
+ vector<string> keynames;
+ d_keymetadb.getDomainMetadata(zone, "AXFR-MASTER-TSIG", keynames);
+ keyname->clear();
+
+ // XXX FIXME this should check for a specific master!
+ BOOST_FOREACH(const string& dbkey, keynames) {
+ *keyname=dbkey;
+
+ return true;
+ }
+ return false;
+}
return message;
}
-
-
-
void addTSIG(DNSPacketWriter& pw, TSIGRecordContent* trc, const string& tsigkeyname, const string& tsigsecret, const string& tsigprevious, bool timersonly)
{
string toSign;
void unsetPresigned(const std::string& zname);
bool TSIGGrantsAccess(const string& zone, const string& keyname, const string& algorithm);
+ bool getTSIGForAcces(const string& zone, const string& master, string* keyname);
private:
void getFromMeta(const std::string& zname, const std::string& key, std::string& value);
*serial=(uint32_t)atol(parts[2].c_str());
}
-AXFRRetriever::AXFRRetriever(const ComboAddress& remote, const string& domain)
+AXFRRetriever::AXFRRetriever(const ComboAddress& remote, const string& domain, const string& tsigkeyname, const string& tsigalgorithm, const string& tsigsecret)
{
ComboAddress local;
if(remote.sin4.sin_family == AF_INET)
DNSPacketWriter pw(packet, domain, QType::AXFR);
pw.getHeader()->id = dns_random(0xffff);
+ if(!tsigkeyname.empty()) {
+ TSIGRecordContent trc;
+ trc.d_algoName = tsigalgorithm + ".sig-alg.reg.int.";
+ trc.d_time = time(0);
+ trc.d_fudge = 300;
+ trc.d_origID=ntohs(pw.getHeader()->id);
+ trc.d_eRcode=0;
+ addTSIG(pw, &trc, tsigkeyname, tsigsecret, "", false);
+ }
+
uint16_t replen=htons(packet.size());
Utility::iovec iov[2];
iov[0].iov_base=(char*)&replen;
class AXFRRetriever : public boost::noncopyable
{
public:
- AXFRRetriever(const ComboAddress& remote, const string& zone);
+ AXFRRetriever(const ComboAddress& remote, const string& zone, const string& tsigkeyname=string(), const string& tsigalgorithm=string(), const string& tsigsecret=string());
int getChunk(Resolver::res_t &res);
private:
#include "packetcache.hh"
#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
+#include "base64.hh"
#include "inflighter.cc"
#include "namespaces.hh"
di.backend=0;
bool first=true;
try {
- ComboAddress raddr(remote, 53);
- AXFRRetriever retriever(raddr, domain.c_str());
-
UeberBackend *B=dynamic_cast<UeberBackend *>(P.getBackend());
NSEC3PARAMRecordContent ns3pr;
bool narrow;
Resolver::res_t recs;
set<string> nsset, qnames;
+
+ ComboAddress raddr(remote, 53);
+
+ string tsigkeyname, tsigalgorithm, tsigsecret;
+
+ if(dk.getTSIGForAcces(domain, remote, &tsigkeyname)) {
+ string tsigsecret64;
+ B->getTSIGKey(tsigkeyname, &tsigalgorithm, &tsigsecret64);
+ B64Decode(tsigsecret64, tsigsecret);
+ }
+ AXFRRetriever retriever(raddr, domain.c_str(), tsigkeyname, tsigalgorithm, tsigsecret);
+
while(retriever.getChunk(recs)) {
if(first) {
L<<Logger::Error<<"AXFR started for '"<<domain<<"', transaction started"<<endl;