diff --git a/irc/chanserv.go b/irc/chanserv.go index adc1845c..e1d690d0 100644 --- a/irc/chanserv.go +++ b/irc/chanserv.go @@ -293,16 +293,17 @@ func csOpHandler(server *Server, client *Client, command string, params []string } func csRegisterHandler(server *Server, client *Client, command string, params []string, rb *ResponseBuffer) { - channelName := params[0] - - channelKey, err := CasefoldChannel(channelName) - if err != nil { - csNotice(rb, client.t("Channel name is not valid")) + if server.Config().Channels.Registration.OperatorOnly && !client.HasRoleCapabs("chanreg") { + csNotice(rb, client.t("Channel registration is restricted to server operators")) return } - - channelInfo := server.channels.Get(channelKey) - if channelInfo == nil || !channelInfo.ClientIsAtLeast(client, modes.ChannelOperator) { + channelName := params[0] + channelInfo := server.channels.Get(channelName) + if channelInfo == nil { + csNotice(rb, client.t("No such channel")) + return + } + if !channelInfo.ClientIsAtLeast(client, modes.ChannelOperator) { csNotice(rb, client.t("You must be an oper on the channel to register it")) return } @@ -313,7 +314,7 @@ func csRegisterHandler(server *Server, client *Client, command string, params [] } // this provides the synchronization that allows exactly one registration of the channel: - err = server.channels.SetRegistered(channelKey, account) + err := server.channels.SetRegistered(channelName, account) if err != nil { csNotice(rb, err.Error()) return diff --git a/irc/config.go b/irc/config.go index e843f445..6912df7c 100644 --- a/irc/config.go +++ b/irc/config.go @@ -385,12 +385,6 @@ func (cm *Casemapping) UnmarshalYAML(unmarshal func(interface{}) error) (err err return nil } -// ChannelRegistrationConfig controls channel registration. -type ChannelRegistrationConfig struct { - Enabled bool - MaxChannelsPerAccount int `yaml:"max-channels-per-account"` -} - // OperClassConfig defines a specific operator class. type OperClassConfig struct { Title string @@ -534,7 +528,11 @@ type Config struct { defaultModes modes.Modes MaxChannelsPerClient int `yaml:"max-channels-per-client"` OpOnlyCreation bool `yaml:"operator-only-creation"` - Registration ChannelRegistrationConfig + Registration struct { + Enabled bool + OperatorOnly bool `yaml:"operator-only"` + MaxChannelsPerAccount int `yaml:"max-channels-per-account"` + } } OperClasses map[string]*OperClassConfig `yaml:"oper-classes"` diff --git a/oragono.yaml b/oragono.yaml index 048fcfc9..f57151e3 100644 --- a/oragono.yaml +++ b/oragono.yaml @@ -472,6 +472,10 @@ channels: # can users register new channels? enabled: true + # restrict new channel registrations to operators only? + # (operators can then transfer channels to regular users using /CS TRANSFER) + operator-only: false + # how many channels can each account register? max-channels-per-account: 15