diff options
-rw-r--r-- | include/modules/rpc.h | 19 | ||||
-rw-r--r-- | modules/extra/xmlrpc.cpp | 28 | ||||
-rw-r--r-- | modules/rpc/jsonrpc.cpp | 28 | ||||
-rw-r--r-- | modules/rpc/rpc_data.cpp | 70 | ||||
-rw-r--r-- | modules/rpc/rpc_main.cpp | 29 | ||||
-rw-r--r-- | modules/rpc/rpc_message.cpp | 31 | ||||
-rw-r--r-- | modules/rpc/rpc_system.cpp | 31 |
7 files changed, 67 insertions, 169 deletions
diff --git a/include/modules/rpc.h b/include/modules/rpc.h index 52d1d6492..719c459e8 100644 --- a/include/modules/rpc.h +++ b/include/modules/rpc.h @@ -21,9 +21,6 @@ namespace RPC class ServiceInterface; class Value; - /** Represents a list of registered events. */ - using Events = Anope::map<Event *>; - /** Represents possible types of RPC value. */ using ValueUnion = std::variant<Array, Map, Anope::string, std::nullptr_t, bool, double, int64_t, uint64_t>; @@ -171,15 +168,17 @@ public: inline const auto &GetRoot() const { return this->root; } }; +#define RPC_EVENT "RPC::Event" + class RPC::Event + : public Service { private: - Anope::string event; size_t minparams; protected: - Event(const Anope::string& e, size_t mp = 0) - : event(e) + Event(Module *o, const Anope::string& e, size_t mp = 0) + : Service(o, RPC_EVENT, e) , minparams(mp) { } @@ -187,8 +186,6 @@ protected: public: virtual ~Event() = default; - const auto &GetEvent() const { return event; } - const auto &GetMinParams() const { return minparams; } virtual bool Run(ServiceInterface *iface, HTTPClient *client, Request &request) = 0; @@ -203,12 +200,6 @@ public: { } - virtual const Events &GetEvents() = 0; - - virtual bool Register(Event *event) = 0; - - virtual bool Unregister(Event *event) = 0; - virtual void Reply(Request &request) = 0; }; diff --git a/modules/extra/xmlrpc.cpp b/modules/extra/xmlrpc.cpp index e0efd1a9c..de23f0dc1 100644 --- a/modules/extra/xmlrpc.cpp +++ b/modules/extra/xmlrpc.cpp @@ -23,8 +23,6 @@ class XMLRPCServiceInterface final , public HTTPPage { private: - RPC::Events events; - static void SendError(HTTPReply &reply, xmlrpc_env &env) { Log(LOG_DEBUG) << "XML-RPC error " << env.fault_code << ": " << env.fault_string; @@ -75,21 +73,6 @@ public: { } - const RPC::Events &GetEvents() override - { - return events; - } - - bool Register(RPC::Event *event) override - { - return this->events.emplace(event->GetEvent(), event).second; - } - - bool Unregister(RPC::Event *event) override - { - return this->events.erase(event->GetEvent()) != 0; - } - bool OnRequest(HTTPProvider *provider, const Anope::string &page_name, HTTPClient *client, HTTPMessage &message, HTTPReply &reply) override { xmlrpc_env env; @@ -110,8 +93,8 @@ public: request.name = method; delete method; - auto event = this->events.find(request.name); - if (event == this->events.end()) + ServiceReference<RPC::Event> event(RPC_EVENT, request.name); + if (!event) { xmlrpc_env_set_fault(&env, RPC::ERR_METHOD_NOT_FOUND, "Method not found"); SendError(reply, env); @@ -152,17 +135,16 @@ public: } xmlrpc_DECREF(params); - auto *eh = event->second; - if (request.data.size() < eh->GetMinParams()) + if (request.data.size() < event->GetMinParams()) { auto error = Anope::printf("Not enough parameters (given %zu, expected %zu)", - request.data.size(), eh->GetMinParams()); + request.data.size(), event->GetMinParams()); xmlrpc_env_set_fault(&env, RPC::ERR_INVALID_PARAMS, error.c_str()); SendError(reply, env); return true; } - if (!eh->Run(this, client, request)) + if (!event->Run(this, client, request)) return false; this->Reply(request); diff --git a/modules/rpc/jsonrpc.cpp b/modules/rpc/jsonrpc.cpp index c0ae6df56..cb6835d47 100644 --- a/modules/rpc/jsonrpc.cpp +++ b/modules/rpc/jsonrpc.cpp @@ -26,8 +26,6 @@ class JSONRPCServiceInterface final , public HTTPPage { private: - RPC::Events events; - static std::pair<yyjson_mut_doc *, yyjson_mut_val *> CreateReply(const Anope::string &id) { auto* doc = yyjson_mut_doc_new(nullptr); @@ -94,21 +92,6 @@ public: { } - const RPC::Events &GetEvents() override - { - return events; - } - - bool Register(RPC::Event *event) override - { - return this->events.emplace(event->GetEvent(), event).second; - } - - bool Unregister(RPC::Event *event) override - { - return this->events.erase(event->GetEvent()) != 0; - } - bool OnRequest(HTTPProvider *provider, const Anope::string &page_name, HTTPClient *client, HTTPMessage &message, HTTPReply &reply) override { yyjson_read_err error; @@ -159,23 +142,22 @@ public: yyjson_doc_free(doc); - auto event = this->events.find(request.name); - if (event == this->events.end()) + ServiceReference<RPC::Event> event(RPC_EVENT, request.name); + if (!event) { SendError(reply, RPC::ERR_METHOD_NOT_FOUND, "Method not found: " + request.name, id); return true; } - auto *eh = event->second; - if (request.data.size() < eh->GetMinParams()) + if (request.data.size() < event->GetMinParams()) { auto error = Anope::printf("Not enough parameters for %s (given %zu, expected %zu)", - request.name.c_str(), request.data.size(), eh->GetMinParams()); + request.name.c_str(), request.data.size(), event->GetMinParams()); SendError(reply, RPC::ERR_INVALID_PARAMS, error, id); return true; } - if (!eh->Run(this, client, request)) + if (!event->Run(this, client, request)) return false; this->Reply(request); diff --git a/modules/rpc/rpc_data.cpp b/modules/rpc/rpc_data.cpp index 2b58a9f76..e776d8e1a 100644 --- a/modules/rpc/rpc_data.cpp +++ b/modules/rpc/rpc_data.cpp @@ -19,8 +19,8 @@ class AnopeListChannelsRPCEvent final : public RPC::Event { public: - AnopeListChannelsRPCEvent() - : RPC::Event("anope.listChannels") + AnopeListChannelsRPCEvent(Module *o) + : RPC::Event(o, "anope.listChannels") { } @@ -37,8 +37,8 @@ class AnopeChannelRPCEvent final : public RPC::Event { public: - AnopeChannelRPCEvent() - : RPC::Event("anope.channel", 1) + AnopeChannelRPCEvent(Module *o) + : RPC::Event(o, "anope.channel", 1) { } @@ -112,8 +112,8 @@ class AnopeListOpersRPCEvent final : public RPC::Event { public: - AnopeListOpersRPCEvent() - : RPC::Event("anope.listOpers") + AnopeListOpersRPCEvent(Module *o) + : RPC::Event(o, "anope.listOpers") { } @@ -130,8 +130,8 @@ class AnopeOperRPCEvent final : public RPC::Event { public: - AnopeOperRPCEvent() - : RPC::Event("anope.oper", 1) + AnopeOperRPCEvent(Module *o) + : RPC::Event(o, "anope.oper", 1) { } @@ -193,8 +193,8 @@ class AnopeListServersRPCEvent final : public RPC::Event { public: - AnopeListServersRPCEvent() - : RPC::Event("anope.listServers") + AnopeListServersRPCEvent(Module *o) + : RPC::Event(o, "anope.listServers") { } @@ -211,8 +211,8 @@ class AnopeServerRPCEvent final : public RPC::Event { public: - AnopeServerRPCEvent() - : RPC::Event("anope.server") + AnopeServerRPCEvent(Module *o) + : RPC::Event(o, "anope.server") { } @@ -254,8 +254,8 @@ class AnopeListUsersRPCEvent final : public RPC::Event { public: - AnopeListUsersRPCEvent() - : RPC::Event("anope.listUsers") + AnopeListUsersRPCEvent(Module *o) + : RPC::Event(0, "anope.listUsers") { } @@ -272,8 +272,8 @@ class AnopeUserRPCEvent final : public RPC::Event { public: - AnopeUserRPCEvent() - : RPC::Event("anope.user", 1) + AnopeUserRPCEvent(Module *o) + : RPC::Event(o, "anope.user", 1) { } @@ -379,41 +379,19 @@ private: public: ModuleRPCData(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, EXTRA | VENDOR) + , anopelistchannelsrpcevent(this) + , anopechannelrpcevent(this) + , anopelistopersrpcevent(this) + , anopeoperrpcevent(this) + , anopelistserversrpcevent(this) + , anopeserverrpcevent(this) + , anopelistusersrpcevent(this) + , anopeuserrpcevent(this) { if (!RPC::service) throw ModuleException("Unable to find RPC interface, is jsonrpc/xmlrpc loaded?"); - - RPC::service->Register(&anopelistchannelsrpcevent); - RPC::service->Register(&anopechannelrpcevent); - - RPC::service->Register(&anopelistopersrpcevent); - RPC::service->Register(&anopeoperrpcevent); - - RPC::service->Register(&anopelistserversrpcevent); - RPC::service->Register(&anopeserverrpcevent); - - RPC::service->Register(&anopelistusersrpcevent); - RPC::service->Register(&anopeuserrpcevent); - } - ~ModuleRPCData() override - { - if (!RPC::service) - return; - - RPC::service->Unregister(&anopelistchannelsrpcevent); - RPC::service->Unregister(&anopechannelrpcevent); - - RPC::service->Unregister(&anopelistopersrpcevent); - RPC::service->Unregister(&anopeoperrpcevent); - - RPC::service->Unregister(&anopelistserversrpcevent); - RPC::service->Unregister(&anopeserverrpcevent); - - RPC::service->Unregister(&anopelistusersrpcevent); - RPC::service->Unregister(&anopeuserrpcevent); - } }; MODULE_INIT(ModuleRPCData) diff --git a/modules/rpc/rpc_main.cpp b/modules/rpc/rpc_main.cpp index 68bcf9a04..4fd40697d 100644 --- a/modules/rpc/rpc_main.cpp +++ b/modules/rpc/rpc_main.cpp @@ -61,8 +61,8 @@ class CommandRPCEvent final : public RPC::Event { public: - CommandRPCEvent() - : RPC::Event("command") + CommandRPCEvent(Module *o) + : RPC::Event(o, "command") { } @@ -118,8 +118,8 @@ class CheckAuthenticationRPCEvent final : public RPC::Event { public: - CheckAuthenticationRPCEvent() - : RPC::Event("checkAuthentication") + CheckAuthenticationRPCEvent(Module *o) + : RPC::Event(o, "checkAuthentication") { } @@ -145,8 +145,8 @@ class StatsRPCEvent final : public RPC::Event { public: - StatsRPCEvent() - : RPC::Event("stats") + StatsRPCEvent(Module *o) + : RPC::Event(o, "stats") { } @@ -178,25 +178,14 @@ private: public: ModuleRPCMain(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, EXTRA | VENDOR) + , commandrpcevent(this) + , checkauthenticationrpcevent(this) + , statsrpcevent(this) { me = this; if (!RPC::service) throw ModuleException("Unable to find RPC interface, is jsonrpc/xmlrpc loaded?"); - - RPC::service->Register(&commandrpcevent); - RPC::service->Register(&checkauthenticationrpcevent); - RPC::service->Register(&statsrpcevent); - } - - ~ModuleRPCMain() override - { - if (!RPC::service) - return; - - RPC::service->Unregister(&commandrpcevent); - RPC::service->Unregister(&checkauthenticationrpcevent); - RPC::service->Unregister(&statsrpcevent); } }; diff --git a/modules/rpc/rpc_message.cpp b/modules/rpc/rpc_message.cpp index f85635943..cff6ebd30 100644 --- a/modules/rpc/rpc_message.cpp +++ b/modules/rpc/rpc_message.cpp @@ -30,8 +30,8 @@ private: ServiceReference<GlobalService> &global; public: - MessageNetworkRPCEvent(ServiceReference<GlobalService> &g) - : RPC::Event("anope.messageNetwork", 1) + MessageNetworkRPCEvent(Module *o, ServiceReference<GlobalService> &g) + : RPC::Event(o, "anope.messageNetwork", 1) , global(g) { } @@ -57,8 +57,8 @@ private: ServiceReference<GlobalService> &global; public: - MessageServerRPCEvent(ServiceReference<GlobalService> &g) - : RPC::Event("anope.messageServer", 2) + MessageServerRPCEvent(Module *o, ServiceReference<GlobalService> &g) + : RPC::Event(o, "anope.messageServer", 2) , global(g) { } @@ -89,8 +89,8 @@ class MessageUserRPCEvent final : public RPC::Event { public: - MessageUserRPCEvent() - : RPC::Event("anope.messageUser", 3) + MessageUserRPCEvent(Module *o) + : RPC::Event(o, "anope.messageUser", 3) { } @@ -129,25 +129,12 @@ public: ModuleRPCSystem(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, EXTRA | VENDOR) , global("GlobalService", "Global") - , messagenetworkrpcevent(global) - , messageserverrpcevent(global) + , messagenetworkrpcevent(this, global) + , messageserverrpcevent(this, global) + , messageuserrpcevent(this) { if (!RPC::service) throw ModuleException("Unable to find RPC interface, is jsonrpc/xmlrpc loaded?"); - - RPC::service->Register(&messagenetworkrpcevent); - RPC::service->Register(&messageserverrpcevent); - RPC::service->Register(&messageuserrpcevent); - } - - ~ModuleRPCSystem() override - { - if (!RPC::service) - return; - - RPC::service->Unregister(&messagenetworkrpcevent); - RPC::service->Unregister(&messageserverrpcevent); - RPC::service->Unregister(&messageuserrpcevent); } }; diff --git a/modules/rpc/rpc_system.cpp b/modules/rpc/rpc_system.cpp index 4982e0646..2c2f33fd2 100644 --- a/modules/rpc/rpc_system.cpp +++ b/modules/rpc/rpc_system.cpp @@ -19,9 +19,12 @@ class AnopeDebugTypesRPCEvent final : public RPC::Event { public: - AnopeDebugTypesRPCEvent() - : RPC::Event("anope.debugTypes") + AnopeDebugTypesRPCEvent(Module *o) + : RPC::Event(o, "anope.debugTypes") { +#if !DEBUG_BUILD + Unregister(); +#endif } bool Run(RPC::ServiceInterface *iface, HTTPClient *client, RPC::Request &request) override @@ -80,15 +83,15 @@ class SystemListMethodsRPCEvent final : public RPC::Event { public: - SystemListMethodsRPCEvent() - : RPC::Event("system.listMethods") + SystemListMethodsRPCEvent(Module *o) + : RPC::Event(o, "system.listMethods") { } bool Run(RPC::ServiceInterface *iface, HTTPClient *client, RPC::Request &request) override { auto &root = request.Root<RPC::Array>(); - for (const auto &[event, _] : iface->GetEvents()) + for (const auto &event : Service::GetServiceKeys(RPC_EVENT)) root.Reply(event); return true; } @@ -104,25 +107,11 @@ private: public: ModuleRPCSystem(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, EXTRA | VENDOR) + , anopedebugtypesrpcevent(this) + , systemlistmethodsrpcevent(this) { if (!RPC::service) throw ModuleException("Unable to find RPC interface, is jsonrpc/xmlrpc loaded?"); - -#if DEBUG_BUILD - RPC::service->Register(&anopedebugtypesrpcevent); -#endif - RPC::service->Register(&systemlistmethodsrpcevent); - } - - ~ModuleRPCSystem() override - { - if (!RPC::service) - return; - -#if DEBUG_BUILD - RPC::service->Unregister(&anopedebugtypesrpcevent); -#endif - RPC::service->Unregister(&systemlistmethodsrpcevent); } }; |