Sanitize names on join and /nick.
This commit is contained in:
parent
69ea63bf88
commit
9335a2139b
|
@ -151,8 +151,7 @@ func InitCommands(c *Commands) {
|
||||||
}
|
}
|
||||||
|
|
||||||
oldId := member.Id()
|
oldId := member.Id()
|
||||||
member.SetId(args[0])
|
member.SetId(SanitizeName(args[0]))
|
||||||
|
|
||||||
err := room.Rename(oldId, member)
|
err := room.Rename(oldId, member)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
member.SetId(oldId)
|
member.SetId(oldId)
|
||||||
|
|
10
chat/room.go
10
chat/room.go
|
@ -14,6 +14,10 @@ const roomBuffer = 10
|
||||||
// closed.
|
// closed.
|
||||||
var ErrRoomClosed = errors.New("room closed")
|
var ErrRoomClosed = errors.New("room closed")
|
||||||
|
|
||||||
|
// The error returned when a user attempts to join with an invalid name, such
|
||||||
|
// as empty string.
|
||||||
|
var ErrInvalidName = errors.New("invalid name")
|
||||||
|
|
||||||
// Member is a User with per-Room metadata attached to it.
|
// Member is a User with per-Room metadata attached to it.
|
||||||
type Member struct {
|
type Member struct {
|
||||||
*User
|
*User
|
||||||
|
@ -128,6 +132,9 @@ func (r *Room) Join(u *User) (*Member, error) {
|
||||||
if r.closed {
|
if r.closed {
|
||||||
return nil, ErrRoomClosed
|
return nil, ErrRoomClosed
|
||||||
}
|
}
|
||||||
|
if u.Id() == "" {
|
||||||
|
return nil, ErrInvalidName
|
||||||
|
}
|
||||||
member := Member{u, false}
|
member := Member{u, false}
|
||||||
err := r.members.Add(&member)
|
err := r.members.Add(&member)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -152,6 +159,9 @@ func (r *Room) Leave(u *User) error {
|
||||||
|
|
||||||
// Rename member with a new identity. This will not call rename on the member.
|
// Rename member with a new identity. This will not call rename on the member.
|
||||||
func (r *Room) Rename(oldId string, identity Identifier) error {
|
func (r *Room) Rename(oldId string, identity Identifier) error {
|
||||||
|
if identity.Id() == "" {
|
||||||
|
return ErrInvalidName
|
||||||
|
}
|
||||||
err := r.members.Replace(oldId, identity)
|
err := r.members.Replace(oldId, identity)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
package chat
|
||||||
|
|
||||||
|
import "regexp"
|
||||||
|
|
||||||
|
var reStripName = regexp.MustCompile("[^\\w.-]")
|
||||||
|
|
||||||
|
// SanitizeName returns a name with only allowed characters.
|
||||||
|
func SanitizeName(s string) string {
|
||||||
|
return reStripName.ReplaceAllString(s, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
var reStripData = regexp.MustCompile("[^[:ascii:]]")
|
||||||
|
|
||||||
|
// SanitizeData returns a string with only allowed characters for client-provided metadata inputs.
|
||||||
|
func SanitizeData(s string) string {
|
||||||
|
return reStripData.ReplaceAllString(s, "")
|
||||||
|
}
|
2
host.go
2
host.go
|
@ -87,7 +87,7 @@ func (h *Host) Connect(term *sshd.Terminal) {
|
||||||
}
|
}
|
||||||
|
|
||||||
member, err := h.Join(user)
|
member, err := h.Join(user)
|
||||||
if err == chat.ErrIdTaken {
|
if err != nil {
|
||||||
// Try again...
|
// Try again...
|
||||||
id.SetName(fmt.Sprintf("Guest%d", h.count))
|
id.SetName(fmt.Sprintf("Guest%d", h.count))
|
||||||
member, err = h.Join(user)
|
member, err = h.Join(user)
|
||||||
|
|
|
@ -18,7 +18,7 @@ type Identity struct {
|
||||||
func NewIdentity(conn sshd.Connection) *Identity {
|
func NewIdentity(conn sshd.Connection) *Identity {
|
||||||
return &Identity{
|
return &Identity{
|
||||||
Connection: conn,
|
Connection: conn,
|
||||||
id: conn.Name(),
|
id: chat.SanitizeName(conn.Name()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue