]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_shun.cpp
Fix null-checking the wrong variable in the disable module.
[user/henk/code/inspircd.git] / src / modules / m_shun.cpp
index 6eaa6b47c79e14b31d27812c182590638c258eac..a62d8369d29dad2a99807f4f73ac9a1e9aee0729 100644 (file)
@@ -4,7 +4,7 @@
  *   Copyright (C) 2019 Matt Schatz <genius3000@g3k.solutions>
  *   Copyright (C) 2018 linuxdaemon <linuxdaemon.irc@gmail.com>
  *   Copyright (C) 2017-2018 B00mX0r <b00mx0r@aureus.pw>
- *   Copyright (C) 2013, 2017-2018 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013, 2017-2018, 2020 Sadie Powell <sadie@witchery.services>
  *   Copyright (C) 2012-2016 Attila Molnar <attilamolnar@hush.com>
  *   Copyright (C) 2012, 2018-2019 Robby <robby@chatbelgie.be>
  *   Copyright (C) 2012 Jens Voss <DukePyrolator@anope.org>
@@ -158,6 +158,20 @@ class ModuleShun : public Module, public Stats::EventListener
        bool NotifyOfShun;
        bool affectopers;
 
+       bool IsShunned(LocalUser* user)
+       {
+               // Exempt the user from shuns if they are an oper and affectopers is disabled.
+               if (!affectopers && user->IsOper())
+                       return false;
+
+               // Exempt the user from shuns if they are an oper with the servers/ignore-shun privilege.
+               if (user->HasPrivPermission("servers/ignore-shun"))
+                       return false;
+
+               // Check whether the user is actually shunned.
+               return ServerInstance->XLines->MatchesLine("SHUN", user);
+       }
+
  public:
        ModuleShun()
                : Stats::EventListener(this)
@@ -209,21 +223,9 @@ class ModuleShun : public Module, public Stats::EventListener
 
        ModResult OnPreCommand(std::string& command, CommandBase::Params& parameters, LocalUser* user, bool validated) CXX11_OVERRIDE
        {
-               if (validated)
+               if (validated || !IsShunned(user))
                        return MOD_RES_PASSTHRU;
 
-               if (!ServerInstance->XLines->MatchesLine("SHUN", user))
-               {
-                       /* Not shunned, don't touch. */
-                       return MOD_RES_PASSTHRU;
-               }
-
-               if (!affectopers && user->IsOper())
-               {
-                       /* Don't do anything if the user is an operator and affectopers isn't set */
-                       return MOD_RES_PASSTHRU;
-               }
-
                if (!ShunEnabledCommands.count(command))
                {
                        if (NotifyOfShun)
@@ -248,7 +250,7 @@ class ModuleShun : public Module, public Stats::EventListener
 
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Provides the SHUN command, which stops a user from executing all except configured commands", VF_VENDOR|VF_COMMON);
+               return Version("Adds the /SHUN command which allows server operators to prevent users from executing commands.", VF_VENDOR|VF_COMMON);
        }
 };