]> granicus.if.org Git - pdns/commitdiff
API: Throw exception in metadata endpoint w/ wrong zone
authorPieter Lexis <pieter.lexis@powerdns.com>
Thu, 9 Nov 2017 13:53:00 +0000 (14:53 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Thu, 9 Nov 2017 13:59:09 +0000 (14:59 +0100)
Before, We would happily accept this POST

pdns/ws-auth.cc
regression-tests.api/test_Zones.py

index dc3265bf71fe42bd4abebf7edd01f946dcfdad55..40b08684d433aa81f95b7e228fb179c2f87b09cf 100644 (file)
@@ -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<string, vector<string> > 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<string> metadata;
index af2c7209996677f455a9f5ea341fd94774181438..6f388f395e0a171fa4e0bcaf8d882076cc0aa614 100644 (file)
@@ -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'])