|
@@ -134,6 +134,15 @@ func ParseDefaultUserModes(rawModes *string) modes.ModeChanges {
|
134
|
134
|
return modeChanges
|
135
|
135
|
}
|
136
|
136
|
|
|
137
|
+// #1021: channel key must be valid as a non-final parameter
|
|
138
|
+func validateChannelKey(key string) bool {
|
|
139
|
+ // empty string is valid in this context because it unsets the mode
|
|
140
|
+ if len(key) == 0 {
|
|
141
|
+ return true
|
|
142
|
+ }
|
|
143
|
+ return key[0] != ':' && strings.IndexByte(key, ' ') == -1
|
|
144
|
+}
|
|
145
|
+
|
137
|
146
|
// ApplyChannelModeChanges applies a given set of mode changes.
|
138
|
147
|
func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, changes modes.ModeChanges, rb *ResponseBuffer) (applied modes.ModeChanges) {
|
139
|
148
|
// so we only output one warning for each list type when full
|
|
@@ -244,8 +253,12 @@ func (channel *Channel) ApplyChannelModeChanges(client *Client, isSamode bool, c
|
244
|
253
|
case modes.Key:
|
245
|
254
|
switch change.Op {
|
246
|
255
|
case modes.Add:
|
247
|
|
- channel.setKey(change.Arg)
|
248
|
|
- applied = append(applied, change)
|
|
256
|
+ if validateChannelKey(change.Arg) {
|
|
257
|
+ channel.setKey(change.Arg)
|
|
258
|
+ applied = append(applied, change)
|
|
259
|
+ } else {
|
|
260
|
+ rb.Add(nil, client.server.name, ERR_INVALIDMODEPARAM, details.nick, "*", fmt.Sprintf(client.t("Invalid mode %[1]s parameter: %[2]s"), string(change.Mode), change.Arg))
|
|
261
|
+ }
|
249
|
262
|
case modes.Remove:
|
250
|
263
|
channel.setKey("")
|
251
|
264
|
applied = append(applied, change)
|