]> granicus.if.org Git - pdns/commitdiff
Support for TSIG key management
authorAki Tuomi <cmouse@desteem.org>
Sat, 15 Jun 2013 15:36:03 +0000 (18:36 +0300)
committerAki Tuomi <cmouse@desteem.org>
Tue, 3 Sep 2013 15:20:41 +0000 (18:20 +0300)
modules/remotebackend/httpconnector.cc
modules/remotebackend/remotebackend.cc
modules/remotebackend/remotebackend.hh

index e21718f47c84018731e6bd75391a1e66936a6aa4..c1b17d0cd36c4935fe79d87f1f5dcf0aabd39cc8 100644 (file)
@@ -140,6 +140,18 @@ void HTTPConnector::restful_requestbuilder(const std::string &method, const rapi
         // create an empty post
         curl_easy_setopt(d_c, CURLOPT_POST, 1);
         curl_easy_setopt(d_c, CURLOPT_POSTFIELDSIZE, 0);
+    } else if (method == "setTSIGKey") {
+        std::stringstream ss2;
+        tmpstr = curl_easy_escape(d_c, parameters["algorithm"].GetString(), 0);
+        ss2 << "algorithm=" << tmpstr << "&content=";
+        tmpstr = curl_easy_escape(d_c, parameters["content"].GetString(), 0);
+        ss2 << tmpstr;
+        std::string out = ss2.str();
+        curl_easy_setopt(d_c, CURLOPT_POSTFIELDSIZE, out.size());
+        curl_easy_setopt(d_c, CURLOPT_COPYPOSTFIELDS, out.c_str());
+        curl_free(tmpstr);
+    } else if (method == "deleteTSIGKey") {
+        curl_easy_setopt(d_c, CURLOPT_CUSTOMREQUEST, "DELETE");
     } else if (method == "addDomainKey") {
         // create post with keydata
         char *postfields;
index 1039d12a1505d4a40376052545a34599910e74da..1fcebd3248da5da63cc6ddd9e0ca76eb6f48fd8c 100644 (file)
@@ -479,6 +479,70 @@ bool RemoteBackend::getTSIGKey(const std::string& name, std::string* algorithm,
    return true;
 }
 
+bool RemoteBackend::setTSIGKey(const std::string& name, const std::string& algorithm, const std::string& content) {
+   rapidjson::Document query,answer;
+   rapidjson::Value parameters;
+
+   // no point doing dnssec if it's not supported
+   if (d_dnssec == false) return false;
+   query.SetObject();
+   JSON_ADD_MEMBER(query, "method", "setTSIGKey", query.GetAllocator());
+   parameters.SetObject();
+   JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
+   JSON_ADD_MEMBER(parameters, "algorithm", algorithm.c_str(), query.GetAllocator());
+   JSON_ADD_MEMBER(parameters, "content", content.c_str(), query.GetAllocator());
+   query.AddMember("parameters", parameters, query.GetAllocator());
+   if (connector->send(query) == false || connector->recv(answer) == false)
+     return false;
+
+   return true;
+}
+
+bool RemoteBackend::deleteTSIGKey(const std::string& name) {
+   rapidjson::Document query,answer;
+   rapidjson::Value parameters;
+
+   // no point doing dnssec if it's not supported
+   if (d_dnssec == false) return false;
+   query.SetObject();
+   JSON_ADD_MEMBER(query, "method", "deleteTSIGKey", query.GetAllocator());
+   parameters.SetObject();
+   JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
+   query.AddMember("parameters", parameters, query.GetAllocator());
+   if (connector->send(query) == false || connector->recv(answer) == false)
+     return false;
+
+   return true;
+}
+
+bool RemoteBackend::getTSIGKeys(std::vector<struct TSIGKey>& keys) {
+   rapidjson::Document query,answer;
+   rapidjson::Value parameters;
+
+   // no point doing dnssec if it's not supported
+   if (d_dnssec == false) return false;
+   query.SetObject();
+   JSON_ADD_MEMBER(query, "method", "getTSIGKeys", query.GetAllocator());
+   parameters.SetObject();
+   query.AddMember("parameters", parameters, query.GetAllocator());
+
+   if (connector->send(query) == false || connector->recv(answer) == false)
+     return false;
+
+   // expect array
+   if (answer["result"].IsArray()) {
+      for(rapidjson::Value::ValueIterator iter = answer["result"].Begin(); iter != answer["result"].End(); iter++) {
+         struct TSIGKey key;
+         key.name = (*iter)["name"].GetString();
+         key.algorithm = (*iter)["algorithm"].GetString();
+         key.key = (*iter)["content"].GetString();
+         keys.push_back(key);
+      }
+   }
+
+   return true;
+}
+
 bool RemoteBackend::getDomainInfo(const string &domain, DomainInfo &di) {
    rapidjson::Document query,answer;
    rapidjson::Value parameters;
index e69c7decc9e4783e410a2b077ee26de6e555947a..b7bcb624dea90ec0cf6df34b8005718564133495 100644 (file)
@@ -134,6 +134,9 @@ class RemoteBackend : public DNSBackend
   virtual bool commitTransaction();
   virtual bool abortTransaction();
   virtual bool calculateSOASerial(const string& domain, const SOAData& sd, time_t& serial);
+  virtual bool setTSIGKey(const string& name, const string& algorithm, const string& content);
+  virtual bool deleteTSIGKey(const string& name);
+  virtual bool getTSIGKeys(std::vector< struct TSIGKey > &keys);
 
   static DNSBackend *maker();