From 33932b95e4b886aec8ac1bf3e3e1665826bcd0ea Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Wed, 29 May 2019 12:48:05 +0100 Subject: Add irc::sockets::isunix for checking if a file is a UNIX socket. --- src/modules/m_spanningtree/main.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 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 44271473c..55fe992b6 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -191,11 +191,9 @@ void ModuleSpanningTree::ConnectServer(Link* x, Autoconnect* y) } irc::sockets::sockaddrs sa; -#ifndef _WIN32 if (x->IPAddr.find('/') != std::string::npos) { - struct stat sb; - if (stat(x->IPAddr.c_str(), &sb) == -1 || !S_ISSOCK(sb.st_mode) || !irc::sockets::untosa(x->IPAddr, sa)) + if (!irc::sockets::isunix(x->IPAddr) || !irc::sockets::untosa(x->IPAddr, sa)) { // We don't use the family() != AF_UNSPEC check below for UNIX sockets as // that results in a DNS lookup. @@ -205,7 +203,6 @@ void ModuleSpanningTree::ConnectServer(Link* x, Autoconnect* y) } } else -#endif { // If this fails then the IP sa will be AF_UNSPEC. irc::sockets::aptosa(x->IPAddr, x->Port, sa); -- cgit v1.3.1-10-gc9f91 From 8f94fcc856dd492c6ecd5d1ebd1acdb7e59cbbe2 Mon Sep 17 00:00:00 2001 From: linuxdaemon Date: Sat, 22 Jun 2019 09:10:32 -0500 Subject: Fix msgid inconsistencies with TAGMSG Also fixes accidentally copying incoming tags on TAGMSG when sending to other users --- src/modules/m_ircv3_ctctags.cpp | 12 ++++++++---- src/modules/m_spanningtree/main.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/modules/m_spanningtree/main.h | 3 +++ 3 files changed, 48 insertions(+), 4 deletions(-) (limited to 'src/modules/m_spanningtree/main.cpp') diff --git a/src/modules/m_ircv3_ctctags.cpp b/src/modules/m_ircv3_ctctags.cpp index 36e10a325..5b53d668e 100644 --- a/src/modules/m_ircv3_ctctags.cpp +++ b/src/modules/m_ircv3_ctctags.cpp @@ -75,7 +75,7 @@ class CommandTagMsg : public Command return CMD_FAILURE; unsigned int minrank = pm ? pm->GetPrefixRank() : 0; - CTCTags::TagMessage message(source, chan, parameters.GetTags()); + CTCTags::TagMessage message(source, chan, msgdetails.tags_out); message.SetSideEffect(true); const Channel::MemberMap& userlist = chan->GetUsers(); for (Channel::MemberMap::const_iterator iter = userlist.begin(); iter != userlist.end(); ++iter) @@ -117,7 +117,7 @@ class CommandTagMsg : public Command // the message out to the local users. if (InspIRCd::Match(ServerInstance->Config->ServerName, servername)) { - CTCTags::TagMessage message(source, "$*", parameters.GetTags()); + CTCTags::TagMessage message(source, "$*", msgdetails.tags_out); message.SetSideEffect(true); const UserManager::LocalList& list = ServerInstance->Users.GetLocalUsers(); for (UserManager::LocalList::const_iterator iter = list.begin(); iter != list.end(); ++iter) @@ -185,7 +185,7 @@ class CommandTagMsg : public Command if (localtarget && cap.get(localtarget)) { // Send to the target if they have the capability and are a local user. - CTCTags::TagMessage message(source, localtarget, parameters.GetTags()); + CTCTags::TagMessage message(source, localtarget, msgdetails.tags_out); message.SetSideEffect(true); localtarget->Send(msgevprov, message); } @@ -233,7 +233,11 @@ class CommandTagMsg : public Command RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE { - return ROUTE_MESSAGE(parameters[0]); + if (IS_LOCAL(user)) + // This is handled by the OnUserPostTagMessage hook to split the LoopCall pieces + return ROUTE_LOCALONLY; + else + return ROUTE_MESSAGE(parameters[0]); } }; diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 55fe992b6..db5265344 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -39,6 +39,7 @@ ModuleSpanningTree::ModuleSpanningTree() : Away::EventListener(this) , Stats::EventListener(this) + , CTCTags::EventListener(this) , rconnect(this) , rsquit(this) , map(this) @@ -418,6 +419,42 @@ void ModuleSpanningTree::OnUserPostMessage(User* user, const MessageTarget& targ } } +void ModuleSpanningTree::OnUserPostTagMessage(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) +{ + if (!IS_LOCAL(user)) + return; + + switch (target.type) + { + case MessageTarget::TYPE_USER: + { + User* d = target.Get(); + if (!IS_LOCAL(d)) + { + CmdBuilder params(user, "TAGMSG"); + params.push_tags(details.tags_out); + params.push_back(d->uuid); + params.Unicast(d); + } + break; + } + case MessageTarget::TYPE_CHANNEL: + { + Utils->SendChannelMessage(user->uuid, target.Get(), "", target.status, details.tags_out, details.exemptions, "TAGMSG"); + break; + } + case MessageTarget::TYPE_SERVER: + { + const std::string* serverglob = target.Get(); + CmdBuilder par(user, "TAGMSG"); + par.push_tags(details.tags_out); + par.push_back(*serverglob); + par.Broadcast(); + break; + } + } +} + void ModuleSpanningTree::OnBackgroundTimer(time_t curtime) { AutoConnectServers(curtime); diff --git a/src/modules/m_spanningtree/main.h b/src/modules/m_spanningtree/main.h index 1186f072c..9a9d4733d 100644 --- a/src/modules/m_spanningtree/main.h +++ b/src/modules/m_spanningtree/main.h @@ -28,6 +28,7 @@ #include "modules/dns.h" #include "modules/ssl.h" #include "modules/stats.h" +#include "modules/ctctags.h" #include "servercommand.h" #include "commands.h" #include "protocolinterface.h" @@ -72,6 +73,7 @@ class ModuleSpanningTree : public Module , public Away::EventListener , public Stats::EventListener + , public CTCTags::EventListener { /** Client to server commands, registered in the core */ @@ -169,6 +171,7 @@ class ModuleSpanningTree ModResult OnPreTopicChange(User* user, Channel* chan, const std::string& topic) CXX11_OVERRIDE; void OnPostTopicChange(User* user, Channel* chan, const std::string &topic) CXX11_OVERRIDE; void OnUserPostMessage(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE; + void OnUserPostTagMessage(User* user, const MessageTarget& target, const CTCTags::TagMessageDetails& details) CXX11_OVERRIDE; void OnBackgroundTimer(time_t curtime) CXX11_OVERRIDE; void OnUserJoin(Membership* memb, bool sync, bool created, CUList& excepts) CXX11_OVERRIDE; void OnChangeHost(User* user, const std::string &newhost) CXX11_OVERRIDE; -- cgit v1.3.1-10-gc9f91 From 7ad534c1af4578a0d46742c4b6b00a5a33afb63f Mon Sep 17 00:00:00 2001 From: linuxdaemon Date: Mon, 24 Jun 2019 11:10:17 -0500 Subject: Replace large if/else blocks for target.type with switches (#1668). --- src/modules/m_deaf.cpp | 86 ++++++++++++++++++++----------------- src/modules/m_filter.cpp | 37 +++++++++------- src/modules/m_ircv3_echomessage.cpp | 82 ++++++++++++++++++++--------------- src/modules/m_noctcp.cpp | 49 ++++++++++++--------- src/modules/m_services_account.cpp | 47 +++++++++++--------- src/modules/m_silence.cpp | 52 ++++++++++++---------- src/modules/m_spanningtree/main.cpp | 48 ++++++++++++--------- src/modules/m_stripcolor.cpp | 33 ++++++++------ 8 files changed, 247 insertions(+), 187 deletions(-) (limited to 'src/modules/m_spanningtree/main.cpp') diff --git a/src/modules/m_deaf.cpp b/src/modules/m_deaf.cpp index 90412c5c1..e360e2a2e 100644 --- a/src/modules/m_deaf.cpp +++ b/src/modules/m_deaf.cpp @@ -89,50 +89,58 @@ class ModuleDeaf : public Module ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) CXX11_OVERRIDE { - if (target.type == MessageTarget::TYPE_CHANNEL) + switch (target.type) { - Channel* chan = target.Get(); - bool is_bypasschar = (deaf_bypasschars.find(details.text[0]) != std::string::npos); - bool is_bypasschar_uline = (deaf_bypasschars_uline.find(details.text[0]) != std::string::npos); - - // If we have no bypasschars_uline in config, and this is a bypasschar (regular) - // Then it is obviously going to get through +d, no exemption list required - if (deaf_bypasschars_uline.empty() && is_bypasschar) - return MOD_RES_PASSTHRU; - // If it matches both bypasschar and bypasschar_uline, it will get through. - if (is_bypasschar && is_bypasschar_uline) - return MOD_RES_PASSTHRU; - - const Channel::MemberMap& ulist = chan->GetUsers(); - for (Channel::MemberMap::const_iterator i = ulist.begin(); i != ulist.end(); ++i) + case MessageTarget::TYPE_CHANNEL: { - // not +d - if (!i->first->IsModeSet(deafmode)) - continue; - - bool is_a_uline = i->first->server->IsULine(); - // matched a U-line only bypass - if (is_bypasschar_uline && is_a_uline) - continue; - // matched a regular bypass - if (is_bypasschar && !is_a_uline) - continue; - - // don't deliver message! - details.exemptions.insert(i->first); + Channel* chan = target.Get(); + bool is_bypasschar = (deaf_bypasschars.find(details.text[0]) != std::string::npos); + bool is_bypasschar_uline = (deaf_bypasschars_uline.find(details.text[0]) != std::string::npos); + + // If we have no bypasschars_uline in config, and this is a bypasschar (regular) + // Then it is obviously going to get through +d, no exemption list required + if (deaf_bypasschars_uline.empty() && is_bypasschar) + return MOD_RES_PASSTHRU; + // If it matches both bypasschar and bypasschar_uline, it will get through. + if (is_bypasschar && is_bypasschar_uline) + return MOD_RES_PASSTHRU; + + const Channel::MemberMap& ulist = chan->GetUsers(); + for (Channel::MemberMap::const_iterator i = ulist.begin(); i != ulist.end(); ++i) + { + // not +d + if (!i->first->IsModeSet(deafmode)) + continue; + + bool is_a_uline = i->first->server->IsULine(); + // matched a U-line only bypass + if (is_bypasschar_uline && is_a_uline) + continue; + // matched a regular bypass + if (is_bypasschar && !is_a_uline) + continue; + + // don't deliver message! + details.exemptions.insert(i->first); + } + break; } - } - else if (target.type == MessageTarget::TYPE_USER) - { - User* targ = target.Get(); - if (!targ->IsModeSet(privdeafmode)) - return MOD_RES_PASSTHRU; + case MessageTarget::TYPE_USER: + { + User* targ = target.Get(); + if (!targ->IsModeSet(privdeafmode)) + return MOD_RES_PASSTHRU; - if (!privdeafuline && user->server->IsULine()) - return MOD_RES_DENY; + if (!privdeafuline && user->server->IsULine()) + return MOD_RES_DENY; - if (!user->HasPrivPermission("users/ignore-privdeaf")) - return MOD_RES_DENY; + if (!user->HasPrivPermission("users/ignore-privdeaf")) + return MOD_RES_DENY; + + break; + } + case MessageTarget::TYPE_SERVER: + break; } return MOD_RES_PASSTHRU; diff --git a/src/modules/m_filter.cpp b/src/modules/m_filter.cpp index 8e51fd683..e7aab2eeb 100644 --- a/src/modules/m_filter.cpp +++ b/src/modules/m_filter.cpp @@ -372,25 +372,32 @@ ModResult ModuleFilter::OnUserPreMessage(User* user, const MessageTarget& msgtar { bool is_selfmsg = false; std::string target; - if (msgtarget.type == MessageTarget::TYPE_USER) + switch (msgtarget.type) { - User* t = msgtarget.Get(); - // Check if the target nick is exempted, if yes, ignore this message - if (exemptednicks.count(t->nick)) - return MOD_RES_PASSTHRU; + case MessageTarget::TYPE_USER: + { + User* t = msgtarget.Get(); + // Check if the target nick is exempted, if yes, ignore this message + if (exemptednicks.count(t->nick)) + return MOD_RES_PASSTHRU; - if (user == t) - is_selfmsg = true; + if (user == t) + is_selfmsg = true; - target = t->nick; - } - else if (msgtarget.type == MessageTarget::TYPE_CHANNEL) - { - Channel* t = msgtarget.Get(); - if (exemptedchans.count(t->name)) - return MOD_RES_PASSTHRU; + target = t->nick; + break; + } + case MessageTarget::TYPE_CHANNEL: + { + Channel* t = msgtarget.Get(); + if (exemptedchans.count(t->name)) + return MOD_RES_PASSTHRU; - target = t->name; + target = t->name; + break; + } + case MessageTarget::TYPE_SERVER: + break; } if (is_selfmsg && warnonselfmsg) diff --git a/src/modules/m_ircv3_echomessage.cpp b/src/modules/m_ircv3_echomessage.cpp index 3ec534e91..8f281da70 100644 --- a/src/modules/m_ircv3_echomessage.cpp +++ b/src/modules/m_ircv3_echomessage.cpp @@ -48,26 +48,32 @@ class ModuleIRCv3EchoMessage const std::string& text = details.echo_original ? details.original_text : details.text; const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out; - if (target.type == MessageTarget::TYPE_USER) + switch (target.type) { - User* destuser = target.Get(); - ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, destuser, text, details.type); - privmsg.AddTags(tags); - localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); - } - else if (target.type == MessageTarget::TYPE_CHANNEL) - { - Channel* chan = target.Get(); - ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, chan, text, details.type, target.status); - privmsg.AddTags(tags); - localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); - } - else - { - const std::string* servername = target.Get(); - ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, *servername, text, details.type); - privmsg.AddTags(tags); - localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); + case MessageTarget::TYPE_USER: + { + User* destuser = target.Get(); + ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, destuser, text, details.type); + privmsg.AddTags(tags); + localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); + break; + } + case MessageTarget::TYPE_CHANNEL: + { + Channel* chan = target.Get(); + ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, chan, text, details.type, target.status); + privmsg.AddTags(tags); + localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); + break; + } + case MessageTarget::TYPE_SERVER: + { + const std::string* servername = target.Get(); + ClientProtocol::Messages::Privmsg privmsg(ClientProtocol::Messages::Privmsg::nocopy, user, *servername, text, details.type); + privmsg.AddTags(tags); + localuser->Send(ServerInstance->GetRFCEvents().privmsg, privmsg); + break; + } } } @@ -80,23 +86,29 @@ class ModuleIRCv3EchoMessage LocalUser* const localuser = static_cast(user); const ClientProtocol::TagMap& tags = details.echo_original ? details.tags_in : details.tags_out; - if (target.type == MessageTarget::TYPE_USER) - { - User* destuser = target.Get(); - CTCTags::TagMessage message(user, destuser, tags); - localuser->Send(tagmsgprov, message); - } - else if (target.type == MessageTarget::TYPE_CHANNEL) - { - Channel* chan = target.Get(); - CTCTags::TagMessage message(user, chan, tags); - localuser->Send(tagmsgprov, message); - } - else + switch (target.type) { - const std::string* servername = target.Get(); - CTCTags::TagMessage message(user, servername->c_str(), tags); - localuser->Send(tagmsgprov, message); + case MessageTarget::TYPE_USER: + { + User* destuser = target.Get(); + CTCTags::TagMessage message(user, destuser, tags); + localuser->Send(tagmsgprov, message); + break; + } + case MessageTarget::TYPE_CHANNEL: + { + Channel* chan = target.Get(); + CTCTags::TagMessage message(user, chan, tags); + localuser->Send(tagmsgprov, message); + break; + } + case MessageTarget::TYPE_SERVER: + { + const std::string* servername = target.Get(); + CTCTags::TagMessage message(user, servername->c_str(), tags); + localuser->Send(tagmsgprov, message); + break; + } } } diff --git a/src/modules/m_noctcp.cpp b/src/modules/m_noctcp.cpp index c73f8308e..f288820b8 100644 --- a/src/modules/m_noctcp.cpp +++ b/src/modules/m_noctcp.cpp @@ -61,33 +61,40 @@ class ModuleNoCTCP : public Module if (!details.IsCTCP(ctcpname) || irc::equals(ctcpname, "ACTION")) return MOD_RES_PASSTHRU; - if (target.type == MessageTarget::TYPE_CHANNEL) + switch (target.type) { - if (user->HasPrivPermission("channels/ignore-noctcp")) - return MOD_RES_PASSTHRU; + case MessageTarget::TYPE_CHANNEL: + { + if (user->HasPrivPermission("channels/ignore-noctcp")) + return MOD_RES_PASSTHRU; - Channel* c = target.Get(); - ModResult res = CheckExemption::Call(exemptionprov, user, c, "noctcp"); - if (res == MOD_RES_ALLOW) - return MOD_RES_PASSTHRU; + Channel* c = target.Get(); + ModResult res = CheckExemption::Call(exemptionprov, user, c, "noctcp"); + if (res == MOD_RES_ALLOW) + return MOD_RES_PASSTHRU; - if (!c->GetExtBanStatus(user, 'C').check(!c->IsModeSet(nc))) - { - user->WriteNumeric(ERR_CANNOTSENDTOCHAN, c->name, "Can't send CTCP to channel (+C is set)"); - return MOD_RES_DENY; + if (!c->GetExtBanStatus(user, 'C').check(!c->IsModeSet(nc))) + { + user->WriteNumeric(ERR_CANNOTSENDTOCHAN, c->name, "Can't send CTCP to channel (+C is set)"); + return MOD_RES_DENY; + } + break; } - } - else if (target.type == MessageTarget::TYPE_USER) - { - if (user->HasPrivPermission("users/ignore-noctcp")) - return MOD_RES_PASSTHRU; - - User* u = target.Get(); - if (u->IsModeSet(ncu)) + case MessageTarget::TYPE_USER: { - user->WriteNumeric(ERR_CANTSENDTOUSER, u->nick, "Can't send CTCP to user (+T is set)"); - return MOD_RES_DENY; + if (user->HasPrivPermission("users/ignore-noctcp")) + return MOD_RES_PASSTHRU; + + User* u = target.Get(); + if (u->IsModeSet(ncu)) + { + user->WriteNumeric(ERR_CANTSENDTOUSER, u->nick, "Can't send CTCP to user (+T is set)"); + return MOD_RES_DENY; + } + break; } + case MessageTarget::TYPE_SERVER: + break; } return MOD_RES_PASSTHRU; } diff --git a/src/modules/m_services_account.cpp b/src/modules/m_services_account.cpp index 6e15aa8bf..72cd925ab 100644 --- a/src/modules/m_services_account.cpp +++ b/src/modules/m_services_account.cpp @@ -207,32 +207,39 @@ class ModuleServicesAccount std::string *account = accountname.get(user); bool is_registered = account && !account->empty(); - if (target.type == MessageTarget::TYPE_CHANNEL) + switch (target.type) { - Channel* targchan = target.Get(); + case MessageTarget::TYPE_CHANNEL: + { + Channel* targchan = target.Get(); - if (!targchan->IsModeSet(m2) || is_registered) - return MOD_RES_PASSTHRU; + if (!targchan->IsModeSet(m2) || is_registered) + return MOD_RES_PASSTHRU; - if (CheckExemption::Call(exemptionprov, user, targchan, "regmoderated") == MOD_RES_ALLOW) - return MOD_RES_PASSTHRU; + if (CheckExemption::Call(exemptionprov, user, targchan, "regmoderated") == MOD_RES_ALLOW) + return MOD_RES_PASSTHRU; - // User is messaging a +M channel and is not registered or exempt. - user->WriteNumeric(ERR_NEEDREGGEDNICK, targchan->name, "You need to be identified to a registered account to message this channel"); - return MOD_RES_DENY; - } - else if (target.type == MessageTarget::TYPE_USER) - { - User* targuser = target.Get(); - if (!targuser->IsModeSet(m3) || is_registered) - return MOD_RES_PASSTHRU; + // User is messaging a +M channel and is not registered or exempt. + user->WriteNumeric(ERR_NEEDREGGEDNICK, targchan->name, "You need to be identified to a registered account to message this channel"); + return MOD_RES_DENY; + break; + } + case MessageTarget::TYPE_USER: + { + User* targuser = target.Get(); + if (!targuser->IsModeSet(m3) || is_registered) + return MOD_RES_PASSTHRU; - if (calleridapi && calleridapi->IsOnAcceptList(user, targuser)) - return MOD_RES_PASSTHRU; + if (calleridapi && calleridapi->IsOnAcceptList(user, targuser)) + return MOD_RES_PASSTHRU; - // User is messaging a +R user and is not registered or on an accept list. - user->WriteNumeric(ERR_NEEDREGGEDNICK, targuser->nick, "You need to be identified to a registered account to message this user"); - return MOD_RES_DENY; + // User is messaging a +R user and is not registered or on an accept list. + user->WriteNumeric(ERR_NEEDREGGEDNICK, targuser->nick, "You need to be identified to a registered account to message this user"); + return MOD_RES_DENY; + break; + } + case MessageTarget::TYPE_SERVER: + break; } return MOD_RES_PASSTHRU; } diff --git a/src/modules/m_silence.cpp b/src/modules/m_silence.cpp index 87b70dfa4..1e73bda27 100644 --- a/src/modules/m_silence.cpp +++ b/src/modules/m_silence.cpp @@ -384,32 +384,38 @@ class ModuleSilence bool is_ctcp = details.IsCTCP(ctcpname) && !irc::equals(ctcpname, "ACTION"); SilenceEntry::SilenceFlags flag = SilenceEntry::SF_NONE; - if (target.type == MessageTarget::TYPE_CHANNEL) - { - if (is_ctcp) - flag = SilenceEntry::SF_CTCP_CHANNEL; - else if (details.type == MSG_NOTICE) - flag = SilenceEntry::SF_NOTICE_CHANNEL; - else if (details.type == MSG_PRIVMSG) - flag = SilenceEntry::SF_PRIVMSG_CHANNEL; - - return BuildChannelExempts(user, target.Get(), flag, details.exemptions); - } - - if (target.type == MessageTarget::TYPE_USER) + switch (target.type) { - if (is_ctcp) - flag = SilenceEntry::SF_CTCP_USER; - else if (details.type == MSG_NOTICE) - flag = SilenceEntry::SF_NOTICE_USER; - else if (details.type == MSG_PRIVMSG) - flag = SilenceEntry::SF_PRIVMSG_USER; - - if (!CanReceiveMessage(user, target.Get(), flag)) + case MessageTarget::TYPE_CHANNEL: + { + if (is_ctcp) + flag = SilenceEntry::SF_CTCP_CHANNEL; + else if (details.type == MSG_NOTICE) + flag = SilenceEntry::SF_NOTICE_CHANNEL; + else if (details.type == MSG_PRIVMSG) + flag = SilenceEntry::SF_PRIVMSG_CHANNEL; + + return BuildChannelExempts(user, target.Get(), flag, details.exemptions); + break; + } + case MessageTarget::TYPE_USER: { - details.echo_original = true; - return MOD_RES_DENY; + if (is_ctcp) + flag = SilenceEntry::SF_CTCP_USER; + else if (details.type == MSG_NOTICE) + flag = SilenceEntry::SF_NOTICE_USER; + else if (details.type == MSG_PRIVMSG) + flag = SilenceEntry::SF_PRIVMSG_USER; + + if (!CanReceiveMessage(user, target.Get(), flag)) + { + details.echo_original = true; + return MOD_RES_DENY; + } + break; } + case MessageTarget::TYPE_SERVER: + break; } return MOD_RES_PASSTHRU; diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index db5265344..1a51955d1 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -392,30 +392,36 @@ void ModuleSpanningTree::OnUserPostMessage(User* user, const MessageTarget& targ return; const char* message_type = (details.type == MSG_PRIVMSG ? "PRIVMSG" : "NOTICE"); - if (target.type == MessageTarget::TYPE_USER) + switch (target.type) { - User* d = target.Get(); - if (!IS_LOCAL(d)) + case MessageTarget::TYPE_USER: { - CmdBuilder params(user, message_type); - params.push_tags(details.tags_out); - params.push_back(d->uuid); - params.push_last(details.text); - params.Unicast(d); + User* d = target.Get(); + if (!IS_LOCAL(d)) + { + CmdBuilder params(user, message_type); + params.push_tags(details.tags_out); + params.push_back(d->uuid); + params.push_last(details.text); + params.Unicast(d); + } + break; + } + case MessageTarget::TYPE_CHANNEL: + { + Utils->SendChannelMessage(user->uuid, target.Get(), details.text, target.status, details.tags_out, details.exemptions, message_type); + break; + } + case MessageTarget::TYPE_SERVER: + { + const std::string* serverglob = target.Get(); + CmdBuilder par(user, message_type); + par.push_tags(details.tags_out); + par.push_back(*serverglob); + par.push_last(details.text); + par.Broadcast(); + break; } - } - else if (target.type == MessageTarget::TYPE_CHANNEL) - { - Utils->SendChannelMessage(user->uuid, target.Get(), details.text, target.status, details.tags_out, details.exemptions, message_type); - } - else if (target.type == MessageTarget::TYPE_SERVER) - { - const std::string* serverglob = target.Get(); - CmdBuilder par(user, message_type); - par.push_tags(details.tags_out); - par.push_back(*serverglob); - par.push_last(details.text); - par.Broadcast(); } } diff --git a/src/modules/m_stripcolor.cpp b/src/modules/m_stripcolor.cpp index 6ea279422..a309492eb 100644 --- a/src/modules/m_stripcolor.cpp +++ b/src/modules/m_stripcolor.cpp @@ -47,20 +47,27 @@ class ModuleStripColor : public Module return MOD_RES_PASSTHRU; bool active = false; - if (target.type == MessageTarget::TYPE_USER) + switch (target.type) { - User* t = target.Get(); - active = t->IsModeSet(usc); - } - else if (target.type == MessageTarget::TYPE_CHANNEL) - { - Channel* t = target.Get(); - ModResult res = CheckExemption::Call(exemptionprov, user, t, "stripcolor"); - - if (res == MOD_RES_ALLOW) - return MOD_RES_PASSTHRU; - - active = !t->GetExtBanStatus(user, 'S').check(!t->IsModeSet(csc)); + case MessageTarget::TYPE_USER: + { + User* t = target.Get(); + active = t->IsModeSet(usc); + break; + } + case MessageTarget::TYPE_CHANNEL: + { + Channel* t = target.Get(); + ModResult res = CheckExemption::Call(exemptionprov, user, t, "stripcolor"); + + if (res == MOD_RES_ALLOW) + return MOD_RES_PASSTHRU; + + active = !t->GetExtBanStatus(user, 'S').check(!t->IsModeSet(csc)); + break; + } + case MessageTarget::TYPE_SERVER: + break; } if (active) -- cgit v1.3.1-10-gc9f91 From 06e2961a86705d794fd5904000e44a7ae08004d9 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Mon, 15 Jul 2019 12:43:05 +0100 Subject: Split ServerEventListener into {Broadcast,Link,Sync}EventListener. There is no reason to have these events in one big handler and it causes unnecessary event hooks to be created by having them like this. The ServerEventListener class still exists for compatibility --- include/modules/server.h | 49 +++++++++++++++++++++++++++++-- src/modules/m_chanhistory.cpp | 4 +-- src/modules/m_filter.cpp | 7 +++-- src/modules/m_sasl.cpp | 5 ++-- src/modules/m_spanningtree/main.cpp | 6 ++-- src/modules/m_spanningtree/main.h | 20 ++++++++++--- src/modules/m_spanningtree/netburst.cpp | 6 ++-- src/modules/m_spanningtree/treeserver.cpp | 4 +-- src/modules/m_spanningtree/utils.cpp | 2 +- 9 files changed, 82 insertions(+), 21 deletions(-) (limited to 'src/modules/m_spanningtree/main.cpp') diff --git a/include/modules/server.h b/include/modules/server.h index f9907ef26..6bd10b3e3 100644 --- a/include/modules/server.h +++ b/include/modules/server.h @@ -21,11 +21,19 @@ #include "event.h" -class ServerEventListener : public Events::ModuleEventListener +namespace ServerProtocol +{ + class BroadcastEventListener; + class LinkEventListener; + class SyncEventListener; +} + +class ServerProtocol::BroadcastEventListener + : public Events::ModuleEventListener { public: - ServerEventListener(Module* mod) - : ModuleEventListener(mod, "event/server") + BroadcastEventListener(Module* mod) + : ModuleEventListener(mod, "event/server-broadcast") { } @@ -36,6 +44,16 @@ class ServerEventListener : public Events::ModuleEventListener * send the message to the server or MOD_RES_PASSTHRU if no module handled the event. */ virtual ModResult OnBroadcastMessage(Channel* channel, const Server* server) { return MOD_RES_PASSTHRU; } +}; + +class ServerProtocol::LinkEventListener + : public Events::ModuleEventListener +{ + public: + LinkEventListener(Module* mod) + : ModuleEventListener(mod, "event/server-link") + { + } /** Fired when a server finishes burst * @param server Server that recently linked and finished burst @@ -46,6 +64,16 @@ class ServerEventListener : public Events::ModuleEventListener * @param server Server that split */ virtual void OnServerSplit(const Server* server) { } +}; + +class ServerProtocol::SyncEventListener + : public Events::ModuleEventListener +{ + public: + SyncEventListener(Module* mod) + : ModuleEventListener(mod, "event/server-sync") + { + } /** Allows modules to synchronize user metadata during a netburst. This will * be called for every user visible on your side of the burst. @@ -66,3 +94,18 @@ class ServerEventListener : public Events::ModuleEventListener */ virtual void OnSyncNetwork(ProtocolServer& server) { } }; + +/** Compatibility struct for <3.3.0 modules. */ +class ServerEventListener + : public ServerProtocol::BroadcastEventListener + , public ServerProtocol::LinkEventListener + , public ServerProtocol::SyncEventListener +{ + public: + ServerEventListener(Module* mod) + : ServerProtocol::BroadcastEventListener(mod) + , ServerProtocol::LinkEventListener(mod) + , ServerProtocol::SyncEventListener(mod) + { + } +}; diff --git a/src/modules/m_chanhistory.cpp b/src/modules/m_chanhistory.cpp index dffda8e72..227fda3c2 100644 --- a/src/modules/m_chanhistory.cpp +++ b/src/modules/m_chanhistory.cpp @@ -112,7 +112,7 @@ class HistoryMode : public ParamMode > class ModuleChanHistory : public Module - , public ServerEventListener + , public ServerProtocol::BroadcastEventListener { HistoryMode m; bool sendnotice; @@ -125,7 +125,7 @@ class ModuleChanHistory public: ModuleChanHistory() - : ServerEventListener(this) + : ServerProtocol::BroadcastEventListener(this) , m(this) , botmode(this, "bot") , batchcap(this) diff --git a/src/modules/m_filter.cpp b/src/modules/m_filter.cpp index e7aab2eeb..6c2206993 100644 --- a/src/modules/m_filter.cpp +++ b/src/modules/m_filter.cpp @@ -173,7 +173,10 @@ class CommandFilter : public Command } }; -class ModuleFilter : public Module, public ServerEventListener, public Stats::EventListener +class ModuleFilter + : public Module + , public ServerProtocol::SyncEventListener + , public Stats::EventListener { typedef insp::flat_set ExemptTargetSet; @@ -332,7 +335,7 @@ bool ModuleFilter::AppliesToMe(User* user, FilterResult* filter, int iflags) } ModuleFilter::ModuleFilter() - : ServerEventListener(this) + : ServerProtocol::SyncEventListener(this) , Stats::EventListener(this) , initing(true) , filtcommand(this) diff --git a/src/modules/m_sasl.cpp b/src/modules/m_sasl.cpp index 54bb8a44a..2647b63e1 100644 --- a/src/modules/m_sasl.cpp +++ b/src/modules/m_sasl.cpp @@ -37,7 +37,8 @@ enum static std::string sasl_target; -class ServerTracker : public ServerEventListener +class ServerTracker + : public ServerProtocol::LinkEventListener { bool online; @@ -65,7 +66,7 @@ class ServerTracker : public ServerEventListener public: ServerTracker(Module* mod) - : ServerEventListener(mod) + : ServerProtocol::LinkEventListener(mod) { Reset(); } diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 1a51955d1..f8531cb01 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -45,7 +45,9 @@ ModuleSpanningTree::ModuleSpanningTree() , map(this) , commands(this) , currmembid(0) - , eventprov(this, "event/server") + , broadcasteventprov(this, "event/server-broadcast") + , linkeventprov(this, "event/server-link") + , synceventprov(this, "event/server-sync") , sslapi(this) , DNS(this, "DNS") , tagevprov(this, "event/messagetag") @@ -687,7 +689,7 @@ void ModuleSpanningTree::OnUnloadModule(Module* mod) { TreeServer* server = i->second; if (!server->IsRoot()) - FOREACH_MOD_CUSTOM(GetEventProvider(), ServerEventListener, OnServerSplit, (server)); + FOREACH_MOD_CUSTOM(GetLinkEventProvider(), ServerProtocol::LinkEventListener, OnServerSplit, (server)); } return; } diff --git a/src/modules/m_spanningtree/main.h b/src/modules/m_spanningtree/main.h index 9a9d4733d..1aeffbc72 100644 --- a/src/modules/m_spanningtree/main.h +++ b/src/modules/m_spanningtree/main.h @@ -93,9 +93,14 @@ class ModuleSpanningTree */ SpanningTreeProtocolInterface protocolinterface; - /** Event provider for our events - */ - Events::ModuleEventProvider eventprov; + /** Event provider for our broadcast events. */ + Events::ModuleEventProvider broadcasteventprov; + + /** Event provider for our link events. */ + Events::ModuleEventProvider linkeventprov; + + /** Event provider for our sync events. */ + Events::ModuleEventProvider synceventprov; /** API for accessing user SSL certificates. */ UserCertificateAPI sslapi; @@ -158,7 +163,14 @@ class ModuleSpanningTree */ ModResult HandleConnect(const CommandBase::Params& parameters, User* user); - const Events::ModuleEventProvider& GetEventProvider() const { return eventprov; } + /** Retrieves the event provider for broadcast events. */ + const Events::ModuleEventProvider& GetBroadcastEventProvider() const { return broadcasteventprov; } + + /** Retrieves the event provider for link events. */ + const Events::ModuleEventProvider& GetLinkEventProvider() const { return linkeventprov; } + + /** Retrieves the event provider for sync events. */ + const Events::ModuleEventProvider& GetSyncEventProvider() const { return synceventprov; } /** ** *** MODULE EVENTS *** diff --git a/src/modules/m_spanningtree/netburst.cpp b/src/modules/m_spanningtree/netburst.cpp index ed15591e9..ca4d1a472 100644 --- a/src/modules/m_spanningtree/netburst.cpp +++ b/src/modules/m_spanningtree/netburst.cpp @@ -123,7 +123,7 @@ void TreeSocket::DoBurst(TreeServer* s) // Send all xlines this->SendXLines(); - FOREACH_MOD_CUSTOM(Utils->Creator->GetEventProvider(), ServerEventListener, OnSyncNetwork, (bs.server)); + FOREACH_MOD_CUSTOM(Utils->Creator->GetSyncEventProvider(), ServerProtocol::SyncEventListener, OnSyncNetwork, (bs.server)); this->WriteLine(CmdBuilder("ENDBURST")); ServerInstance->SNO->WriteToSnoMask('l',"Finished bursting to \002"+ s->GetName()+"\002."); @@ -265,7 +265,7 @@ void TreeSocket::SyncChannel(Channel* chan, BurstState& bs) this->WriteLine(CommandMetadata::Builder(chan, item->name, value)); } - FOREACH_MOD_CUSTOM(Utils->Creator->GetEventProvider(), ServerEventListener, OnSyncChannel, (chan, bs.server)); + FOREACH_MOD_CUSTOM(Utils->Creator->GetSyncEventProvider(), ServerProtocol::SyncEventListener, OnSyncChannel, (chan, bs.server)); } void TreeSocket::SyncChannel(Channel* chan) @@ -301,6 +301,6 @@ void TreeSocket::SendUsers(BurstState& bs) this->WriteLine(CommandMetadata::Builder(user, item->name, value)); } - FOREACH_MOD_CUSTOM(Utils->Creator->GetEventProvider(), ServerEventListener, OnSyncUser, (user, bs.server)); + FOREACH_MOD_CUSTOM(Utils->Creator->GetSyncEventProvider(), ServerProtocol::SyncEventListener, OnSyncUser, (user, bs.server)); } } diff --git a/src/modules/m_spanningtree/treeserver.cpp b/src/modules/m_spanningtree/treeserver.cpp index bbe66ff83..ec1fb079d 100644 --- a/src/modules/m_spanningtree/treeserver.cpp +++ b/src/modules/m_spanningtree/treeserver.cpp @@ -117,7 +117,7 @@ TreeServer::TreeServer(const std::string& Name, const std::string& Desc, const s this->AddHashEntry(); Parent->Children.push_back(this); - FOREACH_MOD_CUSTOM(Utils->Creator->GetEventProvider(), ServerEventListener, OnServerLink, (this)); + FOREACH_MOD_CUSTOM(Utils->Creator->GetLinkEventProvider(), ServerProtocol::LinkEventListener, OnServerLink, (this)); } void TreeServer::BeginBurst(uint64_t startms) @@ -207,7 +207,7 @@ void TreeServer::SQuitInternal(unsigned int& num_lost_servers) RemoveHash(); if (!Utils->Creator->dying) - FOREACH_MOD_CUSTOM(Utils->Creator->GetEventProvider(), ServerEventListener, OnServerSplit, (this)); + FOREACH_MOD_CUSTOM(Utils->Creator->GetLinkEventProvider(), ServerProtocol::LinkEventListener, OnServerSplit, (this)); } unsigned int TreeServer::QuitUsers(const std::string& reason) diff --git a/src/modules/m_spanningtree/utils.cpp b/src/modules/m_spanningtree/utils.cpp index a18ec854d..5fbd16da0 100644 --- a/src/modules/m_spanningtree/utils.cpp +++ b/src/modules/m_spanningtree/utils.cpp @@ -171,7 +171,7 @@ void SpanningTreeUtilities::GetListOfServersForChannel(Channel* c, TreeSocketSet for (TreeServer::ChildServers::const_iterator i = children.begin(); i != children.end(); ++i) { ModResult result; - FIRST_MOD_RESULT_CUSTOM(Creator->GetEventProvider(), ServerEventListener, OnBroadcastMessage, result, (c, *i)); + FIRST_MOD_RESULT_CUSTOM(Creator->GetBroadcastEventProvider(), ServerProtocol::BroadcastEventListener, OnBroadcastMessage, result, (c, *i)); if (result == MOD_RES_ALLOW) list.insert((*i)->GetSocket()); } -- cgit v1.3.1-10-gc9f91