]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Correctly add DS record and correctly set ordername to NULL in narrow mode
authorRuben d'Arco <cyclops@prof-x.net>
Tue, 21 May 2013 20:08:33 +0000 (22:08 +0200)
committermind04 <mind04@monshouwer.org>
Fri, 12 Jul 2013 15:29:37 +0000 (17:29 +0200)
pdns/rfc2136handler.cc
regression-tests/1dyndns-update-add-delete-ds/expected_result.narrow
regression-tests/1dyndns-update-add-delete-ds/expected_result.nsec3
regression-tests/1dyndns-update-add-delete-ds/expected_result.nsec3-optout [new file with mode: 0644]
regression-tests/1dyndns-update-add-delete/expected_result.narrow
regression-tests/1dyndns-update-deep-add-delete/expected_result.narrow

index e62c802900875706bd297c6a1e87c002d1da106e..72a8e5165cbcfa453e9abaca2859ae43f68ffeee 100644 (file)
@@ -226,8 +226,11 @@ uint16_t PacketHandler::performUpdate(const string &msgPrefix, const DNSRecord *
         string hashed;
         if(! *narrow) 
           hashed=toLower(toBase32Hex(hashQNameWithSalt(ns3pr->d_iterations, ns3pr->d_salt, rrLabel)));
-        
-        di->backend->updateDNSSECOrderAndAuthAbsolute(di->id, rrLabel, hashed, auth);
+
+        if (*narrow)
+          di->backend->nullifyDNSSECOrderNameAndUpdateAuth(di->id, rrLabel, auth);
+        else
+          di->backend->updateDNSSECOrderAndAuthAbsolute(di->id, rrLabel, hashed, auth);
         if(!auth || rrType == QType::DS) {
           di->backend->nullifyDNSSECOrderNameAndAuth(di->id, rrLabel, "NS");
           di->backend->nullifyDNSSECOrderNameAndAuth(di->id, rrLabel, "A");
@@ -260,21 +263,22 @@ uint16_t PacketHandler::performUpdate(const string &msgPrefix, const DNSRecord *
       bool auth=newRec.auth;
 
       if ( ! pdns_iequals(di->zone, shorter)) {
-        while(chopOff(shorter)) {
-          if (pdns_iequals(shorter, di->zone))
+        do {
+          if (pdns_iequals(di->zone, shorter))
             break;
           bool foundShorter = false;
           di->backend->lookup(QType(QType::ANY), shorter);
           while (di->backend->get(rec)) {
-            foundShorter = true;
+            if ( ! pdns_iequals(shorter, rrLabel) )
+              foundShorter = true;
             if (rec.qtype == QType::NS) // are we inserting below a delegate?
               auth=false;
           }
-          if (!foundShorter
+          if (!foundShorter && auth && !pdns_iequals(shorter, rrLabel)) // haven't found any record at current level, insert ENT.
             insnonterm.insert(shorter);
-          else
+          if (foundShorter)
             break; // if we find a shorter record, we can stop searching
-        }
+        } while(chopOff(shorter));
       }
 
       if(*haveNSEC3)
@@ -283,7 +287,11 @@ uint16_t PacketHandler::performUpdate(const string &msgPrefix, const DNSRecord *
         if(! *narrow) 
           hashed=toLower(toBase32Hex(hashQNameWithSalt(ns3pr->d_iterations, ns3pr->d_salt, rrLabel)));
         
-        di->backend->updateDNSSECOrderAndAuthAbsolute(di->id, rrLabel, hashed, auth);
+        if (*narrow)
+          di->backend->nullifyDNSSECOrderNameAndUpdateAuth(di->id, rrLabel, auth);
+        else
+          di->backend->updateDNSSECOrderAndAuthAbsolute(di->id, rrLabel, hashed, auth);
+
         if (rrType == QType::DS)
           di->backend->setDNSSECAuthOnDsRecord(di->id, rrLabel);        
         if(!auth)
index 22a64c0f4e1bcff2f478cda51e6255dcc4656a78..dcdceb5d501c20307dafd45e4fb111a384493730 100644 (file)
@@ -4,9 +4,11 @@ Answer:
 ;; ZONE SECTION:
 ;test.dyndns.                  IN      SOA
 
-Check if add-delete.test.dyndns. 3600 A 127.0.0.108 exists
+Check delegate and DS added correctly
 --- Start: diff start step.1 ---
-> add-delete.test.dyndns       A       0       127.0.0.108     3600    ''      1
+> del.test.dyndns      DS      0       39274 8 2 8e8a8cfb40fd0c30bfa82e53752e1c257dafb7b6206d12b9eda43af3eab2157d      3600    NULL    1
+> del.test.dyndns      NS      0       ns1.del.test.dyndns     3600    NULL    0
+> ns1.del.test.dyndns  A       0       127.0.0.1       3600    NULL    0
 --- End: diff start step.1 ---
 
 Answer:
@@ -16,7 +18,7 @@ Answer:
 ;test.dyndns.                  IN      SOA
 
 Check if record is gone
---- Start: diff step.1 step.2 ---
-< add-delete.test.dyndns       A       0       127.0.0.108     3600    ''      1
---- End: diff step.1 step.2 ---
+--- Start: diff start step.2 ---
+no difference
+--- End: diff start step.2 ---
 
index 6c68ba9de82ff8c1b3cb70c5ca1932321dbf3c73..488aad2c1e8a1a9a2ab2cc0378e6ed3043f0d236 100644 (file)
@@ -4,9 +4,11 @@ Answer:
 ;; ZONE SECTION:
 ;test.dyndns.                  IN      SOA
 
-Check if add-delete.test.dyndns. 3600 A 127.0.0.108 exists
+Check delegate and DS added correctly
 --- Start: diff start step.1 ---
-> add-delete.test.dyndns       A       0       127.0.0.108     3600    'gkhs0ms64101fs1dj19h7no8vn2tp4fk'      1
+> del.test.dyndns      DS      0       39274 8 2 8e8a8cfb40fd0c30bfa82e53752e1c257dafb7b6206d12b9eda43af3eab2157d      3600    'ott41kituq4b2adjpf8gs59se6liu8vh'      1
+> del.test.dyndns      NS      0       ns1.del.test.dyndns     3600    'ott41kituq4b2adjpf8gs59se6liu8vh'      0
+> ns1.del.test.dyndns  A       0       127.0.0.1       3600    NULL    0
 --- End: diff start step.1 ---
 
 Answer:
@@ -16,7 +18,7 @@ Answer:
 ;test.dyndns.                  IN      SOA
 
 Check if record is gone
---- Start: diff step.1 step.2 ---
-< add-delete.test.dyndns       A       0       127.0.0.108     3600    'gkhs0ms64101fs1dj19h7no8vn2tp4fk'      1
---- End: diff step.1 step.2 ---
+--- Start: diff start step.2 ---
+no difference
+--- End: diff start step.2 ---
 
diff --git a/regression-tests/1dyndns-update-add-delete-ds/expected_result.nsec3-optout b/regression-tests/1dyndns-update-add-delete-ds/expected_result.nsec3-optout
new file mode 100644 (file)
index 0000000..3908752
--- /dev/null
@@ -0,0 +1,24 @@
+Answer:
+;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: [id]
+;; flags: qr aa; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
+;; ZONE SECTION:
+;test.dyndns.                  IN      SOA
+
+Check delegate and DS added correctly
+--- Start: diff start step.1 ---
+> del.test.dyndns      DS      0       39274 8 2 8e8a8cfb40fd0c30bfa82e53752e1c257dafb7b6206d12b9eda43af3eab2157d      3600    'ott41kituq4b2adjpf8gs59se6liu8vh'      1
+> del.test.dyndns      NS      0       ns1.del.test.dyndns     3600    NULL    0
+> ns1.del.test.dyndns  A       0       127.0.0.1       3600    NULL    0
+--- End: diff start step.1 ---
+
+Answer:
+;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: [id]
+;; flags: qr aa; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
+;; ZONE SECTION:
+;test.dyndns.                  IN      SOA
+
+Check if record is gone
+--- Start: diff start step.2 ---
+no difference
+--- End: diff start step.2 ---
+
index 22a64c0f4e1bcff2f478cda51e6255dcc4656a78..1ed6baf1c78e7ecff97471c9b1aa90d2707e8d5b 100644 (file)
@@ -6,7 +6,7 @@ Answer:
 
 Check if add-delete.test.dyndns. 3600 A 127.0.0.108 exists
 --- Start: diff start step.1 ---
-> add-delete.test.dyndns       A       0       127.0.0.108     3600    ''      1
+> add-delete.test.dyndns       A       0       127.0.0.108     3600    NULL    1
 --- End: diff start step.1 ---
 
 Answer:
@@ -17,6 +17,6 @@ Answer:
 
 Check if record is gone
 --- Start: diff step.1 step.2 ---
-< add-delete.test.dyndns       A       0       127.0.0.108     3600    ''      1
+< add-delete.test.dyndns       A       0       127.0.0.108     3600    NULL    1
 --- End: diff step.1 step.2 ---
 
index c8064043f5a7e8cd851759cfa0cf1adffdcf3aec..32828c43ddc536e725d7af4bb036f3111b94d74f 100644 (file)
@@ -60,8 +60,8 @@ Rcode: 3, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
 Reply to question for qname='x.d.e.f.test.dyndns.', qtype=A
 Check if records are added
 --- Start: diff start step.1 ---
-> a.b.c.d.e.f.test.dyndns      A       0       127.0.0.1       3600    ''      1
-> a.b.d.e.f.test.dyndns        A       0       127.0.0.1       3600    ''      1
+> a.b.c.d.e.f.test.dyndns      A       0       127.0.0.1       3600    NULL    1
+> a.b.d.e.f.test.dyndns        A       0       127.0.0.1       3600    NULL    1
 > b.c.d.e.f.test.dyndns        NULL    NULL    NULL    NULL    ''      1
 > b.d.e.f.test.dyndns  NULL    NULL    NULL    NULL    ''      1
 > c.d.e.f.test.dyndns  NULL    NULL    NULL    NULL    ''      1
@@ -105,7 +105,7 @@ Rcode: 3, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
 Reply to question for qname='x.d.e.f.test.dyndns.', qtype=A
 Check if a.b.c.d.e.f is removed correctly
 --- Start: diff start step.2 ---
-> a.b.d.e.f.test.dyndns        A       0       127.0.0.1       3600    ''      1
+> a.b.d.e.f.test.dyndns        A       0       127.0.0.1       3600    NULL    1
 > b.d.e.f.test.dyndns  NULL    NULL    NULL    NULL    ''      1
 > d.e.f.test.dyndns    NULL    NULL    NULL    NULL    ''      1
 > e.f.test.dyndns      NULL    NULL    NULL    NULL    ''      1