]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_override.cpp
Sync helpop chmodes s and p with docs
[user/henk/code/inspircd.git] / src / modules / m_override.cpp
index 69f4b3bca7c1bf876f880eeddf0c58572f056791..289c894bf1df9a3e364fd61fa6c8af2ab0c03352 100644 (file)
@@ -1,14 +1,20 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2020 satmd <satmd@users.noreply.github.com>
+ *   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) 2004, 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;
        ChanModeReference limit;
+       Invite::API invapi;
 
        static bool IsOverride(unsigned int userlevel, const Modes::ChangeList::List& list)
        {
                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;
@@ -56,23 +77,27 @@ 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->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")
+               , invapi(this)
        {
        }
 
        void init() CXX11_OVERRIDE
        {
                ServerInstance->SNO->EnableSnomask('v', "OVERRIDE");
+               UmodeEnabled = ServerInstance->Config->ConfValue("override")->getBool("enableumode");
        }
 
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
@@ -90,8 +115,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));
        }
@@ -118,7 +146,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;
@@ -142,7 +171,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;
@@ -177,7 +206,7 @@ class ModuleOverride : public Module
                        {
                                if (chan->IsModeSet(inviteonly) && (CanOverride(user,"INVITE")))
                                {
-                                       if (!user->IsInvited(chan))
+                                       if (!invapi->IsInvited(user, chan))
                                                return HandleJoinOverride(user, chan, keygiven, "invite-only", "+i");
                                        return MOD_RES_ALLOW;
                                }
@@ -185,7 +214,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"))
@@ -197,7 +226,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);
        }
 };