]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_override.cpp
Move the <disabled> tag out of the core to a new module.
[user/henk/code/inspircd.git] / src / modules / m_override.cpp
index 8bf1d30792f01a9a136d3caa3abc96f5581dc3de..7155e7e76f797dfbe220a7473276e96fbd78051f 100644 (file)
 #include "inspircd.h"
 #include "modules/invite.h"
 
+class Override : public SimpleUserModeHandler
+{
+ public:
+       Override(Module* Creator) : SimpleUserModeHandler(Creator, "override", 'O')
+       {
+               oper = true;
+               if (!ServerInstance->Config->ConfValue("override")->getBool("enableumode"))
+                       DisableAutoRegister();
+       }
+};
+
 class ModuleOverride : public Module
 {
        bool RequireKey;
        bool NoisyOverride;
+       bool UmodeEnabled;
+       Override ou;
        ChanModeReference topiclock;
        ChanModeReference inviteonly;
        ChanModeReference key;
@@ -42,7 +55,7 @@ class ModuleOverride : public Module
                for (Modes::ChangeList::List::const_iterator i = list.begin(); i != list.end(); ++i)
                {
                        ModeHandler* mh = i->mh;
-                       if (mh->GetLevelRequired() > userlevel)
+                       if (mh->GetLevelRequired(i->adding) > userlevel)
                                return true;
                }
                return false;
@@ -58,14 +71,16 @@ class ModuleOverride : public Module
                }
 
                if (NoisyOverride)
-                       chan->WriteChannelWithServ(ServerInstance->Config->ServerName, "NOTICE %s :%s used oper override to bypass %s", chan->name.c_str(), user->nick.c_str(), bypasswhat);
+                       chan->WriteNotice(InspIRCd::Format("%s used oper override to bypass %s", user->nick.c_str(), bypasswhat));
                ServerInstance->SNO->WriteGlobalSno('v', user->nick+" used oper override to bypass " + mode + " on " + chan->name);
                return MOD_RES_ALLOW;
        }
 
  public:
        ModuleOverride()
-               : topiclock(this, "topiclock")
+               : UmodeEnabled(false)
+               , ou(this)
+               , topiclock(this, "topiclock")
                , inviteonly(this, "inviteonly")
                , key(this, "key")
                , limit(this, "limit")
@@ -76,6 +91,7 @@ class ModuleOverride : public Module
        void init() CXX11_OVERRIDE
        {
                ServerInstance->SNO->EnableSnomask('v', "OVERRIDE");
+               UmodeEnabled = ServerInstance->Config->ConfValue("override")->getBool("enableumode");
        }
 
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
@@ -93,8 +109,11 @@ class ModuleOverride : public Module
 
        bool CanOverride(User* source, const char* token)
        {
-               std::string tokenlist = source->oper->getConfig("override");
+               // If we require oper override umode (+O) but it is not set
+               if (UmodeEnabled && !source->IsModeSet(ou))
+                       return false;
 
+               std::string tokenlist = source->oper->getConfig("override");
                // its defined or * is set, return its value as a boolean for if the token is set
                return ((tokenlist.find(token, 0) != std::string::npos) || (tokenlist.find("*", 0) != std::string::npos));
        }
@@ -121,7 +140,8 @@ class ModuleOverride : public Module
                if (source->IsOper() && 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))
+                       if ((memb->chan->GetPrefixValue(source) < memb->getRank()) || (memb->chan->GetPrefixValue(source) <= VOICE_VALUE) ||
+                           (memb->chan->GetPrefixValue(source) == HALFOP_VALUE && memb->getRank() == HALFOP_VALUE))
                        {
                                ServerInstance->SNO->WriteGlobalSno('v',source->nick+" used oper override to kick "+memb->user->nick+" on "+memb->chan->name+" ("+reason+")");
                                return MOD_RES_ALLOW;
@@ -188,7 +208,7 @@ class ModuleOverride : public Module
                                if (chan->IsModeSet(key) && (CanOverride(user,"KEY")) && keygiven != chan->GetModeParameter(key))
                                        return HandleJoinOverride(user, chan, keygiven, "the channel key", "+k");
 
-                               if (chan->IsModeSet(limit) && (chan->GetUserCounter() >= ConvToInt(chan->GetModeParameter(limit))) && (CanOverride(user,"LIMIT")))
+                               if (chan->IsModeSet(limit) && (chan->GetUserCounter() >= ConvToNum<size_t>(chan->GetModeParameter(limit))) && (CanOverride(user,"LIMIT")))
                                        return HandleJoinOverride(user, chan, keygiven, "the channel limit", "+l");
 
                                if (chan->IsBanned(user) && CanOverride(user,"BANWALK"))