summaryrefslogtreecommitdiffstats
path: root/server/user.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/user.go')
-rw-r--r--server/user.go68
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
}