]> granicus.if.org Git - pdns/commitdiff
Replace dnsnameFromJson() with apiNameToDNSName(stringFromJson())
authorChristian Hofstaedtler <christian.hofstaedtler@deduktiva.com>
Wed, 9 Dec 2015 10:31:55 +0000 (11:31 +0100)
committerChristian Hofstaedtler <christian@hofstaedtler.name>
Wed, 9 Dec 2015 11:40:04 +0000 (12:40 +0100)
To reuse the name checking code for strings that didn't come
from json. Also makes it clearer that the checking logic is
an API only thing, and other json consumers may use their own
policy on dots, etc.

pdns/json.cc
pdns/json.hh
pdns/ws-api.cc
pdns/ws-api.hh
pdns/ws-auth.cc
pdns/ws-recursor.cc

index f898bb88d755855708babe96069ed6408783c4b8..2124f8d323372f972166554aa9eaabff2e4273e9 100644 (file)
@@ -90,27 +90,6 @@ string stringFromJson(const Value& container, const char* key, const string& def
   }
 }
 
-DNSName dnsnameFromJson(const rapidjson::Value& container, const char* key)
-{
-  if (!container.IsObject()) {
-    throw JsonException("Container was not an object.");
-  }
-  const Value& val = container[key];
-  if (val.IsString()) {
-    string name = val.GetString();
-    if (!isCanonical(name)) {
-      throw JsonException("DNS Name '" + name + "' is not canonical");
-    }
-    try {
-      return DNSName(name);
-    } catch (...) {
-      throw JsonException("Unable to parse DNS Name '" + name + "'");
-    }
-  } else {
-    throw JsonException("Key '" + string(key) + "' not present or not a String");
-  }
-}
-
 bool boolFromJson(const rapidjson::Value& container, const char* key)
 {
   if (!container.IsObject()) {
index da6ca5c89481f926391f50cdb695e659e4e47217..774631d8e0bb2b4cd3ab1480010452594e3d316f 100644 (file)
@@ -25,7 +25,6 @@
 #include <map>
 #include <stdexcept>
 #include "rapidjson/document.h"
-#include "dnsname.hh"
 
 std::string returnJsonObject(const std::map<std::string, std::string>& items);
 std::string returnJsonError(const std::string& error);
@@ -35,7 +34,6 @@ int intFromJson(const rapidjson::Value& container, const char* key);
 int intFromJson(const rapidjson::Value& container, const char* key, const int default_value);
 std::string stringFromJson(const rapidjson::Value& container, const char* key);
 std::string stringFromJson(const rapidjson::Value& container, const char* key, const std::string& default_value);
-DNSName dnsnameFromJson(const rapidjson::Value& container, const char* key);
 bool boolFromJson(const rapidjson::Value& container, const char* key);
 bool boolFromJson(const rapidjson::Value& container, const char* key, const bool default_value);
 
index 54a62a1b342e6f5f825e2e638ba99a579b0ff7ae..a24b7774e9b4a449253067b8eab9c11b48109a96 100644 (file)
@@ -221,6 +221,17 @@ void apiServerStatistics(HttpRequest* req, HttpResponse* resp) {
   resp->setBody(doc);
 }
 
+DNSName apiNameToDNSName(const string& name) {
+  if (!isCanonical(name)) {
+    throw ApiException("DNS Name '" + name + "' is not canonical");
+  }
+  try {
+    return DNSName(name);
+  } catch (...) {
+    throw ApiException("Unable to parse DNS Name '" + name + "'");
+  }
+}
+
 DNSName apiZoneIdToName(const string& id) {
   string zonename;
   ostringstream ss;
index 6ae4c78fb1ee4c68a0f95a3f796c7b39996df958..fd0071976c8d8b3efa42b34ad4a12a3c9a66f8a4 100644 (file)
@@ -38,6 +38,7 @@ void apiServerStatistics(HttpRequest* req, HttpResponse* resp);
 DNSName apiZoneIdToName(const string& id);
 string apiZoneNameToId(const DNSName& name);
 void apiCheckNameAllowedCharacters(const string& label);
+DNSName apiNameToDNSName(const string& name);
 
 // To be provided by product code.
 void productServerStatisticsFetch(std::map<string,string>& out);
index 547988cf869e0b4e030257de9f8746049af2c296..30402fc1b8dbee157bca693be915cf938ea06151 100644 (file)
@@ -413,7 +413,7 @@ static void gatherRecords(const Value& container, vector<DNSResourceRecord>& new
   if (records.IsArray()) {
     for (SizeType idx = 0; idx < records.Size(); ++idx) {
       const Value& record = records[idx];
-      rr.qname = dnsnameFromJson(record, "name");
+      rr.qname = apiNameToDNSName(stringFromJson(record, "name"));
       rr.qtype = stringFromJson(record, "type");
       string content = stringFromJson(record, "content");
       rr.auth = 1;
@@ -621,7 +621,7 @@ static void apiServerZones(HttpRequest* req, HttpResponse* resp) {
     DomainInfo di;
     Document document;
     req->json(document);
-    DNSName zonename = dnsnameFromJson(document, "name");
+    DNSName zonename = apiNameToDNSName(stringFromJson(document, "name"));
     apiCheckNameAllowedCharacters(zonename.toString());
 
     string zonestring = stringFromJson(document, "zone", "");
@@ -952,7 +952,7 @@ static void patchZone(HttpRequest* req, HttpResponse* resp) {
       const Value& rrset = rrsets[rrsetIdx];
       string changetype;
       QType qtype;
-      DNSName qname = dnsnameFromJson(rrset, "name");
+      DNSName qname = apiNameToDNSName(stringFromJson(rrset, "name"));
       apiCheckNameAllowedCharacters(qname.toString());
       qtype = stringFromJson(rrset, "type");
       changetype = toUpper(stringFromJson(rrset, "changetype"));
index 978e9da1b07dffdb2c0b2be88dc0b80bf288ff54..2755bdea57aa2777a3dd8bb9c5abd26459a57450 100644 (file)
@@ -187,7 +187,7 @@ static void doCreateZone(const Value& document)
     throw ApiException("Config Option \"api-config-dir\" must be set");
   }
 
-  DNSName zonename = dnsnameFromJson(document, "name");
+  DNSName zonename = apiNameToDNSName(stringFromJson(document, "name"));
   apiCheckNameAllowedCharacters(zonename.toString());
 
   string singleIPTarget = stringFromJson(document, "single_target_ip", "");
@@ -279,7 +279,7 @@ static void apiServerZones(HttpRequest* req, HttpResponse* resp)
     Document document;
     req->json(document);
 
-    DNSName zonename = dnsnameFromJson(document, "name");
+    DNSName zonename = apiNameToDNSName(stringFromJson(document, "name"));
 
     auto iter = t_sstorage->domainmap->find(zonename);
     if (iter != t_sstorage->domainmap->end())
@@ -340,7 +340,7 @@ static void apiServerZoneDetail(HttpRequest* req, HttpResponse* resp)
     doDeleteZone(zonename);
     doCreateZone(document);
     reloadAuthAndForwards();
-    fillZone(dnsnameFromJson(document, "name"), resp);
+    fillZone(apiNameToDNSName(stringFromJson(document, "name")), resp);
   }
   else if(req->method == "DELETE" && !::arg().mustDo("api-readonly")) {
     if (!doDeleteZone(zonename)) {