From 875aa2d98d1eb25f4932fbd2ac5c2086d16ff6ea Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Fri, 19 Jul 2019 12:11:36 +0100 Subject: spanningtree: Never send a message to a raw UUID in CmdBuilder. --- src/modules/m_spanningtree/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/modules/m_spanningtree/main.cpp') diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index f8531cb01..2651e1a4a 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -411,7 +411,7 @@ void ModuleSpanningTree::OnUserPostMessage(User* user, const MessageTarget& targ } case MessageTarget::TYPE_CHANNEL: { - Utils->SendChannelMessage(user->uuid, target.Get(), details.text, target.status, details.tags_out, details.exemptions, message_type); + Utils->SendChannelMessage(user, target.Get(), details.text, target.status, details.tags_out, details.exemptions, message_type); break; } case MessageTarget::TYPE_SERVER: @@ -448,7 +448,7 @@ void ModuleSpanningTree::OnUserPostTagMessage(User* user, const MessageTarget& t } case MessageTarget::TYPE_CHANNEL: { - Utils->SendChannelMessage(user->uuid, target.Get(), "", target.status, details.tags_out, details.exemptions, "TAGMSG"); + Utils->SendChannelMessage(user, target.Get(), "", target.status, details.tags_out, details.exemptions, "TAGMSG"); break; } case MessageTarget::TYPE_SERVER: @@ -625,7 +625,7 @@ void ModuleSpanningTree::OnPreRehash(User* user, const std::string ¶meter) // Send out to other servers if (!parameter.empty() && parameter[0] != '-') { - CmdBuilder params((user ? user->uuid : ServerInstance->Config->GetSID()), "REHASH"); + CmdBuilder params(user ? user : ServerInstance->FakeClient, "REHASH"); params.push_back(parameter); params.Forward(user ? TreeServer::Get(user)->GetRoute() : NULL); } -- cgit v1.3.1-10-gc9f91 From a9989ac3978bd6e1f9e915aeed399d9db327c235 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Fri, 19 Jul 2019 13:01:59 +0100 Subject: Get rid of CommandBuilder::push_back. --- src/modules/m_spanningtree/commandbuilder.h | 2 -- src/modules/m_spanningtree/idle.cpp | 6 ++-- src/modules/m_spanningtree/main.cpp | 36 ++++++++++++------------ src/modules/m_spanningtree/nickcollide.cpp | 4 +-- src/modules/m_spanningtree/ping.cpp | 4 +-- src/modules/m_spanningtree/postcommand.cpp | 8 +++--- src/modules/m_spanningtree/protocolinterface.cpp | 2 +- 7 files changed, 30 insertions(+), 32 deletions(-) (limited to 'src/modules/m_spanningtree/main.cpp') diff --git a/src/modules/m_spanningtree/commandbuilder.h b/src/modules/m_spanningtree/commandbuilder.h index ec9533f2e..4913120e0 100644 --- a/src/modules/m_spanningtree/commandbuilder.h +++ b/src/modules/m_spanningtree/commandbuilder.h @@ -151,8 +151,6 @@ class CmdBuilder return *this; } - void push_back(const std::string& s) { push(s); } - const std::string& str() const { return content; } operator const std::string&() const { return str(); } diff --git a/src/modules/m_spanningtree/idle.cpp b/src/modules/m_spanningtree/idle.cpp index 972707ca2..904142999 100644 --- a/src/modules/m_spanningtree/idle.cpp +++ b/src/modules/m_spanningtree/idle.cpp @@ -60,9 +60,9 @@ CmdResult CommandIdle::HandleRemote(RemoteUser* issuer, Params& params) idle = ((unsigned int) (ServerInstance->Time() - localtarget->idle_lastmsg)); CmdBuilder reply(target, "IDLE"); - reply.push_back(issuer->uuid); - reply.push_back(ConvToStr(target->signon)); - reply.push_back(ConvToStr(idle)); + reply.push(issuer->uuid); + reply.push(ConvToStr(target->signon)); + reply.push(ConvToStr(idle)); reply.Unicast(issuer); } diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 2651e1a4a..561eed2fb 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -359,10 +359,10 @@ void ModuleSpanningTree::OnUserInvite(User* source, User* dest, Channel* channel if (IS_LOCAL(source)) { CmdBuilder params(source, "INVITE"); - params.push_back(dest->uuid); - params.push_back(channel->name); + params.push(dest->uuid); + params.push(channel->name); params.push_int(channel->age); - params.push_back(ConvToStr(expiry)); + params.push(ConvToStr(expiry)); params.Broadcast(); } } @@ -403,7 +403,7 @@ void ModuleSpanningTree::OnUserPostMessage(User* user, const MessageTarget& targ { CmdBuilder params(user, message_type); params.push_tags(details.tags_out); - params.push_back(d->uuid); + params.push(d->uuid); params.push_last(details.text); params.Unicast(d); } @@ -419,7 +419,7 @@ void ModuleSpanningTree::OnUserPostMessage(User* user, const MessageTarget& targ const std::string* serverglob = target.Get(); CmdBuilder par(user, message_type); par.push_tags(details.tags_out); - par.push_back(*serverglob); + par.push(*serverglob); par.push_last(details.text); par.Broadcast(); break; @@ -441,7 +441,7 @@ void ModuleSpanningTree::OnUserPostTagMessage(User* user, const MessageTarget& t { CmdBuilder params(user, "TAGMSG"); params.push_tags(details.tags_out); - params.push_back(d->uuid); + params.push(d->uuid); params.Unicast(d); } break; @@ -456,7 +456,7 @@ void ModuleSpanningTree::OnUserPostTagMessage(User* user, const MessageTarget& t const std::string* serverglob = target.Get(); CmdBuilder par(user, "TAGMSG"); par.push_tags(details.tags_out); - par.push_back(*serverglob); + par.push(*serverglob); par.Broadcast(); break; } @@ -513,12 +513,12 @@ void ModuleSpanningTree::OnUserJoin(Membership* memb, bool sync, bool created_by else { CmdBuilder params(memb->user, "IJOIN"); - params.push_back(memb->chan->name); + params.push(memb->chan->name); params.push_int(memb->id); if (!memb->modes.empty()) { - params.push_back(ConvToStr(memb->chan->age)); - params.push_back(memb->modes); + params.push(ConvToStr(memb->chan->age)); + params.push(memb->modes); } params.Broadcast(); } @@ -553,7 +553,7 @@ void ModuleSpanningTree::OnUserPart(Membership* memb, std::string &partmessage, if (IS_LOCAL(memb->user)) { CmdBuilder params(memb->user, "PART"); - params.push_back(memb->chan->name); + params.push(memb->chan->name); if (!partmessage.empty()) params.push_last(partmessage); params.Broadcast(); @@ -593,8 +593,8 @@ void ModuleSpanningTree::OnUserPostNick(User* user, const std::string &oldnick) { // The nick TS is updated by the core, we don't do it CmdBuilder params(user, "NICK"); - params.push_back(user->nick); - params.push_back(ConvToStr(user->age)); + params.push(user->nick); + params.push(ConvToStr(user->age)); params.Broadcast(); } else if (!loopCall) @@ -609,8 +609,8 @@ void ModuleSpanningTree::OnUserKick(User* source, Membership* memb, const std::s return; CmdBuilder params(source, "KICK"); - params.push_back(memb->chan->name); - params.push_back(memb->user->uuid); + params.push(memb->chan->name); + params.push(memb->user->uuid); // If a remote user is being kicked by us then send the membership id in the kick too if (!IS_LOCAL(memb->user)) params.push_int(memb->id); @@ -626,7 +626,7 @@ void ModuleSpanningTree::OnPreRehash(User* user, const std::string ¶meter) if (!parameter.empty() && parameter[0] != '-') { CmdBuilder params(user ? user : ServerInstance->FakeClient, "REHASH"); - params.push_back(parameter); + params.push(parameter); params.Forward(user ? TreeServer::Get(user)->GetRoute() : NULL); } } @@ -749,8 +749,8 @@ void ModuleSpanningTree::OnDelLine(User* user, XLine *x) user = ServerInstance->FakeClient; CmdBuilder params(user, "DELLINE"); - params.push_back(x->type); - params.push_back(x->Displayable()); + params.push(x->type); + params.push(x->Displayable()); params.Broadcast(); } diff --git a/src/modules/m_spanningtree/nickcollide.cpp b/src/modules/m_spanningtree/nickcollide.cpp index 62e200921..f1c6a9ae0 100644 --- a/src/modules/m_spanningtree/nickcollide.cpp +++ b/src/modules/m_spanningtree/nickcollide.cpp @@ -108,8 +108,8 @@ bool SpanningTreeUtilities::DoCollision(User* u, TreeServer* server, time_t remo * this "local" nick is actually behind us, send a SAVE out. */ CmdBuilder params("SAVE"); - params.push_back(u->uuid); - params.push_back(ConvToStr(u->age)); + params.push(u->uuid); + params.push(ConvToStr(u->age)); params.Broadcast(); u->ChangeNick(u->uuid, CommandSave::SavedTimestamp); diff --git a/src/modules/m_spanningtree/ping.cpp b/src/modules/m_spanningtree/ping.cpp index 844feb35b..51e87874d 100644 --- a/src/modules/m_spanningtree/ping.cpp +++ b/src/modules/m_spanningtree/ping.cpp @@ -30,10 +30,10 @@ CmdResult CommandPing::Handle(User* user, Params& params) { // PING for us, reply with a PONG CmdBuilder reply("PONG"); - reply.push_back(user->uuid); + reply.push(user->uuid); if (params.size() >= 2) // If there is a second parameter, append it - reply.push_back(params[1]); + reply.push(params[1]); reply.Unicast(user); } diff --git a/src/modules/m_spanningtree/postcommand.cpp b/src/modules/m_spanningtree/postcommand.cpp index fe54abde2..10cbbce82 100644 --- a/src/modules/m_spanningtree/postcommand.cpp +++ b/src/modules/m_spanningtree/postcommand.cpp @@ -45,7 +45,7 @@ void SpanningTreeUtilities::RouteCommand(TreeServer* origin, CommandBase* thiscm if (routing.type == ROUTE_TYPE_OPT_BCAST) { params.push('*'); - params.push_back(command); + params.push(command); } else if (routing.type == ROUTE_TYPE_UNICAST || routing.type == ROUTE_TYPE_OPT_UCAST) { @@ -64,8 +64,8 @@ void SpanningTreeUtilities::RouteCommand(TreeServer* origin, CommandBase* thiscm if (encap) { - params.push_back(sdest->GetID()); - params.push_back(command); + params.push(sdest->GetID()); + params.push(command); } } else @@ -83,7 +83,7 @@ void SpanningTreeUtilities::RouteCommand(TreeServer* origin, CommandBase* thiscm std::string output_text = CommandParser::TranslateUIDs(thiscmd->translation, parameters, true, thiscmd); - params.push_back(output_text); + params.push(output_text); if (routing.type == ROUTE_TYPE_MESSAGE) { diff --git a/src/modules/m_spanningtree/protocolinterface.cpp b/src/modules/m_spanningtree/protocolinterface.cpp index 2af122010..9fe93a389 100644 --- a/src/modules/m_spanningtree/protocolinterface.cpp +++ b/src/modules/m_spanningtree/protocolinterface.cpp @@ -118,7 +118,7 @@ void SpanningTreeProtocolInterface::SendMessage(Channel* target, char status, co void SpanningTreeProtocolInterface::SendMessage(User* target, const std::string& text, MessageType msgtype) { CmdBuilder p(msgtype == MSG_PRIVMSG ? "PRIVMSG" : "NOTICE"); - p.push_back(target->uuid); + p.push(target->uuid); p.push_last(text); p.Unicast(target); } -- cgit v1.3.1-10-gc9f91 From e2fcf7b3b15f86fec250b7b784bdf3d0631048c6 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Fri, 19 Jul 2019 14:12:13 +0100 Subject: Add an event for adding tags to S2S messages. --- include/modules/server.h | 25 ++++++++++++++ src/modules/m_spanningtree/commandbuilder.h | 52 +++++++++++++++++------------ src/modules/m_spanningtree/main.cpp | 2 +- src/modules/m_spanningtree/main.h | 7 ++++ src/modules/m_spanningtree/misccommands.cpp | 36 ++++++++++++++++++++ src/modules/m_spanningtree/netburst.cpp | 1 - src/modules/m_spanningtree/treeserver.cpp | 1 - src/modules/m_spanningtree/treesocket1.cpp | 1 - src/modules/m_spanningtree/utils.cpp | 1 - 9 files changed, 100 insertions(+), 26 deletions(-) (limited to 'src/modules/m_spanningtree/main.cpp') diff --git a/include/modules/server.h b/include/modules/server.h index 6bd10b3e3..259da868f 100644 --- a/include/modules/server.h +++ b/include/modules/server.h @@ -25,6 +25,7 @@ namespace ServerProtocol { class BroadcastEventListener; class LinkEventListener; + class MessageEventListener; class SyncEventListener; } @@ -66,6 +67,30 @@ class ServerProtocol::LinkEventListener virtual void OnServerSplit(const Server* server) { } }; +class ServerProtocol::MessageEventListener + : public Events::ModuleEventListener +{ + public: + MessageEventListener(Module* mod) + : ModuleEventListener(mod, "event/server-message") + { + } + + /** Fired when a server message is being sent by a user. + * @param source The user who sent the message. + * @param name The name of the command which was sent. + * @param tags The tags which will be sent with the message. + */ + virtual void OnBuildMessage(User* source, const char* name, ClientProtocol::TagMap& tags) { } + + /** Fired when a server message is being sent by a server. + * @param source The server who sent the message. + * @param name The name of the command which was sent. + * @param tags The tags which will be sent with the message. + */ + virtual void OnBuildMessage(Server* source, const char* name, ClientProtocol::TagMap& tags) { } +}; + class ServerProtocol::SyncEventListener : public Events::ModuleEventListener { diff --git a/src/modules/m_spanningtree/commandbuilder.h b/src/modules/m_spanningtree/commandbuilder.h index 4913120e0..6159d7b8a 100644 --- a/src/modules/m_spanningtree/commandbuilder.h +++ b/src/modules/m_spanningtree/commandbuilder.h @@ -26,28 +26,53 @@ class TreeServer; class CmdBuilder { protected: + /** The raw message contents. */ std::string content; + /** Tags which have been added to this message. */ + ClientProtocol::TagMap tags; + + /** The size of tags within the contents. */ + size_t tagsize; + + /** Fires the ServerProtocol::MessageEventListener::OnBuildMessage event for a server target. */ + void FireEvent(Server* target, const char* cmd, ClientProtocol::TagMap& taglist); + + /** Fires the ServerProtocol::MessageEventListener::OnBuildMessage event for a user target. */ + void FireEvent(User* target, const char* cmd, ClientProtocol::TagMap& taglist); + + /** Updates the tag string within the buffer. */ + void UpdateTags(); + public: CmdBuilder(const char* cmd) : content(1, ':') + , tagsize(0) { content.append(ServerInstance->Config->GetSID()); push(cmd); + FireEvent(ServerInstance->FakeClient->server, cmd, tags); } CmdBuilder(TreeServer* src, const char* cmd) : content(1, ':') + , tagsize(0) { content.append(src->GetID()); push(cmd); + FireEvent(src, cmd, tags); } CmdBuilder(User* src, const char* cmd) : content(1, ':') + , tagsize(0) { content.append(src->uuid); push(cmd); + if (src == ServerInstance->FakeClient) + FireEvent(src->server, cmd, tags); + else + FireEvent(src, cmd, tags); } CmdBuilder& push_raw(const std::string& s) @@ -119,27 +144,12 @@ class CmdBuilder return *this; } - CmdBuilder& push_tags(const ClientProtocol::TagMap& tags) - { - if (!tags.empty()) - { - char separator = '@'; - std::string taglist; - for (ClientProtocol::TagMap::const_iterator iter = tags.begin(); iter != tags.end(); ++iter) - { - taglist.push_back(separator); - separator = ';'; - - taglist.append(iter->first); - if (!iter->second.value.empty()) - { - taglist.push_back('='); - taglist.append(iter->second.value); - } - } - taglist.push_back(' '); - content.insert(0, taglist); - } + CmdBuilder& push_tags(ClientProtocol::TagMap newtags) + { + // It has to be this way around so new tags get priority. + newtags.insert(tags.begin(), tags.end()); + std::swap(tags, newtags); + UpdateTags(); return *this; } diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 561eed2fb..484d72e6d 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -25,7 +25,6 @@ #include "socket.h" #include "xline.h" #include "iohook.h" -#include "modules/server.h" #include "resolvers.h" #include "main.h" @@ -47,6 +46,7 @@ ModuleSpanningTree::ModuleSpanningTree() , currmembid(0) , broadcasteventprov(this, "event/server-broadcast") , linkeventprov(this, "event/server-link") + , messageeventprov(this, "event/server-message") , synceventprov(this, "event/server-sync") , sslapi(this) , DNS(this, "DNS") diff --git a/src/modules/m_spanningtree/main.h b/src/modules/m_spanningtree/main.h index 1aeffbc72..bc31a9aea 100644 --- a/src/modules/m_spanningtree/main.h +++ b/src/modules/m_spanningtree/main.h @@ -29,6 +29,7 @@ #include "modules/ssl.h" #include "modules/stats.h" #include "modules/ctctags.h" +#include "modules/server.h" #include "servercommand.h" #include "commands.h" #include "protocolinterface.h" @@ -99,6 +100,9 @@ class ModuleSpanningTree /** Event provider for our link events. */ Events::ModuleEventProvider linkeventprov; + /** Event provider for our message events. */ + Events::ModuleEventProvider messageeventprov; + /** Event provider for our sync events. */ Events::ModuleEventProvider synceventprov; @@ -169,6 +173,9 @@ class ModuleSpanningTree /** Retrieves the event provider for link events. */ const Events::ModuleEventProvider& GetLinkEventProvider() const { return linkeventprov; } + /** Retrieves the event provider for message events. */ + const Events::ModuleEventProvider& GetMessageEventProvider() const { return messageeventprov; } + /** Retrieves the event provider for sync events. */ const Events::ModuleEventProvider& GetSyncEventProvider() const { return synceventprov; } diff --git a/src/modules/m_spanningtree/misccommands.cpp b/src/modules/m_spanningtree/misccommands.cpp index 8fc1b178f..1d4104f28 100644 --- a/src/modules/m_spanningtree/misccommands.cpp +++ b/src/modules/m_spanningtree/misccommands.cpp @@ -29,6 +29,42 @@ #include "commands.h" #include "treeserver.h" +void CmdBuilder::FireEvent(Server* target, const char* cmd, ClientProtocol::TagMap& taglist) +{ + FOREACH_MOD_CUSTOM(Utils->Creator->GetMessageEventProvider(), ServerProtocol::MessageEventListener, OnBuildMessage, (target, cmd, taglist)); + UpdateTags(); +} + +void CmdBuilder::FireEvent(User* target, const char* cmd, ClientProtocol::TagMap& taglist) +{ + FOREACH_MOD_CUSTOM(Utils->Creator->GetMessageEventProvider(), ServerProtocol::MessageEventListener, OnBuildMessage, (target, cmd, taglist)); + UpdateTags(); +} + +void CmdBuilder::UpdateTags() +{ + std::string taglist; + if (!tags.empty()) + { + char separator = '@'; + for (ClientProtocol::TagMap::const_iterator iter = tags.begin(); iter != tags.end(); ++iter) + { + taglist.push_back(separator); + separator = ';'; + taglist.append(iter->first); + if (!iter->second.value.empty()) + { + taglist.push_back('='); + taglist.append(iter->second.value); + } + } + taglist.push_back(' '); + content.insert(0, taglist); + } + content.replace(0, tagsize, taglist); + tagsize = content.length(); +} + CmdResult CommandSNONotice::Handle(User* user, Params& params) { ServerInstance->SNO->WriteToSnoMask(params[0][0], "From " + user->nick + ": " + params[1]); diff --git a/src/modules/m_spanningtree/netburst.cpp b/src/modules/m_spanningtree/netburst.cpp index ca4d1a472..f3f2ea7ac 100644 --- a/src/modules/m_spanningtree/netburst.cpp +++ b/src/modules/m_spanningtree/netburst.cpp @@ -27,7 +27,6 @@ #include "treeserver.h" #include "main.h" #include "commands.h" -#include "modules/server.h" /** * Creates FMODE messages, used only when syncing channels diff --git a/src/modules/m_spanningtree/treeserver.cpp b/src/modules/m_spanningtree/treeserver.cpp index ec1fb079d..952899962 100644 --- a/src/modules/m_spanningtree/treeserver.cpp +++ b/src/modules/m_spanningtree/treeserver.cpp @@ -23,7 +23,6 @@ #include "inspircd.h" #include "xline.h" #include "main.h" -#include "modules/server.h" #include "utils.h" #include "treeserver.h" diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index 190c5dc15..2e08dea63 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -24,7 +24,6 @@ #include "iohook.h" #include "main.h" -#include "modules/server.h" #include "utils.h" #include "treeserver.h" #include "link.h" diff --git a/src/modules/m_spanningtree/utils.cpp b/src/modules/m_spanningtree/utils.cpp index 2957b8c14..41cce0541 100644 --- a/src/modules/m_spanningtree/utils.cpp +++ b/src/modules/m_spanningtree/utils.cpp @@ -28,7 +28,6 @@ #include "treesocket.h" #include "resolvers.h" #include "commandbuilder.h" -#include "modules/server.h" SpanningTreeUtilities* Utils = NULL; -- cgit v1.3.1-10-gc9f91