using System; using System.Collections.Generic; using FilterAPI.Networking; using FilterLogin.LoginNetworking; namespace FilterLogin.LoginHandlers { class Login3Handle { [LoginPacketHandler(NETCMD.LOGIN_VER)] public static void HandleClientVersion(LoginClient ClientSocket, Packet ClientPacket) { UInt16 Year = 0; UInt16 Version = 0; if (((Year = ClientPacket.PacketReader.ReadUInt16()) != 0) && ((Version = ClientPacket.PacketReader.ReadUInt16()) != 0)) { if (Year != Convert.ToInt32(Program.Conf.GetConfigValue("LoginYear"))){ ClientSocket.Dispose(); } else if (Version != Convert.ToInt32(Program.Conf.GetConfigValue("LoginVersion"))) { ClientSocket.Dispose(); } else { ClientSocket.SendPacketServer(ClientPacket); } } else { ClientSocket.Dispose(); } } [LoginPacketHandler(NETCMD.LOGIN_HASH)] public static void HandleHash(LoginClient ClientSocket, Packet ClientPacket) { String Hash = String.Empty; ClientPacket.PacketReader.ReadByte(); if ((Hash = ClientPacket.ReadString(28)) != String.Empty) { if (Hash.Length != 28) { ClientSocket.Dispose(); } else { ClientSocket.SendPacketServer(ClientPacket); } } else { ClientSocket.Dispose(); } } [LoginPacketHandler(NETCMD.LOGIN_WORLD_SELECT)] public static void HandleWorldSelect(LoginClient ClientSocket, Packet ClientPacket) { Byte WorldID = Byte.MaxValue; if ((WorldID = ClientPacket.PacketReader.ReadByte()) != Byte.MaxValue) { if (Program.SQL.GettWorldBan(WorldID, Program.SQL.GetsUsernameFromnEMID(ClientSocket.nUserNo))) { using (var ServerPacket = new Packet(NETCMD.LOGIN_ERROR)) { ServerPacket.PacketWriter.Write((Byte)71); ClientSocket.SendPacketClient(ServerPacket); } ClientSocket.Dispose(); } else { ClientSocket.SendPacketServer(ClientPacket); } } } [LoginPacketHandler(NETCMD.LOGIN_XFER_KEY)] public static void HandleTransferKey(LoginClient ClientSocket, Packet ServerPacket) { Byte WorldStatus = ServerPacket.PacketReader.ReadByte(); String IPAddress = ServerPacket.ReadString(16); UInt16 Port = ServerPacket.PacketReader.ReadUInt16(); String TransferKey = ServerPacket.ReadString(64); using (var LocalPacket = new Packet(NETCMD.LOCAL_XFER_KEY)) { LocalPacket.PacketWriter.Write(ClientSocket.nUserNo); LocalPacket.PacketWriter.Write(TransferKey); Program.LocalClient.SendPacket(LocalPacket); } using (var ServerPacketRewrite = new Packet(NETCMD.LOGIN_XFER_KEY)) { ServerPacketRewrite.PacketWriter.Write(WorldStatus); if (!Program.SQL.GettSendLocal(ClientSocket.nUserNo)) { ServerPacketRewrite.WriteString(Program.Conf.GetConfigValue("LoginTransferIP"), 16); } else { ServerPacketRewrite.WriteString("127.0.0.1", 16); } ServerPacketRewrite.PacketWriter.Write(Port); ServerPacketRewrite.WriteString(TransferKey); ClientSocket.SendPacketClient(ServerPacketRewrite); } } [LoginPacketHandler(NETCMD.LOGIN_TOKEN)] public static void HandleToken(LoginClient ClientSocket, Packet ClientPacket) { String Token = String.Empty; Int32 nUserNo = -1; if ((Token = ClientPacket.ReadString(Convert.ToByte(Program.Conf.GetConfigValue("LoginTokenLength")))) != String.Empty) { if (Token.Length != Convert.ToByte(Program.Conf.GetConfigValue("LoginTokenLength"))) { ClientSocket.Dispose(); } else if (!Program.SQL.GetnEMIDFromsToken(Token, out nUserNo)) { ClientSocket.Dispose(); } else { ClientSocket.SendPacketServer(ClientPacket); Byte nAuthID = Program.SQL.GetnAuthIDFromnEMID(nUserNo); Byte nTypeID = Program.SQL.GetnTypeIDfromnAuthID(nAuthID, out bool nLoginable); if (!nLoginable) { using (var ServerPacket = new Packet(NETCMD.LOGIN_ERROR)) { ServerPacket.PacketWriter.Write(nTypeID); ClientSocket.SendPacketClient(ServerPacket); } ClientSocket.Dispose(); } else { using (var LocalPacket = new Packet(NETCMD.LOGIN_VER)) { LocalPacket.PacketWriter.Write(Convert.ToString(ClientSocket.ClientGUID)); LocalPacket.PacketWriter.Write(nUserNo); Program.LocalClient.SendPacket(LocalPacket); } ClientSocket.nUserNo = nUserNo; List sIDs = Program.SQL.GetsIDsFornUserNo(ClientSocket.nUserNo); foreach (String sID in sIDs) { using (var LocalPacket = new Packet(NETCMD.LOCAL_DC_PLYR)) { LocalPacket.PacketWriter.Write(sID); LocalPacket.PacketWriter.Write(true); LocalPacket.PacketWriter.Write("Server"); LocalPacket.PacketWriter.Write("Multiple logins detected. You have been kicked from the server."); Program.LocalClient.SendPacket(LocalPacket); } } Program.SQL.InserttUserIP(nUserNo, Convert.ToString(ClientSocket.CIPEP.Address)); foreach (String sQuery in Program.SQL.GetLoginQueries(nUserNo)) { Program.SQL.ExecutesQuery(sQuery); } Program.SQL.DeletetLoginQueries(nUserNo); } } } else { ClientSocket.Dispose(); } } } }