mirror of
https://github.com/anope/anope.git
synced 2026-06-12 19:14:47 +02:00
Switch RPC event registration to use the service system.
This commit is contained in:
+5
-14
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
+5
-23
@@ -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);
|
||||
|
||||
+24
-46
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+10
-21
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user