Sanitize names on join and /nick.

This commit is contained in:
Andrey Petrov 2015-01-19 23:15:27 -08:00
parent 69ea63bf88
commit 9335a2139b
5 changed files with 30 additions and 4 deletions

View File

@ -151,8 +151,7 @@ func InitCommands(c *Commands) {
}
oldId := member.Id()
member.SetId(args[0])
member.SetId(SanitizeName(args[0]))
err := room.Rename(oldId, member)
if err != nil {
member.SetId(oldId)

View File

@ -14,6 +14,10 @@ const roomBuffer = 10
// 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.
type Member struct {
*User
@ -128,6 +132,9 @@ func (r *Room) Join(u *User) (*Member, error) {
if r.closed {
return nil, ErrRoomClosed
}
if u.Id() == "" {
return nil, ErrInvalidName
}
member := Member{u, false}
err := r.members.Add(&member)
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.
func (r *Room) Rename(oldId string, identity Identifier) error {
if identity.Id() == "" {
return ErrInvalidName
}
err := r.members.Replace(oldId, identity)
if err != nil {
return err

17
chat/sanitize.go Normal file
View File

@ -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, "")
}

View File

@ -87,7 +87,7 @@ func (h *Host) Connect(term *sshd.Terminal) {
}
member, err := h.Join(user)
if err == chat.ErrIdTaken {
if err != nil {
// Try again...
id.SetName(fmt.Sprintf("Guest%d", h.count))
member, err = h.Join(user)

View File

@ -18,7 +18,7 @@ type Identity struct {
func NewIdentity(conn sshd.Connection) *Identity {
return &Identity{
Connection: conn,
id: conn.Name(),
id: chat.SanitizeName(conn.Name()),
}
}