]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/mode.cpp
2.0.1 release
[user/henk/code/inspircd.git] / src / mode.cpp
index 6dea66464914af64c9ee1d173b6fcb644e59b741..bda0f81aae8b0df6c0fdc15b01d8dfe47518c03e 100644 (file)
@@ -46,7 +46,7 @@
 #include "modes/umode_s.h"
 
 ModeHandler::ModeHandler(Module* Creator, const std::string& Name, char modeletter, ParamSpec Params, ModeType type)
-       : ServiceProvider(Creator, Name, type == MODETYPE_CHANNEL ? SERVICE_CMODE : SERVICE_UMODE), m_paramtype(TR_TEXT),
+       : ServiceProvider(Creator, Name, SERVICE_MODE), m_paramtype(TR_TEXT),
        parameters_taken(Params), mode(modeletter), prefix(0), oper(false),
        list(false), m_type(type), levelrequired(HALFOP_VALUE)
 {
@@ -62,7 +62,7 @@ CullResult ModeHandler::cull()
 ModeHandler::~ModeHandler()
 {
        if (ServerInstance && ServerInstance->Modes && ServerInstance->Modes->FindMode(mode, m_type) == this)
-               ServerInstance->Logs->Log("MODE", ERROR, "ERROR: Destructor for mode %c called while still registered", mode);
+               ServerInstance->Logs->Log("MODE", DEFAULT, "ERROR: Destructor for mode %c called while still registered", mode);
 }
 
 bool ModeHandler::IsListMode()
@@ -265,6 +265,10 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool
        ModeHandler *mh = FindMode(modechar, type);
        int pcnt = mh->GetNumParams(adding);
 
+       // crop mode parameter size to 250 characters
+       if (parameter.length() > 250)
+               parameter = parameter.substr(0, 250);
+
        ModResult MOD_RESULT;
        FIRST_MOD_RESULT(OnRawMode, MOD_RESULT, (user, chan, modechar, parameter, adding, pcnt));
 
@@ -291,8 +295,8 @@ ModeAction ModeParser::TryMode(User* user, User* targetuser, Channel* chan, bool
                                ModeHandler* neededmh = NULL;
                                for(char c='A'; c <= 'z'; c++)
                                {
-                                       ModeHandler *privmh = FindMode(modechar, type);
-                                       if (privmh->GetPrefixRank() >= neededrank)
+                                       ModeHandler *privmh = FindMode(c, MODETYPE_CHANNEL);
+                                       if (privmh && privmh->GetPrefixRank() >= neededrank)
                                        {
                                                // this mode is sufficient to allow this action
                                                if (!neededmh || privmh->GetPrefixRank() < neededmh->GetPrefixRank())
@@ -644,6 +648,9 @@ bool ModeParser::AddMode(ModeHandler* mh)
        if ((mh->GetPrefix() == ',') || (mh->GetPrefix() == ':') || (mh->GetPrefix() == '#'))
                return false;
 
+       if (mh->GetPrefix() && FindPrefix(mh->GetPrefix()))
+               return false;
+
        mh->GetModeType() == MODETYPE_USER ? mask = MASK_USER : mask = MASK_CHANNEL;
        pos = (mh->GetModeChar()-65) | mask;