]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/coremods/core_channel/cmode_k.cpp
Fix some confusing logic in sanick.
[user/henk/code/inspircd.git] / src / coremods / core_channel / cmode_k.cpp
index 9bab052005081a370ec6b341fdd18350b928170d..5f592869a565e347f04917e608bddacc1f1d0005 100644 (file)
@@ -1,10 +1,14 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
+ *   Copyright (C) 2017-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013-2015 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2012 Robby <robby@chatbelgie.be>
+ *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
+ *   Copyright (C) 2009 Robin Burchell <robin+git@viroteck.net>
  *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- *   Copyright (C) 2006 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2006, 2010 Craig Edwards <brain@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 #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)
 {
+       syntax = "<key>";
 }
 
 ModeAction ModeChannelKey::OnModeChange(User* source, User*, Channel* channel, std::string &parameter, bool adding)
@@ -38,7 +45,8 @@ ModeAction ModeChannelKey::OnModeChange(User* source, User*, Channel* channel, s
                        return MODEACTION_DENY;
                if (exists && (parameter != *key))
                {
-                       /* Key is currently set and the correct key wasnt given */
+                       /* Key is currently set and the correct key wasn't given */
+                       source->WriteNumeric(ERR_KEYSET, channel->name, "Channel key already set");
                        return MODEACTION_DENY;
                }
        } else {
@@ -49,16 +57,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 +93,8 @@ ModeAction ModeChannelKey::OnSet(User* source, Channel* chan, std::string& param
        // Dummy function, never called
        return MODEACTION_DENY;
 }
+
+bool ModeChannelKey::IsParameterSecret()
+{
+       return true;
+}