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)) {
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&()) {
}
}
+ 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);
"""
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):