]> granicus.if.org Git - pdns/commitdiff
API: correct HTTP errors for cryptokey deletions
authorPieter Lexis <pieter.lexis@powerdns.com>
Wed, 23 May 2018 16:09:05 +0000 (18:09 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Wed, 23 May 2018 16:09:05 +0000 (18:09 +0200)
pdns/ws-auth.cc
regression-tests.api/test_cryptokeys.py

index 63214bddb7bc80dd78ffd12991d2e407ec4f0f96..5a38d0f9d85b277ed6d7572862d3b550c7e6f303 100644 (file)
@@ -965,14 +965,28 @@ static void apiZoneCryptokeysGET(DNSName zonename, int inquireKeyId, HttpRespons
  * It deletes a key from :zone_name specified by :cryptokey_id.
  * Server Answers:
  * Case 1: the backend returns true on removal. This means the key is gone.
- *      The server returns 200 OK, no body.
+ *      The server returns 204 No Content, no body.
  * Case 2: the backend returns false on removal. An error occurred.
- *      The sever returns 422 Unprocessable Entity with message "Could not DELETE :cryptokey_id".
+ *      The server returns 422 Unprocessable Entity with message "Could not DELETE :cryptokey_id".
+ * Case 3: the key or zone does not exist.
+ *      The server returns 404 Not Found
  * */
 static void apiZoneCryptokeysDELETE(DNSName zonename, int inquireKeyId, HttpRequest *req, HttpResponse *resp, DNSSECKeeper *dk) {
+  DNSSECKeeper::keyset_t keyset=dk->getKeys(zonename, false);
+  bool found = false;
+  for(const auto& value : keyset) {
+    if (value.second.id == (unsigned) inquireKeyId) {
+      found = true;
+      break;
+    }
+  }
+  if (!found) {
+    throw HttpNotFoundException();
+  }
+
   if (dk->removeKey(zonename, inquireKeyId)) {
     resp->body = "";
-    resp->status = 200;
+    resp->status = 204;
   } else {
     resp->setErrorResult("Could not DELETE " + req->parameters["key_id"], 422);
   }
index e2ce4de8bdccd3dc35d3be4abd5a0142faa21ed3..a3469ca9a3ed32ed578005491d8d302906b75d1d 100644 (file)
@@ -43,7 +43,7 @@ class Cryptokeys(ApiTestCase):
 
         #checks the status code. I don't know how to test explicit that the backend fail removing a key.
         r = self.session.delete(self.url("/api/v1/servers/localhost/zones/"+self.zone+"/cryptokeys/"+self.keyid))
-        self.assertEquals(r.status_code, 200)
+        self.assertEquals(r.status_code, 204)
         self.assertEquals(r.content, b"")
 
         # Check that the key is actually deleted
@@ -55,6 +55,11 @@ class Cryptokeys(ApiTestCase):
         r = self.session.get(self.url("/api/v1/servers/localhost/zones/"+self.zone+"fail/cryptokeys/"+self.keyid))
         self.assertEquals(r.status_code, 404)
 
+    def test_delete_wrong_id(self):
+        self.keyid = self.add_zone_key()
+        r = self.session.delete(self.url("/api/v1/servers/localhost/zones/"+self.zone+"/cryptokeys/1234567"))
+        self.assertEquals(r.status_code, 404)
+
     def test_delete_wrong_zone(self):
         self.keyid = self.add_zone_key()
         #checks for not covered zonename