From eb8f0ac3d81b1ad749c7dec10df731b67a5339fc Mon Sep 17 00:00:00 2001 From: Andreas Neue Date: Thu, 21 Jul 2016 10:30:44 +0200 Subject: [PATCH] Improved client registration handling --- client.go | 30 ++++++++++++++++++++---------- server.go | 18 ++++++++++++------ 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/client.go b/client.go index 57dd817..f239257 100644 --- a/client.go +++ b/client.go @@ -16,13 +16,15 @@ import ( type Client interface { Name() string + Register(bool) Send(*irc.Message) Receive(*irc.Message) - //Register() chan bool Destroy() } type RemoteClient struct { + Registered chan bool + server *Server name string @@ -34,8 +36,8 @@ type RemoteClient struct { isAuthed bool isClosed bool - receive chan *irc.Message - register chan bool + receive chan *irc.Message + registered chan bool conn net.Conn writeq chan string @@ -43,6 +45,7 @@ type RemoteClient struct { func NewRemoteClient(sv *Server, conn net.Conn) *RemoteClient { cl := new(RemoteClient) + cl.server = sv cl.name = "" @@ -50,7 +53,7 @@ func NewRemoteClient(sv *Server, conn net.Conn) *RemoteClient { cl.modes = "" cl.receive = make(chan *irc.Message) - //cl.register = make(chan bool) + cl.registered = make(chan bool) cl.isRegistered = false cl.isAuthed = false @@ -71,6 +74,10 @@ func (cl *RemoteClient) Name() string { return cl.name } +func (cl *RemoteClient) Register(success bool) { + cl.registered <- success +} + func (cl *RemoteClient) Send(msg *irc.Message) { msg.Pre = cl.name cl.server.Dispatch <- msg @@ -116,6 +123,13 @@ func (cl *RemoteClient) dispatch() { select { case msg := <-cl.receive: cl.writeMsg(msg) + case success := <-cl.registered: + if !success { + cl.Destroy() + xlog.Debug("User registration failed: '%s'", cl.name) + return + } + xlog.Debug("User '%s' registered", cl.name) default: continue } @@ -177,6 +191,7 @@ func (cl *RemoteClient) writeLine(format string, a ...interface{}) { func (cl *RemoteClient) handleCmd(s string) { xlog.Debug("handleCmd: [%s] '%s'", cl.name, s) msg := irc.Parse(s) + msg.Cmd = strings.ToUpper(msg.Cmd) if cl.name != "" { cl.Send(msg) return @@ -187,13 +202,8 @@ func (cl *RemoteClient) handleCmd(s string) { cl.password = msg.Args[0] case "NICK": cl.name = msg.Args[0] - if _, exists := cl.server.clients[cl.name]; exists { - cl.Destroy() - xlog.Debug("User registration failed: '%s'", msg.Args[0]) - return - } cl.server.AddClient <- cl - xlog.Debug("User '%s' registered", msg.Args[0]) + case "USER": } } diff --git a/server.go b/server.go index 5a2e493..2743a3a 100644 --- a/server.go +++ b/server.go @@ -121,12 +121,18 @@ func (sv *Server) dispatch() { sv.packetsTransferred++ case cl := <-sv.AddClient: nick := cl.Name() - sv.clients[nick] = cl - sv.sendLogon(cl.Name()) - sv.connectionsCurrent = float64(len(sv.clients)) - xlog.Info("Client registered: '%s'", nick) - xlog.Info("Server has %d client(s)", len(sv.clients)) - xlog.Debug("Goroutines running: %d", runtime.NumGoroutine()) + if _, exists := sv.clients[nick]; exists { + cl.Register(false) + xlog.Info("Client registration failed: '%s'", nick) + } else { + sv.clients[nick] = cl + sv.sendLogon(cl.Name()) + sv.connectionsCurrent = float64(len(sv.clients)) + cl.Register(true) + xlog.Info("Client registered: '%s'", nick) + xlog.Info("Server has %d client(s)", len(sv.clients)) + xlog.Debug("Goroutines running: %d", runtime.NumGoroutine()) + } case cl := <-sv.DelClient: nick := cl.Name() cl.Destroy()