private void Client_OnConnected(LoginArgsContainer LoginArgs) { if (OnStateChange != null) { OnStateChange(1, 0f); } }
private static void RunAsClient() { GonzoNet.PacketHandlers.Register(0x02, false, 0, new OnPacketReceive(PacketHandlers.HandleServerChallenge)); //GonzoNet requires a log output stream to function correctly. This is built in behavior. GonzoNet.Logger.OnMessageLogged += new MessageLoggedDelegate(Logger_OnMessageLogged); StaticStaticDiffieHellman.ExportKey("ClientPublic.dat", PacketHandlers.ClientKey.PublicKey); m_Client = new NetworkClient("127.0.0.1", 12345); m_Client.OnConnected += new OnConnectedDelegate(m_Client_OnConnected); LoginArgsContainer LoginArgs = new LoginArgsContainer(); LoginArgs.Enc = new GonzoNet.Encryption.ARC4Encryptor("test"); LoginArgs.Username = "******"; LoginArgs.Password = "******"; LoginArgs.Client = m_Client; PacketHandlers.GenerateClientIV(); m_Client.Connect(LoginArgs); while (true) { Thread.Sleep(1000); } }
public static void SendLoginRequestCity(LoginArgsContainer Args) { PacketStream Packet = new PacketStream((byte)PacketType.LOGIN_REQUEST_CITY, 0); Packet.WriteHeader(); ECDiffieHellmanCng PrivateKey = Args.Client.ClientEncryptor.GetDecryptionArgsContainer() .AESDecryptArgs.PrivateKey; //IMPORTANT: Public key must derive from the private key! byte[] ClientPublicKey = PrivateKey.PublicKey.ToByteArray(); byte[] NOnce = Args.Client.ClientEncryptor.GetDecryptionArgsContainer().AESDecryptArgs.NOnce; Packet.WriteInt32(((byte)PacketHeaders.UNENCRYPTED + (ClientPublicKey.Length + 1) + (NOnce.Length + 1))); Packet.WriteByte((byte)ClientPublicKey.Length); Packet.WriteBytes(ClientPublicKey); Packet.WriteByte((byte)NOnce.Length); Packet.WriteBytes(NOnce); Args.Client.Send(Packet.ToArray()); }
/// <summary> /// Sends a CharacterCreate packet to a CityServer. /// </summary> /// <param name="LoginArgs">Arguments used to log onto the CityServer.</param> /// <param name="Character">The character to create on the CityServer.</param> public static void SendCharacterCreateCity(LoginArgsContainer LoginArgs, TSOClient.VM.Sim Character) { PacketStream Packet = new PacketStream((byte)PacketType.CHARACTER_CREATE_CITY, 0); Packet.WriteHeader(); byte[] EncryptionKey = LoginArgs.Enc.GetDecryptionArgsContainer().ARC4DecryptArgs.EncryptionKey; MemoryStream PacketData = new MemoryStream(); BinaryWriter Writer = new BinaryWriter(PacketData); Writer.Write((byte)LoginArgs.Username.Length); Writer.Write(Encoding.ASCII.GetBytes(LoginArgs.Username), 0, Encoding.ASCII.GetBytes(LoginArgs.Username).Length); //LoginArgs password is set to PlayerAccount.Hash for relogging to the cityserver. byte[] HashBuf = Convert.FromBase64String(LoginArgs.Password); Writer.Write((byte)HashBuf.Length); Writer.Write(HashBuf, 0, HashBuf.Length); Writer.Write((byte)EncryptionKey.Length); Writer.Write(EncryptionKey); Writer.Write(PlayerAccount.CityToken); Writer.Write(Character.Timestamp); Writer.Write(Character.Name); Writer.Write(Character.Sex); Writer.Write(Character.Description); Writer.Write((ulong)Character.HeadOutfitID); Writer.Write((ulong)Character.BodyOutfitID); Writer.Write((byte)Character.AppearanceType); Packet.WriteUInt16((ushort)((ushort)PacketHeaders.UNENCRYPTED + PacketData.Length)); Packet.WriteBytes(PacketData.ToArray()); Writer.Close(); LoginArgs.Client.Send(Packet.ToArray()); }
private static void RunAsClient() { GonzoNet.PacketHandlers.Register(0x02, false, 0, new OnPacketReceive(PacketHandlers.HandleServerChallenge)); //GonzoNet requires a log output stream to function correctly. This is built in behavior. GonzoNet.Logger.OnMessageLogged += new MessageLoggedDelegate(Logger_OnMessageLogged); NetworkFacade.Client = new NetworkClient("127.0.0.1", 12345); NetworkFacade.Client.OnConnected += new OnConnectedDelegate(m_Client_OnConnected); LoginArgsContainer LoginArgs = new LoginArgsContainer(); LoginArgs.Enc = new AESEncryptor("test"); LoginArgs.Username = "******"; LoginArgs.Password = "******"; LoginArgs.Client = NetworkFacade.Client; SaltedHash Hash = new SaltedHash(new SHA512Managed(), LoginArgs.Username.Length); PacketHandlers.PasswordHash = Hash.ComputePasswordHash(LoginArgs.Username, LoginArgs.Password); NetworkFacade.Client.Connect(LoginArgs); while (true) { Thread.Sleep(1000); } }
public static void SendLoginRequest(LoginArgsContainer Args) { //Variable length... PacketStream Packet = new PacketStream((byte)PacketType.LOGIN_REQUEST, 0); Packet.WriteByte(0x00); SaltedHash Hash = new SaltedHash(new SHA512Managed(), Args.Username.Length); MemoryStream MemStream = new MemoryStream(); DecryptionArgsContainer DecryptionArgs = Args.Enc.GetDecryptionArgsContainer(); MemStream.WriteByte((byte)Args.Username.Length); MemStream.Write(Encoding.ASCII.GetBytes(Args.Username), 0, Encoding.ASCII.GetBytes(Args.Username).Length); byte[] HashBuf = Hash.ComputePasswordHash(Args.Username, Args.Password); PlayerAccount.Hash = HashBuf; MemStream.WriteByte((byte)HashBuf.Length); MemStream.Write(HashBuf, 0, HashBuf.Length); Packet.WriteUInt16((ushort)(PacketHeaders.UNENCRYPTED + MemStream.ToArray().Length + 4)); Packet.WriteBytes(MemStream.ToArray()); string[] Version = GlobalSettings.Default.ClientVersion.Split('.'); Packet.WriteByte((byte)int.Parse(Version[0])); //Version 1 Packet.WriteByte((byte)int.Parse(Version[1])); //Version 2 Packet.WriteByte((byte)int.Parse(Version[2])); //Version 3 Packet.WriteByte((byte)int.Parse(Version[3])); //Version 4 Args.Client.Send(Packet.ToArray()); }
/// <summary> /// User clicked button to log in. /// </summary> private void BtnLogin_Click(object sender, EventArgs e) { LoginArgsContainer Args = new LoginArgsContainer(); if (TxtPassword.Text != "" && TxtUsername.Text != "") { NetworkFacade.Client = new NetworkClient(GlobalSettings.Default.LoginServerIP, 2106, GonzoNet.Encryption.EncryptionMode.AESCrypto); NetworkFacade.Client.OnConnected += new OnConnectedDelegate(NetworkController.Client_OnConnected); Args.Username = TxtUsername.Text.ToUpper(); Args.Password = TxtPassword.Text.ToUpper(); SaltedHash Hash = new SaltedHash(new SHA512Managed(), Args.Username.Length); byte[] HashBuf = Hash.ComputePasswordHash(Args.Username.ToUpper(), Args.Password.ToUpper()); Args.Enc = new AESEncryptor(Convert.ToBase64String(HashBuf)); Args.Client = NetworkFacade.Client; PlayerAccount.Username = TxtUsername.Text; LblStatus.Invoke(new MethodInvoker(delegate { LblStatus.Visible = true; })); LblStatus.Invoke(new MethodInvoker(delegate { LblStatus.Text = "Connecting..."; })); NetworkController.OnReceivedCharacters += new OnReceivedCharactersDelegate(NetworkController_OnReceivedCharacters); NetworkFacade.Client.Connect(Args); } else { MessageBox.Show("Please enter a username and password!"); } }
/// <summary> /// Client connected to server successfully. /// </summary> /// <param name="LoginArgs"></param> public static void Client_OnConnected(LoginArgsContainer LoginArgs) { if (!IsReconnect) { PacketSenders.SendLoginRequest(LoginArgs); } else { PacketSenders.SendLoginRequestCity(LoginArgs); } }
private void Client_OnConnected(LoginArgsContainer LoginArgs) { ProgressEvent Progress = new ProgressEvent(EventCodes.PROGRESS_UPDATE); Progress.Done = 1; Progress.Total = 3; UIPacketSenders.SendLoginRequestCity(LoginArgs); OnTransitionProgress(Progress); }
/// <summary> /// Authenticate with the service client to get a token, /// Then get info about avatars & cities /// </summary> /// <param name="username"></param> /// <param name="password"></param> public void InitialConnect(string username, string password) { var client = NetworkFacade.Client; LoginArgsContainer Args = new LoginArgsContainer(); Args.Username = username; Args.Password = password; Args.Enc = new GonzoNet.Encryption.ARC4Encryptor(password); Args.Client = client; client.Connect(Args); }
/// <summary> /// Creates a new CityTransitionScreen. /// </summary> /// <param name="SelectedCity">The city being transitioned to.</param> /// <param name="CharacterCreated">If transitioning from CreateASim, this should be true. /// A CharacterCreateCity packet will be sent to the CityServer. Otherwise, this should be false. /// A CityToken packet will be sent to the CityServer.</param> public CityTransitionScreen(CityInfo SelectedCity, bool CharacterCreated) { m_SelectedCity = SelectedCity; m_CharacterCreated = CharacterCreated; /** * Scale the whole screen to 1024 */ m_BackgroundCtnr = new UIContainer(); m_BackgroundCtnr.ScaleX = m_BackgroundCtnr.ScaleY = ScreenWidth / 800.0f; /** Background image **/ m_Background = new UIImage(GetTexture((ulong)FileIDs.UIFileIDs.setup)); m_Background.ID = "Background"; m_BackgroundCtnr.Add(m_Background); var lbl = new UILabel(); lbl.Caption = "Version " + GlobalSettings.Default.ClientVersion; lbl.X = 20; lbl.Y = 558; m_BackgroundCtnr.Add(lbl); this.Add(m_BackgroundCtnr); m_LoginProgress = new UILoginProgress(); m_LoginProgress.X = (ScreenWidth - (m_LoginProgress.Width + 20)); m_LoginProgress.Y = (ScreenHeight - (m_LoginProgress.Height + 20)); m_LoginProgress.Opacity = 0.9f; this.Add(m_LoginProgress); NetworkFacade.Controller.OnNetworkError += new NetworkErrorDelegate(Controller_OnNetworkError); LoginArgsContainer LoginArgs = new LoginArgsContainer(); LoginArgs.Username = NetworkFacade.Client.ClientEncryptor.Username; LoginArgs.Password = Convert.ToBase64String(PlayerAccount.Hash); LoginArgs.Enc = NetworkFacade.Client.ClientEncryptor; NetworkFacade.Client = new NetworkClient(SelectedCity.IP, SelectedCity.Port); //THIS IS IMPORTANT - THIS NEEDS TO BE COPIED AFTER IT HAS BEEN RECREATED FOR //THE RECONNECTION TO WORK! LoginArgs.Client = NetworkFacade.Client; NetworkFacade.Client.OnConnected += new OnConnectedDelegate(Client_OnConnected); NetworkFacade.Controller.Reconnect(ref NetworkFacade.Client, SelectedCity, LoginArgs); NetworkFacade.Controller.OnCharacterCreationStatus += new OnCharacterCreationStatusDelegate(Controller_OnCharacterCreationStatus); NetworkFacade.Controller.OnCityTransferProgress += new OnCityTransferProgressDelegate(Controller_OnCityTransfer); }
/// <summary> /// Authenticate with the service client to get a token, /// Then get info about avatars & cities /// </summary> /// <param name="username"></param> /// <param name="password"></param> public void InitialConnect(string username, string password) { var client = NetworkFacade.Client; LoginArgsContainer Args = new LoginArgsContainer(); Args.Username = username; Args.Password = password; //Doing the encryption this way eliminates the need to send key across the wire! :D SaltedHash Hash = new SaltedHash(new SHA512Managed(), Args.Username.Length); byte[] HashBuf = Hash.ComputePasswordHash(Args.Username, Args.Password); Args.Enc = new GonzoNet.Encryption.ARC4Encryptor(Convert.ToBase64String(HashBuf)); Args.Client = client; client.Connect(Args); }
/// <summary> /// Reconnects to a CityServer. /// </summary> public void Reconnect(ref NetworkClient Client, CityInfo SelectedCity, LoginArgsContainer LoginArgs) { Client.Disconnect(); if (LoginArgs.Enc == null) { System.Diagnostics.Debug.WriteLine("LoginArgs.Enc was null!"); //LoginArgs.Enc = new GonzoNet.Encryption.AESEncryptor(Convert.ToBase64String(PlayerAccount.Hash)); } else if (LoginArgs.Username == null || LoginArgs.Password == null) { System.Diagnostics.Debug.WriteLine("LoginArgs.Username or LoginArgs.Password was null!"); LoginArgs.Username = PlayerAccount.Username; LoginArgs.Password = Convert.ToBase64String(PlayerAccount.Hash); } Client.Connect(LoginArgs); }
private void Client_OnConnected(LoginArgsContainer LoginArgs) { TSOClient.Network.Events.ProgressEvent Progress = new TSOClient.Network.Events.ProgressEvent(TSOClient.Events.EventCodes.PROGRESS_UPDATE); Progress.Done = 1; Progress.Total = 2; if (m_CharacterCreated) { UIPacketSenders.SendCharacterCreateCity(LoginArgs, PlayerAccount.CurrentlyActiveSim); OnTransitionProgress(Progress); } else { UIPacketSenders.SendCityToken(NetworkFacade.Client); OnTransitionProgress(Progress); } }
/// <summary> /// Authentication failed, so retry. /// </summary> private void Controller_OnLoginFailureCity() { if (EventSink.EventQueue[0].ECode == EventCodes.AUTHENTICATION_FAILURE) { ProgressEvent Progress = new ProgressEvent(EventCodes.PROGRESS_UPDATE); Progress.Done = 1; Progress.Total = 3; LoginArgsContainer LoginArgs = new LoginArgsContainer(); LoginArgs.Username = NetworkFacade.Client.ClientEncryptor.Username; LoginArgs.Password = Convert.ToBase64String(PlayerAccount.Hash); LoginArgs.Enc = NetworkFacade.Client.ClientEncryptor; NetworkFacade.Controller.Reconnect(ref NetworkFacade.Client, m_SelectedCity, LoginArgs); OnTransitionProgress(Progress); //Doing this instead of EventQueue.Clear() ensures we won't accidentally remove any //events that may have been added to the end. EventSink.EventQueue.Remove(EventSink.EventQueue[0]); } }
/// <summary> /// Reconnects to city server. /// </summary> private static void Reconnect() { LoginArgsContainer LoginArgs = new LoginArgsContainer(); LoginArgs.Username = NetworkFacade.Client.ClientEncryptor.Username; LoginArgs.Password = Convert.ToBase64String(PlayerAccount.Hash); LoginArgs.Enc = NetworkFacade.Client.ClientEncryptor; lock (NetworkFacade.Client) { NetworkFacade.Client = new NetworkClient(NetworkFacade.Cities[0].IP, NetworkFacade.Cities[0].Port, GonzoNet.Encryption.EncryptionMode.AESCrypto); //THIS IS IMPORTANT - THIS NEEDS TO BE COPIED AFTER IT HAS BEEN RECREATED FOR //THE RECONNECTION TO WORK! LoginArgs.Client = NetworkFacade.Client; NetworkFacade.Client.OnConnected += new OnConnectedDelegate(Client_OnConnected); GonzoNet.Logger.OnMessageLogged += new MessageLoggedDelegate(Logger_OnMessageLogged); IsReconnect = true; NetworkFacade.Client.Connect(LoginArgs); } }
public static void SendLoginRequest(LoginArgsContainer Args) { PacketStream InitialPacket = new PacketStream((byte)PacketType.LOGIN_REQUEST, 0); InitialPacket.WriteHeader(); ECDiffieHellmanCng PrivateKey = Args.Client.ClientEncryptor.GetDecryptionArgsContainer() .AESDecryptArgs.PrivateKey; //IMPORTANT: Public key must derive from the private key! byte[] ClientPublicKey = PrivateKey.PublicKey.ToByteArray(); byte[] NOnce = Args.Client.ClientEncryptor.GetDecryptionArgsContainer().AESDecryptArgs.NOnce; InitialPacket.WriteInt32(((byte)PacketHeaders.UNENCRYPTED + /*4 is for version*/ 4 + (ClientPublicKey.Length + 1) + (NOnce.Length + 1))); SaltedHash Hash = new SaltedHash(new SHA512Managed(), Args.Username.Length); byte[] HashBuf = Hash.ComputePasswordHash(Args.Username, Args.Password); PlayerAccount.Hash = HashBuf; string[] Version = GlobalSettings.Default.ClientVersion.Split('.'); InitialPacket.WriteByte((byte)int.Parse(Version[0])); //Version 1 InitialPacket.WriteByte((byte)int.Parse(Version[1])); //Version 2 InitialPacket.WriteByte((byte)int.Parse(Version[2])); //Version 3 InitialPacket.WriteByte((byte)int.Parse(Version[3])); //Version 4 InitialPacket.WriteByte((byte)ClientPublicKey.Length); InitialPacket.WriteBytes(ClientPublicKey); InitialPacket.WriteByte((byte)NOnce.Length); InitialPacket.WriteBytes(NOnce); Args.Client.Send(InitialPacket.ToArray()); }
/// <summary> /// Reconnects to a CityServer. /// </summary> public void Reconnect(ref NetworkClient Client, CityInfo SelectedCity, LoginArgsContainer LoginArgs) { Client.Disconnect(); Client.Connect(LoginArgs); }
private static void m_Client_OnConnected(LoginArgsContainer LoginArgs) { PacketSenders.SendInitialConnectPacket(LoginArgs.Client, LoginArgs.Username); Console.WriteLine("Sent first packet!\r\n"); }
private void m_LoginClient_OnConnected(LoginArgsContainer LoginArgs) { LoginPacketSenders.SendServerInfo(m_LoginClient); }
/// <summary> /// The client successfully connected to the login server! /// </summary> /// <param name="LoginArgs">The arguments the user used for logging in.</param> private void ClientNetworkManager_OnLogin(LoginArgsContainer LoginArgs) { m_LoginProgressDiag.UpdateStatus(LoginProcess.Initial); }