diff --git a/cache.go b/cache.go index 99d4d68..baa4cf5 100644 --- a/cache.go +++ b/cache.go @@ -7,32 +7,27 @@ import ( var ( mu sync.RWMutex - clients = make(map[uint32]Client) - ChatGroups = make(map[uint32]ChatGroup) - ClientsMap = make(map[uint32]map[uint32]*Client) + clients = make(map[uint32]*Client) + chatGroups = make(map[uint32]ChatGroup) ) func AddGroupToCache(chatGroup *ChatGroup) { mu.Lock() defer mu.Unlock() - ChatGroups[chatGroup.Id] = *chatGroup - ClientsMap[chatGroup.Id] = make(map[uint32]*Client) + chatGroups[chatGroup.Id] = *chatGroup } func RemoveGroupFromCache(chatGroup *ChatGroup) { mu.Lock() defer mu.Unlock() - delete(ChatGroups, chatGroup.Id) - delete(ClientsMap, chatGroup.Id) + delete(chatGroups, chatGroup.Id) } func AddClientConnectionsToCache(client *Client) { mu.Lock() defer mu.Unlock() for _, groupIn := range client.Groups { - if clients, ok := ClientsMap[groupIn.Id]; ok { - clients[client.Id] = client - } + chatGroups[groupIn.Id].Members[client.Id] = client } } @@ -40,16 +35,14 @@ func RemoveClientConnectionsToCache(client *Client) { mu.Lock() defer mu.Unlock() for _, groupIn := range client.Groups { - if clients, ok := ClientsMap[groupIn.Id]; ok { - delete(clients, client.Id) - } + delete(chatGroups[groupIn.Id].Members, client.Id) } } func GetClientFromId(id uint32) (*Client, error) { - client, ok := &clients[id] + client, ok := clients[id] if !ok { - return nil, errors.New("No such user") + return nil, errors.New("no such user") } return client, nil } diff --git a/http.go b/http.go new file mode 100644 index 0000000..a694a25 --- /dev/null +++ b/http.go @@ -0,0 +1,19 @@ +package main + +import "net/http" + +func isMethodAllowed(response *http.ResponseWriter, request *http.Request) bool { + if request.Method != http.MethodPost { + http.Error(*response, "POST only", http.StatusMethodNotAllowed) + return false + } + return true +} + +func RegisterHandler(response http.ResponseWriter, request *http.Request) { + if !isMethodAllowed(&response, request) { + return + } + + ctx := request.Context() +} diff --git a/struct.go b/struct.go index c748b30..7ea3473 100644 --- a/struct.go +++ b/struct.go @@ -15,7 +15,7 @@ type Client struct { type ChatGroup struct { Name string - Members [32]*Client Id uint32 + Members map[uint32]*Client Color [3]byte } diff --git a/tokens.go b/tokens.go index 1690e49..8dc4506 100644 --- a/tokens.go +++ b/tokens.go @@ -20,8 +20,8 @@ func GetToken(client *Client) (string, error) { return token.SignedString(secretKey) } -func GetClientIdFromToken(token *string) (uint32, error) { - parsed, err := jwt.ParseWithClaims(*token, &jwt.RegisteredClaims{}, func(t *jwt.Token) (any, error) { +func GetClientIdFromToken(token string) (uint32, error) { + parsed, err := jwt.ParseWithClaims(token, &jwt.RegisteredClaims{}, func(t *jwt.Token) (any, error) { if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { return nil, jwt.ErrSignatureInvalid } diff --git a/wsServer.go b/wsServer.go index 112a6eb..9c0f013 100644 --- a/wsServer.go +++ b/wsServer.go @@ -68,7 +68,7 @@ func handleUnauthenticatedMessage(conn *websocket.Conn, client *Client, message return false } - err := SetClientFromToken(client, token) + clientId, err := GetClientIdFromToken(token) if err != nil { var errmsg = map[string]any{ "type": WSServerResponse(InvalidCredentials), @@ -77,6 +77,17 @@ func handleUnauthenticatedMessage(conn *websocket.Conn, client *Client, message sendMessageCloseIfTimeout(conn, &errmsg) return false } + + client, err = GetClientFromId(clientId) + if err != nil { + var errmsg = map[string]any{ + "type": WSServerResponse(InvalidCredentials), + "message": "bad token", + } + sendMessageCloseIfTimeout(conn, &errmsg) + return false + } + client.IsAuthenticated = true return true }