mirror of
https://github.com/ergochat/ergo.git
synced 2024-11-25 21:39:25 +01:00
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.
This commit is contained in:
parent
c99b2be403
commit
6851901e20
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user