]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
API: Implement TSIG key endpoint (GET only)
authorPieter Lexis <pieter.lexis@powerdns.com>
Mon, 13 Nov 2017 17:44:45 +0000 (18:44 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Fri, 25 May 2018 11:22:47 +0000 (13:22 +0200)
pdns/ws-auth.cc

index 5e93f4126a45e6ef7fb358593848b9c61a02297a..d520cb28d399bd1b695b77875c5168d82d3f23d9 100644 (file)
@@ -1237,6 +1237,56 @@ static void checkDuplicateRecords(vector<DNSResourceRecord>& records) {
   }
 }
 
+static void apiServerTsigKeys(HttpRequest* req, HttpResponse* resp) {
+  if (req->method != "GET") {
+    throw HttpMethodNotAllowedException();
+  }
+
+  vector<struct TSIGKey> keys;
+
+  UeberBackend B;
+  if (!B.getTSIGKeys(keys)) {
+    throw ApiException("Unable to retrieve TSIG keys");
+  }
+
+  Json::array doc;
+
+  for(const auto &key : keys) {
+    Json::object tsigkey = {
+      { "id", apiZoneNameToId(key.name) },
+      { "algorithm", key.algorithm.toString() },
+      { "key", key.key }
+    };
+    doc.push_back(tsigkey);
+  }
+
+  resp->setBody(doc);
+}
+
+static void apiServerTsigKeyDetail(HttpRequest* req, HttpResponse* resp) {
+  if (req->method != "GET") {
+    throw HttpMethodNotAllowedException();
+  }
+
+  DNSName keyname = apiZoneIdToName(req->parameters["id"]);
+
+  UeberBackend B;
+  DNSName algo;
+  string content;
+
+  if (!B.getTSIGKey(keyname, &algo, &content)) {
+    throw ApiException("Unable to retrieve TSIG key with id '"+keyname.toLogString()+"'");
+  }
+
+  Json::object tsigkey = {
+    { "id", apiZoneNameToId(keyname) },
+    { "algorithm", algo.toString() },
+    { "key", content }
+  };
+
+  resp->setBody(tsigkey);
+}
+
 static void apiServerZones(HttpRequest* req, HttpResponse* resp) {
   UeberBackend B;
   DNSSECKeeper dk(&B);
@@ -1937,6 +1987,8 @@ void AuthWebServer::webThread()
       d_ws->registerApiHandler("/api/v1/servers/localhost/search-log", &apiServerSearchLog);
       d_ws->registerApiHandler("/api/v1/servers/localhost/search-data", &apiServerSearchData);
       d_ws->registerApiHandler("/api/v1/servers/localhost/statistics", &apiServerStatistics);
+      d_ws->registerApiHandler("/api/v1/servers/localhost/tsigkeys/<id>", &apiServerTsigKeyDetail);
+      d_ws->registerApiHandler("/api/v1/servers/localhost/tsigkeys", &apiServerTsigKeys);
       d_ws->registerApiHandler("/api/v1/servers/localhost/zones/<id>/axfr-retrieve", &apiServerZoneAxfrRetrieve);
       d_ws->registerApiHandler("/api/v1/servers/localhost/zones/<id>/cryptokeys/<key_id>", &apiZoneCryptokeys);
       d_ws->registerApiHandler("/api/v1/servers/localhost/zones/<id>/cryptokeys", &apiZoneCryptokeys);