]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Disallow adding prefix-mode when it is already set (fixes bug #935)
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Sat, 9 Jan 2010 17:29:28 +0000 (17:29 +0000)
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Sat, 9 Jan 2010 17:29:28 +0000 (17:29 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12245 e03df62e-2008-0410-955e-edbf42e46eb7

include/channels.h
src/channels.cpp
src/mode.cpp
src/modules/m_chanprotect.cpp

index 59f4d1cf35530b35eb46ab98fbe79a1e717b3739..591847407d8e766269cbbcfc7a4901a0c854a467 100644 (file)
@@ -362,8 +362,9 @@ class CoreExport Channel : public Extensible
         * @param user The user to associate the privilage with
         * @param prefix The prefix character to associate
         * @param adding True if adding the prefix, false when removing
+        * @return True if a change was made
         */
-       void SetPrefix(User* user, char prefix, bool adding);
+       bool SetPrefix(User* user, char prefix, bool adding);
 
        /** Check if a user is banned on this channel
         * @param user A user to check against the banlist
index 31038484eb14baedf93858253908b0af711295da..b0951c8ccb52947eb51027491ac8f22002ce0f42 100644 (file)
@@ -929,14 +929,14 @@ unsigned int Channel::GetPrefixValue(User* user)
        return m->second->getRank();
 }
 
-void Channel::SetPrefix(User* user, char prefix, bool adding)
+bool Channel::SetPrefix(User* user, char prefix, bool adding)
 {
        ModeHandler* delta_mh = ServerInstance->Modes->FindMode(prefix, MODETYPE_CHANNEL);
        if (!delta_mh)
-               return;
+               return false;
        UserMembIter m = userlist.find(user);
        if (m == userlist.end())
-               return;
+               return false;
        for(unsigned int i=0; i < m->second->modes.length(); i++)
        {
                char mchar = m->second->modes[i];
@@ -947,11 +947,12 @@ void Channel::SetPrefix(User* user, char prefix, bool adding)
                                m->second->modes.substr(0,i) +
                                (adding ? std::string(1, prefix) : "") +
                                m->second->modes.substr(mchar == prefix ? i+1 : i);
-                       return;
+                       return adding != (mchar == prefix);
                }
        }
        if (adding)
                m->second->modes += std::string(1, prefix);
+       return adding;
 }
 
 void Channel::RemoveAllPrefixes(User* user)
index 7d99277df1702b506ba8695899d3218d6d01c661..28390d327e13d5bd5623e52411f81470e3958959 100644 (file)
@@ -353,6 +353,15 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool
                return MODEACTION_DENY;
        }
 
+       if (mh->GetPrefixRank() && chan)
+       {
+               User* user_to_prefix = ServerInstance->FindNick(parameter);
+               if (!user_to_prefix)
+                       return MODEACTION_DENY;
+               if (!chan->SetPrefix(user_to_prefix, modechar, adding))
+                       return MODEACTION_DENY;
+       }
+
        /* Call the handler for the mode */
        ModeAction ma = mh->OnModeChange(user, targetuser, chan, parameter, adding);
 
@@ -362,15 +371,9 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool
        if (ma != MODEACTION_ALLOW)
                return ma;
 
+       // TODO this count may not be reliable
        mh->ChangeCount(adding ? 1 : -1);
 
-       if (mh->GetPrefixRank() && chan)
-       {
-               User* user_to_prefix = ServerInstance->FindNick(parameter);
-               if (user_to_prefix)
-                       chan->SetPrefix(user_to_prefix, modechar, adding);
-       }
-
        for (ModeWatchIter watchers = modewatchers[handler_id].begin(); watchers != modewatchers[handler_id].end(); watchers++)
                (*watchers)->AfterMode(user, targetuser, chan, parameter, adding, type);
 
index 369703d2c1212759dc57fe605727f230b33be3d9..8a842b626d305ce3b6deecf1c135bb4cd1410e22 100644 (file)
@@ -147,10 +147,6 @@ class ChanFounder : public ModeHandler, public FounderProtectBase
 
        ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
        {
-               User* theuser = ServerInstance->FindNick(parameter);
-
-               if (!theuser)
-                       return MODEACTION_DENY;
                return MODEACTION_ALLOW;
        }
 
@@ -218,11 +214,6 @@ class ChanProtect : public ModeHandler, public FounderProtectBase
 
        ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
        {
-               User* theuser = ServerInstance->FindNick(parameter);
-
-               if (!theuser)
-                       return MODEACTION_DENY;
-
                return MODEACTION_ALLOW;
        }