Skip to content

Commit 7e9f930

Browse files
authored
allow auth during join room (#150)
* allow auth during join room * linter
1 parent 15d1bfa commit 7e9f930

File tree

1 file changed

+25
-39
lines changed

1 file changed

+25
-39
lines changed

internal/lobbyServer/lobby.go

Lines changed: 25 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -245,15 +245,21 @@ func (s *LobbyServer) watchGameServer(name string, g *gameserver.GameServer) {
245245
}
246246
}
247247

248-
func (s *LobbyServer) validateAuth(receivedMessage SocketMessage) error {
248+
func (s *LobbyServer) validateAuth(receivedMessage SocketMessage) (int, error) {
249+
if receivedMessage.NetplayVersion != NetplayAPIVersion {
250+
return MismatchVersion, fmt.Errorf("client and server not at same API version, please update your emulator")
251+
} else if receivedMessage.Emulator == "" {
252+
return BadEmulator, fmt.Errorf("emulator name cannot be empty")
253+
}
254+
249255
if !s.EnableAuth {
250-
return nil
256+
return Accepted, nil
251257
}
252258

253259
now := time.Now().UTC()
254260
timeAsInt, err := strconv.ParseInt(receivedMessage.AuthTime, 10, 64)
255261
if err != nil {
256-
return fmt.Errorf("could not parse time for authentication")
262+
return BadAuth, fmt.Errorf("could not parse time for authentication")
257263
}
258264
receivedTime := time.UnixMilli(timeAsInt).UTC()
259265

@@ -262,22 +268,22 @@ func (s *LobbyServer) validateAuth(receivedMessage SocketMessage) error {
262268
maxAllowableDifference := 15 * time.Minute
263269

264270
if absTimeDifference > maxAllowableDifference {
265-
return fmt.Errorf("clock skew detected, please check your system time")
271+
return BadAuth, fmt.Errorf("clock skew detected, please check your system time")
266272
}
267273

268274
h := sha256.New()
269275
h.Write([]byte(receivedMessage.AuthTime))
270276

271277
authCode := os.Getenv(fmt.Sprintf("%s_AUTH", strings.ToUpper(receivedMessage.Emulator)))
272278
if authCode == "" {
273-
return fmt.Errorf("no authentication code found for emulator %s", receivedMessage.Emulator)
279+
return BadAuth, fmt.Errorf("no authentication code found for emulator %s", receivedMessage.Emulator)
274280
}
275281
h.Write([]byte(authCode))
276282

277283
if receivedMessage.Auth == hex.EncodeToString(h.Sum(nil)) {
278-
return nil
284+
return Accepted, nil
279285
} else {
280-
return fmt.Errorf("bad authentication code")
286+
return BadAuth, fmt.Errorf("bad authentication code")
281287
}
282288
}
283289

@@ -340,12 +346,6 @@ func (s *LobbyServer) wsHandler(w http.ResponseWriter, r *http.Request) {
340346
if err := s.sendData(ws, sendMessage); err != nil {
341347
s.Logger.Error(err, "failed to send message", "message", sendMessage, "address", ws.RemoteAddr())
342348
}
343-
} else if receivedMessage.NetplayVersion != NetplayAPIVersion {
344-
sendMessage.Accept = MismatchVersion
345-
sendMessage.Message = "Client and server not at same API version. Please update your emulator"
346-
if err := s.sendData(ws, sendMessage); err != nil {
347-
s.Logger.Error(err, "failed to send message", "message", sendMessage, "address", ws.RemoteAddr())
348-
}
349349
} else if receivedMessage.Room.RoomName == "" {
350350
sendMessage.Accept = BadName
351351
sendMessage.Message = "Room name cannot be empty"
@@ -358,16 +358,10 @@ func (s *LobbyServer) wsHandler(w http.ResponseWriter, r *http.Request) {
358358
if err := s.sendData(ws, sendMessage); err != nil {
359359
s.Logger.Error(err, "failed to send message", "message", sendMessage, "address", ws.RemoteAddr())
360360
}
361-
} else if receivedMessage.Emulator == "" {
362-
sendMessage.Accept = BadEmulator
363-
sendMessage.Message = "Emulator name cannot be empty"
364-
if err := s.sendData(ws, sendMessage); err != nil {
365-
s.Logger.Error(err, "failed to send message", "message", sendMessage, "address", ws.RemoteAddr())
366-
}
367-
} else if authErr := s.validateAuth(receivedMessage); authErr != nil {
368-
sendMessage.Accept = BadAuth
361+
} else if acceptValue, authErr := s.validateAuth(receivedMessage); authErr != nil {
362+
sendMessage.Accept = acceptValue
369363
sendMessage.Message = authErr.Error()
370-
s.Logger.Info("bad auth code", "authError", authErr.Error(), "message", receivedMessage, "address", ws.RemoteAddr())
364+
s.Logger.Info("bad auth", "authError", authErr.Error(), "message", receivedMessage, "address", ws.RemoteAddr())
371365
if err := s.sendData(ws, sendMessage); err != nil {
372366
s.Logger.Error(err, "failed to send message", "message", sendMessage, "address", ws.RemoteAddr())
373367
}
@@ -466,22 +460,10 @@ func (s *LobbyServer) wsHandler(w http.ResponseWriter, r *http.Request) {
466460
}
467461
} else if receivedMessage.Type == TypeRequestGetRooms {
468462
sendMessage.Type = TypeReplyGetRooms
469-
if receivedMessage.NetplayVersion != NetplayAPIVersion {
470-
sendMessage.Accept = MismatchVersion
471-
sendMessage.Message = "Client and server not at same API version. Please update your emulator"
472-
if err := s.sendData(ws, sendMessage); err != nil {
473-
s.Logger.Error(err, "failed to send message", "message", sendMessage, "address", ws.RemoteAddr())
474-
}
475-
} else if receivedMessage.Emulator == "" {
476-
sendMessage.Accept = BadEmulator
477-
sendMessage.Message = "Emulator name cannot be empty"
478-
if err := s.sendData(ws, sendMessage); err != nil {
479-
s.Logger.Error(err, "failed to send message", "message", sendMessage, "address", ws.RemoteAddr())
480-
}
481-
} else if authErr := s.validateAuth(receivedMessage); authErr != nil {
482-
sendMessage.Accept = BadAuth
463+
if acceptValue, authErr := s.validateAuth(receivedMessage); authErr != nil {
464+
sendMessage.Accept = acceptValue
483465
sendMessage.Message = authErr.Error()
484-
s.Logger.Info("bad auth code", "authError", authErr.Error(), "message", receivedMessage, "address", ws.RemoteAddr())
466+
s.Logger.Info("bad auth", "authError", authErr.Error(), "message", receivedMessage, "address", ws.RemoteAddr())
485467
if err := s.sendData(ws, sendMessage); err != nil {
486468
s.Logger.Error(err, "failed to send message", "message", sendMessage, "address", ws.RemoteAddr())
487469
}
@@ -517,8 +499,12 @@ func (s *LobbyServer) wsHandler(w http.ResponseWriter, r *http.Request) {
517499
}
518500
} else if receivedMessage.Type == TypeRequestJoinRoom {
519501
if !authenticated {
520-
s.Logger.Error(fmt.Errorf("bad auth"), "User tried to join room without being authenticated", "address", ws.RemoteAddr())
521-
continue
502+
if _, authErr := s.validateAuth(receivedMessage); authErr != nil {
503+
s.Logger.Error(fmt.Errorf("bad auth"), "User tried to join room without being authenticated", "address", ws.RemoteAddr())
504+
continue
505+
} else {
506+
authenticated = true
507+
}
522508
}
523509
var duplicateName bool
524510
var accepted int

0 commit comments

Comments
 (0)