Beispiel #1
0
 private void Client_OnConnected(LoginArgsContainer LoginArgs)
 {
     if (OnStateChange != null)
     {
         OnStateChange(1, 0f);
     }
 }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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());
        }
Beispiel #5
0
        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());
        }
Beispiel #7
0
        /// <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!");
            }
        }
Beispiel #8
0
 /// <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);
        }
Beispiel #10
0
        /// <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);
        }
Beispiel #11
0
        /// <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);
        }
Beispiel #14
0
        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]);
            }
        }
Beispiel #16
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);
            }
        }
Beispiel #17
0
        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);
 }
Beispiel #19
0
 private static void m_Client_OnConnected(LoginArgsContainer LoginArgs)
 {
     PacketSenders.SendInitialConnectPacket(LoginArgs.Client, LoginArgs.Username);
     Console.WriteLine("Sent first packet!\r\n");
 }
Beispiel #20
0
 private void m_LoginClient_OnConnected(LoginArgsContainer LoginArgs)
 {
     LoginPacketSenders.SendServerInfo(m_LoginClient);
 }
Beispiel #21
0
 /// <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);
 }