summaryrefslogtreecommitdiff
path: root/server/channel/channel.go
diff options
context:
space:
mode:
authorcitrons <citrons@mondecitronne.com>2025-05-28 21:10:14 -0500
committercitrons <citrons@mondecitronne.com>2025-05-30 17:46:46 -0500
commit7154df4f7bd86fd38aaa00a9bb35f9e97091f168 (patch)
tree6cae1e6c20e46013436f62a46e386892e4ef1a90 /server/channel/channel.go
parentde8c07cfd24a75b72decfb51f3bed5233ad5bcce (diff)
validation and casefolding of names
Diffstat (limited to 'server/channel/channel.go')
-rw-r--r--server/channel/channel.go29
1 files changed, 22 insertions, 7 deletions
diff --git a/server/channel/channel.go b/server/channel/channel.go
index 9a3134e..69f2400 100644
--- a/server/channel/channel.go
+++ b/server/channel/channel.go
@@ -4,6 +4,7 @@ import (
"citrons.xyz/talk/proto"
"citrons.xyz/talk/server/object"
"citrons.xyz/talk/server/session"
+ "citrons.xyz/talk/server/validate"
"citrons.xyz/talk/server/user"
)
@@ -35,11 +36,16 @@ func NewStore(world *object.World) *ChannelStore {
}
func (cs *ChannelStore) CreateChannel(name string) (*Channel, *proto.Fail) {
- if cs.byName[name] != nil {
+ if cs.ByName(name) != nil {
return nil, &proto.Fail {
"name-taken", "", map[string]string {"": name},
}
}
+ if !validate.Name(name) {
+ return nil, &proto.Fail {
+ "invalid-name", "", map[string]string {"": name},
+ }
+ }
var c Channel
c.store = cs
c.name = name
@@ -47,13 +53,13 @@ func (cs *ChannelStore) CreateChannel(name string) (*Channel, *proto.Fail) {
c.byId = make(map[string]int)
c.defaultMembership = DefaultMembership
- cs.byName[name] = &c
+ cs.byName[validate.Fold(name)] = &c
c.id = cs.world.NewObject(&c)
return &c, nil
}
func (cs *ChannelStore) ByName(name string) *Channel {
- return cs.byName[name]
+ return cs.byName[validate.Fold(name)]
}
func (c *Channel) Name() string {
@@ -65,13 +71,22 @@ func (c *Channel) Id() string {
}
func (c *Channel) Rename(name string) *proto.Fail {
- if c.store.byName[name] != nil {
+ if !validate.Name(name) {
+ return &proto.Fail {
+ "invalid-name", "", map[string]string {"": name},
+ }
+ }
+ if validate.Fold(name) == validate.Fold(c.name) {
+ c.name = name
+ return nil
+ }
+ if c.store.ByName(name) != nil {
return &proto.Fail {
"name-taken", "", map[string]string {"": name},
}
}
- c.store.byName[c.name] = nil
- c.store.byName[name] = c
+ c.store.byName[validate.Fold(c.name)] = nil
+ c.store.byName[validate.Fold(name)] = c
c.name = name
return nil
}
@@ -144,7 +159,7 @@ func (c *Channel) Delete() {
default:
}
}
- delete(c.store.byName, c.name)
+ delete(c.store.byName, validate.Fold(c.name))
c.store.world.RemoveObject(c.id)
deleted := Tombstone {c.name}