示例#1
0
        public static void CheckVersion(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var version = packet.ReadInt();

            var ip            = client.RemoteEndPoint.ToString().Split(':')[0];
            var kick          = false;
            var ver           = client.Metadata["version"] as int[];
            var clientVersion = ver[0];
            var ignore        = ver[2];

            if (version != clientVersion && ignore == 0)
            {
                Log.Notice(string.Format("Failed ClientAuth IP: {0} Client ver: {1} Server ver: {2}", ip, version, clientVersion));

                if (version > clientVersion)
                {
                    events.VersionMismatch("login.CheckVersion", new VersionCheckEventArgs(version, ip, VersionCheckResult.NewerClient));
                }
                else
                {
                    events.VersionMismatch("login.CheckVersion", new VersionCheckEventArgs(version, ip, VersionCheckResult.OlderClient));
                }

                kick = true;
            }

            if (ignore == 0)
            {
                version = clientVersion;
            }

            events.VersionMismatch("login.CheckVersion", new VersionCheckEventArgs(version, ip, VersionCheckResult.Match));

            builder.New(0x7A);
            {
                builder += version;     // Client Version
                builder += 0x0059077C;  // Debug
                builder += 0;           // Reserved
                builder += 0;           // Reserved
            }

            client.Send(builder, "CheckVersion");

            if (kick)
            {
                events.ClientDisconnected(client, client);
                return;
            }

            var id = -2;

            var sleep = new Timer(500);

            sleep.Elapsed += (s, _e) =>
            {
                if (id == -2)
                {
                    var syncServer = client.Metadata["syncServer"] as SyncReceiver;
                    id = Authentication.GetUser(syncServer, (ulong)client.Metadata["magic"]);
                }

                if (id > 0)
                {
                    client.AccountID = id;
                    SendChannels.SendChannelList(client);

                    var timer = new Timer(5000);
                    timer.AutoReset = true;
                    timer.Elapsed  += (sender, e) => { SendChannels.SendChannelList(client); };

                    timer.Start();
                    client.Metadata["timer"] = timer;
                }

                sleep.Stop();
            };

            sleep.Start();
        }
示例#2
0
        /*
         * CheckVersion Packet
         * -------------------------
         * Client2Server Structure:
         *
         * ushort   : magic code
         * ushort   : size
         * int      : padding
         * ushort   : opcode
         *
         * int      : version1         #client version
         * int      : version2         #debug
         * int      : version3         #reserved
         * int      : version4         #reserved
         * -------------------------
         * Server2Client Structure:
         *
         * ushort   : magic code
         * ushort   : size
         * ushort   : opcode
         *
         * int      : version1         #client version
         * int      : version2         #debug
         * int      : version3         #reserved
         * int      : version4         #reserved
         */
        #endregion

        public static void CheckVersion(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            int version = packet.ReadInt();

            var conf = client.Metadata["conf"] as Configuration;

            if (conf == null)
            {
                return;
            }

            int clientVersion = conf.ClientVersion;

            // i dont like this one, should be way better: client.GetIpAddress();
            string ip   = client.RemoteEndPoint.ToString().Split(':')[0];
            bool   kick = false;

            if (conf.Debug)
            {
                // skipping on debug mode

                builder.New(0x7A);
                {
                    builder += version;     // Client Version
                    builder += 0;           // Debug
                    builder += 0;           // Reserved
                    builder += 0;           // Reserved
                }

                events.VersionMismatch("login.CheckVersion", new VersionCheckEventArgs(version, ip, VersionCheckResult.Match));

                client.Send(builder, "CheckVersion");
                return;
            }

            var result = VersionCheckResult.None;

            if (version != clientVersion)
            {
                result = version > clientVersion ? VersionCheckResult.NewerClient : VersionCheckResult.OlderClient;
                kick   = true;
                Log.Notice(string.Format("Failed CheckVersion Ip: {0} Client: {1}; Server: {2}", ip, version, clientVersion));
            }
            else
            {
                result = VersionCheckResult.Match;
            }

            events.VersionMismatch("login.CheckVersion", new VersionCheckEventArgs(version, ip, result));

            builder.New(0x7A);
            {
                builder += clientVersion;   // Client Version
                builder += 0;               // Debug
                builder += 0;               // Reserved
                builder += 0;               // Reserved
            }

            client.Send(builder, "CheckVersion");

            if (kick)
            {
                // we have to be sure that client will be disconnected
                // if client didnt closed it's connection, server will close after 800ms
                var waitKick = new Timer(800);
                waitKick.Elapsed += (s, _e) =>
                {
                    client.Disconnect();
                    waitKick.Stop();
                };

                waitKick.Start();
                return;
            }

            int id = -2;

            var sleep = new Timer(500);

            sleep.Elapsed += (s, _e) =>
            {
                if (id == -2)
                {
                    var syncServer = client.Metadata["syncServer"] as SyncReceiver;
                    id = Authentication.GetUser(syncServer, (ulong)client.Metadata["magic"]);
                }

                if (id > 0)
                {
                    client.AccountID = id;
                    SendChannels.SendChannelList(client);

                    var timer = new Timer(5000);
                    timer.AutoReset = true;
                    timer.Elapsed  += (sender, e) => { SendChannels.SendChannelList(client); };

                    timer.Start();
                    client.Metadata["timer"] = timer;
                }

                sleep.Stop();
            };

            sleep.Start();
        }