Skip to content

Commit 5aa7003

Browse files
mind04Peter van Dijk
authored andcommitted
AXFR-out can handle secure and insecure NSEC3 optout delegations
1 parent c947dcb commit 5aa7003

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

pdns/tcpreceiver.cc

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,8 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
492492
DNSSECKeeper dk;
493493
dk.clearCaches(target);
494494
bool securedZone = dk.isSecuredZone(target);
495+
bool presignedZone = dk.isPresigned(target);
496+
495497
if(dk.getNSEC3PARAM(target, &ns3pr, &narrow)) {
496498
NSEC3Zone=true;
497499
if(narrow) {
@@ -642,12 +644,17 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
642644
/* now write all other records */
643645

644646
string keyname;
647+
set<string> ns3rrs;
645648
DTime dt;
646649
dt.set();
647650
int records=0;
648651
while(sd.db->get(rr)) {
649-
if (rr.qtype.getCode() == QType::RRSIG)
652+
if (rr.qtype.getCode() == QType::RRSIG) {
653+
RRSIGRecordContent rrc(rr.content);
654+
if(presignedZone && rrc.d_type == QType::NSEC3)
655+
ns3rrs.insert(fromBase32Hex(makeRelative(rr.qname, target)));
650656
continue;
657+
}
651658

652659
// only skip the DNSKEY if direct-dnskey is enabled, to avoid changing behaviour
653660
// when it is not enabled.
@@ -660,7 +667,7 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
660667
keyname = NSEC3Zone ? hashQNameWithSalt(ns3pr.d_iterations, ns3pr.d_salt, rr.qname) : labelReverse(rr.qname);
661668
NSECXEntry& ne = nsecxrepo[keyname];
662669
ne.d_ttl = sd.default_ttl;
663-
ne.d_auth = (ne.d_auth || rr.auth || (NSEC3Zone && !ns3pr.d_flags));
670+
ne.d_auth = (ne.d_auth || rr.auth || (NSEC3Zone && (!ns3pr.d_flags || (presignedZone && ns3pr.d_flags))));
664671
if (rr.qtype.getCode()) {
665672
ne.d_set.insert(rr.qtype.getCode());
666673
}
@@ -697,7 +704,7 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
697704
if(securedZone) {
698705
if(NSEC3Zone) {
699706
for(nsecxrepo_t::const_iterator iter = nsecxrepo.begin(); iter != nsecxrepo.end(); ++iter) {
700-
if(iter->second.d_auth) {
707+
if(iter->second.d_auth && (!presignedZone || !ns3pr.d_flags || ns3rrs.count(iter->first))) {
701708
NSEC3RecordContent n3rc;
702709
n3rc.d_set = iter->second.d_set;
703710
if (n3rc.d_set.size() && (n3rc.d_set.size() != 1 || !n3rc.d_set.count(QType::NS)))
@@ -710,7 +717,7 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
710717
inext++;
711718
if(inext == nsecxrepo.end())
712719
inext = nsecxrepo.begin();
713-
while(!(inext->second.d_auth) && inext != iter)
720+
while((!inext->second.d_auth || (presignedZone && ns3pr.d_flags && !ns3rrs.count(inext->first))) && inext != iter)
714721
{
715722
inext++;
716723
if(inext == nsecxrepo.end())

0 commit comments

Comments
 (0)