Parcourir la source

fix #1756

A default channel mode of +i would block channel creation; fix this by treating
initial joins as SAJOINs.

Note that it's nontrivial to detect initial join in (*Channel).Join, because
having 0 members does not necessarily indicate a new channel.
tags/v2.8.0-rc1
Shivaram Lingamneni il y a 2 ans
Parent
révision
6851901e20
1 fichiers modifiés avec 8 ajouts et 6 suppressions
  1. 8
    6
      irc/channelmanager.go

+ 8
- 6
irc/channelmanager.go Voir le fichier

117
 		return errNoSuchChannel, ""
117
 		return errNoSuchChannel, ""
118
 	}
118
 	}
119
 
119
 
120
-	channel, err := func() (*Channel, error) {
120
+	channel, err, newChannel := func() (*Channel, error, bool) {
121
+		var newChannel bool
121
 		cm.Lock()
122
 		cm.Lock()
122
 		defer cm.Unlock()
123
 		defer cm.Unlock()
123
 
124
 
124
 		if cm.purgedChannels.Has(casefoldedName) {
125
 		if cm.purgedChannels.Has(casefoldedName) {
125
-			return nil, errChannelPurged
126
+			return nil, errChannelPurged, false
126
 		}
127
 		}
127
 		entry := cm.chans[casefoldedName]
128
 		entry := cm.chans[casefoldedName]
128
 		if entry == nil {
129
 		if entry == nil {
130
 			// enforce OpOnlyCreation
131
 			// enforce OpOnlyCreation
131
 			if !registered && server.Config().Channels.OpOnlyCreation &&
132
 			if !registered && server.Config().Channels.OpOnlyCreation &&
132
 				!(isSajoin || client.HasRoleCapabs("chanreg")) {
133
 				!(isSajoin || client.HasRoleCapabs("chanreg")) {
133
-				return nil, errInsufficientPrivs
134
+				return nil, errInsufficientPrivs, false
134
 			}
135
 			}
135
 			// enforce confusables
136
 			// enforce confusables
136
 			if !registered && (cm.chansSkeletons.Has(skeleton) || cm.registeredSkeletons.Has(skeleton)) {
137
 			if !registered && (cm.chansSkeletons.Has(skeleton) || cm.registeredSkeletons.Has(skeleton)) {
137
-				return nil, errConfusableIdentifier
138
+				return nil, errConfusableIdentifier, false
138
 			}
139
 			}
139
 			entry = &channelManagerEntry{
140
 			entry = &channelManagerEntry{
140
 				channel:      NewChannel(server, name, casefoldedName, registered),
141
 				channel:      NewChannel(server, name, casefoldedName, registered),
149
 				entry.skeleton = skeleton
150
 				entry.skeleton = skeleton
150
 			}
151
 			}
151
 			cm.chans[casefoldedName] = entry
152
 			cm.chans[casefoldedName] = entry
153
+			newChannel = true
152
 		}
154
 		}
153
 		entry.pendingJoins += 1
155
 		entry.pendingJoins += 1
154
-		return entry.channel, nil
156
+		return entry.channel, nil, newChannel
155
 	}()
157
 	}()
156
 
158
 
157
 	if err != nil {
159
 	if err != nil {
159
 	}
161
 	}
160
 
162
 
161
 	channel.EnsureLoaded()
163
 	channel.EnsureLoaded()
162
-	err, forward = channel.Join(client, key, isSajoin, rb)
164
+	err, forward = channel.Join(client, key, isSajoin || newChannel, rb)
163
 
165
 
164
 	cm.maybeCleanup(channel, true)
166
 	cm.maybeCleanup(channel, true)
165
 
167
 

Chargement…
Annuler
Enregistrer