3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-25 21:39:25 +01:00
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.
This commit is contained in:
Shivaram Lingamneni 2021-07-15 05:59:45 -04:00
parent c99b2be403
commit 6851901e20

View File

@ -117,12 +117,13 @@ func (cm *ChannelManager) Join(client *Client, name string, key string, isSajoin
return errNoSuchChannel, "" return errNoSuchChannel, ""
} }
channel, err := func() (*Channel, error) { channel, err, newChannel := func() (*Channel, error, bool) {
var newChannel bool
cm.Lock() cm.Lock()
defer cm.Unlock() defer cm.Unlock()
if cm.purgedChannels.Has(casefoldedName) { if cm.purgedChannels.Has(casefoldedName) {
return nil, errChannelPurged return nil, errChannelPurged, false
} }
entry := cm.chans[casefoldedName] entry := cm.chans[casefoldedName]
if entry == nil { if entry == nil {
@ -130,11 +131,11 @@ func (cm *ChannelManager) Join(client *Client, name string, key string, isSajoin
// enforce OpOnlyCreation // enforce OpOnlyCreation
if !registered && server.Config().Channels.OpOnlyCreation && if !registered && server.Config().Channels.OpOnlyCreation &&
!(isSajoin || client.HasRoleCapabs("chanreg")) { !(isSajoin || client.HasRoleCapabs("chanreg")) {
return nil, errInsufficientPrivs return nil, errInsufficientPrivs, false
} }
// enforce confusables // enforce confusables
if !registered && (cm.chansSkeletons.Has(skeleton) || cm.registeredSkeletons.Has(skeleton)) { if !registered && (cm.chansSkeletons.Has(skeleton) || cm.registeredSkeletons.Has(skeleton)) {
return nil, errConfusableIdentifier return nil, errConfusableIdentifier, false
} }
entry = &channelManagerEntry{ entry = &channelManagerEntry{
channel: NewChannel(server, name, casefoldedName, registered), channel: NewChannel(server, name, casefoldedName, registered),
@ -149,9 +150,10 @@ func (cm *ChannelManager) Join(client *Client, name string, key string, isSajoin
entry.skeleton = skeleton entry.skeleton = skeleton
} }
cm.chans[casefoldedName] = entry cm.chans[casefoldedName] = entry
newChannel = true
} }
entry.pendingJoins += 1 entry.pendingJoins += 1
return entry.channel, nil return entry.channel, nil, newChannel
}() }()
if err != nil { if err != nil {
@ -159,7 +161,7 @@ func (cm *ChannelManager) Join(client *Client, name string, key string, isSajoin
} }
channel.EnsureLoaded() channel.EnsureLoaded()
err, forward = channel.Join(client, key, isSajoin, rb) err, forward = channel.Join(client, key, isSajoin || newChannel, rb)
cm.maybeCleanup(channel, true) cm.maybeCleanup(channel, true)