コード例 #1
0
    public ServerPacketId DeleteAccount(byte[] data)
    {
        Console.WriteLine(tcpPacket.client.RemoteEndPoint.ToString() + " 탈퇴요청");

        AccountPacket accountPacket = new AccountPacket(data);
        AccountData   accountData   = accountPacket.GetData();

        Console.WriteLine("아이디 : " + accountData.Id + "패스워드 : " + accountData.Id);

        try
        {
            if (database.DeleteAccountData(accountData.Id, accountData.password))
            {
                msg[0] = (byte)UnityServer.Result.Success;
                Console.WriteLine("탈퇴 성공");
            }
            else
            {
                msg[0] = (byte)UnityServer.Result.Fail;
                Console.WriteLine("탈퇴 실패");
            }
        }
        catch
        {
            Console.WriteLine("DataHandler::RemovePlayerData 에러");
            Console.WriteLine("탈퇴 실패");
            msg[0] = (byte)UnityServer.Result.Fail;
        }

        Array.Resize(ref msg, 1);
        msg = CreateResultPacket(msg, ServerPacketId.DeleteResult);

        return(ServerPacketId.DeleteResult);
    }
コード例 #2
0
    //split this up into two methods, one for registering and one for logging in
    public void SubmitAccount(string findUser, string findPass, MenuLink ml, bool registering)
    {
        GameObject passwordGameObj = GameObject.Find(findPass);
        InputField passwordInput   = passwordGameObj.GetComponent <InputField>();

        GameObject userGameObj   = GameObject.Find(findUser);
        InputField usernameInput = userGameObj.GetComponent <InputField>();

        string password = passwordInput.text;
        string userName = usernameInput.text;

        //problem with this line as registering shouldn't go into CharacterMenu
        statusBoxHandler.InstantiatePrefab(Menus.CharacterMenu, MenuPrefabs.StatusBox);

        try
        {
            CheckInputs(userName, password);
            AccountPacket ap   = new AccountPacket();
            byte[]        data = ap.GetDataBytes(userName, password);


            SubPacket subPacket = new SubPacket(registering, (ushort)userName.Length, (ushort)password.Length, 0, 0, data, SubPacketTypes.Account);

            BasePacket packetToSend = BasePacket.CreatePacket(subPacket, false, false);
            Utils.SetAccountName(userName);
            packetProcessor = GameObject.FindGameObjectWithTag("PacketProcessor").GetComponent <PacketProcessor>();
            packetProcessor.LoginOrRegister(packetToSend);
        }
        catch (AccountException e)
        {
            StatusBoxHandler.statusText   = e.Message;
            StatusBoxHandler.readyToClose = true;
        }
    }
コード例 #3
0
    public ServerPacketId DeleteAccount(byte[] data)
    {
        Console.WriteLine(tcpPacket.client.RemoteEndPoint.ToString() + " 탈퇴요청");

        AccountPacket accountPacket = new AccountPacket(data);
        AccountData   accountData   = accountPacket.GetData();

        Console.WriteLine("아이디 : " + accountData.Id + "패스워드 : " + accountData.Id);

        try
        {
            if (fileIO.RemovePlayerData(accountData.Id, accountData.password))
            {
                msg = Encoding.Unicode.GetBytes("success");
            }
            else
            {
                msg = Encoding.Unicode.GetBytes("fail");
            }
        }
        catch
        {
            Console.WriteLine("DataHandler::RemovePlayerData 에러");
            msg = Encoding.Unicode.GetBytes("fail");
        }

        return(ServerPacketId.DeleteResult);
    }
コード例 #4
0
        public static AccountPacket Parse(NetworkMessage message)
        {
            AccountPacket packet = new AccountPacket();
            packet.Os = message.GetUInt16(); // OS
            packet.Version = message.GetUInt16(); // version

            // File checks
            message.GetUInt32();
            message.GetUInt32();
            message.GetUInt32();

            message.RSADecrypt();

            message.GetByte(); // should be zero

            packet.XteaKey = new uint[4];
            packet.XteaKey[0] = message.GetUInt32();
            packet.XteaKey[1] = message.GetUInt32();
            packet.XteaKey[2] = message.GetUInt32();
            packet.XteaKey[3] = message.GetUInt32();

            packet.AccountName = message.GetString(); // account name
            packet.Password = message.GetString(); // password

            return packet;
        }
コード例 #5
0
ファイル: LoginConnection.cs プロジェクト: Codinablack/Tibia
        /// <summary>
        ///     Called when [client read handshake message].
        /// </summary>
        /// <param name="result">The result.</param>
        /// <exception cref="InvalidNetworkProtocolException"></exception>
        /// <exception cref="InvalidRsaException"></exception>
        /// <exception cref="AuthenticationFailedException"></exception>
        private void OnClientReadHandshakeMessage(IAsyncResult result)
        {
            // TODO: 2) Disconnect: Validation of timestamp and random number (sent before first login packet?)
            // TODO: 3) Disconnect: Only clients with current protocol allowed (Change to automatic update)
            // TODO: 4) Disconnect: Gamestate
            // TODO: 5) Disconnect: IP banishments (Change to automatic timer backwards)
            // TODO: 6) Character data (e.g.: Skin & Mount) to render on client side

            if (!EndRead(result))
            {
                return;
            }

            try
            {
                if (IncomingMessage.ReadNetworkProtocol() != NetworkProtocol.Login)
                {
                    throw new InvalidNetworkProtocolException();
                }

                AccountPacket accountPacket = AccountPacket.Parse(IncomingMessage);
                if (!accountPacket.IsRsaValid)
                {
                    throw new InvalidRsaException();
                }

                AuthenticationEventArgs authenticationEventArgs = new AuthenticationEventArgs(accountPacket.Username, accountPacket.Password);
                Authenticate?.Invoke(this, authenticationEventArgs);

                if (authenticationEventArgs.Cancel)
                {
                    throw new AuthenticationFailedException();
                }

                Xtea = accountPacket.Xtea;

                Account account = new Account
                {
                    UserName      = accountPacket.Username,
                    Password      = accountPacket.Password,
                    OSPlatform    = accountPacket.OSPlatform,
                    ClientVersion = accountPacket.Version
                };

                LoginDataEventArgs loginDataEventArgs = new LoginDataEventArgs(account);
                RequestLoginData?.Invoke(this, loginDataEventArgs);

                SendLoginWindow((loginDataEventArgs.Account.PremiumExpirationDate - DateTime.Today).Days, loginDataEventArgs.Account.UserName, loginDataEventArgs.Account.Password, loginDataEventArgs.Characters, loginDataEventArgs.Worlds, loginDataEventArgs.Notification);
            }
            catch
            {
                // TODO: Log invalid data from the client
            }
            finally
            {
                Close();
            }
        }
コード例 #6
0
    public void DeleteAccount(string Id, string Pw)
    {
        AccountData   accountData   = new AccountData(Id, Pw);
        AccountPacket accountPacket = new AccountPacket(accountData);

        byte[] msg = CreatePacket(accountPacket, ClientPacketId.Delete);

        sendMsg.Enqueue(msg);
    }
コード例 #7
0
    public void CreateAccount(string Id, string Pw)
    {
        Debug.Log("회원가입");
        AccountData   accountData   = new AccountData(Id, Pw);
        AccountPacket accountPacket = new AccountPacket(accountData);

        byte[] msg = CreatePacket(accountPacket, ClientPacketId.Create);
        sendMsg.Enqueue(msg);
    }
コード例 #8
0
    public ServerPacketId Login(byte[] data)
    {
        Console.WriteLine(tcpPacket.client.RemoteEndPoint.ToString() + " 로그인요청");

        AccountPacket accountPacket = new AccountPacket(data);
        AccountData   accountData   = accountPacket.GetData();

        Console.WriteLine("아이디 : " + accountData.Id + "비밀번호 : " + accountData.password);

        try
        {
            if (database.AccountData.Contains(accountData.Id))
            {
                if (((LoginData)database.AccountData[accountData.Id]).PW == accountData.password)
                {
                    if (!LoginUser.ContainsValue(accountData.Id))
                    {
                        msg[0] = (byte)UnityServer.Result.Success;
                        Console.WriteLine("로그인 성공");
                        LoginUser.Add(tcpPacket.client, accountData.Id);
                    }
                    else
                    {
                        Console.WriteLine("현재 접속중인 아이디입니다.");

                        if (CompareIP(GetSocket(accountData.Id).RemoteEndPoint.ToString(), tcpPacket.client.RemoteEndPoint.ToString()))
                        {
                            LoginUser.Remove(GetSocket(accountData.Id));
                            Console.WriteLine("현재 접속중 해제");
                        }
                        msg[0] = (byte)UnityServer.Result.Fail;
                    }
                }
                else
                {
                    Console.WriteLine("패스워드가 맞지 않습니다.");
                    msg[0] = (byte)UnityServer.Result.Fail;
                }
            }
            else
            {
                Console.WriteLine("존재하지 않는 아이디입니다.");
                msg[0] = (byte)UnityServer.Result.Fail;
            }
        }
        catch
        {
            Console.WriteLine("DataHandler::PlayerData.Contains 에러");
            msg[0] = (byte)UnityServer.Result.Fail;
        }

        Array.Resize(ref msg, 1);

        msg = CreateResultPacket(msg, ServerPacketId.LoginResult);

        return(ServerPacketId.LoginResult);
    }
コード例 #9
0
    //로그인 -> Server
    public void Login(string id, string pw)
    {
        Debug.Log("로그인");

        AccountData   accountData       = new AccountData(id, pw);
        AccountPacket accountDataPacket = new AccountPacket(accountData);

        accountDataPacket.SetPacketId((int)ClientPacketId.Login);

        DataPacket packet = new DataPacket(CreatePacket(accountDataPacket), null);

        sendMsgs.Enqueue(packet);
    }
コード例 #10
0
        private void ClientReadFirstCallBack(IAsyncResult ar)
        {
            if (!EndRead(ar))
            {
                return;
            }

            try
            {
                byte protocol = inMessage.GetByte(); // protocol id (1 = login, 2 = game)

                if (protocol == 0x01)
                {
                    AccountPacket accountPacket = AccountPacket.Parse(inMessage);
                    xteaKey = accountPacket.XteaKey;

                    long accountId = Game.CheckLoginInfo(this, accountPacket, true);

                    if (accountId >= 0)
                    {
                        this.AccountId = accountId;
                        SendCharacterList(
                            Settings.Default.MessageOfTheDay,
                            999,
                            Database.GetCharacterList(accountId)
                            );
                    }

                    Close();
                }
                else if (protocol == 0x0A)
                {
                    ParseLoginPacket(inMessage);

                    if (stream.CanRead)
                    {
                        stream.BeginRead(inMessage.Buffer, 0, 2,
                                         new AsyncCallback(ClientReadCallBack), null);
                    }
                }
            }
            catch
            {
                // Invalid data from the client
                Close();
            }
        }
コード例 #11
0
    public ServerPacketId Login(byte[] data)
    {
        Console.WriteLine(tcpPacket.client.RemoteEndPoint.ToString() + " 로그인요청");

        AccountPacket accountPacket = new AccountPacket(data);
        AccountData   accountData   = accountPacket.GetData();

        Console.WriteLine("아이디 : " + accountData.Id + "비밀번호 : " + accountData.password);

        try
        {
            if (fileIO.playerData.Contains(accountData.Id))
            {
                if (fileIO.GetPlayerData(accountData.Id).PW == accountData.password)
                {
                    if (!LoginUser.Contains(accountData.Id))
                    {
                        msg = Encoding.Unicode.GetBytes("success");
                        Console.WriteLine("로그인 성공");
                        ((TcpClient)LoginUser[tcpPacket.client]).Id = accountData.Id;
                    }
                    else
                    {
                        Console.WriteLine("현재 접속중인 아이디입니다.");
                        msg = Encoding.Unicode.GetBytes("fail");
                    }
                }
                else
                {
                    Console.WriteLine("패스워드가 맞지 않습니다.");
                    msg = Encoding.Unicode.GetBytes("fail");
                }
            }
            else
            {
                Console.WriteLine("존재하지 않는 아이디입니다.");
                msg = Encoding.Unicode.GetBytes("fail");
            }
        }
        catch
        {
            Console.WriteLine("DataHandler::PlayerData.Contains 에러");
            msg = Encoding.Unicode.GetBytes("fail");
        }

        return(ServerPacketId.LoginResult);
    }
コード例 #12
0
    public void DeleteAccount(DataPacket packet)
    {
        Console.WriteLine(packet.client.RemoteEndPoint.ToString() + " 탈퇴요청");

        AccountPacket accountPacket = new AccountPacket(packet.msg);
        AccountData   accountData   = accountPacket.GetData();

        Console.WriteLine("아이디 : " + accountData.Id + "패스워드 : " + accountData.Id);

        Result result = Result.Fail;

        try
        {
            if (database.DeleteAccountData(accountData.Id, accountData.Password) == Result.Success)
            {
                result = Result.Success;
                Console.WriteLine("탈퇴 성공");
            }
            else
            {
                result = Result.Fail;
                Console.WriteLine("탈퇴 실패");
            }
        }
        catch
        {
            Console.WriteLine("DataHandler::DeleteAccount.RemovePlayerData 에러");
            result = Result.Fail;
        }

        ResultData   resultData       = new ResultData((byte)result);
        ResultPacket resultDataPacket = new ResultPacket(resultData);

        resultDataPacket.SetPacketId((int)ServerPacketId.DeleteAccountResult);

        byte[] msg = CreatePacket(resultDataPacket);
        packet = new DataPacket(msg, packet.client);

        lock (sendLock)
        {
            sendMsgs.Enqueue(packet);
        }
    }
コード例 #13
0
    public void Login(DataPacket packet)
    {
        Console.WriteLine(packet.client.RemoteEndPoint.ToString() + " 로그인");

        AccountPacket accountPacket = new AccountPacket(packet.msg);
        AccountData   accountData   = accountPacket.GetData();

        Console.WriteLine("아이디 : " + accountData.Id + "비밀번호 : " + accountData.Password);

        Result result = Result.Fail;

        try
        {
            if (database.AccountData.Contains(accountData.Id))
            {
                if (((AccountData)database.AccountData[accountData.Id]).Password == accountData.Password)
                {
                    List <string> id = new List <string>(loginUser.Values);


                    if (!loginUser.ContainsValue(accountData.Id))
                    {
                        result = Result.Success;
                        Console.WriteLine("로그인 성공");
                        loginUser.Add(packet.client, accountData.Id);
                        userState.Add(accountData.Id, new UserState(accountData.Id, -1));

                        database.AddUserData(accountData.Id);
                    }
                    else
                    {
                        Console.WriteLine("현재 접속중인 아이디입니다.");

                        if (CompareIP(GetSocket(accountData.Id).RemoteEndPoint.ToString(), packet.client.RemoteEndPoint.ToString()))
                        {
                            loginUser.Remove(GetSocket(accountData.Id));

                            try
                            {
                                if (userState.ContainsKey(accountData.Id))
                                {
                                    if (userState[accountData.Id].state >= 0)
                                    {
                                        roomManager.ExitRoom(userState[accountData.Id].state, packet.client);
                                    }

                                    userState.Remove(accountData.Id);
                                }
                            }
                            catch
                            {
                                Console.WriteLine("DataHandler::GameClose.ContainsKey - roomManager 에러");
                                Console.WriteLine("방에 입장하지 않았습니다.");
                            }

                            database.DeleteUserData(accountData.Id);

                            Console.WriteLine("현재 접속중 해제");
                        }

                        result = Result.Fail;
                    }
                }
                else
                {
                    Console.WriteLine("패스워드가 맞지 않습니다.");
                    result = Result.Fail;
                }
            }
            else
            {
                Console.WriteLine("존재하지 않는 아이디입니다.");
                result = Result.Fail;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("DataHandler::Login.ContainsValue 에러" + e.Message);
            result = Result.Fail;
        }

        ResultData   resultData       = new ResultData((byte)result);
        ResultPacket resultDataPacket = new ResultPacket(resultData);

        resultDataPacket.SetPacketId((int)ServerPacketId.LoginResult);

        byte[] msg = CreatePacket(resultDataPacket);
        packet = new DataPacket(msg, packet.client);

        lock (sendLock)
        {
            sendMsgs.Enqueue(packet);
        }
    }