@@ -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