#ifndef JSON_ADAPTER_HH #define JSON_ADAPTER_HH #include #include #include #include "registry.hh" #include "logger.hh" #include "server_version.hh" #include "json_spirit/json_spirit_value.h" class SessionRegistry; // allow mocking the JsonAdapter in unittest_rpc class JsonAdapterBase { public: ~JsonAdapterBase() = default; virtual bool verify_security_token(const std::string& s) const = 0; // Cache a certain function call. See JSON-155. virtual void cache(const std::string& client_id, const std::string& fn_name, const std::function& func) = 0; }; class JsonAdapter : public JsonAdapterBase { public: // calls shutdown() on the instance if it is still running(). virtual ~JsonAdapter(); // don't allow copies JsonAdapter(const JsonAdapter&) = delete; void operator=(const JsonAdapter&) = delete; // returns all events in queue, if any. Blocks for given number of seconds and returns empty array on timeout json_spirit::Array pollForEvents(unsigned timeout_seconds); // same as above, but with explicit session_id. JUST FOR DEBUG!!! json_spirit::Array pollForEvents2(const std::string& session_id, unsigned timeout_seconds); // set some internal variables and return itself for chaining. // these functions shall be called before prepare_run()! // only if do_sync== true the keysync thread is stared and the keysync callbacks are registered. JsonAdapter& ignore_session_errors(bool _ig); // if called with "false" the JSON Adpapter would no longer deliver HTML and JavaScript files, only handle JSON-RPC requests JsonAdapter& deliver_html(bool _deliver_html); // sets the timeout to drop client's config cache JsonAdapter& set_client_session_timeout(int timeout_seconds); // look for a free port to listen on and set the given configuration void prepare_run(const std::string& address, unsigned start_port, unsigned end_port, ::messageToSend_t messageToSend); // run the server in another thread and returns immediately. prepare_run() has to be called before! void run(); // non-static: does the real work. :-) void connection_close_cb(); void close_session(const std::string& session_id); static std::string create_session(); // exits gracefully after the given number of seconds. // if "tv" is NULL it means: exits immediately after _all_ currently processed events have been finished. void shutdown(struct timeval* tv); void shutdown_now() { shutdown(nullptr); } // exit immediately or after the currently processed event has been finished. //void abort(); // returns "true" after run() was called, until shutdown() or abort() is called. bool running() const; unsigned port() const; const std::string& address() const; unsigned request_count() const; virtual std::thread::id get_sync_thread_id() const = 0; // returns 'true' if 's' is the security token created by the function above. virtual bool verify_security_token(const std::string& s) const override; virtual void cache(const std::string& client_id, const std::string& fn_name, const std::function& func) override; // returns the version of the JsonAdapter static ServerVersion version(); // returns the PEP_SESSION registered for the current thread static PEP_SESSION getSessionForThread(const std::string& client_id); static PEP_STATUS messageToSend(message* msg); static PEP_STATUS notifyHandshake(pEp_identity* self, pEp_identity* partner, sync_handshake_signal signal); Logger::Stream Log(Logger::Severity s = Logger::Severity::Debug) const; // will throw logic_error if guard variables contains illegal values, which means: *this is not a valid JsonAdapter object! void check_guard() const; static JsonAdapter& getInstance(); static SessionRegistry& getSessionRegistry(); JsonAdapter& startup(::messageToSend_t messageToSend); protected: // might be overridden for multi-protocol adapters to dispatch to different client types. virtual messageToSend_t getMessageToSend() const { return &JsonAdapter::messageToSend; } // MUST be overridden, because the sync event queue is _not_ part of the Json Adapter virtual inject_sync_event_t getInjectSyncEvent() const = 0; static JsonAdapter& createInstance(JsonAdapter* instance); static JsonAdapter* singleton; // creates the one and only instance of the JSON adapter. JsonAdapter(); //private: struct Internal; friend struct Internal; unsigned long long guard_0; Internal* i; // pimpl for stable interface. unsigned long long guard_1; private: static void staticThreadFunc(JsonAdapter* that) { that->threadFunc(); } void threadFunc(); std::exception_ptr initExcept; }; // just for debug: // returns a string with a pretty-printed JSON array containing the session registry std::string getSessions(); #endif // JSON_ADAPTER_HH