// doLogin authenticates the user, sends the login response, and sets up the client for standard packet processing func (svc *GameService) doLogin(client player.Player, username, password string) error { profile, responseCode := svc.auth.LookupProfile(username, password) if responseCode != auth.AuthOkay { client.Conn().Write <- &game_protocol.OutboundLoginResponseUnsuccessful{ Response: encoding.Uint8(responseCode), } client.Conn().Disconnect() return nil } client.SetProfile(profile.(player.Profile)) // Successful login, do all the stuff client.Conn().Write <- &game_protocol.OutboundLoginResponse{ Response: encoding.Uint8(responseCode), Rights: encoding.Uint8(client.Profile().Rights()), Flagged: 0, } client.SetDecodeFunc(svc.decodePacket) go svc.packetConsumer(client) game_event.PlayerLogin.NotifyObservers(client) client.LoadProfile() game_event.PlayerFinishLogin.NotifyObservers(client) go func() { client.Conn().WaitForDisconnect() game_event.PlayerLogout.NotifyObservers(client) }() return nil }
// decodeLoginBlock handles the unencrypted login block func (svc *GameService) decodeLoginBlock(client player.Player) error { loginBlock := game_protocol.InboundLoginBlock{} if err := loginBlock.Decode(client.Conn().ReadBuffer, nil); err != nil { return err } expectedSecureBlockSize := int(loginBlock.LoginLen) - ((9 * 4) + 1 + 1 + 1 + 2) if expectedSecureBlockSize != int(loginBlock.SecureBlockSize) { client.Log().Error("Secure block size mismatch: got %v expected %v", loginBlock.SecureBlockSize, expectedSecureBlockSize) client.Conn().Disconnect() } client.SetSecureBlockSize(int(loginBlock.SecureBlockSize)) client.SetDecodeFunc(svc.decodeSecureBlock) return nil }
// handshake performs the isaac key exchange func (svc *GameService) handshake(client player.Player) error { serverSeed := client.ServerISAACSeed() handshake := protocol.InboundGameHandshake{} if err := handshake.Decode(client.Conn().ReadBuffer, nil); err != nil { return err } client.Conn().Write <- &protocol.OutboundGameHandshake{ ServerISAACSeed: [2]encoding.Uint32{ encoding.Uint32(serverSeed[0]), encoding.Uint32(serverSeed[1]), }, } client.SetDecodeFunc(svc.decodeLoginBlock) return nil }