From 34df6ecc4d214fcd3e91b7ca797ca649289d64f7 Mon Sep 17 00:00:00 2001 From: Christian Hofstaedtler Date: Mon, 30 Mar 2015 21:43:13 +0200 Subject: [PATCH] API: Allow deleting out-of-zone records Useful for fixing legacy data (but note that it's impossible to re-create such data using the API.) Fixes #2393. --- pdns/ws-auth.cc | 9 +++++---- regression-tests.api/test_Zones.py | 5 ++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pdns/ws-auth.cc b/pdns/ws-auth.cc index 9fe2272bd..9e5525b76 100644 --- a/pdns/ws-auth.cc +++ b/pdns/ws-auth.cc @@ -968,9 +968,6 @@ static void patchZone(HttpRequest* req, HttpResponse* resp) { qtype = stringFromJson(rrset, "type"); changetype = toUpper(stringFromJson(rrset, "changetype")); - if (!iends_with(qname, dotsuffix) && !pdns_iequals(qname, zonename)) - throw ApiException("RRset "+qname+" IN "+qtype.getName()+": Name is out of zone"); - if (changetype == "DELETE") { // delete all matching qname/qtype RRs (and, implictly comments). if (!di.backend->replaceRRSet(di.id, qname, qtype, vector())) { @@ -978,7 +975,11 @@ static void patchZone(HttpRequest* req, HttpResponse* resp) { } } else if (changetype == "REPLACE") { - new_records.clear(); + // we only validate for REPLACE, as DELETE can be used to "fix" out of zone records. + if (!iends_with(qname, dotsuffix) && !pdns_iequals(qname, zonename)) + throw ApiException("RRset "+qname+" IN "+qtype.getName()+": Name is out of zone"); + + new_records.clear(); new_comments.clear(); // new_ptrs is merged gatherRecords(rrset, new_records, new_ptrs); diff --git a/regression-tests.api/test_Zones.py b/regression-tests.api/test_Zones.py index 3e0ece4bb..75f306a0d 100644 --- a/regression-tests.api/test_Zones.py +++ b/regression-tests.api/test_Zones.py @@ -766,7 +766,6 @@ fred IN A 192.168.0.4 def test_zone_rr_delete_out_of_zone(self): payload, zone = self.create_zone() name = payload['name'] - # replace with qname mismatch rrset = { 'changetype': 'delete', 'name': 'not-in-zone', @@ -777,8 +776,8 @@ fred IN A 192.168.0.4 self.url("/servers/localhost/zones/" + name), data=json.dumps(payload), headers={'content-type': 'application/json'}) - self.assertEquals(r.status_code, 422) - self.assertIn('out of zone', r.json()['error']) + print r.content + self.assertEquals(r.status_code, 200) # succeed so users can fix their wrong, old data def test_zone_delete(self): payload, zone = self.create_zone() -- 2.49.0