add "context" to the function call mechanism

JSON-2
Roker 7 years ago
parent 9a9f4d5226
commit 4f753ecdce

@ -0,0 +1,14 @@
#ifndef JSON_ADAPTER_CONTEXT_HH
#define JSON_ADAPTER_CONTEXT_HH
#include <string>
class Context
{
public:
virtual ~Context() = default;
virtual bool verify_security_token(const std::string& token) const = 0;
};
#endif // JSON_ADAPTER_CONTEXT_HH

@ -3,6 +3,8 @@
#include "json_spirit/json_spirit_value.h"
#include "json_spirit/json_spirit_writer.h"
#include "context.hh"
#include <type_traits>
// Just for debugging:
@ -298,7 +300,7 @@ public:
virtual ~FuncBase() = default;
virtual bool isSeparator() const = 0;
virtual void setJavaScriptSignature(js::Object& o) const = 0;
virtual js::Value call(const js::Array& params) const = 0;
virtual js::Value call(const js::Array& params, const Context* context) const = 0;
};
@ -323,7 +325,7 @@ public:
std::function<R(typename Args::c_type ...)> fn;
js::Value call(const js::Array& parameters) const override
js::Value call(const js::Array& parameters, const Context* context) const override
{
if(parameters.size() != sizeof...(Args))
throw std::runtime_error("Size mismatch: "
@ -359,9 +361,9 @@ class Separator : public FuncBase
{
public:
Separator() = default;
virtual bool isSeparator() const override { return true; }
virtual void setJavaScriptSignature(js::Object& o) const override { o.emplace_back("separator", true); }
virtual js::Value call(const js::Array& params) const override { return js::Value{}; }
virtual bool isSeparator() const override { return true; }
virtual void setJavaScriptSignature(js::Object& o) const override { o.emplace_back("separator", true); }
virtual js::Value call(const js::Array&, const Context*) const override { return js::Value{}; }
};
//typedef std::map< std::string, FuncBase* > FunctionMap;

@ -290,7 +290,7 @@ void OnApiRequest(evhttp_request* req, void* obj)
if(p.type() == js::obj_type)
{
const js::Object& request = p.get_obj();
answer = call( functions, request, ja->sec_token() );
answer = call( functions, request, ja );
}else{
answer = make_error( JSON_RPC::PARSE_ERROR, "evbuffer_copyout does not return a JSON string. b=" + std::to_string(b), js::Value{data_string}, 42 );
}
@ -541,12 +541,6 @@ void JsonAdapter::shutdown(timeval* t)
}
const std::string& JsonAdapter::sec_token() const
{
return i->token;
}
// returns 'true' if 's' is the security token created by the function above.
bool JsonAdapter::verify_security_token(const std::string& s) const
{

@ -3,8 +3,9 @@
#include <pEp/pEpEngine.h>
#include "registry.hh"
#include "context.hh"
class JsonAdapter
class JsonAdapter : public Context
{
public:
// creates an instance of the JSON adapter. It tries to bind the first available port in the given range
@ -12,7 +13,7 @@ public:
JsonAdapter(const std::string& address, unsigned start_port, unsigned end_port);
// calls abort() on the instance if it is still running().
~JsonAdapter();
virtual ~JsonAdapter();
// don't allow copies
JsonAdapter(const JsonAdapter&) = delete;
@ -37,9 +38,7 @@ public:
unsigned request_count() const;
// returns 'true' if 's' is the security token created by the function above.
bool verify_security_token(const std::string& s) const;
const std::string& sec_token() const;
virtual bool verify_security_token(const std::string& s) const override;
static
unsigned apiVersion();

@ -45,7 +45,7 @@ namespace
using json_spirit::find_value;
js::Object call(const FunctionMap& fm, const js::Object& request, const std::string& sec_token_orig)
js::Object call(const FunctionMap& fm, const js::Object& request, const Context* context)
{
int request_id = -1;
try
@ -57,7 +57,7 @@ js::Object call(const FunctionMap& fm, const js::Object& request, const std::str
}
const auto sec_token = find_value(request, "security_token");
if(sec_token.type()!=js::str_type || (sec_token.get_str()!=sec_token_orig) )
if(sec_token.type()!=js::str_type || context->verify_security_token(sec_token.get_str())==false )
{
return make_error(JSON_RPC::INVALID_REQUEST, "Invalid request: Wrong security token.", request, request_id);
}
@ -98,7 +98,8 @@ js::Object call(const FunctionMap& fm, const js::Object& request, const std::str
std::cerr << "=== Now I do the call!\n"
"\tmethod_name=\"" << method_name << "\","
"\tparams=" << js::write(params) << ". ===\n";
const js::Value result = fn->second->call(p);
const js::Value result = fn->second->call(p, context);
std::cerr << "=== Result of call: " << js::write(result, js::raw_utf8) << ". ===\n";
std::cerr << "\tSessions: " << getSessions() << "\n";

@ -2,6 +2,7 @@
#define JSON_RPC_HH
#include "json_spirit/json_spirit_value.h"
#include "context.hh"
#include "function_map.hh"
namespace js = json_spirit;
@ -19,7 +20,7 @@ enum class JSON_RPC
// parse the JSON-RPC 2.0 compatible "request", call the function
// and create an appropiate "response" object (containing a result or an error)
js::Object call(const FunctionMap& fm, const js::Object& request, const std::string& sec_token_orig);
js::Object call(const FunctionMap& fm, const js::Object& request, const Context* context);
// create a JSON-RPC 2.0 compatible result response object
js::Object make_result(const js::Value& result, int id);

Loading…
Cancel
Save