return dr;
}
-
void reportBasicTypes()
{
ARecordContent::report();
return getRR<AAAARecordContent>(dr)->getCA(defport);
}
+/**
+ * Check if the DNSNames that should be hostnames, are hostnames
+ */
+void checkHostnameCorrectness(const DNSResourceRecord& rr)
+{
+ if (rr.qtype.getCode() == QType::NS || rr.qtype.getCode() == QType::MX || rr.qtype.getCode() == QType::SRV) {
+ DNSName toCheck;
+ if (rr.qtype.getCode() == QType::SRV) {
+ vector<string> parts;
+ stringtok(parts, rr.getZoneRepresentation());
+ if (parts.size() == 4) toCheck = DNSName(parts[3]);
+ } else if (rr.qtype.getCode() == QType::MX) {
+ vector<string> parts;
+ stringtok(parts, rr.getZoneRepresentation());
+ if (parts.size() == 2) toCheck = DNSName(parts[1]);
+ } else {
+ toCheck = DNSName(rr.content);
+ }
+
+ if (toCheck.empty()) {
+ throw std::runtime_error("unable to extract hostname from content");
+ }
+ else if ((rr.qtype.getCode() == QType::MX || rr.qtype.getCode() == QType::SRV) && toCheck == g_rootdnsname) {
+ // allow null MX/SRV
+ } else if(!toCheck.isHostname()) {
+ throw std::runtime_error(boost::str(boost::format("non-hostname content %s") % toCheck.toString()));
+ }
+ }
+}
#if 0
static struct Reporter
void reportOtherTypes();
void reportAllTypes();
ComboAddress getAddr(const DNSRecord& dr, uint16_t defport=0);
+void checkHostnameCorrectness(const DNSResourceRecord& rr);
#endif
checkOcclusion.insert({rr.qname, rr.qtype});
}
}
-
if((rr.qtype.getCode() == QType::A || rr.qtype.getCode() == QType::AAAA) && !rr.qname.isWildcard() && !rr.qname.isHostname())
cout<<"[Info] "<<rr.qname.toString()<<" record for '"<<rr.qtype.getName()<<"' is not a valid hostname."<<endl;
// Check if the DNSNames that should be hostnames, are hostnames
- if (rr.qtype.getCode() == QType::NS || rr.qtype.getCode() == QType::MX || rr.qtype.getCode() == QType::SRV) {
- DNSName toCheck;
- if (rr.qtype.getCode() == QType::SRV) {
- vector<string> parts;
- stringtok(parts, rr.getZoneRepresentation());
- if (parts.size() == 4) toCheck = DNSName(parts[3]);
- } else if (rr.qtype.getCode() == QType::MX) {
- vector<string> parts;
- stringtok(parts, rr.getZoneRepresentation());
- if (parts.size() == 2) toCheck = DNSName(parts[1]);
- } else {
- toCheck = DNSName(rr.content);
- }
-
- if (toCheck.empty()) {
- cout<<"[Warning] "<<rr.qtype.getName()<<" record in zone '"<<zone<<"': unable to extract hostname from content."<<endl;
- numwarnings++;
- }
- else if ((rr.qtype.getCode() == QType::MX || rr.qtype.getCode() == QType::SRV) && toCheck == g_rootdnsname) {
- // allow null MX/SRV
- } else if(!toCheck.isHostname()) {
- cout<<"[Warning] "<<rr.qtype.getName()<<" record in zone '"<<zone<<"' has non-hostname content '"<<toCheck.toString()<<"'."<<endl;
- numwarnings++;
- }
+ try {
+ checkHostnameCorrectness(rr);
+ } catch (const std::exception& e) {
+ cout << "[Warning] " << rr.qtype.getName() << " record in zone '" << zone << ": " << e.what() << endl;
+ numwarnings++;
}
if (rr.qtype.getCode() == QType::CNAME) {
}
// Check if the DNSNames that should be hostnames, are hostnames
- if (rr.qtype.getCode() == QType::NS || rr.qtype.getCode() == QType::MX || rr.qtype.getCode() == QType::SRV) {
- DNSName toCheck;
- if (rr.qtype.getCode() == QType::SRV) {
- vector<string> parts;
- stringtok(parts, rr.getZoneRepresentation());
- if (parts.size() == 4) toCheck = DNSName(parts[3]);
- } else if (rr.qtype.getCode() == QType::MX) {
- vector<string> parts;
- stringtok(parts, rr.getZoneRepresentation());
- if (parts.size() == 2) toCheck = DNSName(parts[1]);
- } else {
- toCheck = DNSName(rr.content);
- }
-
- if (toCheck.empty()) {
- throw ApiException("RRset "+qname.toString()+" IN "+qtype.getName() + " unable to extract hostname from content.");
- }
- else if ((rr.qtype.getCode() == QType::MX || rr.qtype.getCode() == QType::SRV) && toCheck == g_rootdnsname) {
- // allow null MX/SRV
- } else if(!toCheck.isHostname()) {
- throw ApiException("RRset "+qname.toString()+" IN "+qtype.getName() + " record has non-hostname content '" + toCheck.toString() + "'.");
- }
+ try {
+ checkHostnameCorrectness(rr);
+ } catch (const std::exception& e) {
+ throw ApiException("RRset "+qname.toString()+" IN "+qtype.getName() + " " + e.what());
}
}
checkDuplicateRecords(new_records);
data=json.dumps(payload),
headers={'content-type': 'application/json'})
self.assertEquals(r.status_code, 422)
- self.assertIn('record has non-hostname content', r.json()['error'])
+ self.assertIn('non-hostname content', r.json()['error'])
data = self.session.get(self.url("/api/v1/servers/localhost/zones/" + name)).json()
self.assertIsNone(get_rrset(data, name, 'MX'))