]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_override.cpp
Improve the message sent when overriding channel modes.
[user/henk/code/inspircd.git] / src / modules / m_override.cpp
index 9cfc3aed0e877b95c31be094afbeef490d1858b9..5e91456554078faff707dc20583191c9bbd081bc 100644 (file)
@@ -1,14 +1,19 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2017 B00mX0r <b00mx0r@aureus.pw>
+ *   Copyright (C) 2017 Adam <Adam@anope.org>
+ *   Copyright (C) 2016 Sheogorath <sheogorath@shivering-isles.com>
+ *   Copyright (C) 2013, 2017, 2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013 Daniel Vassdal <shutter@canternet.org>
+ *   Copyright (C) 2012-2015 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012 Shawn Smith <ShawnSmith0828@gmail.com>
+ *   Copyright (C) 2012 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
- *   Copyright (C) 2009 Uli Schlachter <psychon@znc.in>
- *   Copyright (C) 2007-2009 Robin Burchell <robin+git@viroteck.net>
+ *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
+ *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
  *   Copyright (C) 2007-2008 Dennis Friis <peavey@inspircd.org>
- *   Copyright (C) 2008 Pippijn van Steenhoven <pip88nl@gmail.com>
- *   Copyright (C) 2008 Geoff Bricker <geoff.bricker@gmail.com>
- *   Copyright (C) 2004-2006 Craig Edwards <craigedwards@brainbox.cc>
- *   Copyright (C) 2006 Oliver Lupton <oliverlupton@gmail.com>
+ *   Copyright (C) 2006, 2008, 2010 Craig Edwards <brain@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 #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 +60,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 +76,16 @@ class ModuleOverride : public Module
                }
 
                if (NoisyOverride)
-                       chan->WriteNotice(InspIRCd::Format("%s used oper override to bypass %s", user->nick.c_str(), bypasswhat));
+                       chan->WriteRemoteNotice(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 +96,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 +114,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 +145,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;
@@ -145,7 +170,7 @@ class ModuleOverride : public Module
 
                if (CanOverride(source, "MODE"))
                {
-                       std::string msg = source->nick + " overriding modes: ";
+                       std::string msg = source->nick + " used oper override to set modes on " + channel->name + ": ";
 
                        // Construct a MODE string in the old format for sending it as a snotice
                        std::string params;
@@ -188,7 +213,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"))
@@ -200,7 +225,7 @@ class ModuleOverride : public Module
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides support for allowing opers to override certain things",VF_VENDOR);
+               return Version("Allows server operators to be given privileges that allow them to ignore various channel-level restrictions.",VF_VENDOR);
        }
 };