diff options
| author | 2010-03-02 12:04:53 -0600 | |
|---|---|---|
| committer | 2010-08-03 17:32:39 -0400 | |
| commit | 89f72a4d63c6868ac3c191197f37e08341b8bc16 (patch) | |
| tree | 619fc74cfc57928de1bd0a9b08a8ad65903a8e7b /src/modules | |
| parent | Unset umode +x when a different vhost is set on a user (diff) | |
Create OnChannelPermissionCheck hook
Diffstat (limited to 'src/modules')
| -rw-r--r-- | src/modules/m_allowinvite.cpp | 32 | ||||
| -rw-r--r-- | src/modules/m_nokicks.cpp | 21 | ||||
| -rw-r--r-- | src/modules/m_ojoin.cpp | 18 | ||||
| -rw-r--r-- | src/modules/m_override.cpp | 33 | ||||
| -rw-r--r-- | src/modules/m_servprotect.cpp | 17 | ||||
| -rw-r--r-- | src/modules/m_silence.cpp | 8 | ||||
| -rw-r--r-- | src/modules/m_spanningtree/main.cpp | 15 | ||||
| -rw-r--r-- | src/modules/m_spanningtree/main.h | 1 | ||||
| -rw-r--r-- | src/modules/m_testnet.cpp | 5 |
9 files changed, 55 insertions, 95 deletions
diff --git a/src/modules/m_allowinvite.cpp b/src/modules/m_allowinvite.cpp index 5666a6a42..262429f1c 100644 --- a/src/modules/m_allowinvite.cpp +++ b/src/modules/m_allowinvite.cpp @@ -29,7 +29,7 @@ class ModuleAllowInvite : public Module ModuleAllowInvite() : ni(this) { ServerInstance->Modules->AddService(ni); - Implementation eventlist[] = { I_OnUserPreInvite, I_On005Numeric }; + Implementation eventlist[] = { I_OnChannelPermissionCheck, I_On005Numeric }; ServerInstance->Modules->Attach(eventlist, this, 2); } @@ -38,25 +38,23 @@ class ModuleAllowInvite : public Module ServerInstance->AddExtBanChar('A'); } - virtual ModResult OnUserPreInvite(User* user,User* dest,Channel* channel, time_t timeout) + void OnChannelPermissionCheck(User* user,Channel* channel, PermissionData& perm) { - if (IS_LOCAL(user)) + if (perm.name != "invite") + return; + + ModResult res = channel->GetExtBanStatus(user, 'A'); + if (res == MOD_RES_DENY) { - ModResult res = channel->GetExtBanStatus(user, 'A'); - if (res == MOD_RES_DENY) - { - // Matching extban, explicitly deny /invite - user->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :You are banned from using INVITE", user->nick.c_str(), channel->name.c_str()); - return res; - } - if (channel->IsModeSet(&ni) || res == MOD_RES_ALLOW) - { - // Explicitly allow /invite - return MOD_RES_ALLOW; - } + // Matching extban, explicitly deny /invite + perm.result = res; + perm.SetReason(":%s %d %s %s :You are banned from using INVITE", ServerInstance->Config->ServerName.c_str(), + ERR_CHANOPRIVSNEEDED, user->nick.c_str(), channel->name.c_str()); + } + else if (channel->IsModeSet(&ni) || res == MOD_RES_ALLOW) + { + perm.result = MOD_RES_ALLOW; } - - return MOD_RES_PASSTHRU; } virtual ~ModuleAllowInvite() diff --git a/src/modules/m_nokicks.cpp b/src/modules/m_nokicks.cpp index 4910bc7ef..f08b9f518 100644 --- a/src/modules/m_nokicks.cpp +++ b/src/modules/m_nokicks.cpp @@ -33,7 +33,7 @@ class ModuleNoKicks : public Module void init() { ServerInstance->Modules->AddService(nk); - Implementation eventlist[] = { I_OnUserPreKick, I_On005Numeric }; + Implementation eventlist[] = { I_OnChannelPermissionCheck, I_On005Numeric }; ServerInstance->Modules->Attach(eventlist, this, 2); } @@ -42,23 +42,14 @@ class ModuleNoKicks : public Module ServerInstance->AddExtBanChar('Q'); } - ModResult OnUserPreKick(User* source, Membership* memb, const std::string &reason) + void OnChannelPermissionCheck(User* user,Channel* chan, PermissionData& perm) { - if (!memb->chan->GetExtBanStatus(source, 'Q').check(!memb->chan->IsModeSet(&nk))) + if (perm.name == "kick" && !chan->GetExtBanStatus(user, 'Q').check(!chan->IsModeSet(&nk))) { - if ((ServerInstance->ULine(source->nick.c_str())) || ServerInstance->ULine(source->server)) - { - // ulines can still kick with +Q in place - return MOD_RES_PASSTHRU; - } - else - { - // nobody else can (not even opers with override, and founders) - source->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :Can't kick user %s from channel (+Q set)",source->nick.c_str(), memb->chan->name.c_str(), memb->user->nick.c_str()); - return MOD_RES_DENY; - } + perm.SetReason(":%s %d %s %s :Can't kick in channel (+Q set)", ServerInstance->Config->ServerName.c_str(), + ERR_CHANOPRIVSNEEDED, user->nick.c_str(), chan->name.c_str()); + perm.result = MOD_RES_DENY; } - return MOD_RES_PASSTHRU; } ~ModuleNoKicks() diff --git a/src/modules/m_ojoin.cpp b/src/modules/m_ojoin.cpp index 6e9212f8d..5642bcda6 100644 --- a/src/modules/m_ojoin.cpp +++ b/src/modules/m_ojoin.cpp @@ -148,7 +148,7 @@ class ModuleOjoin : public Module ServerInstance->Modules->AddService(*np); ServerInstance->Modules->AddService(mycommand); - Implementation eventlist[] = { I_OnUserPreJoin, I_OnUserPreKick, I_OnRehash }; + Implementation eventlist[] = { I_OnUserPreJoin, I_OnChannelPermissionCheck, I_OnRehash }; ServerInstance->Modules->Attach(eventlist, this, 3); } @@ -183,18 +183,24 @@ class ModuleOjoin : public Module op = Conf->getBool("op", true); } - ModResult OnUserPreKick(User* source, Membership* memb, const std::string &reason) + void OnChannelPermissionCheck(User* source, Channel* chan, PermissionData& perm) { + if (perm.name != "kick") + return; + TargetedPermissionData& t = static_cast<TargetedPermissionData&>(perm); + Membership* memb = chan->GetUser(t.target); // Don't do anything if they're not +Y if (!memb->hasMode(np->GetModeChar())) - return MOD_RES_PASSTHRU; + return; // Let them do whatever they want to themselves. if (source == memb->user) - return MOD_RES_PASSTHRU; + return; - source->WriteNumeric(484, source->nick+" "+memb->chan->name+" :Can't kick "+memb->user->nick+" as they're on official network business."); - return MOD_RES_DENY; + perm.SetReason(":%s 484 %s %s :Can't kick %s as they're on official network business", + ServerInstance->Config->ServerName.c_str(), source->nick.c_str(), + memb->chan->name.c_str(), memb->user->nick.c_str()); + perm.result = MOD_RES_DENY; } ~ModuleOjoin() diff --git a/src/modules/m_override.cpp b/src/modules/m_override.cpp index 4742bb284..e9c59c0b9 100644 --- a/src/modules/m_override.cpp +++ b/src/modules/m_override.cpp @@ -27,8 +27,8 @@ class ModuleOverride : public Module // read our config options (main config file) OnRehash(NULL); ServerInstance->SNO->EnableSnomask('v', "OVERRIDE"); - Implementation eventlist[] = { I_OnRehash, I_OnPreMode, I_On005Numeric, I_OnUserPreJoin, I_OnUserPreKick, I_OnPreTopicChange }; - ServerInstance->Modules->Attach(eventlist, this, 6); + Implementation eventlist[] = { I_OnRehash, I_OnPreMode, I_On005Numeric, I_OnUserPreJoin, I_OnChannelPermissionCheck }; + ServerInstance->Modules->Attach(eventlist, this, 5); } void OnRehash(User* user) @@ -54,35 +54,14 @@ class ModuleOverride : public Module return ((tokenlist.find(token, 0) != std::string::npos) || (tokenlist.find("*", 0) != std::string::npos)); } - - ModResult OnPreTopicChange(User *source, Channel *channel, const std::string &topic) + void OnChannelPermissionCheck(User* source,Channel* chan, PermissionData& perm) { - if (IS_LOCAL(source) && IS_OPER(source) && CanOverride(source, "TOPIC")) + if (IS_LOCAL(source) && IS_OPER(source) && CanOverride(source, perm.name.c_str())) { - if (!channel->HasUser(source) || (channel->IsModeSet('t') && channel->GetPrefixValue(source) < HALFOP_VALUE)) - { - ServerInstance->SNO->WriteGlobalSno('v',std::string(source->nick)+" used oper override to change a topic on "+std::string(channel->name)); - } - - // Explicit allow - return MOD_RES_ALLOW; - } - - return MOD_RES_PASSTHRU; - } + ServerInstance->SNO->WriteGlobalSno('v',source->nick+" used oper override for "+perm.name+" on "+chan->name); - ModResult OnUserPreKick(User* source, Membership* memb, const std::string &reason) - { - if (IS_OPER(source) && CanOverride(source,"KICK")) - { - // If the kicker's status is less than the target's, or the kicker's status is less than or equal to voice - if ((memb->chan->GetPrefixValue(source) < memb->getRank()) || (memb->chan->GetPrefixValue(source) <= VOICE_VALUE)) - { - ServerInstance->SNO->WriteGlobalSno('v',std::string(source->nick)+" used oper override to kick "+std::string(memb->user->nick)+" on "+std::string(memb->chan->name)+" ("+reason+")"); - return MOD_RES_ALLOW; - } + perm.result = MOD_RES_ALLOW; } - return MOD_RES_PASSTHRU; } ModResult OnPreMode(User* source, Extensible* dest, irc::modestacker& modes) diff --git a/src/modules/m_servprotect.cpp b/src/modules/m_servprotect.cpp index a20f635b7..db1b3b08e 100644 --- a/src/modules/m_servprotect.cpp +++ b/src/modules/m_servprotect.cpp @@ -44,7 +44,7 @@ class ModuleServProtectMode : public Module : bm(this) { ServerInstance->Modules->AddService(bm); - Implementation eventlist[] = { I_OnWhois, I_OnKill, I_OnWhoisLine, I_OnRawMode, I_OnUserPreKick }; + Implementation eventlist[] = { I_OnWhois, I_OnKill, I_OnWhoisLine, I_OnRawMode, I_OnChannelPermissionCheck }; ServerInstance->Modules->Attach(eventlist, this, 5); } @@ -112,16 +112,17 @@ class ModuleServProtectMode : public Module return MOD_RES_PASSTHRU; } - ModResult OnUserPreKick(User *src, Membership* memb, const std::string &reason) + void OnChannelPermissionCheck(User* src, Channel* chan, PermissionData& perm) { - if (memb->user->IsModeSet('k')) + if (perm.name != "kick") + return; + TargetedPermissionData& t = static_cast<TargetedPermissionData&>(perm); + if (t.target->IsModeSet('k')) { - src->WriteNumeric(484, "%s %s :You are not permitted to kick services", - src->nick.c_str(), memb->chan->name.c_str()); - return MOD_RES_DENY; + perm.SetReason(":%s 484 %s %s :You are not permitted to kick services", + ServerInstance->Config->ServerName.c_str(), src->nick.c_str(), chan->name.c_str()); + perm.result = MOD_RES_DENY; } - - return MOD_RES_PASSTHRU; } ModResult OnWhoisLine(User* src, User* dst, int &numeric, std::string &text) diff --git a/src/modules/m_silence.cpp b/src/modules/m_silence.cpp index 8c26051db..dc1d1b505 100644 --- a/src/modules/m_silence.cpp +++ b/src/modules/m_silence.cpp @@ -280,7 +280,7 @@ class ModuleSilence : public Module ServerInstance->AddCommand(&cmdsilence); ServerInstance->AddCommand(&cmdsvssilence); - Implementation eventlist[] = { I_OnRehash, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage, I_OnUserPreInvite }; + Implementation eventlist[] = { I_OnRehash, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage, I_OnChannelPermissionCheck }; ServerInstance->Modules->Attach(eventlist, this, 5); } @@ -342,9 +342,11 @@ class ModuleSilence : public Module return PreText(user, dest, target_type, text, status, exempt_list, SILENCE_NOTICE); } - ModResult OnUserPreInvite(User* source,User* dest,Channel* channel, time_t timeout) + void OnChannelPermissionCheck(User* user,Channel* chan, PermissionData& perm) { - return MatchPattern(dest, source, SILENCE_INVITE); + if (perm.name != "invite" || perm.result != MOD_RES_PASSTHRU) + return; + perm.result = MatchPattern(static_cast<TargetedPermissionData&>(perm).target, user, SILENCE_INVITE); } ModResult MatchPattern(User* dest, User* source, int pattern) diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index acd0e180e..d42cc9f46 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -66,7 +66,7 @@ void ModuleSpanningTree::init() I_OnPreCommand, I_OnGetServerDescription, I_OnUserInvite, I_OnPostTopicChange, I_OnWallops, I_OnUserNotice, I_OnUserMessage, I_OnBackgroundTimer, I_OnUserJoin, I_OnChangeHost, I_OnChangeName, I_OnChangeIdent, I_OnUserPart, I_OnUnloadModule, - I_OnUserQuit, I_OnUserPostNick, I_OnUserKick, I_OnRemoteKill, I_OnRehash, I_OnPreRehash, + I_OnUserQuit, I_OnUserPostNick, I_OnUserKick, I_OnRemoteKill, I_OnRehash, I_OnOper, I_OnAddLine, I_OnDelLine, I_OnLoadModule, I_OnStats, I_OnSetAway, I_OnPostCommand, I_OnUserConnect, I_OnAcceptConnection }; @@ -739,19 +739,6 @@ void ModuleSpanningTree::OnRemoteKill(User* source, User* dest, const std::strin Utils->DoOneToMany(source->uuid,"KILL",params); } -void ModuleSpanningTree::OnPreRehash(User* user, const std::string ¶meter) -{ - ServerInstance->Logs->Log("remoterehash", DEBUG, "called with param %s", parameter.c_str()); - - // Send out to other servers - if (!parameter.empty() && parameter[0] != '-') - { - parameterlist params; - params.push_back(parameter); - Utils->DoOneToAllButSender(user ? user->uuid : ServerInstance->Config->GetSID(), "REHASH", params, user ? user->server : ServerInstance->Config->ServerName); - } -} - void ModuleSpanningTree::OnRehash(User* user) { // Re-read config stuff diff --git a/src/modules/m_spanningtree/main.h b/src/modules/m_spanningtree/main.h index ee0e9f4cd..8f00e3f96 100644 --- a/src/modules/m_spanningtree/main.h +++ b/src/modules/m_spanningtree/main.h @@ -150,7 +150,6 @@ class ModuleSpanningTree : public Module void OnUserPostNick(User* user, const std::string &oldnick); void OnUserKick(User* source, Membership* memb, const std::string &reason, CUList& excepts); void OnRemoteKill(User* source, User* dest, const std::string &reason, const std::string &operreason); - void OnPreRehash(User* user, const std::string ¶meter); void OnRehash(User* user); void OnOper(User* user, const std::string &opertype); void OnLine(User* source, const std::string &host, bool adding, char linetype, long duration, const std::string &reason); diff --git a/src/modules/m_testnet.cpp b/src/modules/m_testnet.cpp index 001077a15..e9ddd97bf 100644 --- a/src/modules/m_testnet.cpp +++ b/src/modules/m_testnet.cpp @@ -98,12 +98,11 @@ static void checkall(Module* noimpl) CHK(OnRehash); CHK(OnSendSnotice); CHK(OnUserPreJoin); - CHK(OnUserPreKick); + CHK(OnChannelPermissionCheck); CHK(OnUserKick); CHK(OnOper); CHK(OnInfo); CHK(OnWhois); - CHK(OnUserPreInvite); CHK(OnUserInvite); CHK(OnUserPreMessage); CHK(OnUserPreNotice); @@ -141,7 +140,6 @@ static void checkall(Module* noimpl) CHK(OnExtBanCheck); CHK(OnStats); CHK(OnChangeLocalUserHost); - CHK(OnPreTopicChange); CHK(OnPostTopicChange); CHK(OnEvent); CHK(OnGlobalOper); @@ -165,7 +163,6 @@ static void checkall(Module* noimpl) CHK(OnRunTestSuite); CHK(OnNamesListItem); CHK(OnNumeric); - CHK(OnPreRehash); CHK(OnModuleRehash); CHK(OnSendWhoLine); CHK(OnChangeIdent); |
