Shivaram Lingamneni 4 роки тому
джерело
коміт
2f9234318c
2 змінених файлів з 21 додано та 6 видалено
  1. 6
    4
      irc/channel.go
  2. 15
    2
      irc/modes.go

+ 6
- 4
irc/channel.go Переглянути файл

@@ -564,7 +564,12 @@ func (channel *Channel) hasClient(client *Client) bool {
564 564
 
565 565
 // <mode> <mode params>
566 566
 func (channel *Channel) modeStrings(client *Client) (result []string) {
567
-	isMember := client.HasMode(modes.Operator) || channel.hasClient(client)
567
+	hasPrivs := client.HasMode(modes.Operator)
568
+
569
+	channel.stateMutex.RLock()
570
+	defer channel.stateMutex.RUnlock()
571
+
572
+	isMember := hasPrivs || channel.members[client] != nil
568 573
 	showKey := isMember && (channel.key != "")
569 574
 	showUserLimit := channel.userLimit > 0
570 575
 
@@ -580,9 +585,6 @@ func (channel *Channel) modeStrings(client *Client) (result []string) {
580 585
 
581 586
 	mods += channel.flags.String()
582 587
 
583
-	channel.stateMutex.RLock()
584
-	defer channel.stateMutex.RUnlock()
585
-
586 588
 	result = []string{mods}
587 589
 
588 590
 	// args for flags with args: The order must match above to keep

+ 15
- 2
irc/modes.go Переглянути файл

@@ -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)

Завантаження…
Відмінити
Зберегти