From d38e81e6876583db2c2299db156c0d991d3cd19d Mon Sep 17 00:00:00 2001 From: Pieter Lexis Date: Thu, 9 Nov 2017 14:53:00 +0100 Subject: [PATCH] API: Throw exception in metadata endpoint w/ wrong zone Before, We would happily accept this POST --- pdns/ws-auth.cc | 11 ++++++++++- regression-tests.api/test_Zones.py | 7 +++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pdns/ws-auth.cc b/pdns/ws-auth.cc index dc3265bf71..40b08684d4 100644 --- a/pdns/ws-auth.cc +++ b/pdns/ws-auth.cc @@ -711,7 +711,11 @@ static bool isValidMetadataKind(const string& kind, bool readonly) { static void apiZoneMetadata(HttpRequest* req, HttpResponse *resp) { DNSName zonename = apiZoneIdToName(req->parameters["id"]); + UeberBackend B; + DomainInfo di; + if (!B.getDomainInfo(zonename, di)) + throw ApiException("Could not find domain '"+zonename.toString()+"'"); if (req->method == "GET") { map > md; @@ -791,8 +795,13 @@ static void apiZoneMetadata(HttpRequest* req, HttpResponse *resp) { static void apiZoneMetadataKind(HttpRequest* req, HttpResponse* resp) { DNSName zonename = apiZoneIdToName(req->parameters["id"]); - string kind = req->parameters["kind"]; + UeberBackend B; + DomainInfo di; + if (!B.getDomainInfo(zonename, di)) + throw ApiException("Could not find domain '"+zonename.toString()+"'"); + + string kind = req->parameters["kind"]; if (req->method == "GET") { vector metadata; diff --git a/regression-tests.api/test_Zones.py b/regression-tests.api/test_Zones.py index af2c720999..6f388f395e 100644 --- a/regression-tests.api/test_Zones.py +++ b/regression-tests.api/test_Zones.py @@ -472,6 +472,13 @@ class AuthZones(ApiTestCase, AuthZonesHelperMixin): rdata = r.json() self.assertEquals(rdata["metadata"], payload_metadata["metadata"]) + def test_create_metadata_in_non_existent_zone(self): + payload_metadata = {"type": "Metadata", "kind": "AXFR-SOURCE", "metadata": ["127.0.0.2"]} + r = self.session.post(self.url("/api/v1/servers/localhost/zones/idonotexist.123.456.example./metadata"), + data=json.dumps(payload_metadata)) + self.assertEquals(r.status_code, 422) + self.assertIn('Could not find domain ', r.json()['error']) + def test_create_slave_zone(self): # Test that nameservers can be absent for slave zones. name, payload, data = self.create_zone(kind='Slave', nameservers=None, masters=['127.0.0.2']) -- 2.47.2