]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/coremods/core_channel/cmode_k.cpp
Fix incorrect ModResult for noctcp user target.
[user/henk/code/inspircd.git] / src / coremods / core_channel / cmode_k.cpp
index 9bab052005081a370ec6b341fdd18350b928170d..43f41ddfd2bed788841761ce6527367d7b841647 100644 (file)
@@ -23,6 +23,8 @@
 #include "inspircd.h"
 #include "core_channel.h"
 
+const std::string::size_type ModeChannelKey::maxkeylen = 32;
+
 ModeChannelKey::ModeChannelKey(Module* Creator)
        : ParamMode<ModeChannelKey, LocalStringExt>(Creator, "key", 'k', PARAM_ALWAYS)
 {
@@ -49,16 +51,29 @@ ModeAction ModeChannelKey::OnModeChange(User* source, User*, Channel* channel, s
                }
        }
 
-       channel->SetMode(this, adding);
        if (adding)
        {
+               // When joining a channel multiple keys are delimited with a comma so we strip
+               // them out here to avoid creating channels that are unjoinable.
+               size_t commapos;
+               while ((commapos = parameter.find(',')) != std::string::npos)
+                       parameter.erase(commapos, 1);
+
+               // Truncate the parameter to the maximum key length.
                if (parameter.length() > maxkeylen)
                        parameter.erase(maxkeylen);
+
+               // If the password is empty here then it only consisted of commas. This is not
+               // acceptable so we reject the mode change.
+               if (parameter.empty())
+                       return MODEACTION_DENY;
+
                ext.set(channel, parameter);
        }
        else
                ext.unset(channel);
 
+       channel->SetMode(this, adding);
        return MODEACTION_ALLOW;
 }
 
@@ -72,3 +87,8 @@ ModeAction ModeChannelKey::OnSet(User* source, Channel* chan, std::string& param
        // Dummy function, never called
        return MODEACTION_DENY;
 }
+
+bool ModeChannelKey::IsParameterSecret()
+{
+       return true;
+}