diff options
Diffstat (limited to 'server/user.go')
| -rw-r--r-- | server/user.go | 68 |
1 files changed, 61 insertions, 7 deletions
diff --git a/server/user.go b/server/user.go index f69d126..5d2731c 100644 --- a/server/user.go +++ b/server/user.go @@ -1,6 +1,7 @@ package server import ( + "log" "net" "go.rctt.net/solec/core" @@ -11,9 +12,9 @@ type User struct { Conns map[net.Conn]struct{} } -func NewUser(conn net.Conn, auth core.Auth) User { +func NewUser(conn net.Conn, name string) User { u := User{ - Name: auth.Name, + Name: name, Conns: make(map[net.Conn]struct{}), } @@ -31,12 +32,65 @@ func (u *User) Send(payload core.Wrapper) error { return nil } -func (u *User) Auth(pass string) error { - // TODO: Implement auth +func (s *Server) handleUserConn(conn net.Conn) { + name, err := s.performUserAuth(conn) + if err != nil { + log.Println("user auth error:", err) + return + } - if pass != "valid" { - return core.ErrAuthInvalidPassword + s.usersMu.Lock() + user, ok := s.users[name] + if ok { + log.Println("next connection from user:", user.Name) + user.Conns[conn] = struct{}{} + } else { + log.Println("initial connection from user:", name) + user = NewUser(conn, name) + s.users[name] = user } + s.usersMu.Unlock() - return nil + defer func() { + s.usersMu.Lock() + log.Println("client disconnected: ", user.Name) + delete(s.users[user.Name].Conns, conn) + if len(s.users[user.Name].Conns) == 0 { + log.Println("all connections closed for user:", user.Name) + delete(s.users, user.Name) + } + s.usersMu.Unlock() + }() + + if err := s.readInput(conn); err != nil { + log.Println(err) + } +} + +func (s *Server) performUserAuth(conn net.Conn) (string, error) { + clientPayload, err := core.Decode(conn) + if err != nil { + return "", err + } + + clientAuth, ok := clientPayload.(core.UserAuth) + if !ok { + return "", core.ErrUnexpectedPayloadType + } + + // For testing --- + if clientAuth.Pass != "valid" { + if err := core.Send(conn, core.Error{core.ErrorAuthFailed}); err != nil { + log.Println("cannot send auth error:", err) + } + + return "", core.ErrAuthInvalidPassword + } + // --- + + if err := core.Send(conn, core.Success{}); err != nil { + return "", err + } + + return clientAuth.Name, nil } |
