From: Peter van Dijk Date: Tue, 5 Feb 2013 13:14:37 +0000 (+0000) Subject: fix rapidjson usage in remotebackend, patch by Aki Tuomi. Closes #697 X-Git-Tag: rec-3.5-rc3~36 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b26a48a121236e8a91e5356fbdf80eac84cfec07;p=thirdparty%2Fpdns.git fix rapidjson usage in remotebackend, patch by Aki Tuomi. Closes #697 git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@3096 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- diff --git a/modules/remotebackend/remotebackend.cc b/modules/remotebackend/remotebackend.cc index 7fd10955ec..83f96c5d32 100644 --- a/modules/remotebackend/remotebackend.cc +++ b/modules/remotebackend/remotebackend.cc @@ -18,23 +18,18 @@ bool Connector::send(rapidjson::Document &value) { * that the receiving happened ok, and extract * result. Logging is performed here, too. */ -bool Connector::recv(rapidjson::Value &value) { - rapidjson::Document input; - if (recv_message(input)>0) { +bool Connector::recv(rapidjson::Document &value) { + if (recv_message(value)>0) { bool rv = true; // check for error - if (input.HasMember("result")) { - value = input["result"]; - } else { - value = false; + if (!value.HasMember("result")) { return false; } - if (!value.IsObject() && (value.IsBool() && value.GetBool() == false)) { + if (!value["result"].IsObject() && (value["result"].IsBool() && value["result"].GetBool() == false)) { rv = false; - value = false; } - if (input.HasMember("log")) { - const rapidjson::Value& messages = input["log"]; + if (value.HasMember("log")) { + const rapidjson::Value& messages = value["log"]; if (messages.IsArray()) { // log em all for (rapidjson::Value::ConstValueIterator iter = messages.Begin(); iter != messages.End(); ++iter) @@ -126,7 +121,7 @@ int RemoteBackend::build(const std::string &connstr) { * data is mainly left alone, some defaults are assumed. */ void RemoteBackend::lookup(const QType &qtype, const std::string &qdomain, DNSPacket *pkt_p, int zoneId) { - rapidjson::Document query; + rapidjson::Document query,answer; rapidjson::Value parameters; if (d_index != -1) @@ -156,7 +151,7 @@ void RemoteBackend::lookup(const QType &qtype, const std::string &qdomain, DNSPa if (connector->send(query) == false || connector->recv(d_result) == false) return; // OK. we have result parametersues in result - if (d_result.IsArray() == false) return; + if (d_result["result"].IsArray() == false) return; d_index = 0; } @@ -165,26 +160,26 @@ bool RemoteBackend::get(DNSResourceRecord &rr) { rapidjson::Value value; value = ""; - rr.qtype = JSON_GET(d_result[d_index], "qtype", value).GetString(); - rr.qname = JSON_GET(d_result[d_index], "qname", value).GetString(); + rr.qtype = JSON_GET(d_result["result"][d_index], "qtype", value).GetString(); + rr.qname = JSON_GET(d_result["result"][d_index], "qname", value).GetString(); rr.qclass = QClass::IN; - rr.content = JSON_GET(d_result[d_index], "content",value).GetString(); + rr.content = JSON_GET(d_result["result"][d_index], "content",value).GetString(); value = -1; - rr.ttl = JSON_GET(d_result[d_index], "ttl",value).GetInt(); - rr.domain_id = JSON_GET(d_result[d_index],"domain_id",value).GetInt(); - rr.priority = JSON_GET(d_result[d_index],"priority",value).GetInt(); + rr.ttl = JSON_GET(d_result["result"][d_index], "ttl",value).GetInt(); + rr.domain_id = JSON_GET(d_result["result"][d_index],"domain_id",value).GetInt(); + rr.priority = JSON_GET(d_result["result"][d_index],"priority",value).GetInt(); value = 1; if (d_dnssec) - rr.auth = JSON_GET(d_result[d_index],"auth", value).GetInt(); + rr.auth = JSON_GET(d_result["result"][d_index],"auth", value).GetInt(); else rr.auth = 1; value = 0; - rr.scopeMask = JSON_GET(d_result[d_index],"scopeMask", value).GetInt(); + rr.scopeMask = JSON_GET(d_result["result"][d_index],"scopeMask", value).GetInt(); d_index++; // id index is out of bounds, we know the results end here. - if (d_index == static_cast(d_result.Size())) { + if (d_index == static_cast(d_result["result"].Size())) { d_result.SetNull(); d_index = -1; } @@ -192,7 +187,7 @@ bool RemoteBackend::get(DNSResourceRecord &rr) { } bool RemoteBackend::list(const std::string &target, int domain_id) { - rapidjson::Document query; + rapidjson::Document query,answer; rapidjson::Value parameters; if (d_index != -1) @@ -208,7 +203,7 @@ bool RemoteBackend::list(const std::string &target, int domain_id) { if (connector->send(query) == false || connector->recv(d_result) == false) return false; - if (d_result.IsArray() == false) + if (d_result["result"].IsArray() == false) return false; d_index = 0; @@ -216,8 +211,8 @@ bool RemoteBackend::list(const std::string &target, int domain_id) { } bool RemoteBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::string& qname, std::string& unhashed, std::string& before, std::string& after) { - rapidjson::Document query; - rapidjson::Value answer,parameters; + rapidjson::Document query,answer; + rapidjson::Value parameters; // no point doing dnssec if it's not supported if (d_dnssec == false) return false; @@ -232,16 +227,16 @@ bool RemoteBackend::getBeforeAndAfterNamesAbsolute(uint32_t id, const std::strin if (connector->send(query) == false || connector->recv(answer) == false) return false; - unhashed = answer["unhashed"].GetString(); - before = answer["before"].GetString(); - after = answer["after"].GetString(); + unhashed = answer["result"]["unhashed"].GetString(); + before = answer["result"]["before"].GetString(); + after = answer["result"]["after"].GetString(); return true; } bool RemoteBackend::getDomainMetadata(const std::string& name, const std::string& kind, std::vector& meta) { - rapidjson::Document query; - rapidjson::Value answer,parameters; + rapidjson::Document query,answer; + rapidjson::Value parameters; query.SetObject(); JSON_ADD_MEMBER(query, "method", "getDomainMetadata", query.GetAllocator()); @@ -252,6 +247,7 @@ bool RemoteBackend::getDomainMetadata(const std::string& name, const std::string if (connector->send(query) == false) return false; + meta.clear(); // not mandatory to implement @@ -259,10 +255,10 @@ bool RemoteBackend::getDomainMetadata(const std::string& name, const std::string return true; if (answer.IsArray()) { - for(rapidjson::Value::ValueIterator iter = answer.Begin(); iter != answer.End(); iter++) { + for(rapidjson::Value::ValueIterator iter = answer["result"].Begin(); iter != answer["result"].End(); iter++) { meta.push_back(iter->GetString()); } - } else if (answer.IsString()) { + } else if (answer["result"].IsString()) { meta.push_back(answer.GetString()); } @@ -270,8 +266,8 @@ bool RemoteBackend::getDomainMetadata(const std::string& name, const std::string } bool RemoteBackend::setDomainMetadata(const string& name, const std::string& kind, const std::vector& meta) { - rapidjson::Document query; - rapidjson::Value answer,parameters,val; + rapidjson::Document query,answer; + rapidjson::Value parameters,val; query.SetObject(); JSON_ADD_MEMBER(query, "method", "setDomainMetadata", query.GetAllocator()); parameters.SetObject(); @@ -287,15 +283,15 @@ bool RemoteBackend::setDomainMetadata(const string& name, const std::string& kin if (connector->send(query) == false || connector->recv(answer) == false) return false; - if (answer.IsBool()) + if (answer["result"].IsBool()) return answer.GetBool(); return false; } bool RemoteBackend::getDomainKeys(const std::string& name, unsigned int kind, std::vector& keys) { - rapidjson::Document query; - rapidjson::Value answer,parameters; + rapidjson::Document query,answer; + rapidjson::Value parameters; // no point doing dnssec if it's not supported if (d_dnssec == false) return false; @@ -311,7 +307,7 @@ bool RemoteBackend::getDomainKeys(const std::string& name, unsigned int kind, st keys.clear(); - for(rapidjson::Value::ValueIterator iter = answer.Begin(); iter != answer.End(); iter++) { + for(rapidjson::Value::ValueIterator iter = answer["result"].Begin(); iter != answer["result"].End(); iter++) { DNSBackend::KeyData key; key.id = (*iter)["id"].GetUint(); key.flags = (*iter)["flags"].GetUint(); @@ -324,8 +320,8 @@ bool RemoteBackend::getDomainKeys(const std::string& name, unsigned int kind, st } bool RemoteBackend::removeDomainKey(const string& name, unsigned int id) { - rapidjson::Document query; - rapidjson::Value answer,parameters; + rapidjson::Document query,answer; + rapidjson::Value parameters; // no point doing dnssec if it's not supported if (d_dnssec == false) return false; @@ -339,12 +335,12 @@ bool RemoteBackend::removeDomainKey(const string& name, unsigned int id) { if (connector->send(query) == false || connector->recv(answer) == false) return false; - return answer.GetBool(); + return answer["result"].GetBool(); } int RemoteBackend::addDomainKey(const string& name, const KeyData& key) { - rapidjson::Document query; - rapidjson::Value answer,parameters,jkey; + rapidjson::Document query,answer; + rapidjson::Value parameters,jkey; // no point doing dnssec if it's not supported if (d_dnssec == false) return false; @@ -362,12 +358,12 @@ int RemoteBackend::addDomainKey(const string& name, const KeyData& key) { if (connector->send(query) == false || connector->recv(answer) == false) return false; - return answer.GetInt(); + return answer["result"].GetInt(); } bool RemoteBackend::activateDomainKey(const string& name, unsigned int id) { - rapidjson::Document query; - rapidjson::Value answer, parameters; + rapidjson::Document query,answer; + rapidjson::Value parameters; // no point doing dnssec if it's not supported if (d_dnssec == false) return false; @@ -382,12 +378,12 @@ bool RemoteBackend::activateDomainKey(const string& name, unsigned int id) { if (connector->send(query) == false || connector->recv(answer) == false) return false; - return answer.GetBool(); + return answer["result"].GetBool(); } bool RemoteBackend::deactivateDomainKey(const string& name, unsigned int id) { - rapidjson::Document query; - rapidjson::Value answer, parameters; + rapidjson::Document query,answer; + rapidjson::Value parameters; // no point doing dnssec if it's not supported if (d_dnssec == false) return false; @@ -402,7 +398,7 @@ bool RemoteBackend::deactivateDomainKey(const string& name, unsigned int id) { if (connector->send(query) == false || connector->recv(answer) == false) return false; - return answer.GetBool(); + return answer["result"].GetBool(); } bool RemoteBackend::doesDNSSEC() { @@ -410,8 +406,8 @@ bool RemoteBackend::doesDNSSEC() { } bool RemoteBackend::getTSIGKey(const std::string& name, std::string* algorithm, std::string* content) { - rapidjson::Document query; - rapidjson::Value answer, parameters; + rapidjson::Document query,answer; + rapidjson::Value parameters; // no point doing dnssec if it's not supported if (d_dnssec == false) return false; @@ -425,16 +421,16 @@ bool RemoteBackend::getTSIGKey(const std::string& name, std::string* algorithm, return false; if (algorithm != NULL) - algorithm->assign(answer["algorithm"].GetString()); + algorithm->assign(answer["result"]["algorithm"].GetString()); if (content != NULL) - content->assign(answer["content"].GetString()); + content->assign(answer["result"]["content"].GetString()); return true; } bool RemoteBackend::getDomainInfo(const string &domain, DomainInfo &di) { - rapidjson::Document query; - rapidjson::Value answer, parameters; + rapidjson::Document query,answer; + rapidjson::Value parameters; rapidjson::Value value; std::string kind; @@ -448,26 +444,26 @@ bool RemoteBackend::getDomainInfo(const string &domain, DomainInfo &di) { return false; // make sure we got zone & kind - if (!answer.HasMember("zone")) { + if (!answer["result"].HasMember("zone")) { L<GetString()); } } - di.notified_serial = JSON_GET(answer, "notified_serial", value).GetInt(); + di.notified_serial = JSON_GET(answer["result"], "notified_serial", value).GetInt(); value = 0; - di.serial = JSON_GET(answer,"serial", value).GetInt(); - di.last_check = JSON_GET(answer,"last_check", value).GetInt(); + di.serial = JSON_GET(answer["result"],"serial", value).GetInt(); + di.last_check = JSON_GET(answer["result"],"last_check", value).GetInt(); value = "native"; - kind = JSON_GET(answer, "kind", value).GetString(); + kind = JSON_GET(answer["result"], "kind", value).GetString(); if (kind == "master") { di.kind = DomainInfo::Master; } else if (kind == "slave") { @@ -480,8 +476,8 @@ bool RemoteBackend::getDomainInfo(const string &domain, DomainInfo &di) { } void RemoteBackend::setNotified(uint32_t id, uint32_t serial) { - rapidjson::Document query; - rapidjson::Value answer, parameters; + rapidjson::Document query,answer; + rapidjson::Value parameters; query.SetObject(); JSON_ADD_MEMBER(query, "method", "setNotified", query.GetAllocator()); diff --git a/modules/remotebackend/remotebackend.hh b/modules/remotebackend/remotebackend.hh index 924b278766..dc6e08a942 100644 --- a/modules/remotebackend/remotebackend.hh +++ b/modules/remotebackend/remotebackend.hh @@ -27,7 +27,7 @@ class Connector { public: virtual ~Connector() {}; bool send(rapidjson::Document &value); - bool recv(rapidjson::Value &value); + bool recv(rapidjson::Document &value); virtual int send_message(const rapidjson::Document &input) = 0; virtual int recv_message(rapidjson::Document &output) = 0; }; @@ -118,7 +118,7 @@ class RemoteBackend : public DNSBackend int build(const std::string &connstr); Connector *connector; bool d_dnssec; - rapidjson::Value d_result; + rapidjson::Document d_result; int d_index; }; #endif