@@ -245,15 +245,21 @@ func (s *LobbyServer) watchGameServer(name string, g *gameserver.GameServer) {
245
245
}
246
246
}
247
247
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
+
249
255
if ! s .EnableAuth {
250
- return nil
256
+ return Accepted , nil
251
257
}
252
258
253
259
now := time .Now ().UTC ()
254
260
timeAsInt , err := strconv .ParseInt (receivedMessage .AuthTime , 10 , 64 )
255
261
if err != nil {
256
- return fmt .Errorf ("could not parse time for authentication" )
262
+ return BadAuth , fmt .Errorf ("could not parse time for authentication" )
257
263
}
258
264
receivedTime := time .UnixMilli (timeAsInt ).UTC ()
259
265
@@ -262,22 +268,22 @@ func (s *LobbyServer) validateAuth(receivedMessage SocketMessage) error {
262
268
maxAllowableDifference := 15 * time .Minute
263
269
264
270
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" )
266
272
}
267
273
268
274
h := sha256 .New ()
269
275
h .Write ([]byte (receivedMessage .AuthTime ))
270
276
271
277
authCode := os .Getenv (fmt .Sprintf ("%s_AUTH" , strings .ToUpper (receivedMessage .Emulator )))
272
278
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 )
274
280
}
275
281
h .Write ([]byte (authCode ))
276
282
277
283
if receivedMessage .Auth == hex .EncodeToString (h .Sum (nil )) {
278
- return nil
284
+ return Accepted , nil
279
285
} else {
280
- return fmt .Errorf ("bad authentication code" )
286
+ return BadAuth , fmt .Errorf ("bad authentication code" )
281
287
}
282
288
}
283
289
@@ -340,12 +346,6 @@ func (s *LobbyServer) wsHandler(w http.ResponseWriter, r *http.Request) {
340
346
if err := s .sendData (ws , sendMessage ); err != nil {
341
347
s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .RemoteAddr ())
342
348
}
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
- }
349
349
} else if receivedMessage .Room .RoomName == "" {
350
350
sendMessage .Accept = BadName
351
351
sendMessage .Message = "Room name cannot be empty"
@@ -358,16 +358,10 @@ func (s *LobbyServer) wsHandler(w http.ResponseWriter, r *http.Request) {
358
358
if err := s .sendData (ws , sendMessage ); err != nil {
359
359
s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .RemoteAddr ())
360
360
}
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
369
363
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 ())
371
365
if err := s .sendData (ws , sendMessage ); err != nil {
372
366
s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .RemoteAddr ())
373
367
}
@@ -466,22 +460,10 @@ func (s *LobbyServer) wsHandler(w http.ResponseWriter, r *http.Request) {
466
460
}
467
461
} else if receivedMessage .Type == TypeRequestGetRooms {
468
462
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
483
465
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 ())
485
467
if err := s .sendData (ws , sendMessage ); err != nil {
486
468
s .Logger .Error (err , "failed to send message" , "message" , sendMessage , "address" , ws .RemoteAddr ())
487
469
}
@@ -517,8 +499,12 @@ func (s *LobbyServer) wsHandler(w http.ResponseWriter, r *http.Request) {
517
499
}
518
500
} else if receivedMessage .Type == TypeRequestJoinRoom {
519
501
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
+ }
522
508
}
523
509
var duplicateName bool
524
510
var accepted int
0 commit comments