예제 #1
0
        /// <summary>
        /// Limpa os dados de usuário para voltar a tela de login
        /// </summary>
        /// <param name="index"></param>
        public static void BackToLoginScreen(string hexID)
        {
            var pData = Authentication.FindByHexID(hexID);

            Accounts_DB.UpdateLastIP(pData.Account, pData.IP);
            Accounts_DB.UpdateLoggedIn(pData.Account, 0); //0 = false

            pData.Clear();
        }
예제 #2
0
        /// <summary>
        /// Verifica a senha de usuário e garante acesso ao sistema.
        /// </summary>
        /// <param name="result"></param>
        /// <param name="username"></param>
        public static void Login(bool result, string username)
        {
            var pData = FindByUsername(username);

            //se nao achar em outro lugar, verifica no proprio login server
            if (!result)   //(se falso), check login server
            //Verifica se o usuário já está conectado, caso verdadeiro, envia mensagem de erro
            {
                if (Authentication.IsConnected(pData.Username))
                {
                    pData.LoginAttempt++;
                    TryingToAccess(pData);
                    return;
                }
            }
            else
            {
                pData.LoginAttempt++;
                TryingToAccess(pData);
                return;
            }

            //Verifica se os campos estão corretos, caso falso, envia mensagem de erro
            if (!Accounts_DB.ExistPassword(pData.Username, pData.Password))
            {
                LoginPacket.Message(pData.HexID, (int)PacketList.LoginServer_Client_InvalidNamePass);
                return;
            }

            //muda o nome de usuario para o campo oficial de usuario e limpar o campo temporario
            pData.Account  = pData.Username;
            pData.Username = string.Empty;

            FileLog.WriteLog($"User Login: {pData.Account} {pData.IP}", System.Drawing.Color.Black);

            //carrega as informações da conta
            Accounts_DB.LoadAccountData(pData);
            Accounts_DB.LoadAccountService(pData);

            //verifica os serviços
            pData.Service.VerifyServices(pData.ID);

            Accounts_DB.UpdateDateLasteLogin(pData.Account);
            Accounts_DB.UpdateCurrentIP(pData.Account, pData.IP);
            Accounts_DB.UpdateLoggedIn(pData.Account, 1);  //1 = true

            //envia a lista de servidores e muda a tela no cliente
            LoginPacket.ServerList(pData.HexID);
            LoginPacket.GameState(pData.HexID, 2); //tela 2, lista de servidor
        }
예제 #3
0
        /// <summary>
        /// Verifica cada serviço e atualiza na tabela.
        /// </summary>
        /// <param name="accountID"></param>
        public void VerifyServices(int accountID)
        {
            var id = 0;

            //se expirou, atualiza a db e remove da lista.
            foreach (DictionaryEntry pair in service)
            {
                id = Convert.ToInt32(pair.Key);

                if (IsServiceExpired(id))
                {
                    Accounts_DB.UpdateService(accountID, id, EXPIRED);
                    service.Remove(id);
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Recebe os dados dos clientes.
        /// </summary>
        public static void ReceivedData()
        {
            while ((msg = socket.ReadMessage()) != null)
            {
                pData = Authentication.FindByConnection(msg.SenderConnection);

                switch (msg.MessageType)
                {
                case NetIncomingMessageType.DiscoveryRequest:

                    #region Find Banned Country
                    var ip = msg.SenderEndPoint.Address.ToString();

                    if (GeoIp.Enabled)
                    {
                        //Verifica se o ip já está bloqueado temporariamente (evitar processamento desnecessario)
                        if (!GeoIp.IsIpBlocked(ip))
                        {
                            //verifica se o ip do país está na lista de bloqueados.
                            if (GeoIp.IsCountryIpBlocked(ip))
                            {
                                var country = GeoIp.FindCountryByIp(ip);

                                //adiciona na lista de bloqueado temporareamente
                                GeoIp.AddIpAddress(ip);
                                FileLog.WriteLog($"Banned country trying to connect: {ip} {country.Country}-{country.Code}", Color.Coral);
                                return;
                            }
                        }
                        else
                        {
                            return;
                        }
                    }

                    #endregion

                    #region Find Banned IP
                    if (Accounts_DB.IsBannedIp(msg.SenderEndPoint.Address.ToString()) == true)
                    {
                        FileLog.WriteLog("Warning: Attempted IP Banned " + msg.SenderEndPoint.Address, Color.Coral);
                        return;
                    }
                    #endregion

                    LoginNetwork.socket.SendDiscoveryResponse(null, msg.SenderEndPoint);
                    FileLog.WriteLog($"Discovery Response IPEndPoint: {msg.SenderEndPoint.Address}", Color.Coral);
                    break;

                case NetIncomingMessageType.ErrorMessage:
                    FileLog.WriteLog($"Error: {msg.ReadString()}", Color.Coral);
                    break;

                case NetIncomingMessageType.StatusChanged:
                    #region Status Changed Connected
                    NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte();
                    if (status == NetConnectionStatus.Connected)
                    {
                        FileLog.WriteLog($"Status changed to connected: {msg.SenderEndPoint.Address}", Color.Coral);
                        Authentication.Player.Add(new PlayerData(msg.SenderConnection, NetUtility.ToHexString(msg.SenderConnection.RemoteUniqueIdentifier), msg.SenderEndPoint.Address.ToString()));
                    }
                    #endregion

                    #region Status Changed Disconnected
                    if (status == NetConnectionStatus.Disconnected)
                    {
                        if (pData == null)
                        {
                            return;
                        }

                        FileLog.WriteLog($"Status changed to disconnected: {pData?.ID} {pData?.Account} {msg?.SenderEndPoint.Address} {pData?.HexID}", Color.Coral);

                        Accounts_DB.UpdateLastIP(pData.Account, pData.IP);
                        Accounts_DB.UpdateLoggedIn(pData.Account, 0);             //0 disconnect
                        Accounts_DB.UpdateCurrentIP(pData.Account, string.Empty); //limpa o ip atual

                        Authentication.Player.Remove(pData);
                    }
                    #endregion
                    break;

                case NetIncomingMessageType.Data:
                    LoginData.HandleData(pData.HexID, msg);
                    break;

                default:
                    //Registra qualquer mensagem invalida
                    FileLog.WriteLog($"Unhandled type: {msg.MessageType}", Color.DarkRed);
                    break;
                }

                LoginNetwork.socket.Recycle(msg);
            }
        }
        /// <summary>
        /// Recebe os dados dos clientes.
        /// </summary>
        public static void ReceivedData()
        {
            NetIncomingMessage msg;

            while ((msg = Socket.ReadMessage()) != null)
            {
                var pData = Authentication.FindByConnection(msg.SenderConnection);

                switch (msg.MessageType)
                {
                case NetIncomingMessageType.DiscoveryRequest:
                    #region Find Banned IP
                    if (Accounts_DB.BannedIP(msg.SenderEndPoint.Address.ToString()) == true)
                    {
                        LogConfig.WriteLog("Warning: Attempted IP Banned " + msg.SenderEndPoint.Address);
                        LogConfig.WriteLog("Warning: Attempted IP Banned " + msg.SenderEndPoint.Address, Color.Coral);
                        return;
                    }
                    #endregion

                    LoginServerNetwork.Socket.SendDiscoveryResponse(null, msg.SenderEndPoint);
                    LogConfig.WriteLog($"Discovery Response IPEndPoint: {msg.SenderEndPoint.Address}", Color.Coral);
                    break;

                case NetIncomingMessageType.ErrorMessage:
                    LogConfig.WriteLog($"Error: {msg.ReadString()}", Color.Coral);
                    break;

                case NetIncomingMessageType.StatusChanged:
                    #region Status Changed Connected
                    NetConnectionStatus status = (NetConnectionStatus)msg.ReadByte();

                    if (status == NetConnectionStatus.Connected)
                    {
                        LogConfig.WriteLog($"Status changed to connected: {msg.SenderEndPoint.Address}", Color.Coral);
                        Authentication.Player.Add(new PlayerData(msg.SenderConnection, NetUtility.ToHexString(msg.SenderConnection.RemoteUniqueIdentifier), msg.SenderEndPoint.Address.ToString()));
                    }
                    #endregion

                    #region Status Changed Disconnected
                    if (status == NetConnectionStatus.Disconnected)
                    {
                        pData = Authentication.FindByHexID(NetUtility.ToHexString(msg.SenderConnection.RemoteUniqueIdentifier));

                        //1 - enabled, 0 - disabled
                        if (Settings.LogSystem == 1)
                        {
                            LogConfig.WriteLog($"Status changed to disconnected: {pData?.ID} {pData?.Account} {msg.SenderEndPoint.Address} {pData.HexID}");
                        }
                        if (!Settings.LogSystemScreen)
                        {
                            LogConfig.WriteLog($"Status changed to disconnected: {pData?.ID} {pData?.Account} {msg.SenderEndPoint.Address} {pData.HexID}", Color.Coral);
                        }

                        Accounts_DB.UpdateLastIP(pData.Account, pData.IP);
                        Accounts_DB.UpdateLoggedIn(pData.Account, 0);     //0 disconnect
                        Accounts_DB.UpdateCurrentIP(pData.Account, "");

                        Authentication.Player.Remove(pData);
                    }
                    #endregion
                    break;

                case NetIncomingMessageType.Data:
                    LoginServerData.HandleData(pData.HexID, msg);
                    break;

                default:
                    //Registra qualquer mensagem invalida
                    LogConfig.WriteLog($"Unhandled type: {msg.MessageType}", Color.DarkRed);
                    break;
                }

                LoginServerNetwork.Socket.Recycle(msg);
            }
        }
예제 #6
0
        /// <summary>
        /// Verifica se a versão do cliente e nome de usuário estão corretos.
        /// </summary>
        /// <param name="hexID"></param>
        /// <param name="data"></param>
        public static void Login(string hexID, NetIncomingMessage data)
        {
            //Se o bloqueio de login estiver ativo, envia mensagem de erro para o cliente
            if (Settings.CantConnectNow)
            {
                LoginPacket.Message(hexID, (int)PacketList.LoginServer_Client_Maintenance);
                return;
            }

            //Verifica a versão do jogo; se invalido, envia mensagem de erro
            var version = data.ReadString();

            if (Settings.Version.CompareTo(version) != 0)
            {
                LoginPacket.Message(hexID, (int)PacketList.InvalidVersion);
                return;
            }

            //verifica o checksum do cliente; se invalido, envia mensagem de erro
            var checksum = data.ReadString();

            if (CheckSum.Enabled)
            {
                if (!CheckSum.Compare(version, checksum))
                {
                    LoginPacket.Message(hexID, (int)PacketList.CantConnectNow);
                    return;
                }
            }

            var pData = FindByHexID(hexID);

            pData.Username = data.ReadString().ToLower();     //lê o nome de usuário em uma variavel temporaria para distinguir do 'account
            pData.Password = data.ReadString();               //lê a senha de usuário

            //Verifica se o usuário está na lista de banidos, caso verdadeiro, envia mensagem de erro
            if (Accounts_DB.IsBanned(Accounts_DB.GetID(pData.Username)))
            {
                LoginPacket.Message(pData.HexID, (int)PacketList.LoginServer_Client_AccountBanned);
                return;
            }

            //Verifica se o nome existe no banco de dados, caso falso, envia a mensagem de erro
            if (!Accounts_DB.ExistAccount(pData.Username))
            {
                LoginPacket.Message(pData.HexID, (int)PacketList.LoginServer_Client_InvalidNamePass);
                return;
            }

            //Verifica se o usuário está ativo, caso falso, envia mensagem de erro
            if (!Accounts_DB.IsActive(pData.Username))
            {
                LoginPacket.Message(pData.HexID, (int)PacketList.LoginServer_Client_AccountDisabled);
                return;
            }

            //Envia mensagem para outros servidores para saber se há algum usuario com o mesmo nome online
            if (WorldNetwork.IsWorldServerConnected())
            {
                WorldPacket.IsPlayerConnected(pData.Username);
            }
            else //se não há nenhum servidor conectado, continua para o próximo método
            {
                Login(false, pData.Username);
            }
        }