]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Return Refused when the lua update policy declines all updates.
authorMiod Vallat <miod.vallat@powerdns.com>
Mon, 25 Aug 2025 07:44:22 +0000 (09:44 +0200)
committerMiod Vallat <miod.vallat@powerdns.com>
Mon, 25 Aug 2025 08:26:22 +0000 (10:26 +0200)
Fixes: #14953
Signed-off-by: Miod Vallat <miod.vallat@powerdns.com>
pdns/rfc2136handler.cc
regression-tests.auth-py/test_GSSTSIG.py

index 0d1e2ea8e0fd389c60c95c04a9080177680f6f84..061b682131384e49499f0cbec7fc08e3e46f9a3c 100644 (file)
@@ -811,9 +811,12 @@ static uint8_t updateRecords(MOADNSParser& mdp, DNSSECKeeper& dsk, DomainInfo& i
   vector<const DNSRecord *> nonCnamesToAdd;
   vector<const DNSRecord *> nsRRtoDelete;
 
+  bool anyRecordProcessed{false};
+  bool anyRecordAcceptedByLua{false};
   for(const auto & answer : mdp.d_answers) {
     const DNSRecord *dnsRecord = &answer;
     if (dnsRecord->d_place == DNSResourceRecord::AUTHORITY) {
+      anyRecordProcessed = true;
       /* see if it's permitted by policy */
       if (update_policy_lua != nullptr) {
         if (!update_policy_lua->updatePolicy(dnsRecord->d_name, QType(dnsRecord->d_type), info.zone.operator const DNSName&(), packet)) {
@@ -821,6 +824,7 @@ static uint8_t updateRecords(MOADNSParser& mdp, DNSSECKeeper& dsk, DomainInfo& i
           continue;
         }
         g_log<<Logger::Debug<<msgPrefix<<"Accepting update for " << dnsRecord->d_name << "/" << QType(dnsRecord->d_type).toString() << ": Permitted by policy"<<endl;
+        anyRecordAcceptedByLua = true;
       }
 
       if (dnsRecord->d_class == QClass::NONE  && dnsRecord->d_type == QType::NS && dnsRecord->d_name == info.zone.operator const DNSName&()) {
@@ -839,6 +843,14 @@ static uint8_t updateRecords(MOADNSParser& mdp, DNSSECKeeper& dsk, DomainInfo& i
     }
   }
 
+  if (update_policy_lua != nullptr) {
+    // If the Lua update policy script has been invoked, and has rejected
+    // everything, better return Refused.
+    if (anyRecordProcessed && !anyRecordAcceptedByLua) {
+      return RCode::Refused;
+    }
+  }
+
   for (const auto &resrec : cnamesToAdd) {
     DNSResourceRecord rec;
     info.backend->lookup(QType(QType::ANY), resrec->d_name, info.id);
index a8c73964c8b742bf72c687a9bf4e7636244c4987..e0a07bd1845499d88aff235c16e793c1a65abcca 100644 (file)
@@ -138,7 +138,7 @@ lua-dnsupdate-policy-script=kerberos-client/update-policy.lua
 """
     def testDisallowedByLuaUpdate(self):
         self.kinit("testuser1")
-        self.nsupdate("add inserted10.example.net 10 A 1.2.3.10", 0) # Lua deny is still a NOERROR
+        self.nsupdate("add inserted10.example.net 10 A 1.2.3.10", 2)
         self.checkNotInDB('example.net', 'inserted10.example.net')
 
     def testAllowedByLuaUpdate(self):