]> Cypherpunks.ru repositories - goircd.git/commitdiff
Cleaner nickname and channelname validation, not correlated together
authorSergey Matveev <stargrave@stargrave.org>
Tue, 13 May 2014 19:59:09 +0000 (23:59 +0400)
committerSergey Matveev <stargrave@stargrave.org>
Tue, 13 May 2014 19:59:09 +0000 (23:59 +0400)
daemon.go
room.go

index 487e5876ff5605d47db4adb93fd3734238affecf..59d6372b4a64b3e611e28cfd48ac53737ad69e8e 100644 (file)
--- a/daemon.go
+++ b/daemon.go
@@ -35,6 +35,10 @@ const (
        ALIVENESS_CHECK = time.Second * 10  // Client's aliveness check period
 )
 
        ALIVENESS_CHECK = time.Second * 10  // Client's aliveness check period
 )
 
+var (
+       RE_NICKNAME = regexp.MustCompile("^[a-zA-Z0-9-]{1,9}$")
+)
+
 type Daemon struct {
        hostname             string
        motd                 string
 type Daemon struct {
        hostname             string
        motd                 string
@@ -153,19 +157,16 @@ func (daemon *Daemon) ClientRegister(client *Client, command string, cols []stri
                        client.ReplyParts("431", "No nickname given")
                        return
                }
                        client.ReplyParts("431", "No nickname given")
                        return
                }
-               nickname := strings.ToLower(cols[1])
-               nickname_found := false
+               nickname := cols[1]
                for client := range daemon.clients {
                        if client.nickname == nickname {
                for client := range daemon.clients {
                        if client.nickname == nickname {
-                               nickname_found = true
+                               client.ReplyParts("433", "*", nickname, "Nickname is already in use")
+                               return
                        }
                }
                        }
                }
-               if nickname_found {
-                       client.ReplyParts("433", "*", cols[1], "Nickname is already in use")
-                       return
-               }
-               if ok, _ := regexp.MatchString("^[^_-][_a-z0-9-]{1,50}$", nickname); !ok {
+               if !RE_NICKNAME.MatchString(nickname) {
                        client.ReplyParts("432", "*", cols[1], "Erroneous nickname")
                        client.ReplyParts("432", "*", cols[1], "Erroneous nickname")
+                       return
                }
                client.nickname = nickname
        case "USER":
                }
                client.nickname = nickname
        case "USER":
@@ -213,8 +214,7 @@ func (daemon *Daemon) HandlerJoin(client *Client, cmd string) {
                keys = []string{}
        }
        for n, room := range rooms {
                keys = []string{}
        }
        for n, room := range rooms {
-               room, valid := RoomNameSanitize(room)
-               if !valid {
+               if !RoomNameValid(room) {
                        client.ReplyNoChannel(room)
                        continue
                }
                        client.ReplyNoChannel(room)
                        continue
                }
@@ -326,7 +326,7 @@ func (daemon *Daemon) Processor(events chan ClientEvent) {
                                        }
                                        continue
                                }
                                        }
                                        continue
                                }
-                               room, _ := RoomNameSanitize(cols[0])
+                               room := cols[0]
                                r, found := daemon.rooms[room]
                                if !found {
                                        client.ReplyNoChannel(room)
                                r, found := daemon.rooms[room]
                                if !found {
                                        client.ReplyNoChannel(room)
@@ -345,7 +345,6 @@ func (daemon *Daemon) Processor(events chan ClientEvent) {
                                        continue
                                }
                                for _, room := range strings.Split(cols[1], ",") {
                                        continue
                                }
                                for _, room := range strings.Split(cols[1], ",") {
-                                       room, _ = RoomNameSanitize(room)
                                        r, found := daemon.rooms[room]
                                        if !found {
                                                client.ReplyNoChannel(room)
                                        r, found := daemon.rooms[room]
                                        if !found {
                                                client.ReplyNoChannel(room)
@@ -382,7 +381,6 @@ func (daemon *Daemon) Processor(events chan ClientEvent) {
                                if msg != "" {
                                        continue
                                }
                                if msg != "" {
                                        continue
                                }
-                               target, _ = RoomNameSanitize(target)
                                r, found := daemon.rooms[target]
                                if !found {
                                        client.ReplyNoNickChan(target)
                                r, found := daemon.rooms[target]
                                if !found {
                                        client.ReplyNoNickChan(target)
@@ -394,10 +392,9 @@ func (daemon *Daemon) Processor(events chan ClientEvent) {
                                        continue
                                }
                                cols = strings.SplitN(cols[1], " ", 2)
                                        continue
                                }
                                cols = strings.SplitN(cols[1], " ", 2)
-                               room, _ := RoomNameSanitize(cols[0])
-                               r, found := daemon.rooms[room]
+                               r, found := daemon.rooms[cols[0]]
                                if !found {
                                if !found {
-                                       client.ReplyNoChannel(room)
+                                       client.ReplyNoChannel(cols[0])
                                }
                                var change string
                                if len(cols) > 1 {
                                }
                                var change string
                                if len(cols) > 1 {
@@ -411,7 +408,7 @@ func (daemon *Daemon) Processor(events chan ClientEvent) {
                                        client.ReplyNotEnoughParameters("WHO")
                                        continue
                                }
                                        client.ReplyNotEnoughParameters("WHO")
                                        continue
                                }
-                               room, _ := RoomNameSanitize(strings.Split(cols[1], " ")[0])
+                               room := strings.Split(cols[1], " ")[0]
                                r, found := daemon.rooms[room]
                                if !found {
                                        client.ReplyNoChannel(room)
                                r, found := daemon.rooms[room]
                                if !found {
                                        client.ReplyNoChannel(room)
diff --git a/room.go b/room.go
index 9e1900206c71bc6be54af15526458798d6deb199..f92d0e6b08811f89758111420da09ba80204416c 100644 (file)
--- a/room.go
+++ b/room.go
@@ -25,12 +25,14 @@ import (
        "strings"
 )
 
        "strings"
 )
 
+var (
+       RE_ROOM = regexp.MustCompile("^#[^\x00\x07\x0a\x0d ,:/]{1,200}$")
+)
+
 // Sanitize room's name. It can consist of 1 to 50 ASCII symbols
 // with some exclusions. All room names will have "#" prefix.
 // Sanitize room's name. It can consist of 1 to 50 ASCII symbols
 // with some exclusions. All room names will have "#" prefix.
-func RoomNameSanitize(name string) (n string, valid bool) {
-       n = strings.TrimLeft(strings.ToLower(name), "&#+!")
-       valid, _ = regexp.MatchString("^[^\x00\x07\x0a\x0d ,:/]{1,50}$", n)
-       return "#" + n, valid
+func RoomNameValid(name string) bool {
+       return RE_ROOM.MatchString(name)
 }
 
 type Room struct {
 }
 
 type Room struct {