aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authorGravatar Daniel De Graaf2010-03-02 12:04:53 -0600
committerGravatar Daniel De Graaf2010-08-03 17:32:39 -0400
commit89f72a4d63c6868ac3c191197f37e08341b8bc16 (patch)
tree619fc74cfc57928de1bd0a9b08a8ad65903a8e7b /src/modules
parentUnset 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.cpp32
-rw-r--r--src/modules/m_nokicks.cpp21
-rw-r--r--src/modules/m_ojoin.cpp18
-rw-r--r--src/modules/m_override.cpp33
-rw-r--r--src/modules/m_servprotect.cpp17
-rw-r--r--src/modules/m_silence.cpp8
-rw-r--r--src/modules/m_spanningtree/main.cpp15
-rw-r--r--src/modules/m_spanningtree/main.h1
-rw-r--r--src/modules/m_testnet.cpp5
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 &parameter)
-{
- 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 &parameter);
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);