示例#1
0
 public void LoadData()
 {
     Out.Info("Loading ServerList...");
     Servers = ServersManager.GetServers();
     Out.Info("Loading BlockedIp");
     BlockedIp = AccountManager.GetBlockedIps(); Out.Debug($"{BlockedIp.Count} ips blocked");
 }
示例#2
0
 public void Disconnect()
 {
     thread.Abort();
     server.Clients.Remove(this);
     socket.Dispose();
     Out.Debug($" -User {Ip}");
 }
示例#3
0
        private bool CheckChallengeNr(EndPoint addr, int challenge)
        {
            for (var i = 0; i < _serverQueryChallenges.Count; i++)
            {
                if (_serverQueryChallenges[i].Addr.CompareAddr(addr, true))
                {
                    if (challenge != _serverQueryChallenges[i].Challenge)
                    {
                        return(false);
                    }

                    // allow challenge values to last for 1 hour
                    if (Networking.NetTime > _serverQueryChallenges[i].Time + ChallengeLifetime)
                    {
                        _serverQueryChallenges.RemoveAt(i);
                        Out.Warning("Old challenge from {0}", addr);
                        return(false);
                    }

                    return(true);
                }

                // clean up any old entries
                if (Networking.NetTime > _serverQueryChallenges[i].Time + ChallengeLifetime)
                {
                    _serverQueryChallenges.RemoveAt(i);
                }
            }

            if (challenge != -1)
            {
                Out.Debug("No challenge from {0}", addr);
            }
            return(false);
        }
 /// <summary>
 /// system.diagnostics.debug
 /// </summary>
 public void Debug(
     string s,
     bool lineBreak = false,
     [CallerFilePath] string callerFilePath     = "",
     [CallerMemberName] string callerMemberName = "",
     [CallerLineNumber] int callerLineNumber    = -1)
 => Out.Debug(s, lineBreak, callerFilePath, callerMemberName, callerLineNumber);
示例#5
0
        public void Initialize(string ip, int port)
        {
            DateTime startTime = DateTime.Now;

            Out.Info("Initializing server...");
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.Bind(new IPEndPoint(IPAddress.Parse(ip), port));
                socket.Listen(100);
                Ip   = ip;
                Port = port;
            }
            catch (SocketException e)
            {
                Out.Error(e.Message);
                Dispose();
                return;
            }
            Clients = new Dictionary <Socket, IBaseClient>();
            Servers = new Dictionary <int, WorldServer>();
            Out.Info("Loading Config...");
            if (!File.Exists("config.txt"))
            {
                Out.Error("Can't load 'config.txt' !");
                Dispose();
                return;
            }
            Config = ConfigManager.GetConfig();
            if (Config.ContainsKey("Debug") && Config["Debug"] == "true")
            {
                Out.DebugMode = true;
            }
            if (Config.ContainsKey("Maintenance") && Config["Maintenance"] == "true")
            {
                onMaintenance = true;
            }
            ProtocolVersion = int.Parse(Config["ProtocolVersion"]);
            if (!ConfigManager.CheckConfig(Config))
            {
                Dispose();
                return;
            }
            Out.Info("Initializing database...");
            DatabaseManager.Initialize(Config["Database_Host"], Config["Database_User"], Config["Database_Password"], Config["Database_Auth"]);
            if (Config.ContainsKey("AuthServer_Name"))
            {
                Console.Title = Config["AuthServer_Name"];
            }
            AccountManager.Initialize(DatabaseManager.connection);
            ServersManager.Initialize(DatabaseManager.connection);
            LoadData();

            Out.Info($"Server started successfuly (Elapsed time : {DateTime.Now.Subtract(startTime).TotalMilliseconds.ToString("### ###")} ms)");
            socket.BeginAccept(AcceptCallBack, null);
            Out.Debug("Waiting for clients...");
        }
示例#6
0
        public static void HandleIdentification(BigEndianReader reader, AuthClient client, AuthServer server)
        {
            IdentificationWithLoginTokenMessage message = new IdentificationWithLoginTokenMessage();

            message.Unpack(reader);
            Account  account = AccountManager.GetAccount(message.login);
            DateTime dateNow = DateTime.Now;

            //IF ACCOUNT EXIST
            if (account == null ||
                message.password != Tools.GetMd5(account.Password + client.Ticket)) //Test password
            {
                client.Send(new IdentificationFailedMessage((sbyte)IdentificationFailureReasonEnum.WRONG_CREDENTIALS));
                client.Disconnect();
                return;
            }
            client.account = account;
            //IF LIFE BANNED OR IP BANNED
            if (account.Banned || server.BlockedIp.Contains(client.Ip))
            {
                client.Send(new IdentificationFailedMessage((sbyte)IdentificationFailureReasonEnum.BANNED));
                client.Disconnect();
                return;
            }
            //IF TEMP BANNED
            if (account.EndBan > dateNow)
            {
                int ms = 0;
                ms = (int)account.EndBan.Subtract(dateNow).TotalMinutes;
                client.Send(new IdentificationFailedBannedMessage((sbyte)IdentificationFailureReasonEnum.BANNED, ms));
                client.Disconnect();
                return;
            }
            //IF ON MAINTENANCE
            if (AuthServer.onMaintenance && !account.isAdmin)
            {
                client.Send(new IdentificationFailedMessage((sbyte)IdentificationFailureReasonEnum.IN_MAINTENANCE));
                client.Disconnect();
                return;
            }
            //TODO QUEUE MANAGEMENT
            if (account.Pseudo == null || account.Pseudo.Length == 0)
            {
                client.Send(new NicknameRegistrationMessage());
                Out.Info($"First connection for account '{account.Username}'. Requesting a nickname.");
                return;
            }
            SendAccServer(client, server);
            //TODO AUTO CONNECT TO THE FIRST AVAILABLE SERVER
            if (message.autoconnect)
            {
                //client.Send(new SelectedServerRefusedMessage(1, (sbyte)ServerConnectionErrorEnum.SERVER_CONNECTION_ERROR_DUE_TO_STATUS, (sbyte)ServerStatusEnum.NOJOIN));
                Out.Debug(account.isAdmin ? $"+Admin {account.Pseudo}" : $"+User {account.Pseudo}");
            }
        }
示例#7
0
 public static void HandleCharacterList(BigEndianReader reader, WorldClient client, WorldServer server)
 {
     if (Char != null)
     {
         client.Send(new CharactersListMessage(false, new CharacterBaseInformations[] { Char }));
         Out.Debug(Char.sex.ToString() + Char.breed.ToString(), "Infos");
         return;
     }
     client.Send(new CharactersListMessage(false, new List <CharacterBaseInformations>()));
     //TODO : Get list of characters and send them
 }
示例#8
0
        public override void SendClientMessages(bool sendSnapshots)
        {
            var receivingClients = new List <GameClient>();

            foreach (var cl in Clients)
            {
                var client = (GameClient)cl;

                if (!client.ShouldSendMessage())
                {
                    continue;
                }

                Out.Debug("Write snapshot");
                if (sendSnapshots && client.IsActive())
                {
                    receivingClients.Add(client);
                }
                else
                {
                    // if client never send a netchannl packet yet, send ConnectionAccept because it could get lost in multiplayer
                    if (client.NetChannel.GetSequenceNr(EFlowType.Incoming) == 0)
                    {
                        Networking.OutOfBandPrintf(Socket, client.NetChannel.GetRemoteAddress(), "{0}00000000000000", (char)EConnectionType.ConnectionAccept);
                    }

                    client.NetChannel.Transmit();
                    client.UpdateSendState();
                }
            }

            if (receivingClients.Count > 0)
            {
                // if any client wants an update, take new snapshot now
                var snapshot = Program.FrameSnapshotManager.TakeTickSnapshot(TickCount);

                // copy temp ents references to pSnapshot
                CopyTempEntities(snapshot);

                foreach (var cl in receivingClients)
                {
                    var frame = cl.GetSendFrame();
                    if (frame == null)
                    {
                        continue;
                    }

                    cl.SendSnapshot(frame);
                    cl.UpdateSendState();
                }

                snapshot.ReleaseRefrence();
            }
        }
示例#9
0
        public void OnRequestFullUpdate()
        {
            // client requests a full update
            _lastSnapshot = null;

            // free old baseline snapshot
            FreeBaselines();

            Baseline = Program.FrameSnapshotManager.CreateEmptySnapshot(0, 1 << 11);

            Out.Debug("Sending full update to client \"{0}\"", GetClientName());
        }
示例#10
0
 //6072
 public static void HandleCharacterSelectedForceReadyMessage(BigEndianReader reader, WorldClient client, WorldServer server)
 {
     Out.Debug(CharSelectActions.Char.name, "NAME");
     client.Send(new CharacterSelectedSuccessMessage(new CharacterBaseInformations(
                                                         1,
                                                         200,
                                                         "TEST",
                                                         CharSelectActions.Char.entityLook,
                                                         1,
                                                         false
                                                         )));
 }
示例#11
0
        public void AcceptCallBack(IAsyncResult result)
        {
            AuthClient _newClient = new AuthClient(socket.EndAccept(result), this)
            {
                Ticket = Tools.RandomString(32, false)
            };

            Out.Debug($"New socket [{_newClient.socket.RemoteEndPoint}]");
            _newClient.Initialize();
            Clients.Add(_newClient.socket, _newClient);

            socket.BeginAccept(AcceptCallBack, null);
        }
示例#12
0
        public static Dictionary <int, WorldServer> GetServers()
        {
            Dictionary <int, WorldServer> srvList = new Dictionary <int, WorldServer>();
            var request = database.Query <WorldServer>("SELECT * FROM serverlist WHERE Usable=1", null);

            foreach (var srv in request)
            {
                WorldServer serv = srv;
                srvList.Add(serv.ServerId, serv);
                Out.Debug($" +SERVER [{serv.ServerId}]\t {serv.Name} \t {serv.Status} \t {serv.Completion}");
            }
            return(srvList);
        }
示例#13
0
 public void Initialize()
 {
     try
     {
         Send(new ProtocolRequired(AuthServer.ProtocolVersion, AuthServer.ProtocolVersion));
         Send(new HelloConnectMessage(1, Ticket)); //Send password encryption key
         socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceiveCallBack, socket);
     }
     catch (Exception)
     {
         Out.Debug($"User {Ip} disconnected because of an error");
         Disconnect();
     }
 }
示例#14
0
 public static void Initialize(string host, string user, string password, string database)
 {
     try
     {
         Out.Debug($"Connecting to:\n\t\tHOST = {host}\n\t\tUSER = {user}\n\t\tPWD = {password}\n\t\tDATABASE = {database}");
         string m_mysql = string.Format($"server={host};database={database};uid={user};pwd={password};Allow User Variables=True");
         connection = new MySqlConnection(m_mysql);
         connection.Open();
         Out.Debug($"Connection to database {database} openned");
     }
     catch (MySqlException e)
     {
         Out.Error(e.ToString());
     }
 }
示例#15
0
        public static void HandleAuthAdminCommand(BigEndianReader reader, AuthClient client, AuthServer server)
        {
            //TODO HANDLE AUTH COMMANDS
            AdminCommandMessage message = new AdminCommandMessage();

            message.Unpack(reader);

            switch (message.content.Split(' ')[0])
            {
            default:
                client.Send(new ConsoleMessage((sbyte)ConsoleMessageTypeEnum.CONSOLE_ERR_MESSAGE, "Unknown command"));
                break;
            }

            Out.Debug($"User {client.account.Pseudo} performed command '{message.content}'");
        }
示例#16
0
 public void Send(Message message)
 {
     try
     {
         using (BigEndianWriter writer = new BigEndianWriter())
         {
             message.Pack(writer);
             socket.BeginSend(writer.Data, 0, writer.Data.Length, SocketFlags.None, new AsyncCallback(SendCallBack), socket);
             Out.Debug($"{"New Packet", -12} : {message.ToString(), 36} --> {Ip, -12}");
         }
     }
     catch (Exception e)
     {
         Out.Warn($" USER DISCONNECTED (sending packet) {e.Message}");
         Disconnect();
     }
 }
示例#17
0
        public static void HandlePacket(byte[] data, WorldClient client, WorldServer server)
        {
            BigEndianReader reader = new BigEndianReader(data);
            short           header = reader.ReadShort();
            uint            Id     = (uint)header >> 2;
            uint            Length = (uint)header & 3;

            reader = UpdateReader(reader, Length);
            if (!packetList.ContainsKey(Id))
            {
                Out.Warn($"Unexpected packet from { client.Ip}. Invalid packet ID[{ Id}]" +
                         "\nDisconnecting client");
                return;
            }
            Out.Debug($"{"New Packet",-12} : {packetList[Id].Method.Name.Remove(0, 6),30}[{Id,4}] <-- {client.Ip,-12}");
            packetList[Id](reader, client, server);
        }
示例#18
0
 public void AcceptCallBack(IAsyncResult result)
 {
     try
     {
         WorldClient _newClient = new WorldClient(_world.EndAccept(result), this);
         Out.Debug($"New socket [{_newClient.socket.RemoteEndPoint}]");
         Clients.Add(_newClient);
     }
     catch (Exception e)
     {
         if (Clients != null)
         {
             Out.Error(e.Message);
         }
     }
     _world.BeginAccept(AcceptCallBack, null);
 }
示例#19
0
 public void Initialize()
 {
     try
     {
         //TODO HANDLE WORLD CONNECTION
         Send(new ProtocolRequired(1375, 1375));
         Send(new HelloGameMessage());
         Send(new BasicTimeMessage(1, 0));
         Send(new AccountCapabilitiesMessage(1, false, 16383, 4095)); //-> Binary (each bit correspond to one class)
         Send(new TrustStatusMessage(true));
         socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ReceiveCallBack, socket);
     }
     catch (Exception e)
     {
         Out.Debug($"User {Ip} disconnected because of an error");
         Out.Error(e.Message);
         Disconnect();
     }
 }
示例#20
0
        public virtual void SendClientMessages(bool sendSnapshots)
        {
            foreach (var client in Clients)
            {
                if (!client.ShouldSendMessage())
                {
                    continue;
                }

                if (client.NetChannel != null)
                {
                    client.NetChannel.Transmit();
                    client.UpdateSendState();
                }
                else
                {
                    Out.Debug("Client has no NetChannel!");
                }
            }
        }
示例#21
0
        public void AcceptCallBack(IAsyncResult result)
        {
            try
            {
                AuthClient _newClient = new AuthClient(socket.EndAccept(result), this)
                {
                    Ticket = Tools.RandomString(32, false)
                };
                Out.Debug($"New socket [{_newClient.socket.RemoteEndPoint}]");
                //_newClient.Initialize();
                Clients.Add(_newClient.socket, _newClient);

                socket.BeginAccept(AcceptCallBack, null);
            }catch (Exception e)
            {
                if (Clients != null)
                {
                    Out.Error(e.Message);
                }
            }
        }
示例#22
0
        public void ProcessConnectionlessPacket(NetPacket packet)
        {
            var msg = packet.Message;

            var type = (EConnectionType)msg.ReadChar();

            if (!CheckConnectionLessRateLimits(packet.From))
            {
                return;
            }

            switch (type)
            {
            case EConnectionType.GetChallenge:
                ReplyChallenge(packet.From);
                break;

            case EConnectionType.RequestInfo:
                // TODO: Responde player's info, map ect.
                break;

            case EConnectionType.PlayerConnect:
                var protocol     = msg.ReadInt();
                var authProtocol = msg.ReadInt();
                var challengeNr  = msg.ReadInt();

                var playerName     = msg.ReadString();
                var serverPassword = msg.ReadString();

                ConnectClient(packet.From, protocol, authProtocol, challengeNr, playerName, serverPassword);
                break;

            default:
                Out.Debug("Unknown connectionless type '{0}'!", type);
                return;
            }
        }
示例#23
0
        public static void BuildPacket(byte[] data, AuthClient client, AuthServer server)
        {
            BigEndianReader reader = new BigEndianReader(data);
            AuthClient      cl     = client;
            short           header = reader.ReadShort();
            uint            Id     = (uint)header >> 2;
            uint            Length = (uint)header & 3;

            reader = UpdateReader(reader, Length);
            Out.Debug($"=> Packet[{Id}] from {client.Ip}");
            #region
            switch (Id)
            {
            case 4:
                IdentificationWithLoginTokenMessage message = new IdentificationWithLoginTokenMessage();
                message.Unpack(reader);
                Account  account = AccountManager.GetAccount(message.login);
                DateTime dateNow = DateTime.Now;
                List <GameServerInformations> servers = new List <GameServerInformations>();
                foreach (WorldServer s in server.Servers.Values)     //Load each server
                {
                    int nbChar = AccountManager.GetNbChar(s.ServerId, account.Id);
                    servers.Add(new GameServerInformations((ushort)s.ServerId, (sbyte)s.Status, (sbyte)s.Completion, true, (sbyte)nbChar));
                }
                if (servers.Count < 1)
                {
                    AuthServer.onMaintenance = true;
                }
                if (account == null ||
                    message.password != Tools.GetMd5(account.Password + cl.Ticket))     //Test password
                {
                    client.Send(new IdentificationFailedMessage((sbyte)IdentificationFailureReasonEnum.WRONG_CREDENTIALS));
                    client.Disconnect();
                    return;
                }
                if (account.Banned)     // ban a vie
                {
                    client.Send(new IdentificationFailedMessage((sbyte)IdentificationFailureReasonEnum.BANNED));
                    client.Disconnect();
                    return;
                }
                if (account.EndBan > dateNow)    //Ban temp
                {
                    int ms = 0;
                    ms = (int)account.EndBan.Subtract(dateNow).TotalMinutes;
                    client.Send(new IdentificationFailedBannedMessage((sbyte)IdentificationFailureReasonEnum.BANNED, ms));
                    client.Disconnect();
                    return;
                }
                if (AuthServer.onMaintenance)     //Maintenance (In config)
                {
                    client.Send(new IdentificationFailedMessage((sbyte)IdentificationFailureReasonEnum.IN_MAINTENANCE));
                    client.Disconnect();
                    return;
                }
                client.account = account;

                double msSub = 0;
                if (account.EndSub > DateTime.Now)
                {
                    msSub = account.EndSub.Subtract(DateTime.Now).TotalMilliseconds;
                }
                client.Send(new IdentificationSuccessMessage(account.isAdmin, true, account.Pseudo, account.Id, 0, account.Question, msSub));
                Out.Debug(account.isAdmin? $"+Admin {account.Pseudo}" : $"+User {account.Pseudo}");
                client.Send(new ServersListMessage(servers));

                //TODO Get number of characters for each server
                return;

            default:
                client.Disconnect();
                return;
            }
            #endregion
        }
示例#24
0
        public static void HandleCharacterCreation(BigEndianReader reader, WorldClient client, WorldServer server)
        {
            try
            {
                CharacterCreationRequestMessage message = new CharacterCreationRequestMessage();
                message.Unpack(reader);
                client.Send(new CharacterCreationResultMessage(0));
                Thread.Sleep(1000);
                int   y      = 0;
                int[] colors = new int[5];
                foreach (int x in message.colors)
                {
                    if (y < 5 && x != -1)
                    {
                        colors[y] = (y + 1 & 255) << 24 | x & 16777215;
                        //((nb & 255) << 24 | color & 16777215)
                        y++;
                    }
                    else
                    {
                        break;
                    }
                }

                for (int x = 0; x < colors.Length; x++)
                {
                    Out.Debug(colors[x].ToString(), "Colors");
                }
                //x => x.Key << 24 | x.Value.ToArgb() & 0xFFFFFF

                int style = message.breed * 10;
                if (message.sex)
                {
                    style++;
                }

                Char = new CharacterBaseInformations(
                    1,
                    200,
                    message.name,
                    new EntityLook(1, new short[] { (short)style }, colors, new short[] { 125 }, new SubEntity[] { }),
                    message.breed,
                    message.sex);

                IEnumerable <CharacterBaseInformations> chars = new List <CharacterBaseInformations>()
                {
                    Char
                };

                client.Send(new CharactersListMessage(false, chars));
            }
            catch (Exception e)
            {
                Out.Error(e.Message);
            }
            //var_character =
            //{
            //    Level = 1,
            //    Name = message.name,
            //    Breed = message.breed,
            //    Sex = message.sex,
            //    EntityLook = EntityManager.Instance.BuildEntityLook(message.breed, message.sex, message.colors.ToList()),
            //    MapId = BreedManager.Instance.GetStartMap(message.breed),
            //    CellId = BreedManager.Instance.GetStartCell(message.breed),
            //    Direction = BreedManager.Instance.GetStartDirection(message.breed),
            //    SpellsPoints = 1
            //};
        }
示例#25
0
 public void Disconnect()
 {
     server.Clients.Remove(socket);
     socket.Dispose();
     Out.Debug($" -User {Ip}");
 }