summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Powell <petpow@saberuk.com>2017-11-10 16:03:37 +0000
committerPeter Powell <petpow@saberuk.com>2018-01-06 16:29:18 +0000
commitaa78793b3a8003a248d98c700a1f842fe8a92b47 (patch)
treeda0b0b367f9756fdc54128fdeb9abd442341f944
parent2fcb5ff4389a9a82d253acdff02a388ddcf14653 (diff)
Strip commas from channel keys like Charybdis and others do.
-rw-r--r--src/coremods/core_channel/cmode_k.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/coremods/core_channel/cmode_k.cpp b/src/coremods/core_channel/cmode_k.cpp
index 9bab05200..992fbc1b5 100644
--- a/src/coremods/core_channel/cmode_k.cpp
+++ b/src/coremods/core_channel/cmode_k.cpp
@@ -49,16 +49,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;
}