diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/channels.cpp | 3 | ||||
-rw-r--r-- | src/helperfuncs.cpp | 25 | ||||
-rw-r--r-- | src/inspircd.cpp | 3 | ||||
-rw-r--r-- | src/modules.cpp | 1 | ||||
-rw-r--r-- | src/modules/m_blockcaps.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_blockcolor.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_censor.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_chanfilter.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_exemptchanops.cpp | 95 | ||||
-rw-r--r-- | src/modules/m_messageflood.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_nickflood.cpp | 4 | ||||
-rw-r--r-- | src/modules/m_noctcp.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_nonicks.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_nonotice.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_services_account.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_stripcolor.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_testnet.cpp | 1 |
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 |