ASSERT_ROW_COLUMNS("info-zone-query", d_result[0], 7);
di.id=atol(d_result[0][0].c_str());
- di.zone=d_result[0][1];
+ di.zone=DNSName(d_result[0][1]);
stringtok(di.masters, d_result[0][2], " ,\t");
di.last_check=atol(d_result[0][3].c_str());
di.notified_serial = atol(d_result[0][4].c_str());
DomainInfo sd;
ASSERT_ROW_COLUMNS("info-all-slaves-query", d_result[n], 4);
sd.id=atol(d_result[n][0].c_str());
- sd.zone=d_result[n][1];
+ sd.zone= DNSName(d_result[n][1]);
stringtok(sd.masters, d_result[n][2], ", \t");
sd.last_check=atol(d_result[n][3].c_str());
sd.backend=this;
DomainInfo sd;
ASSERT_ROW_COLUMNS("info-all-master-query", d_result[n], 5);
sd.id=atol(d_result[n][0].c_str());
- sd.zone=d_result[n][1];
+ sd.zone= DNSName(d_result[n][1]);
sd.last_check=atol(d_result[n][3].c_str());
sd.notified_serial=atoi(d_result[n][4].c_str());
sd.backend=this;
d_beforeOrderQuery_stmt->nextRow(row);
ASSERT_ROW_COLUMNS("get-order-before-query", row, 2);
before=row[0];
- unhashed=row[1];
+ unhashed=DNSName(row[1]);
}
d_beforeOrderQuery_stmt->reset();
}
d_lastOrderQuery_stmt->nextRow(row);
ASSERT_ROW_COLUMNS("get-order-last-query", row, 2);
before=row[0];
- unhashed=row[1];
+ unhashed=DNSName(row[1]);
}
d_lastOrderQuery_stmt->reset();
}
while(d_getTSIGKeyQuery_stmt->hasNextRow()) {
d_getTSIGKeyQuery_stmt->nextRow(row);
ASSERT_ROW_COLUMNS("get-tsig-key-query", row, 2);
- if(algorithm->empty() || *algorithm==row[0]) {
- *algorithm = row[0];
+ if(algorithm->empty() || *algorithm==DNSName(row[0])) {
+ *algorithm = DNSName(row[0]);
*content = row[1];
}
}
d_getTSIGKeysQuery_stmt->nextRow(row);
ASSERT_ROW_COLUMNS("get-tsig-keys-query", row, 3);
struct TSIGKey key;
- key.name = row[0];
- key.algorithm = row[1];
+ key.name = DNSName(row[0]);
+ key.algorithm = DNSName(row[1]);
key.key = row[2];
keys.push_back(key);
}
ASSERT_ROW_COLUMNS("get-all-domains-query", row, 8);
DomainInfo di;
di.id = atol(row[0].c_str());
- di.zone = row[1];
+ di.zone = DNSName(row[1]);
if (!row[4].empty()) {
stringtok(di.masters, row[4], " ,\t");
if(!d_qname.empty())
r.qname=d_qname;
else
- r.qname=row[6];
+ r.qname=DNSName(row[6]);
r.qtype=row[3];
if (r.qtype==QType::MX || r.qtype==QType::SRV)
global_zone_command:
ZONETOK quotedname zone_block
{
- s_di.name=stripDot($2);
+ s_di.name=DNSName(stripDot($2));
free($2);
parent->commit(s_di);
s_di.clear();
|
ZONETOK quotedname AWORD zone_block
{
- s_di.name=stripDot($2);
+ s_di.name=DNSName(stripDot($2));
free($2);
parent->commit(s_di);
s_di.clear();
void clear()
{
- name=filename=type="";
+ name=DNSName();
+ filename=type="";
masters.clear();
alsoNotify.clear();
d_dev=0;
return false;
sd.qname = domain;
if(!sd.nameserver.countLabels())
- sd.nameserver=arg()["default-soa-name"];
+ sd.nameserver= DNSName(arg()["default-soa-name"]);
if(!sd.hostmaster.countLabels()) {
if (!arg().isEmpty("default-soa-mail")) {
- sd.hostmaster=arg()["default-soa-mail"];
+ sd.hostmaster= DNSName(arg()["default-soa-mail"]);
// attodot(sd.hostmaster); FIXME400
}
else
#define DLOG(x) x
#endif
-bool _add_to_negcache( const string &zone ) {
+// XXX DNSName pain, should be DNSName native.
+static bool add_to_negcache( const string &zone ) {
static int negqueryttl=::arg().asNum("negquery-cache-ttl");
// add the zone to the negative query cache and return false
if(negqueryttl) {
DLOG(L<<Logger::Error<<"Adding to neg qcache: " << zone<<endl);
- PC.insert(zone, QType(QType::SOA), PacketCache::QUERYCACHE, "", negqueryttl, 0);
+ PC.insert(DNSName(zone), QType(QType::SOA), PacketCache::QUERYCACHE, "", negqueryttl, 0);
}
return false;
}
+// XXX DNSName Pain, this should be DNSName native! vvvvvvvvvvvvvv
inline int DNSReversedBackend::_getAuth(DNSPacket *p, SOAData *soa, const string &inZone, const string &querykey, const int best_match_len) {
static int negqueryttl=::arg().asNum("negquery-cache-ttl");
* failed to look up this zone */
if( negqueryttl ) {
string content;
- bool ret = PC.getEntry( inZone, QType(QType::SOA), PacketCache::QUERYCACHE, content, 0 );
+ bool ret = PC.getEntry( DNSName(inZone), QType(QType::SOA), PacketCache::QUERYCACHE, content, 0 );
if( ret && content.empty() ) {
DLOG(L<<Logger::Error<<"Found in neg qcache: " << inZone << ":" << content << ":" << ret << ":"<<endl);
return GET_AUTH_NEG_DONTCACHE;
if( getAuthData( *soa, p ) ) {
/* all the keys are reversed. rather than reversing them again it is
* presumably quicker to just substring the zone down to size */
- soa->qname = inZone.substr( inZone.length() - foundkey.length(), string::npos );
+ soa->qname = DNSName(inZone.substr( inZone.length() - foundkey.length(), string::npos ));
- DLOG(L<<Logger::Error<<"Successfully got record: " <<foundkey << " : " << querykey.substr( 0, foundkey.length() ) << " : " << soa->qname<<endl);
+ DLOG(L<<Logger::Error<<"Successfully got record: " <<foundkey << " : " << querykey.substr( 0, foundkey.length() ) << " : " << soa->qname<<endl);
- return GET_AUTH_SUCCESS;
+ return GET_AUTH_SUCCESS;
}
return GET_AUTH_NEG_CACHE;
* size
*/
if( ret == GET_AUTH_NEG_CACHE )
- _add_to_negcache( inZone.toStringNoDot() );
+ add_to_negcache( inZone.toStringNoDot() );
return ret == GET_AUTH_SUCCESS;
}
}
DNSName algoName = trc->d_algoName; // FIXME400
- if (algoName == "hmac-md5.sig-alg.reg.int")
- algoName = "hmac-md5";
+ if (algoName == DNSName("hmac-md5.sig-alg.reg.int"))
+ algoName = DNSName("hmac-md5");
- if (algoName == "gss-tsig") {
+ if (algoName == DNSName("gss-tsig")) {
if (!gss_verify_signature(*keyname, message, trc->d_mac)) {
L<<Logger::Error<<"Packet for domain '"<<q->qdomain<<"' denied: TSIG signature mismatch using '"<<*keyname<<"' and algorithm '"<<trc->d_algoName<<"'"<<endl;
return false;
L<<Logger::Error<<"Packet for domain '"<<q->qdomain<<"' denied: can't find TSIG key with name '"<<*keyname<<"' and algorithm '"<<algoName<<"'"<<endl;
return false;
}
- if (trc->d_algoName == "hmac-md5")
- trc->d_algoName += "sig-alg.reg.int";
+ if (trc->d_algoName == DNSName("hmac-md5"))
+ trc->d_algoName += DNSName("sig-alg.reg.int");
TSIGHashEnum algo;
if(!getTSIGHashEnum(trc->d_algoName, algo)) {
bool sharedDNSSECCompare(const shared_ptr<DNSRecordContent>& a, const shared_ptr<DNSRecordContent>& b)
{
- return a->serialize("", true, true) < b->serialize("", true, true);
+ return a->serialize(DNSName(), true, true) < b->serialize(DNSName(), true, true);
}
string getMessageForRRSET(const DNSName& qname, const RRSIGRecordContent& rrc, vector<shared_ptr<DNSRecordContent> >& signRecords)
sort(signRecords.begin(), signRecords.end(), sharedDNSSECCompare);
string toHash;
- toHash.append(const_cast<RRSIGRecordContent&>(rrc).serialize("", true, true));
+ toHash.append(const_cast<RRSIGRecordContent&>(rrc).serialize(DNSName(), true, true));
toHash.resize(toHash.size() - rrc.d_signature.length()); // chop off the end, don't sign the signature!
BOOST_FOREACH(shared_ptr<DNSRecordContent>& add, signRecords) {
toHash.append((char*)&tmp, 2);
uint32_t ttl=htonl(rrc.d_originalttl);
toHash.append((char*)&ttl, 4);
- string rdata=add->serialize("", true, true);
+ string rdata=add->serialize(DNSName(), true, true);
tmp=htons(rdata.length());
toHash.append((char*)&tmp, 2);
toHash.append(rdata);
{
string toHash;
toHash.assign(qname.toDNSString()); // FIXME400 tolower?
- toHash.append(const_cast<DNSKEYRecordContent&>(drc).serialize("", true, true));
+ toHash.append(const_cast<DNSKEYRecordContent&>(drc).serialize(DNSName(), true, true));
DSRecordContent dsrc;
if(digest==1) {
message.append(packet);
vector<uint8_t> signVect;
- DNSPacketWriter dw(signVect, "", 0);
+ DNSPacketWriter dw(signVect, DNSName(), 0);
if(!timersonly) {
dw.xfrName(keyname, false);
dw.xfr16BitInt(QClass::ANY); // class
// now add something that looks a lot like a TSIG record, but isn't
vector<uint8_t> signVect;
- DNSPacketWriter dw(signVect, "", 0);
+ DNSPacketWriter dw(signVect, DNSName(), 0);
if(!timersonly) {
dw.xfrName(tsigkeyname, false);
dw.xfr16BitInt(QClass::ANY); // class
void startTransaction()
{
- (*d_keymetadb->backends.begin())->startTransaction("", -1);
+ (*d_keymetadb->backends.begin())->startTransaction(DNSName(), -1);
}
void commitTransaction()
if(parts.size()>1) {
for (vector<string>::const_iterator i=++parts.begin();i<parts.end();++i) {
ret+=PC.purge(*i);
- dk.clearCaches(*i);
+ dk.clearCaches(DNSName(*i));
}
}
else {
const string& domain=parts[1];
DomainInfo di;
UeberBackend B;
- if(!B.getDomainInfo(domain, di))
+ if(!B.getDomainInfo(DNSName(domain), di))
return "Domain '"+domain+"' unknown";
if(di.masters.empty())
return "Domain '"+domain+"' is not a slave domain (or has no master defined)";
random_shuffle(di.masters.begin(), di.masters.end());
- Communicator.addSuckRequest(domain, di.masters.front());
+ Communicator.addSuckRequest(DNSName(domain), di.masters.front());
return "Added retrieval request for '"+domain+"' from master "+di.masters.front();
}
}
L<<Logger::Warning<<"Notification request to host "<<parts[2]<<" for domain '"<<parts[1]<<"' received"<<endl;
- Communicator.notify(parts[1],parts[2]);
+ Communicator.notify(DNSName(parts[1]), parts[2]);
return "Added to queue";
}
+// XXX DNSName pain - if you pass us something that is not DNS, you'll get an exception here, which you never got before
+// and I bet we don't report it well to the user...
+
string DLNotifyHandler(const vector<string>&parts, Utility::pid_t ppid)
{
extern CommunicatorClass Communicator;
return itoa(notified)+" out of "+itoa(total)+" zones added to queue - see log";
return "Added "+itoa(total)+" MASTER zones to queue";
} else {
- if(!Communicator.notifyDomain(parts[1]))
+ if(!Communicator.notifyDomain(DNSName(parts[1])))
return "Failed to add to the queue - see log";
return "Added to queue";
}
static int ldp_addRecords(lua_State *L) {
DNSPacket *p=ldp_checkDNSPacket(L);
vector<DNSResourceRecord> rrs;
- popResourceRecordsTable(L, "BOGUS", rrs);
+ popResourceRecordsTable(L, DNSName("BOGUS"), rrs);
BOOST_FOREACH(DNSResourceRecord rr, rrs) {
p->addRecord(rr);
}
nsset.insert(rr.content);
for(set<string>::const_iterator j=nsset.begin();j!=nsset.end();++j) {
- vector<string> nsips=fns.lookup(*j, B);
+ vector<string> nsips=fns.lookup(DNSName(*j), B);
if(nsips.empty())
L<<Logger::Warning<<"Unable to queue notification of domain '"<<domain<<"': nameservers do not resolve!"<<endl;
else
string prefix(match);
prefix.resize(prefix.size()-1);
- string zone = pcReverse(prefix);
+ string zone = pcReverse(DNSName(prefix));
cmap_t::const_iterator iter = mc.d_map.lower_bound(tie(zone));
cmap_t::const_iterator start=iter;
}
else {
- string qname = pcReverse(match);
+ string qname = pcReverse(DNSName(match));
delcount+=mc.d_map.count(tie(qname));
pair<cmap_t::iterator, cmap_t::iterator> range = mc.d_map.equal_range(tie(qname));
for(char c='a';c<='m';++c) {
*templ=c;
- rr.qname=templ;
+ rr.qname=DNSName(templ);
rr.content=ips[c-'a'];
r->addRecord(rr);
}
DNSResourceRecord rr;
if(p->qtype.getCode()==QType::TXT) {
- if (pdns_iequals(target, "version.pdns") || pdns_iequals(target, "version.bind")) {
+ static const DNSName versionbind("version.bind."), versionpdns("version.pdns."), idserver("id.server.");
+ if (target==versionbind || target==versionbind) {
// modes: full, powerdns only, anonymous or custom
const static string mode=::arg()["version-string"];
else
rr.content=mode;
}
- else if (pdns_iequals(target, "id.server")) {
+ else if (target==idserver) {
// modes: disabled, hostname or custom
const static string id=::arg()["server-id"];
ret.push_back(rr); // put in the original
rr.qtype = QType::CNAME;
rr.qname = prefix + rr.qname;
- rr.content = (prefix + rr.content).toStringNoDot();
+ rr.content = (prefix + DNSName(rr.content)).toStringNoDot();
rr.auth = 0; // don't sign CNAME
- target= rr.content;
+ target= DNSName(rr.content);
ret.push_back(rr);
}
if(!ret.empty())
return ret;
if(subdomain.countLabels())
- prefix+= subdomain.getRawLabels()[0];
+ prefix+= DNSName(subdomain.getRawLabels()[0]); // XXX DNSName pain this feels wrong
if(subdomain == sd.qname) // stop at SOA
break;
wildcard=subdomain;
while( subdomain.chopOff() && !haveSomething ) {
if (subdomain.empty()) {
- B.lookup(QType(QType::ANY), "*", p, sd.domain_id);
+ B.lookup(QType(QType::ANY), DNSName("*"), p, sd.domain_id);
} else {
- B.lookup(QType(QType::ANY), "*."+subdomain, p, sd.domain_id);
+ B.lookup(QType(QType::ANY), DNSName("*")+subdomain, p, sd.domain_id);
}
while(B.get(rr)) {
if(rr.qtype == p->qtype || rr.qtype.getCode() == QType::CNAME || (p->qtype.getCode() == QType::ANY && rr.qtype.getCode() != QType::RRSIG))
ret->push_back(rr);
- wildcard="*."+subdomain;
+ wildcard=DNSName("*")+subdomain;
haveSomething=true;
}
vector<string>parts;
stringtok(parts, content);
if (parts.size() >= 3) {
- B.lookup(qtypes[n],parts[2],p);
+ B.lookup(qtypes[n], DNSName(parts[2]), p);
}
else
continue;
}
else {
- B.lookup(qtypes[n], content, p);
+ B.lookup(qtypes[n], DNSName(content), p);
}
while(B.get(rr)) {
if(rr.domain_id!=i->domain_id && ::arg()["out-of-zone-additional-processing"]=="no") {
r->setA(false);
if(d_dk.isSecuredZone(sd.qname) && !addDSforNS(p, r, sd, rrset.begin()->qname))
- addNSECX(p, r, rrset.begin()->qname, "", sd.qname, 1);
+ addNSECX(p, r, rrset.begin()->qname, DNSName(), sd.qname, 1);
return true;
}
if(!d_dk.isSecuredZone(sd.qname))
return;
- addNSECX(p, r, target, "", sd.qname, 5);
+ addNSECX(p, r, target, DNSName(), sd.qname, 5);
if(pdns_iequals(sd.qname, p->qdomain)) {
addDNSKEY(p, r, sd);
addNSEC3PARAM(p, r, sd);
if(rr.qtype.getCode() == QType::CNAME) {
retargeted=true;
- target=rr.content;
+ target=DNSName(rr.content);
}
DLOG(L<<"\tadding '"<<rr.content<<"'"<<endl);
// this TRUMPS a cname!
if(p->qtype.getCode() == QType::NSEC && d_dk.isSecuredZone(sd.qname) && !d_dk.getNSEC3PARAM(sd.qname, 0)) {
- addNSEC(p, r, target, "", sd.qname, 5);
+ addNSEC(p, r, target, DNSName(), sd.qname, 5);
goto sendit;
}
DLOG(L<<"After first ANY query for '"<<target<<"', id="<<sd.domain_id<<": weDone="<<weDone<<", weHaveUnauth="<<weHaveUnauth<<", weRedirected="<<weRedirected<<", haveAlias='"<<haveAlias<<"'"<<endl);
if(p->qtype.getCode() == QType::DS && weHaveUnauth && !weDone && !weRedirected && d_dk.isSecuredZone(sd.qname)) {
DLOG(L<<"Q for DS of a name for which we do have NS, but for which we don't have on a zone with DNSSEC need to provide an AUTH answer that proves we don't"<<endl);
- makeNOError(p, r, target, "", sd, 1);
+ makeNOError(p, r, target, DNSName(), sd, 1);
goto sendit;
}
for(auto& rr: rrset) {
if(rr.qtype.getCode() == QType::CNAME) {
r->addRecord(rr);
- target = rr.content;
+ target = DNSName(rr.content);
retargetcount++;
goto retargeted;
}
completeANYRecords(p, r, sd, target);
}
else
- makeNOError(p, r, rr.qname, "", sd, 0);
+ makeNOError(p, r, rr.qname, DNSName(), sd, 0);
goto sendit;
}
}
else {
DLOG(L<<"Have some data, but not the right data"<<endl);
- makeNOError(p, r, target, "", sd, 0);
+ makeNOError(p, r, target, DNSName(), sd, 0);
}
sendit:;
if(!tsigkeyname.empty()) {
// cerr<<"Adding TSIG to notification, key name: '"<<tsigkeyname<<"', algo: '"<<tsigalgorithm<<"', secret: "<<Base64Encode(tsigsecret)<<endl;
TSIGRecordContent trc;
- if (tsigalgorithm == "hmac-md5")
- trc.d_algoName = tsigalgorithm + "sig-alg.reg.int";
+ if (tsigalgorithm == DNSName("hmac-md5"))
+ trc.d_algoName = tsigalgorithm + DNSName("sig-alg.reg.int");
else
trc.d_algoName = tsigalgorithm;
trc.d_time = time(0);
pw.getHeader()->id = dns_random(0xffff);
if(!tsigkeyname.empty()) {
- if (tsigalgorithm == "hmac-md5")
- d_trc.d_algoName = tsigalgorithm + "sig-alg.reg.int";
+ if (tsigalgorithm == DNSName("hmac-md5"))
+ d_trc.d_algoName = tsigalgorithm + DNSName("sig-alg.reg.int");
else
d_trc.d_algoName = tsigalgorithm;
d_trc.d_time = time(0);
timeoutReadn(len);
MOADNSParser mdp(d_buf.get(), len);
- int err = parseResult(mdp, "", 0, 0, &res);
+ int err = parseResult(mdp, DNSName(), 0, 0, &res);
if(err)
throw ResolverException("AXFR chunk error: " + RCode::to_s(err));
}
} else {
for(vector<string>::const_iterator key=tsigKeys.begin(); key != tsigKeys.end(); key++) {
- if (inputkey == *key) { // because checkForCorrectTSIG has already been performed earlier on, if the names of the ky match with the domain given. THis is valid.
+ if (inputkey == DNSName(*key)) { // because checkForCorrectTSIG has already been performed earlier on, if the names of the ky match with the domain given. THis is valid.
validKey=true;
break;
}
{
vector<uint8_t> packet;
- DNSPacketWriter pw(packet, qname, qtype);
+ DNSPacketWriter pw(packet, DNSName(qname), qtype);
pw.getHeader()->id=dns_random(0xffff);
pw.getHeader()->rd=1;
if (s_secpollresolvers.empty()) {
throw PDNSException("Zones with a mixture of Opt-Out NSEC3 RRs and non-Opt-Out NSEC3 RRs are not supported.");
optOutFlag = ns3rc.d_flags & 1;
if (ns3rc.d_set.count(QType::NS) && !pdns_iequals(rr.qname, domain))
- secured.insert(toLower(makeRelative(rr.qname.toString(), domain.toString())));
+ secured.insert(DNSName(toLower(makeRelative(rr.qname.toString(), domain.toString())))); // XXX DNSName pain
continue;
}
case QType::NSEC: {
if (!rr.auth && rr.qtype.getCode() == QType::NS) {
if (isNSEC3)
ordername=toBase32Hex(hashQNameWithSalt(ns3pr, rr.qname));
- auth=(!isNSEC3 || !optOutFlag || secured.count(ordername));
+ auth=(!isNSEC3 || !optOutFlag || secured.count(DNSName(ordername)));
} else
auth=rr.auth;
if (isNSEC3) {
// NSEC3
ordername=toBase32Hex(hashQNameWithSalt(ns3pr, rr.qname));
- if(!isNarrow && (rr.auth || (rr.qtype.getCode() == QType::NS && (!optOutFlag || secured.count(ordername))))) {
+ if(!isNarrow && (rr.auth || (rr.qtype.getCode() == QType::NS && (!optOutFlag || secured.count(DNSName(ordername)))))) {
di.backend->feedRecord(rr, &ordername);
} else
di.backend->feedRecord(rr);
notifyDomain(domain);
}
catch(DBException &re) {
- L<<Logger::Error<<"Unable to feed record during incoming AXFR of '"+domain+"': "<<re.reason<<endl;
+ L<<Logger::Error<<"Unable to feed record during incoming AXFR of '" << domain<<"': "<<re.reason<<endl;
if(di.backend && transaction) {
L<<Logger::Error<<"Aborting possible open transaction for domain '"<<domain<<"' AXFR"<<endl;
di.backend->abortTransaction();
}
}
catch(MOADNSException &re) {
- L<<Logger::Error<<"Unable to parse record during incoming AXFR of '"+domain+"' (MOADNSException): "<<re.what()<<endl;
+ L<<Logger::Error<<"Unable to parse record during incoming AXFR of '"<<domain<<"' (MOADNSException): "<<re.what()<<endl;
if(di.backend && transaction) {
L<<Logger::Error<<"Aborting possible open transaction for domain '"<<domain<<"' AXFR"<<endl;
di.backend->abortTransaction();
}
}
catch(std::exception &re) {
- L<<Logger::Error<<"Unable to parse record during incoming AXFR of '"+domain+"' (std::exception): "<<re.what()<<endl;
+ L<<Logger::Error<<"Unable to parse record during incoming AXFR of '"<<domain<<"' (std::exception): "<<re.what()<<endl;
if(di.backend && transaction) {
L<<Logger::Error<<"Aborting possible open transaction for domain '"<<domain<<"' AXFR"<<endl;
di.backend->abortTransaction();
}
}
catch(ResolverException &re) {
- L<<Logger::Error<<"Unable to AXFR zone '"+domain+"' from remote '"<<remote<<"' (resolver): "<<re.reason<<endl;
+ L<<Logger::Error<<"Unable to AXFR zone '"<<domain<<"' from remote '"<<remote<<"' (resolver): "<<re.reason<<endl;
if(di.backend && transaction) {
L<<Logger::Error<<"Aborting possible open transaction for domain '"<<domain<<"' AXFR"<<endl;
di.backend->abortTransaction();
}
}
catch(PDNSException &ae) {
- L<<Logger::Error<<"Unable to AXFR zone '"+domain+"' from remote '"<<remote<<"' (PDNSException): "<<ae.reason<<endl;
+ L<<Logger::Error<<"Unable to AXFR zone '"<<domain<<"' from remote '"<<remote<<"' (PDNSException): "<<ae.reason<<endl;
if(di.backend && transaction) {
L<<Logger::Error<<"Aborting possible open transaction for domain '"<<domain<<"' AXFR"<<endl;
di.backend->abortTransaction();
B->lookup(QType(QType::NS),q->qdomain);
while(B->get(rr))
- nsset.insert(rr.content);
+ nsset.insert(DNSName(rr.content));
for(const auto & j: nsset) {
vector<string> nsips=fns.lookup(j, B);
for(vector<string>::const_iterator k=nsips.begin();k!=nsips.end();++k) {
if(!tsigkeyname.empty()) {
string tsig64;
DNSName algorithm=trc.d_algoName; // FIXME400: check
- if (algorithm == "hmac-md5.sig-alg.reg.int")
- algorithm = "hmac-md5";
- if (algorithm != "gss-tsig") {
+ if (algorithm == DNSName("hmac-md5.sig-alg.reg.int"))
+ algorithm = DNSName("hmac-md5");
+ if (algorithm != DNSName("gss-tsig")) {
Lock l(&s_plock);
s_P->getBackend()->getTSIGKey(tsigkeyname, &algorithm, &tsig64);
B64Decode(tsig64, tsigsecret);
nrc.d_set.insert(QType::RRSIG);
nrc.d_set.insert(QType::NSEC);
if(boost::next(iter) != nsecxrepo.end()) {
- nrc.d_next = labelReverse(boost::next(iter)->first);
+ nrc.d_next = DNSName(labelReverse(boost::next(iter)->first));
}
else
- nrc.d_next=labelReverse(nsecxrepo.begin()->first);
+ nrc.d_next=DNSName(labelReverse(nsecxrepo.begin()->first));
- rr.qname = labelReverse(iter->first);
+ rr.qname = DNSName(labelReverse(iter->first));
rr.ttl = sd.default_ttl;
rr.content = nrc.getZoneRepresentation();
if(!tsigkeyname.empty()) {
string tsig64;
DNSName algorithm=trc.d_algoName; // FIXME400: was toLowerCanonic, compare output
- if (algorithm == "hmac-md5.sig-alg.reg.int")
- algorithm = "hmac-md5";
+ if (algorithm == DNSName("hmac-md5.sig-alg.reg.int"))
+ algorithm = DNSName("hmac-md5");
Lock l(&s_plock);
s_P->getBackend()->getTSIGKey(tsigkeyname, &algorithm, &tsig64);
B64Decode(tsig64, tsigsecret);
GssContext ctx(label.toStringNoDot());
if (tkey_in.d_mode == 3) { // establish context
- if (tkey_in.d_algo == "gss-tsig.") {
+ if (tkey_in.d_algo == DNSName("gss-tsig.")) {
std::vector<std::string> meta;
DNSName tmpLabel(label);
do {
if (sign)
{
TSIGRecordContent trc;
- trc.d_algoName = "gss-tsig";
+ trc.d_algoName = DNSName("gss-tsig");
trc.d_time = tkey_out->d_inception;
trc.d_fudge = 300;
trc.d_mac = "";
DNSSECKeeper dk;
jdi.SetObject();
// id is the canonical lookup key, which doesn't actually match the name (in some cases)
- string zoneId = apiZoneNameToId(di.zone.toString());
+ string zoneId = apiZoneNameToId(di.zone);
Value jzoneId(zoneId.c_str(), doc.GetAllocator()); // copy
jdi.AddMember("id", jzoneId, doc.GetAllocator());
string url = "/servers/localhost/zones/" + zoneId;
jdi.AddMember("last_check", (unsigned int) di.last_check, doc.GetAllocator());
}
-static void fillZone(const string& zonename, HttpResponse* resp) {
+static void fillZone(const DNSName& zonename, HttpResponse* resp) {
UeberBackend B;
DomainInfo di;
if(!B.getDomainInfo(zonename, di))
- throw ApiException("Could not find domain '"+zonename+"'");
+ throw ApiException("Could not find domain '"+zonename.toString()+"'");
Document doc;
fillZoneInfo(di, doc, doc);
if (records.IsArray()) {
for (SizeType idx = 0; idx < records.Size(); ++idx) {
const Value& record = records[idx];
- rr.qname = stringFromJson(record, "name");
+ rr.qname = DNSName(stringFromJson(record, "name"));
rr.qtype = stringFromJson(record, "type");
rr.content = stringFromJson(record, "content");
rr.auth = 1;
}
}
-static void updateDomainSettingsFromDocument(const DomainInfo& di, const string& zonename, Document& document) {
+static void updateDomainSettingsFromDocument(const DomainInfo& di, const DNSName& zonename, Document& document) {
string master;
const Value &masters = document["masters"];
if (masters.IsArray()) {
if(req->method != "GET")
throw ApiException("Only GET is implemented");
- string zonename = apiZoneIdToName(req->parameters["id"]);
+ DNSName zonename = apiZoneIdToName(req->parameters["id"]);
UeberBackend B;
DomainInfo di;
DNSSECKeeper dk;
if(!B.getDomainInfo(zonename, di))
- throw ApiException("Could not find domain '"+zonename+"'");
+ throw ApiException("Could not find domain '"+zonename.toString()+"'");
DNSSECKeeper::keyset_t keyset=dk.getKeys(zonename, boost::indeterminate, false);
if (keyset.empty())
- throw ApiException("No keys for zone '"+zonename+"'");
+ throw ApiException("No keys for zone '"+zonename.toString()+"'");
Document doc;
doc.SetArray();
resp->setBody(doc);
}
-static void gatherRecordsFromZone(const Value &container, vector<DNSResourceRecord>& new_records, string zonename) {
+static void gatherRecordsFromZone(const Value &container, vector<DNSResourceRecord>& new_records, DNSName zonename) {
DNSResourceRecord rr;
vector<string> zonedata;
stringtok(zonedata, stringFromJson(container, "zone"), "\r\n");
Document document;
req->json(document);
string zonename = stringFromJson(document, "name");
+ DNSName dzonename(zonename);
// strip trailing dot (from spec PoV this is wrong, but be nice to clients)
if (zonename.size() > 0 && zonename.substr(zonename.size()-1) == ".") {
string zonestring = stringFromJson(document, "zone", "");
- bool exists = B.getDomainInfo(zonename, di);
+ bool exists = B.getDomainInfo(dzonename, di);
if(exists)
throw ApiException("Domain '"+zonename+"' already exists");
if (records.IsArray()) {
gatherRecords(document, new_records, new_ptrs);
} else if (zonestring != "") {
- gatherRecordsFromZone(document, new_records, zonename);
+ gatherRecordsFromZone(document, new_records, DNSName(zonename));
}
gatherComments(document, new_comments, false);
DNSResourceRecord rr;
BOOST_FOREACH(rr, new_records) {
- if (!rr.qname.isPartOf(zonename) && !pdns_iequals(rr.qname, zonename))
+ if (!rr.qname.isPartOf(dzonename) && rr.qname != dzonename)
throw ApiException("RRset "+rr.qname.toString()+" IN "+rr.qtype.getName()+": Name is out of zone");
- if (rr.qtype.getCode() == QType::SOA && pdns_iequals(rr.qname, zonename)) {
+ if (rr.qtype.getCode() == QType::SOA && rr.qname==dzonename) {
have_soa = true;
increaseSOARecord(rr, soa_edit_api_kind, soa_edit_kind);
}
}
- rr.qname = zonename;
+ rr.qname = dzonename;
rr.auth = 1;
rr.ttl = ::arg().asNum("default-ttl");
// synthesize a SOA record so the zone "really" exists
SOAData sd;
- sd.qname = zonename;
- sd.nameserver = arg()["default-soa-name"];
+ sd.qname = dzonename;
+ sd.nameserver = DNSName(arg()["default-soa-name"]);
if (!arg().isEmpty("default-soa-mail")) {
- sd.hostmaster = arg()["default-soa-mail"];
+ sd.hostmaster = DNSName(arg()["default-soa-mail"]); // needs attodot?
// attodot(sd.hostmaster); FIXME400
} else {
- sd.hostmaster = "hostmaster." + zonename;
+ sd.hostmaster = DNSName("hostmaster.") + dzonename;
}
sd.serial = intFromJson(document, "serial", 0);
sd.ttl = rr.ttl;
}
// no going back after this
- if(!B.createDomain(zonename))
+ if(!B.createDomain(dzonename))
throw ApiException("Creating domain '"+zonename+"' failed");
- if(!B.getDomainInfo(zonename, di))
+ if(!B.getDomainInfo(dzonename, di))
throw ApiException("Creating domain '"+zonename+"' failed: lookup of domain ID failed");
- di.backend->startTransaction(zonename, di.id);
+ di.backend->startTransaction(dzonename, di.id);
BOOST_FOREACH(rr, new_records) {
rr.domain_id = di.id;
di.backend->feedComment(c);
}
- updateDomainSettingsFromDocument(di, zonename, document);
+ updateDomainSettingsFromDocument(di, dzonename, document);
di.backend->commitTransaction();
- fillZone(zonename, resp);
+ fillZone(dzonename, resp);
resp->status = 201;
return;
}
}
static void apiServerZoneDetail(HttpRequest* req, HttpResponse* resp) {
- string zonename = apiZoneIdToName(req->parameters["id"]);
+ DNSName zonename = apiZoneIdToName(req->parameters["id"]);
if(req->method == "PUT" && !::arg().mustDo("experimental-api-readonly")) {
// update domain settings
UeberBackend B;
DomainInfo di;
if(!B.getDomainInfo(zonename, di))
- throw ApiException("Could not find domain '"+zonename+"'");
+ throw ApiException("Could not find domain '"+zonename.toString()+"'");
Document document;
req->json(document);
UeberBackend B;
DomainInfo di;
if(!B.getDomainInfo(zonename, di))
- throw ApiException("Could not find domain '"+zonename+"'");
+ throw ApiException("Could not find domain '"+zonename.toString()+"'");
if(!di.backend->deleteDomain(zonename))
- throw ApiException("Deleting domain '"+zonename+"' failed: backend delete failed/unsupported");
+ throw ApiException("Deleting domain '"+zonename.toString()+"' failed: backend delete failed/unsupported");
// empty body on success
resp->body = "";
// }
static void apiServerZoneExport(HttpRequest* req, HttpResponse* resp) {
- string zonename = apiZoneIdToName(req->parameters["id"]);
+ DNSName zonename = apiZoneIdToName(req->parameters["id"]);
if(req->method != "GET")
throw HttpMethodNotAllowedException();
UeberBackend B;
DomainInfo di;
if(!B.getDomainInfo(zonename, di))
- throw ApiException("Could not find domain '"+zonename+"'");
+ throw ApiException("Could not find domain '"+zonename.toString()+"'");
DNSResourceRecord rr;
SOAData sd;
switch(rr.qtype.getCode()) {
case QType::SOA:
fillSOAData(rr.content, sd);
- sd.nameserver = sd.nameserver.toString();
- sd.hostmaster = sd.hostmaster.toString();
+ /* sd.nameserver = sd.nameserver.toString();
+ sd.hostmaster = sd.hostmaster.toString(); */ // XXX DNSName pain - these looked like noops?
content = serializeSOAData(sd);
break;
case QType::MX:
}
static void apiServerZoneAxfrRetrieve(HttpRequest* req, HttpResponse* resp) {
- string zonename = apiZoneIdToName(req->parameters["id"]);
+ DNSName zonename = apiZoneIdToName(req->parameters["id"]);
if(req->method != "PUT")
throw HttpMethodNotAllowedException();
UeberBackend B;
DomainInfo di;
if(!B.getDomainInfo(zonename, di))
- throw ApiException("Could not find domain '"+zonename+"'");
+ throw ApiException("Could not find domain '"+zonename.toString()+"'");
if(di.masters.empty())
- throw ApiException("Domain '"+zonename+"' is not a slave domain (or has no master defined)");
+ throw ApiException("Domain '"+zonename.toString()+"' is not a slave domain (or has no master defined)");
random_shuffle(di.masters.begin(), di.masters.end());
Communicator.addSuckRequest(zonename, di.masters.front());
- resp->body = returnJsonMessage("Added retrieval request for '"+zonename+"' from master "+di.masters.front());
+ resp->body = returnJsonMessage("Added retrieval request for '"+zonename.toString()+"' from master "+di.masters.front());
}
static void apiServerZoneNotify(HttpRequest* req, HttpResponse* resp) {
- string zonename = apiZoneIdToName(req->parameters["id"]);
+ DNSName zonename = apiZoneIdToName(req->parameters["id"]);
if(req->method != "PUT")
throw HttpMethodNotAllowedException();
UeberBackend B;
DomainInfo di;
if(!B.getDomainInfo(zonename, di))
- throw ApiException("Could not find domain '"+zonename+"'");
+ throw ApiException("Could not find domain '"+zonename.toString()+"'");
if(!Communicator.notifyDomain(zonename))
throw ApiException("Failed to add to the queue - see server log");
if (!IpToU32(rr.content, &ip)) {
throw ApiException("PTR: Invalid IP address given");
}
- ptr->qname = (boost::format("%u.%u.%u.%u.in-addr.arpa")
+ ptr->qname = DNSName((boost::format("%u.%u.%u.%u.in-addr.arpa")
% ((ip >> 24) & 0xff)
% ((ip >> 16) & 0xff)
% ((ip >> 8) & 0xff)
% ((ip ) & 0xff)
- ).str();
+ ).str());
} else if (rr.qtype.getCode() == QType::AAAA) {
ComboAddress ca(rr.content);
char buf[3];
string tmp = ss.str();
tmp.resize(tmp.size()-1); // remove last dot
// reverse and append arpa domain
- ptr->qname = string(tmp.rbegin(), tmp.rend()) + ".ip6.arpa";
+ ptr->qname = DNSName(string(tmp.rbegin(), tmp.rend())) + DNSName("ip6.arpa");
} else {
throw ApiException("Unsupported PTR source '" + rr.qname.toString() + "' type '" + rr.qtype.getName() + "'");
}
static void patchZone(HttpRequest* req, HttpResponse* resp) {
UeberBackend B;
DomainInfo di;
- string zonename = apiZoneIdToName(req->parameters["id"]);
+ DNSName zonename = apiZoneIdToName(req->parameters["id"]);
if (!B.getDomainInfo(zonename, di))
- throw ApiException("Could not find domain '"+zonename+"'");
+ throw ApiException("Could not find domain '"+zonename.toString()+"'");
vector<DNSResourceRecord> new_records;
vector<Comment> new_comments;
const Value& rrset = rrsets[rrsetIdx];
string changetype;
QType qtype;
- DNSName qname = stringFromJson(rrset, "name");
+ DNSName qname(stringFromJson(rrset, "name"));
qtype = stringFromJson(rrset, "type");
changetype = toUpper(stringFromJson(rrset, "changetype"));
if (!soa_edit_api_kind.empty() && !soa_edit_done) {
SOAData sd;
if (!B.getSOA(zonename, sd))
- throw ApiException("No SOA found for domain '"+zonename+"'");
+ throw ApiException("No SOA found for domain '"+zonename.toString()+"'");
DNSResourceRecord rr;
rr.qname = zonename;
di.backend->commitTransaction();
extern PacketCache PC;
- PC.purge(zonename);
+ PC.purge(zonename.toString()); // XXX DNSName pain - this seems the wrong way round!
// now the PTRs
BOOST_FOREACH(const DNSResourceRecord& rr, new_ptrs) {