X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_channel%2Fcmode_k.cpp;h=5f592869a565e347f04917e608bddacc1f1d0005;hb=c71361e8e4f22cb4f72881399bce2832eb080b0e;hp=9bab052005081a370ec6b341fdd18350b928170d;hpb=98372c3cf2c1455e41c388d822876a4d146ae76d;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_channel/cmode_k.cpp b/src/coremods/core_channel/cmode_k.cpp index 9bab05200..5f592869a 100644 --- a/src/coremods/core_channel/cmode_k.cpp +++ b/src/coremods/core_channel/cmode_k.cpp @@ -1,10 +1,14 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2017-2020 Sadie Powell + * Copyright (C) 2013-2015 Attila Molnar + * Copyright (C) 2012 Robby + * Copyright (C) 2009 Uli Schlachter + * Copyright (C) 2009 Robin Burchell * Copyright (C) 2009 Daniel De Graaf - * Copyright (C) 2008 Robin Burchell * Copyright (C) 2007 Dennis Friis - * Copyright (C) 2006 Craig Edwards + * Copyright (C) 2006, 2010 Craig Edwards * * 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 @@ -23,9 +27,12 @@ #include "inspircd.h" #include "core_channel.h" +const std::string::size_type ModeChannelKey::maxkeylen = 32; + ModeChannelKey::ModeChannelKey(Module* Creator) : ParamMode(Creator, "key", 'k', PARAM_ALWAYS) { + syntax = ""; } ModeAction ModeChannelKey::OnModeChange(User* source, User*, Channel* channel, std::string ¶meter, 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; +}