diff --git a/irc/channel.go b/irc/channel.go index 55b2e637..a121847f 100644 --- a/irc/channel.go +++ b/irc/channel.go @@ -270,8 +270,8 @@ func (channel *Channel) SetTopic(client *Client, topic string) { return } - if len(topic) > client.server.limits.Topic { - topic = topic[:client.server.limits.Topic] + if len(topic) > client.server.limits.TopicLen { + topic = topic[:client.server.limits.TopicLen] } channel.topic = topic @@ -482,8 +482,8 @@ func (channel *Channel) Kick(client *Client, target *Client, comment string) { return } - if len(comment) > client.server.limits.Kick { - comment = comment[:client.server.limits.Kick] + if len(comment) > client.server.limits.KickLen { + comment = comment[:client.server.limits.KickLen] } for member := range channel.members { diff --git a/irc/config.go b/irc/config.go index 22d267e6..cf335d6d 100644 --- a/irc/config.go +++ b/irc/config.go @@ -97,6 +97,7 @@ type Config struct { Limits struct { NickLen int `yaml:"nicklen"` ChannelLen int `yaml:"channellen"` + AwayLen int `yaml:"awaylen"` KickLen int `yaml:"kicklen"` TopicLen int `yaml:"topiclen"` WhowasEntries uint `yaml:"whowas-entries"` @@ -157,7 +158,7 @@ func LoadConfig(filename string) (config *Config, err error) { if len(config.Server.Listen) == 0 { return nil, errors.New("Server listening addresses missing") } - if config.Limits.NickLen < 1 || config.Limits.ChannelLen < 2 || config.Limits.TopicLen < 1 { + if config.Limits.NickLen < 1 || config.Limits.ChannelLen < 2 || config.Limits.AwayLen < 1 || config.Limits.TopicLen < 1 || config.Limits.TopicLen < 1 { return nil, errors.New("Limits aren't setup properly, check them and make them sane") } return config, nil diff --git a/irc/server.go b/irc/server.go index e84b81d1..7daa3ad2 100644 --- a/irc/server.go +++ b/irc/server.go @@ -28,8 +28,9 @@ import ( // Limits holds the maximum limits for various things such as topic lengths type Limits struct { - Kick int - Topic int + AwayLen int + KickLen int + TopicLen int } type Server struct { @@ -81,8 +82,9 @@ func NewServer(config *Config) *Server { db: OpenDB(config.Datastore.SQLitePath), idle: make(chan *Client), limits: Limits{ - Kick: config.Limits.KickLen, - Topic: config.Limits.TopicLen, + AwayLen: config.Limits.AwayLen, + KickLen: config.Limits.KickLen, + TopicLen: config.Limits.TopicLen, }, name: NewName(config.Server.Name), nameString: NewName(config.Server.Name).String(), @@ -169,13 +171,14 @@ func NewServer(config *Config) *Server { // add RPL_ISUPPORT tokens server.isupport = NewISupportList() + server.isupport.Add("AWAYLEN", strconv.Itoa(server.limits.AwayLen)) server.isupport.Add("CASEMAPPING", "ascii") // server.isupport.Add("CHANMODES", "") //TODO(dan): Channel mode list here server.isupport.Add("CHANNELLEN", strconv.Itoa(config.Limits.ChannelLen)) server.isupport.Add("CHANTYPES", "#") server.isupport.Add("EXCEPTS", "") server.isupport.Add("INVEX", "") - server.isupport.Add("KICKLEN", strconv.Itoa(server.limits.Kick)) + server.isupport.Add("KICKLEN", strconv.Itoa(server.limits.KickLen)) // server.isupport.Add("MAXLIST", "") //TODO(dan): Support max list length? // server.isupport.Add("MODES", "") //TODO(dan): Support max modes? server.isupport.Add("NETWORK", config.Network.Name) @@ -183,7 +186,7 @@ func NewServer(config *Config) *Server { server.isupport.Add("PREFIX", "(qaohv)~&@%+") // server.isupport.Add("STATUSMSG", "@+") //TODO(dan): Support STATUSMSG // server.isupport.Add("TARGMAX", "") //TODO(dan): Support this - server.isupport.Add("TOPICLEN", strconv.Itoa(server.limits.Topic)) + server.isupport.Add("TOPICLEN", strconv.Itoa(server.limits.TopicLen)) // account registration if server.accountRegistration.Enabled { @@ -816,6 +819,9 @@ func awayHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool { if len(msg.Params) > 0 { isAway = true text = msg.Params[0] + if len(text) > server.limits.AwayLen { + text = text[:server.limits.AwayLen] + } } if isAway { diff --git a/oragono.yaml b/oragono.yaml index 81da4b81..36fd0df3 100644 --- a/oragono.yaml +++ b/oragono.yaml @@ -87,6 +87,9 @@ limits: # channellen is the max channel length allowed channellen: 64 + # awaylen is the maximum length of an away message + awaylen: 200 + # kicklen is the maximum length of a kick message kicklen: 390