From: Christian Hofstaedtler Date: Mon, 30 Mar 2015 19:43:13 +0000 (+0200) Subject: API: Allow deleting out-of-zone records X-Git-Tag: dnsdist-1.0.0-alpha1~248^2~98^2~29^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F2397%2Fhead;p=thirdparty%2Fpdns.git 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. --- diff --git a/pdns/ws-auth.cc b/pdns/ws-auth.cc index 9fe2272bd4..9e5525b76e 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 3e0ece4bb8..75f306a0dd 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()