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(); }
/* * 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(); }