using System; using System.Net; using System.Linq; using System.Data; using System.Data.SqlClient; using Filter.Networking.Instances; using Filter.Networking.Login; using Filter.Utilities; using System.Threading; namespace Filter.Handlers.Login { internal enum LoginResponse : byte { Response01 = 67, //DB Error. Response02 = 68, //Authentication Failed. Response03 = 69, //Please check ID or Password. Response04 = 71, //The ID has been blocked. Response05 = 72, //The World Servers are down for maintenance. Response06 = 73, //Authentication timed out. Please try to log in again. Response07 = 74, //Login failed. Response08 = 75, //Please accept the agreement to continue. } internal class Login3Handle { [LoginPacketHandler(Login3TypeClient.Version)] public static void HandleVersion(LoginClient ClientSocket, Packet ClientPacket) { if (ClientSocket.IsConnected != 0) { ClientPacket.Dispose(); return; } Int16 Year; Int16 Version; if (!ClientPacket.ReadInt16(out Year) || !ClientPacket.ReadInt16(out Version)) { SendResponse(ClientSocket, LoginResponse.Response07); } else if (Year != Program.Config.LoginYear || Version != Program.Config.LoginVersion) { SendResponse(ClientSocket, LoginResponse.Response07); } else { ClientSocket.Server.SendPacket(ClientPacket); } ClientPacket.Dispose(); } [LoginPacketHandler(Login3TypeClient.WorldSelect)] public static void HandleWorldSelect(LoginClient ClientSocket, Packet ClientPacket) { if (ClientSocket.IsConnected != 0) { ClientPacket.Dispose(); return; } Byte WorldID; if (!ClientPacket.ReadByte(out WorldID)) { ClientSocket.Disconnect(); } else { ClientSocket.Server.SendPacket(ClientPacket); } ClientPacket.Dispose(); } [LoginPacketHandler(Login3TypeClient.Token)] public static void HandleToken(LoginClient ClientSocket, Packet ClientPacket) { if (ClientSocket.IsConnected != 0) { ClientPacket.Dispose(); return; } String Username; String Password; String EncryptedPassword = String.Empty; if (!ClientPacket.ReadString(out Username, 18) || !ClientPacket.ReadString(out Password, 16)) { SendResponse(ClientSocket, LoginResponse.Response07); } else { using (var Connection = new SqlConnection()) { Connection.ConnectionString = Program.ConnectionBuilder.ConnectionString; try { Connection.Open(); } catch { SendResponse(ClientSocket, LoginResponse.Response01); } if (Connection.State == ConnectionState.Open) { using (var Command = Connection.CreateCommand()) { Command.CommandText = String.Format("SELECT TOP 1 nUserNo, sUserPWSalt FROM HK_Account..tUser WHERE sUserID = '{0}'", Username); using (var Reader = Command.ExecuteReader()) { Reader.Read(); if (!Reader.HasRows) { SendResponse(ClientSocket, LoginResponse.Response03); } else { ClientSocket.AccountID = Convert.ToInt32(Reader["nUserNo"]); String sUserPWSalt = Convert.ToString(Reader["sUserPWSalt"]); WebClient Client = new WebClient(); EncryptedPassword = Client.DownloadString(String.Format("http://164.132.202.69:8080/t7vCRXIxglDMrO5ujx2s.php?Password={0}&Salt={1}", Password, sUserPWSalt)); } Reader.Close(); } if (EncryptedPassword != String.Empty) { Command.CommandText = String.Format("SELECT TOP 1 nUserNo FROM HK_Account..tUser WHERE sUserID = '{0}' AND sUserPWHash = '{1}'", Username, EncryptedPassword); using (var Reader = Command.ExecuteReader()) { Reader.Read(); if (!Reader.HasRows) { SendResponse(ClientSocket, LoginResponse.Response03); } else { ClientPacket = new Packet(3, 6); ClientPacket.WriteString(Username, 18); ClientPacket.WriteString("-", 16); Console.WriteLine(Username + Password); ClientSocket.Server.SendPacket(ClientPacket); } Reader.Close(); } } else { SendResponse(ClientSocket, LoginResponse.Response03); } } } Connection.Close(); } } ClientPacket.Dispose(); } [LoginPacketHandler(Login3TypeServer.Transfer)] public static void HandleTransfer(LoginServer ServerSocket, Packet ServerPacket) { if (ServerSocket.IsConnected != 0) { ServerPacket.Dispose(); return; } Byte[] Unwanted = new Byte[19]; ServerPacket.ReadBytes(Unwanted, 19); String TransferKey; ServerPacket.ReadString(out TransferKey, 64); Program.LoginToManagerTransfer.Add(TransferKey, ServerSocket.Client.AccountID); ServerSocket.Client.SendPacket(ServerPacket); } private static void SendResponse(LoginClient ClientSocket, LoginResponse Response) { Packet ServerPacket = new Packet(Login3TypeServer.LoginError); ServerPacket.WriteInt16(Convert.ToInt16(Response)); ClientSocket.SendPacket(ServerPacket); } } }