summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/channels.cpp3
-rw-r--r--src/helperfuncs.cpp25
-rw-r--r--src/inspircd.cpp3
-rw-r--r--src/modules.cpp1
-rw-r--r--src/modules/m_blockcaps.cpp3
-rw-r--r--src/modules/m_blockcolor.cpp3
-rw-r--r--src/modules/m_censor.cpp3
-rw-r--r--src/modules/m_chanfilter.cpp3
-rw-r--r--src/modules/m_exemptchanops.cpp95
-rw-r--r--src/modules/m_messageflood.cpp3
-rw-r--r--src/modules/m_nickflood.cpp4
-rw-r--r--src/modules/m_noctcp.cpp3
-rw-r--r--src/modules/m_nonicks.cpp3
-rw-r--r--src/modules/m_nonotice.cpp2
-rw-r--r--src/modules/m_services_account.cpp3
-rw-r--r--src/modules/m_stripcolor.cpp3
-rw-r--r--src/modules/m_testnet.cpp1
17 files changed, 89 insertions, 72 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index d0533aee6..5603ef1dd 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -92,9 +92,8 @@ int Channel::SetTopic(User *u, std::string &ntopic, bool forceset)
return CMD_FAILURE;
if (res != MOD_RES_ALLOW)
{
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (u,this,"topiclock"));
bool defok = IsModeSet('t') ? GetPrefixValue(u) >= HALFOP_VALUE : HasUser(u);
- if (!res.check(defok))
+ if (!ServerInstance->OnCheckExemption(u,this,"topiclock").check(defok))
{
if (!this->HasUser(u))
u->WriteNumeric(442, "%s %s :You're not on that channel!",u->nick.c_str(), this->name.c_str());
diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp
index 66a84bbce..98dd1fc7f 100644
--- a/src/helperfuncs.cpp
+++ b/src/helperfuncs.cpp
@@ -439,3 +439,28 @@ void GenRandomHandler::Call(char *output, size_t max)
for(unsigned int i=0; i < max; i++)
output[i] = random();
}
+
+ModResult OnCheckExemptionHandler::Call(User* user, Channel* chan, const std::string& restriction)
+{
+ unsigned int mypfx = chan->GetPrefixValue(user);
+ char minmode;
+ std::string current;
+
+ irc::spacesepstream defaultstream(ServerInstance->Config->ConfValue("options")->getString("exemptchanops"));
+
+ while (defaultstream.GetToken(current))
+ {
+ std::string::size_type pos = current.find(':');
+ if (pos == std::string::npos)
+ continue;
+ if (current.substr(0,pos) == restriction)
+ minmode = current[pos+1];
+ }
+
+ ModeHandler* mh = ServerInstance->Modes->FindMode(minmode, MODETYPE_CHANNEL);
+ if (mh && mypfx >= mh->GetPrefixRank())
+ return MOD_RES_ALLOW;
+ if (mh || minmode == '*')
+ return MOD_RES_DENY;
+ return MOD_RES_PASSTHRU;
+}
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 27060be52..c6faf8802 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -305,7 +305,8 @@ InspIRCd::InspIRCd(int argc, char** argv) :
Rehash(&HandleRehash),
IsNick(&HandleIsNick),
IsIdent(&HandleIsIdent),
- FloodQuitUser(&HandleFloodQuitUser)
+ FloodQuitUser(&HandleFloodQuitUser),
+ OnCheckExemption(&HandleOnCheckExemption)
{
#ifdef WIN32
// Strict, frequent checking of memory on debug builds
diff --git a/src/modules.cpp b/src/modules.cpp
index 98788c616..83393c2ad 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -163,7 +163,6 @@ ModResult Module::OnNumeric(User*, unsigned int, const std::string&) { return MO
void Module::OnHookIO(StreamSocket*, ListenSocket*) { }
ModResult Module::OnAcceptConnection(int, ListenSocket*, irc::sockets::sockaddrs*, irc::sockets::sockaddrs*) { return MOD_RES_PASSTHRU; }
void Module::OnSendWhoLine(User*, const std::vector<std::string>&, User*, Channel*, std::string&) { }
-ModResult Module::OnChannelRestrictionApply(User*, Channel*, const char*) { return MOD_RES_PASSTHRU; }
ModuleManager::ModuleManager() : ModCount(0)
{
diff --git a/src/modules/m_blockcaps.cpp b/src/modules/m_blockcaps.cpp
index ade42cb4b..873cf46ca 100644
--- a/src/modules/m_blockcaps.cpp
+++ b/src/modules/m_blockcaps.cpp
@@ -59,8 +59,7 @@ public:
return MOD_RES_PASSTHRU;
Channel* c = (Channel*)dest;
- ModResult res;
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,c,"blockcaps"));
+ ModResult res = ServerInstance->OnCheckExemption(user,c,"blockcaps");
if (res == MOD_RES_ALLOW)
return MOD_RES_PASSTHRU;
diff --git a/src/modules/m_blockcolor.cpp b/src/modules/m_blockcolor.cpp
index 9ffb36b80..d19317074 100644
--- a/src/modules/m_blockcolor.cpp
+++ b/src/modules/m_blockcolor.cpp
@@ -47,8 +47,7 @@ class ModuleBlockColour : public Module
if ((target_type == TYPE_CHANNEL) && (IS_LOCAL(user)))
{
Channel* c = (Channel*)dest;
- ModResult res;
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,c,"blockcolor"));
+ ModResult res = ServerInstance->OnCheckExemption(user,c,"blockcolor");
if (res == MOD_RES_ALLOW)
return MOD_RES_PASSTHRU;
diff --git a/src/modules/m_censor.cpp b/src/modules/m_censor.cpp
index 6a9f6941f..bf1f0225d 100644
--- a/src/modules/m_censor.cpp
+++ b/src/modules/m_censor.cpp
@@ -76,8 +76,7 @@ class ModuleCensor : public Module
{
active = ((Channel*)dest)->IsModeSet('G');
Channel* c = (Channel*)dest;
- ModResult res;
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,c,"censor"));
+ ModResult res = ServerInstance->OnCheckExemption(user,c,"censor");
if (res == MOD_RES_ALLOW)
return MOD_RES_PASSTHRU;
diff --git a/src/modules/m_chanfilter.cpp b/src/modules/m_chanfilter.cpp
index e790a15d8..faa064dbf 100644
--- a/src/modules/m_chanfilter.cpp
+++ b/src/modules/m_chanfilter.cpp
@@ -83,8 +83,7 @@ class ModuleChanFilter : public Module
virtual ModResult ProcessMessages(User* user,Channel* chan,std::string &text)
{
- ModResult res;
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,chan,"filter"));
+ ModResult res = ServerInstance->OnCheckExemption(user,chan,"filter");
if (!IS_LOCAL(user) || res == MOD_RES_ALLOW)
return MOD_RES_PASSTHRU;
diff --git a/src/modules/m_exemptchanops.cpp b/src/modules/m_exemptchanops.cpp
index 2677e66df..e92350eeb 100644
--- a/src/modules/m_exemptchanops.cpp
+++ b/src/modules/m_exemptchanops.cpp
@@ -52,42 +52,12 @@ class ExemptChanOps : public ListModeBase
}
};
-class ModuleExemptChanOps : public Module
+class ExemptHandler : public HandlerBase3<ModResult, User*, Channel*, const std::string&>
{
- ExemptChanOps ec;
- std::string defaults;
-
public:
-
- ModuleExemptChanOps() : ec(this)
- {
- }
-
- void init()
- {
- ServerInstance->Modules->AddService(ec);
- Implementation eventlist[] = { I_OnChannelDelete, I_OnChannelRestrictionApply, I_OnRehash, I_OnSyncChannel };
- ServerInstance->Modules->Attach(eventlist, this, 4);
-
- OnRehash(NULL);
- }
-
- Version GetVersion()
- {
- return Version("Provides the ability to allow channel operators to be exempt from certain modes.",VF_VENDOR);
- }
-
- void OnRehash(User* user)
- {
- defaults = ServerInstance->Config->ConfValue("exemptchanops")->getString("defaults");
- ec.DoRehash();
- }
-
- void OnSyncChannel(Channel* chan, Module* proto, void* opaque)
- {
- ec.DoSyncChannel(chan, proto, opaque);
- }
-
+ ExemptChanOps ec;
+ ExemptHandler(Module* me) : ec(me) {}
+
ModeHandler* FindMode(const std::string& mid)
{
if (mid.length() == 1)
@@ -101,21 +71,11 @@ class ModuleExemptChanOps : public Module
return NULL;
}
- ModResult OnChannelRestrictionApply(User* user, Channel* chan, const char* restriction)
+ ModResult Call(User* user, Channel* chan, const std::string& restriction)
{
unsigned int mypfx = chan->GetPrefixValue(user);
- irc::spacesepstream defaultstream(defaults);
std::string minmode;
- std::string current;
- while (defaultstream.GetToken(current))
- {
- std::string::size_type pos = current.find(':');
- if (pos == std::string::npos)
- continue;
- if (current.substr(0,pos) == restriction)
- minmode = current[pos+1];
- }
modelist* list = ec.extItem.get(chan);
if (list)
@@ -135,7 +95,50 @@ class ModuleExemptChanOps : public Module
return MOD_RES_ALLOW;
if (mh || minmode == "*")
return MOD_RES_DENY;
- return MOD_RES_PASSTHRU;
+
+ return ServerInstance->HandleOnCheckExemption.Call(user, chan, restriction);
+ }
+};
+
+class ModuleExemptChanOps : public Module
+{
+ std::string defaults;
+ ExemptHandler eh;
+
+ public:
+
+ ModuleExemptChanOps() : eh(this)
+ {
+ }
+
+ void init()
+ {
+ ServerInstance->Modules->AddService(eh.ec);
+ Implementation eventlist[] = { I_OnRehash, I_OnSyncChannel };
+ ServerInstance->Modules->Attach(eventlist, this, 2);
+ ServerInstance->OnCheckExemption = &eh;
+
+ OnRehash(NULL);
+ }
+
+ ~ModuleExemptChanOps()
+ {
+ ServerInstance->OnCheckExemption = &ServerInstance->HandleOnCheckExemption;
+ }
+
+ Version GetVersion()
+ {
+ return Version("Provides the ability to allow channel operators to be exempt from certain modes.",VF_VENDOR);
+ }
+
+ void OnRehash(User* user)
+ {
+ eh.ec.DoRehash();
+ }
+
+ void OnSyncChannel(Channel* chan, Module* proto, void* opaque)
+ {
+ eh.ec.DoSyncChannel(chan, proto, opaque);
}
};
diff --git a/src/modules/m_messageflood.cpp b/src/modules/m_messageflood.cpp
index c37537249..ccaf0a402 100644
--- a/src/modules/m_messageflood.cpp
+++ b/src/modules/m_messageflood.cpp
@@ -196,8 +196,7 @@ class ModuleMsgFlood : public Module
ModResult ProcessMessages(User* user,Channel* dest, const std::string &text)
{
- ModResult res;
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,dest,"flood"));
+ ModResult res = ServerInstance->OnCheckExemption(user,dest,"flood");
if (!IS_LOCAL(user) || res == MOD_RES_ALLOW)
return MOD_RES_PASSTHRU;
diff --git a/src/modules/m_nickflood.cpp b/src/modules/m_nickflood.cpp
index 47c8bc836..708d30e6b 100644
--- a/src/modules/m_nickflood.cpp
+++ b/src/modules/m_nickflood.cpp
@@ -209,7 +209,7 @@ class ModuleNickFlood : public Module
nickfloodsettings *f = nf.ext.get(channel);
if (f)
{
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,channel,"nickflood"));
+ res = ServerInstance->OnCheckExemption(user,channel,"nickflood");
if (res == MOD_RES_ALLOW)
continue;
@@ -248,7 +248,7 @@ class ModuleNickFlood : public Module
nickfloodsettings *f = nf.ext.get(channel);
if (f)
{
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,channel,"nickflood"));
+ res = ServerInstance->OnCheckExemption(user,channel,"nickflood");
if (res == MOD_RES_ALLOW)
return;
diff --git a/src/modules/m_noctcp.cpp b/src/modules/m_noctcp.cpp
index 19f97b42c..680392ea9 100644
--- a/src/modules/m_noctcp.cpp
+++ b/src/modules/m_noctcp.cpp
@@ -78,8 +78,7 @@ class ModuleNoCTCP : public Module
if ((target_type == TYPE_CHANNEL) && (IS_LOCAL(user)))
{
Channel* c = (Channel*)dest;
- ModResult res;
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,c,"noctcp"));
+ ModResult res = ServerInstance->OnCheckExemption(user,c,"noctcp");
if (res == MOD_RES_ALLOW)
return MOD_RES_PASSTHRU;
diff --git a/src/modules/m_nonicks.cpp b/src/modules/m_nonicks.cpp
index 8713ffe96..7a6d3ffd0 100644
--- a/src/modules/m_nonicks.cpp
+++ b/src/modules/m_nonicks.cpp
@@ -84,8 +84,7 @@ class ModuleNoNickChange : public Module
{
Channel* curr = *i;
- ModResult res;
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,curr,"nonick"));
+ ModResult res = ServerInstance->OnCheckExemption(user,curr,"nonick");
if (res == MOD_RES_ALLOW)
continue;
diff --git a/src/modules/m_nonotice.cpp b/src/modules/m_nonotice.cpp
index fe1e0a46d..b3f3d8da6 100644
--- a/src/modules/m_nonotice.cpp
+++ b/src/modules/m_nonotice.cpp
@@ -53,7 +53,7 @@ class ModuleNoNotice : public Module
// ulines are exempt.
return MOD_RES_PASSTHRU;
}
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,c,"nonotice"));
+ res = ServerInstance->OnCheckExemption(user,c,"nonotice");
if (res == MOD_RES_ALLOW)
return MOD_RES_PASSTHRU;
else
diff --git a/src/modules/m_services_account.cpp b/src/modules/m_services_account.cpp
index 4b047ea07..61026c08f 100644
--- a/src/modules/m_services_account.cpp
+++ b/src/modules/m_services_account.cpp
@@ -175,8 +175,7 @@ class ModuleServicesAccount : public Module
if (target_type == TYPE_CHANNEL)
{
Channel* c = (Channel*)dest;
- ModResult res;
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,c,"regmoderated"));
+ ModResult res = ServerInstance->OnCheckExemption(user,c,"regmoderated");
if (c->IsModeSet('M') && !is_registered && res != MOD_RES_ALLOW)
{
diff --git a/src/modules/m_stripcolor.cpp b/src/modules/m_stripcolor.cpp
index 113c931cb..c2246a0d9 100644
--- a/src/modules/m_stripcolor.cpp
+++ b/src/modules/m_stripcolor.cpp
@@ -114,8 +114,7 @@ class ModuleStripColor : public Module
else if (target_type == TYPE_CHANNEL)
{
Channel* t = (Channel*)dest;
- ModResult res;
- FIRST_MOD_RESULT(OnChannelRestrictionApply, res, (user,t,"stripcolor"));
+ ModResult res = ServerInstance->OnCheckExemption(user,t,"stripcolor");
if (res == MOD_RES_ALLOW)
return MOD_RES_PASSTHRU;
diff --git a/src/modules/m_testnet.cpp b/src/modules/m_testnet.cpp
index faa0c7b2e..2f514cf0b 100644
--- a/src/modules/m_testnet.cpp
+++ b/src/modules/m_testnet.cpp
@@ -169,7 +169,6 @@ static void checkall(Module* noimpl)
CHK(OnModuleRehash);
CHK(OnSendWhoLine);
CHK(OnChangeIdent);
- CHK(OnChannelRestrictionApply);
}
class CommandTest : public Command