]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_override.cpp
Update wiki links to use HTTPS and point to the correct pages.
[user/henk/code/inspircd.git] / src / modules / m_override.cpp
index 1d9447fc46a1679c4a4d34a4da062007bd9e3a0c..3266d3eb0734278d6b372800b02d69fea7b53ae7 100644 (file)
@@ -33,6 +33,20 @@ class ModuleOverride : public Module
        bool RequireKey;
        bool NoisyOverride;
 
+       static bool IsOverride(unsigned int userlevel, const std::string& modeline)
+       {
+               for (std::string::const_iterator i = modeline.begin(); i != modeline.end(); ++i)
+               {
+                       ModeHandler* mh = ServerInstance->Modes->FindMode(*i, MODETYPE_CHANNEL);
+                       if (!mh)
+                               continue;
+
+                       if (mh->GetLevelRequired() > userlevel)
+                               return true;
+               }
+               return false;
+       }
+
  public:
 
        void init()
@@ -87,7 +101,8 @@ class ModuleOverride : public Module
                if (IS_OPER(source) && 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;
@@ -105,7 +120,10 @@ class ModuleOverride : public Module
 
                unsigned int mode = channel->GetPrefixValue(source);
 
-               if (mode < HALFOP_VALUE && CanOverride(source, "MODE"))
+               if (!IsOverride(mode, parameters[1]))
+                       return MOD_RES_PASSTHRU;
+
+               if (CanOverride(source, "MODE"))
                {
                        std::string msg = source->nick+" overriding modes:";
                        for(unsigned int i=0; i < parameters.size(); i++)