]> granicus.if.org Git - pdns/commitdiff
API: Lay infra for using json11
authorChristian Hofstaedtler <christian.hofstaedtler@deduktiva.com>
Mon, 28 Dec 2015 00:54:13 +0000 (01:54 +0100)
committerChristian Hofstaedtler <christian.hofstaedtler@deduktiva.com>
Tue, 29 Dec 2015 22:29:16 +0000 (23:29 +0100)
build-scripts/dist-recursor
pdns/Makefile-recursor
pdns/Makefile.am
pdns/json.cc
pdns/json.hh
pdns/webserver.cc
pdns/webserver.hh

index b066ddc9d2fcf9074c3b19a092d13eb2cfa7cc33..5da313f60dde41d6e2eff40156f2c8fda4886aae 100755 (executable)
@@ -83,6 +83,7 @@ cp -a ../ext/mbedtls/library/{aes.c,base64.c,md.c,md_wrap.c,md5.c,sha1.c,sha256.
 cp -a ../ext/mbedtls/library/{rsa.c,bignum.c,oid.c,asn1parse.c,ctr_drbg.c,entropy.c,entropy_poll.c,timing.c,ecp.c,ecdsa.c,ecp_curves.c,hmac_drbg.c,asn1write.c} $DIRNAME/ext/mbedtls/library
 
 cp -a ../ext/yahttp/ $DIRNAME/ext/yahttp
+cp -a ../ext/json11/ $DIRNAME/ext/json11
 
 mkdir -p $DIRNAME/ext/luawrapper/include
 cp ../ext/luawrapper/include/LuaContext.hpp $DIRNAME/ext/luawrapper/include
index 2a57156d13874c2c48b7be801ff606b4b0dee73c..48ceb9238a77aea4aae28f894f06e8daea80e3ac 100644 (file)
@@ -4,7 +4,7 @@ BINDIR=/usr/bin/
 SYSCONFDIR=/etc/powerdns/
 LOCALSTATEDIR=/var/run/
 OPTFLAGS?=-O3
-CXXFLAGS:= $(CXXFLAGS) -Iext/rapidjson/include -I$(CURDIR)/ext/mbedtls/include -Wall @CF_PIE@ @CF_FORTIFY@ @CF_STACK@ $(OPTFLAGS) $(PROFILEFLAGS) $(ARCHFLAGS) -pthread -Iext/yahttp -DHAVE_CONFIG_H
+CXXFLAGS:= $(CXXFLAGS) -Iext/rapidjson/include -I$(CURDIR)/ext/mbedtls/include -I$(CURDIR)/ext/json11 -Wall @CF_PIE@ @CF_FORTIFY@ @CF_STACK@ $(OPTFLAGS) $(PROFILEFLAGS) $(ARCHFLAGS) -pthread -Iext/yahttp -DHAVE_CONFIG_H
 CFLAGS:=$(CFLAGS) -Wall $(OPTFLAGS) @CF_PIE@ @CF_FORTIFY@ @CF_STACK@ $(PROFILEFLAGS) $(ARCHFLAGS) -I$(CURDIR)/ext/mbedtls/include -pthread -DHAVE_CONFIG_H
 LDFLAGS:=$(LDFLAGS) $(ARCHFLAGS) -pthread @LD_RELRO@ @CF_STACK@ @LD_PIE@
 STRIP_BINARIES?=1
@@ -29,6 +29,7 @@ ext/mbedtls/library/hmac_drbg.o ext/mbedtls/library/asn1write.o \
 ext/mbedtls/library/bignum.o ext/mbedtls/library/oid.o ext/mbedtls/library/asn1parse.o  \
 ext/mbedtls/library/ctr_drbg.o ext/mbedtls/library/entropy.o ext/mbedtls/library/entropy_poll.o\
 ext/mbedtls/library/timing.o \
+ext/json11/json11.o \
 lua-recursor4.o randomhelper.o recpacketcache.o dns.o \
 reczones.o base32.o nsecrecords.o json.o ws-recursor.o ws-api.o \
 version.o responsestats.o webserver.o ext/yahttp/yahttp/reqresp.o ext/yahttp/yahttp/router.o \
@@ -119,7 +120,7 @@ clean: binclean
        -rm -f dep *~ *.gcda *.gcno optional/*.gcda optional/*.gcno
 
 binclean:
-       -rm -f *.o pdns_hw pdns_recursor rec_control optional/*.o build-stamp ext/library/*.o ext/yahttp/yahttp/*.o
+       -rm -f *.o pdns_hw pdns_recursor rec_control optional/*.o build-stamp ext/library/*.o ext/yahttp/yahttp/*.o ext/json11/*.o
 
 dep:
        $(CXX) $(CXXFLAGS) -MM -MG *.cc *.hh > $@
index 662e71534aad120e5a5d142536c1f9df832451a2..a2af6b76942ea1c8011c5a00aefe07160cc3db7c 100644 (file)
@@ -1,3 +1,5 @@
+JSON11_LIBS = -L$(top_srcdir)/ext/json11 -ljson11
+
 AM_CPPFLAGS += \
        -I$(top_srcdir)/ext/json11 \
        -I$(top_srcdir)/ext/rapidjson/include \
@@ -207,7 +209,8 @@ pdns_server_LDADD = \
        @modulelibs@ \
        $(LIBDL) \
        $(MBEDTLS_LIBS) \
-       $(YAHTTP_LIBS)
+       $(YAHTTP_LIBS) \
+       $(JSON11_LIBS)
 
 if BOTAN110
 pdns_server_SOURCES += botan110signers.cc botansigners.cc
@@ -307,7 +310,8 @@ pdnsutil_LDADD = \
        $(LIBDL) \
        $(MBEDTLS_LIBS) \
        $(BOOST_PROGRAM_OPTIONS_LIBS) \
-       $(YAHTTP_LIBS)
+       $(YAHTTP_LIBS) \
+       $(JSON11_LIBS)
 
 if BOTAN110
 pdnsutil_SOURCES += botan110signers.cc botansigners.cc
@@ -374,7 +378,7 @@ zone2sql_SOURCES = \
        zone2sql.cc \
        zoneparser-tng.cc
 
-zone2sql_LDADD = $(MBEDTLS_LIBS)
+zone2sql_LDADD = $(MBEDTLS_LIBS) $(JSON11_LIBS)
 
 zone2json_SOURCES = \
        arguments.cc \
@@ -400,7 +404,7 @@ zone2json_SOURCES = \
        zone2json.cc \
        zoneparser-tng.cc
 
-zone2json_LDADD = $(MBEDTLS_LIBS) -L$(top_srcdir)/ext/json11 -ljson11
+zone2json_LDADD = $(MBEDTLS_LIBS) $(JSON11_LIBS)
 
 # pkglib_LTLIBRARIES = iputils.la
 # iputils_la_SOURCES = lua-iputils.cc
@@ -1157,7 +1161,8 @@ pdns_recursor_SOURCES = \
 
 pdns_recursor_LDADD = \
        $(MBEDTLS_LIBS) \
-       $(YAHTTP_LIBS)
+       $(YAHTTP_LIBS) \
+       $(JSON11_LIBS)
 
 if PKCS11
 pdns_recursor_SOURCES += pkcs11signers.cc pkcs11signers.hh
index ee6022afeacdf7f05eadc3b722c374b97e0524f3..b0bd9e51331ba292218d20cc87682625d6ea7792 100644 (file)
@@ -31,6 +31,7 @@
 #include "rapidjson/writer.h"
 
 using namespace rapidjson;
+using json11::Json;
 
 int intFromJson(const Value& container, const char* key)
 {
@@ -63,6 +64,31 @@ int intFromJson(const Value& container, const char* key, const int default_value
   }
 }
 
+int intFromJson(const Json container, const std::string& key)
+{
+  auto val = container[key];
+  if (val.is_number()) {
+    return val.int_value();
+  } else if (val.is_string()) {
+    return std::stoi(val.string_value());
+  } else {
+    throw JsonException("Key '" + string(key) + "' not an Integer or not present");
+  }
+}
+
+int intFromJson(const Json container, const std::string& key, const int default_value)
+{
+  auto val = container[key];
+  if (val.is_number()) {
+    return val.int_value();
+  } else if (val.is_string()) {
+    return std::stoi(val.string_value());
+  } else {
+    // TODO: check if value really isn't present
+    return default_value;
+  }
+}
+
 string stringFromJson(const Value& container, const char* key)
 {
   if (!container.IsObject()) {
@@ -76,6 +102,16 @@ string stringFromJson(const Value& container, const char* key)
   }
 }
 
+string stringFromJson(const Json container, const std::string &key)
+{
+  const Json val = container[key];
+  if (val.is_string()) {
+    return val.string_value();
+  } else {
+    throw JsonException("Key '" + string(key) + "' not present or not a String");
+  }
+}
+
 string stringFromJson(const Value& container, const char* key, const string& default_value)
 {
   if (!container.IsObject()) {
@@ -116,6 +152,26 @@ bool boolFromJson(const rapidjson::Value& container, const char* key, const bool
   }
 }
 
+bool boolFromJson(const json11::Json container, const std::string& key)
+{
+  auto val = container[key];
+  if (val.is_bool()) {
+    return val.bool_value();
+  } else {
+    throw JsonException("Key '" + string(key) + "' not present or not a Bool");
+  }
+}
+
+bool boolFromJson(const json11::Json container, const std::string& key, const bool default_value)
+{
+  auto val = container[key];
+  if (val.is_bool()) {
+    return val.bool_value();
+  } else {
+    return default_value;
+  }
+}
+
 string makeStringFromDocument(const Document& doc)
 {
   StringBuffer output;
index 774631d8e0bb2b4cd3ab1480010452594e3d316f..726f8de4502663fba8a9d1f75be6fee9f77a8431 100644 (file)
@@ -25,6 +25,7 @@
 #include <map>
 #include <stdexcept>
 #include "rapidjson/document.h"
+#include "json11.hpp"
 
 std::string returnJsonObject(const std::map<std::string, std::string>& items);
 std::string returnJsonError(const std::string& error);
@@ -32,10 +33,15 @@ std::string returnJsonMessage(const std::string& message);
 std::string makeStringFromDocument(const rapidjson::Document& doc);
 int intFromJson(const rapidjson::Value& container, const char* key);
 int intFromJson(const rapidjson::Value& container, const char* key, const int default_value);
+int intFromJson(const json11::Json container, const std::string& key);
+int intFromJson(const json11::Json container, const std::string& 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);
+std::string stringFromJson(const json11::Json container, const std::string &key);
 bool boolFromJson(const rapidjson::Value& container, const char* key);
 bool boolFromJson(const rapidjson::Value& container, const char* key, const bool default_value);
+bool boolFromJson(const json11::Json container, const std::string& key);
+bool boolFromJson(const json11::Json container, const std::string& key, const bool default_value);
 
 class JsonException : public std::runtime_error
 {
index 81b2cd14043407a6dfa166e4f36511074c2b5a69..a6c4ffe7b4dcf09be8d9ab10a517349cb193cdb6 100644 (file)
@@ -51,6 +51,21 @@ void HttpRequest::json(rapidjson::Document& document)
   }
 }
 
+json11::Json HttpRequest::json()
+{
+  string err;
+  if(this->body.empty()) {
+    L<<Logger::Debug<<"HTTP: JSON document expected in request body, but body was empty" << endl;
+    throw HttpBadRequestException();
+  }
+  json11::Json doc = json11::Json::parse(this->body, err);
+  if (doc.is_null()) {
+    L<<Logger::Debug<<"HTTP: parsing of JSON document failed:" << err << endl;
+    throw HttpBadRequestException();
+  }
+  return doc;
+}
+
 bool HttpRequest::compareAuthorization(const string &expected_password)
 {
   // validate password
@@ -87,6 +102,11 @@ void HttpResponse::setBody(rapidjson::Document& document)
   this->body = makeStringFromDocument(document);
 }
 
+void HttpResponse::setBody(const json11::Json& document)
+{
+  document.dump(this->body);
+}
+
 static void bareHandlerWrapper(WebServer::HandlerFunction handler, YaHTTP::Request* req, YaHTTP::Response* resp)
 {
   // wrapper to convert from YaHTTP::* to our subclasses
index 7eee5e2663f80ae9176a61d693bfee0532646122..c02489cbd1ead99e73e4deea9007fd190d900328 100644 (file)
@@ -29,6 +29,7 @@
 #include "rapidjson/document.h"
 #include "rapidjson/stringbuffer.h"
 #include "rapidjson/writer.h"
+#include "json11.hpp"
 #include "namespaces.hh"
 #include "sstuff.hh"
 
@@ -42,6 +43,7 @@ public:
   bool accept_html;
   bool complete;
   void json(rapidjson::Document& document);
+  json11::Json json();
 
   // checks password _only_.
   bool compareAuthorization(const string &expected_password);
@@ -54,6 +56,7 @@ public:
   HttpResponse(const YaHTTP::Response &resp) : YaHTTP::Response(resp) { };
 
   void setBody(rapidjson::Document& document);
+  void setBody(const json11::Json& document);
 };