bugfixes and refactoring in game-server
This commit is contained in:
@@ -16,6 +16,7 @@ type GameClaims struct {
|
||||
Player1ID int64 `json:"player1_id"`
|
||||
Player2ID int64 `json:"player2_id"`
|
||||
GameServer string `json:"game_server"`
|
||||
RawToken string `json:"-"`
|
||||
jwt.RegisteredClaims
|
||||
}
|
||||
|
||||
@@ -48,6 +49,28 @@ func ParseGameToken(secret []byte, tokenString string) (*GameClaims, error) {
|
||||
if claims.MatchID == "" {
|
||||
return nil, fmt.Errorf("invalid game token: empty match_id")
|
||||
}
|
||||
if claims.Player1ID <= 0 || claims.Player2ID <= 0 {
|
||||
return nil, fmt.Errorf("invalid game token: player IDs must be positive")
|
||||
}
|
||||
claims.RawToken = tokenString
|
||||
return claims, nil
|
||||
}
|
||||
|
||||
// ParseGameTokenUnverified extracts claims from a game token without verifying
|
||||
// its signature or expiration.
|
||||
func ParseGameTokenUnverified(tokenString string) (*GameClaims, error) {
|
||||
claims := &GameClaims{}
|
||||
_, _, err := jwt.NewParser().ParseUnverified(tokenString, claims)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid game token: %w", err)
|
||||
}
|
||||
if claims.MatchID == "" {
|
||||
return nil, fmt.Errorf("invalid game token: empty match_id")
|
||||
}
|
||||
if claims.Player1ID <= 0 || claims.Player2ID <= 0 {
|
||||
return nil, fmt.Errorf("invalid game token: player IDs must be positive")
|
||||
}
|
||||
claims.RawToken = tokenString
|
||||
return claims, nil
|
||||
}
|
||||
|
||||
@@ -62,5 +85,8 @@ func ParseUserToken(secret []byte, tokenString string) (*UserClaims, error) {
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid user token: %w", err)
|
||||
}
|
||||
if claims.UserID <= 0 {
|
||||
return nil, fmt.Errorf("invalid user token: user_id must be positive")
|
||||
}
|
||||
return claims, nil
|
||||
}
|
||||
|
||||
@@ -63,6 +63,37 @@ func TestParseGameTokenMissingExp(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseGameTokenNonPositiveIDs(t *testing.T) {
|
||||
for _, tc := range [][2]int64{{0, 2}, {-1, 2}, {1, 0}, {1, -5}} {
|
||||
token := sign(t, &GameClaims{
|
||||
MatchID: "m1",
|
||||
Player1ID: tc[0],
|
||||
Player2ID: tc[1],
|
||||
RegisteredClaims: jwt.RegisteredClaims{
|
||||
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour)),
|
||||
},
|
||||
}, secret)
|
||||
if _, err := ParseGameToken(secret, token); err == nil {
|
||||
t.Fatalf("expected error for non-positive IDs: %+v", tc)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseGameTokenUnverified(t *testing.T) {
|
||||
// Works even if expired
|
||||
token := gameToken(t, secret, time.Now().Add(-time.Hour))
|
||||
claims, err := ParseGameTokenUnverified(token)
|
||||
if err != nil {
|
||||
t.Fatalf("parse unverified: %v", err)
|
||||
}
|
||||
if claims.MatchID != "m1" || claims.Player1ID != 1 || claims.Player2ID != 2 {
|
||||
t.Fatalf("unexpected claims: %+v", claims)
|
||||
}
|
||||
if claims.RawToken != token {
|
||||
t.Fatalf("raw token mismatch: got %q, want %q", claims.RawToken, token)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseUserToken(t *testing.T) {
|
||||
token := sign(t, &UserClaims{
|
||||
UserID: 42,
|
||||
@@ -76,3 +107,15 @@ func TestParseUserToken(t *testing.T) {
|
||||
t.Fatalf("user_id = %d, want 42", claims.UserID)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseUserTokenNonPositiveID(t *testing.T) {
|
||||
for _, id := range []int64{0, -1, -99} {
|
||||
token := sign(t, &UserClaims{
|
||||
UserID: id,
|
||||
RegisteredClaims: jwt.RegisteredClaims{ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour))},
|
||||
}, secret)
|
||||
if _, err := ParseUserToken(secret, token); err == nil {
|
||||
t.Fatalf("expected error for user_id = %d", id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user