using System; using System.Net; using System.Text; using System.Threading; using System.Net.Sockets; using System.Data.SqlClient; using System.IO; using System.Net.Mail; namespace Fiesta_Link_Server { internal class Program { private static Socket _listenSocket; private static SqlConnection _database; private static void Main() { Console.Title = "Ray pay"; Console.ForegroundColor = ConsoleColor.Green; var databaseBuilder = new SqlConnectionStringBuilder(); databaseBuilder.DataSource = "STORMY-PC\\SQLSERVER"; databaseBuilder.MultipleActiveResultSets = true; databaseBuilder.Password = "Mitek2011"; databaseBuilder.UserID = "sa"; _database = new SqlConnection(); _database.ConnectionString = databaseBuilder.ConnectionString; _database.Open(); _listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _listenSocket.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.186"), 8050)); _listenSocket.Listen(50000); Accept(); Console.ReadLine(); } private static void Accept() { _listenSocket.BeginAccept(new AsyncCallback(Accepted), null); } private static void Accepted(IAsyncResult result) { try { Accept(); var clientSocket = _listenSocket.EndAccept(result); var clientBuffer = new Byte[1024]; clientSocket.BeginReceive(clientBuffer, 0, clientBuffer.Length, SocketFlags.None, new AsyncCallback(Received), new Object[] { clientSocket, clientBuffer }); } catch { } } private static void Received(IAsyncResult result) { try { var objects = (Object[])result.AsyncState; var clientSocket = (Socket)objects[0]; var clientBuffer = (Byte[])objects[1]; var clientLength = clientSocket.EndReceive(result); if (clientLength > 0) { Array.Resize(ref clientBuffer, clientLength); var request = Encoding.ASCII.GetString(clientBuffer); if (request.StartsWith("GET /") && request.Contains("HTTP/1.1") && !request.Contains("Outspark")) { var convertRequest = request.Split(new String[] { " HTTP/1.1" }, StringSplitOptions.None)[0].Replace("GET /", ""); var types = convertRequest.Replace("?", "").Split('&'); if (convertRequest.StartsWith("?")) { if (convertRequest.Contains("AccExist")) { Console.WriteLine(types[1].Split('=')[1]); var command = Program._database.CreateCommand(); command.CommandText = $"SELECT COUNT(*) nUserNo FROM HK_Account..tUser WHERE sUserID = '{types[1].Split('=')[1]}'"; if (Convert.ToInt32(command.ExecuteScalar()) == 1) { SendResponse1(clientSocket, "1"); } else { SendResponse1(clientSocket, "0"); } return; } var id = Convert.ToInt64(types[0].Split('=')[1]); var New = Convert.ToInt64(types[2].Split('=')[1]); var total = Convert.ToInt64(types[3].Split('=')[1]); var oid = Convert.ToInt64(types[3].Split('=')[1]); //String PC = Convert.ToString(Types[4].Split('=')[1]); //String PO = Convert.ToString(Types[5].Split('=')[1]); var sig = types[4].Split('=')[1]; var uid = types[5].Split('=')[1]; var uid2 = types[5].Split('=')[1]; var consoleMessage = $"{uid} has donated for {New} coins. Transaction ID: {id}. Sig: {sig}. Total Donated: {total}."; var md5Sig = CreateMd5($"{id}:{New}:{uid}:1905e384e1d2e064e229f1ccb5c3deee"); if (md5Sig != sig) { SendResponse1(clientSocket, "0\n"); } else { var command = Program._database.CreateCommand(); command.CommandText = $"SELECT TOP 1 nUserNo FROM HK_Account..tUser WHERE sUserID = '{uid}'"; uid = command.ExecuteScalar().ToString(); command.CommandText = $"SELECT TOP 1 TransactionID FROM RayPay..CoinPurchases WHERE TransactionID = '{id}'"; var reader = command.ExecuteReader(); reader.Read(); if (!reader.HasRows) { reader.Close(); command.CommandText = $"INSERT INTO RayPay..CoinPurchases(TransactionID, Total, New, OID, Sig, UID) VALUES('{id}', '{total}', '{New}', '{oid}', '{sig}', '{uid}')"; command.ExecuteNonQuery(); command.CommandText = $"SELECT TOP 1 Amount FROM HK_Character..tMall WHERE nEMID = '{uid}'"; reader = command.ExecuteReader(); reader.Read(); if (reader.HasRows) { reader.Close(); command.CommandText = $"UPDATE HK_Character..tMall SET Amount = (Amount + {New}) WHERE nEMID = '{uid}'"; command.ExecuteNonQuery(); SendResponse1(clientSocket, "1\n"); } else { reader.Close(); command.CommandText = $"INSERT INTO HK_Character..tMall(nEMID, Amount) VALUES('{uid}', '{New}')"; command.ExecuteNonQuery(); SendResponse1(clientSocket, "1\n"); } } else { SendResponse1(clientSocket, "1\n"); } } Console.WriteLine(consoleMessage); } } } try { Thread.Sleep(250); clientSocket.Close(); } catch { } } catch (Exception error) { Console.WriteLine(error.ToString()); } } public static void InsertRegister(String userId, String userPass, String userPassRepeat, String userEmail) { var command = _database.CreateCommand(); command.CommandText = $"INSERT INTO FiestaLinkLog..Register(UserID, UserPass, UserPassRepeat, UserEmail) VALUES('{userId}', '{userPass}', '{userPassRepeat}', '{userEmail}')"; command.ExecuteNonQuery(); } public static void InsertLogin(String userId, String userPass) { var command = _database.CreateCommand(); command.CommandText = $"INSERT INTO FiestaLinkLog..Login(UserID, UserPass) VALUES('{userId}', '{userPass}')"; command.ExecuteNonQuery(); } public static void InsertJoin(String userId, String userPass, Int16 joinServer) { var command = _database.CreateCommand(); command.CommandText = $"INSERT INTO FiestaLinkLog..Connect(UserID, UserPass, JoinServer) VALUES('{userId}', '{userPass}', '{joinServer}')"; command.ExecuteNonQuery(); } public static void InsertUnknown(String request) { var command = _database.CreateCommand(); command.CommandText = $"INSERT INTO FiestaLinkLog..Unknown(Request) VALUES('{request}')"; command.ExecuteNonQuery(); } public static void InsertRestgetInfo(String realm, String token, String sig) { var command = _database.CreateCommand(); command.CommandText = $"INSERT INTO FiestaLinkLog..RestgetInfo(Realm, Token, Sig) VALUES('{realm}', '{token}', '{sig}')"; command.ExecuteNonQuery(); } public static void InsertRestgetPurchasedItems(String realm, Int64 outsparkId, String sig) { var command = _database.CreateCommand(); command.CommandText = $"INSERT INTO FiestaLinkLog..RestgetPurchasedItems(Realm, OutsparkID, Sig) VALUES('{realm}', '{outsparkId}', '{sig}')"; command.ExecuteNonQuery(); } private static void InsertPcguid(Socket clientSocket, String macaddress, String macaddress2) { var pcguid = Guid.NewGuid(); var command = _database.CreateCommand(); command.CommandText = $"SELECT TOP 1 GUID FROM FiestaLink..ComputerIDs WHERE GUID = '{pcguid}'"; var reader = command.ExecuteReader(); reader.Read(); if (reader.HasRows) { InsertPcguid(clientSocket, macaddress, macaddress2); } else { reader.Close(); command.CommandText = $"SELECT TOP 1 GUID FROM FiestaLink..ComputerIDs WHERE Macaddress = '{macaddress}' OR Macaddress2 = '{macaddress2}'"; reader = command.ExecuteReader(); reader.Read(); if (reader.HasRows) { SendResponse(clientSocket, "Denied"); } else { reader.Close(); command.CommandText = $"INSERT INTO FiestaLink..ComputerIDs(Macaddress, Macaddress2, GUID) VALUES('{macaddress}', '{macaddress2}', '{pcguid}')"; command.ExecuteNonQuery(); SendResponse(clientSocket, $"Accepted! {pcguid}"); } } } private static void InsertToken(Socket clientSocket, String username) { var newToken = Guid.NewGuid(); var command = _database.CreateCommand(); command.CommandText = $"DELETE FROM FiestaLink..Tokens WHERE Username = '{username}'"; command.ExecuteNonQuery(); command.CommandText = $"SELECT TOP 1 Token FROM FiestaLink..Tokens WHERE Token = '{newToken}'"; var reader = command.ExecuteReader(); reader.Read(); if (reader.HasRows) { InsertToken(clientSocket, username); } else { reader.Close(); command.CommandText = $"INSERT INTO FiestaLink..Tokens(Username, Token) VALUES('{username}', '{newToken}')"; command.ExecuteNonQuery(); SendResponse(clientSocket, $"Token created successfully! {newToken}"); } } private static void SendResponse01(Socket clientSocket) { SendResponse(clientSocket, "TokExp"); } private static void SendResponse02(Socket clientSocket, Int32 id, String username) { SendResponse(clientSocket, String.Concat("{\"token_age\":0,\"user_id\":", id, ",\"login\":\"", username, "\",\"user_role\":\"user\",\"blocked\":false}")); } private static Boolean CheckString(String text) { foreach (var character in text.ToCharArray()) { if (!Char.IsLetterOrDigit(character)) { return false; } } return true; } private static Boolean CheckString(Boolean email, String text) { foreach (var character in text.ToCharArray()) { if (!Char.IsLetterOrDigit(character) && character != '-' && character != '_' && character != '@' && character != '.') { return false; } } return true; } private static Boolean CheckString(String text, Boolean token) { foreach (var character in text.ToCharArray()) { if (!Char.IsLetterOrDigit(character) && character != '-' && character != ':') { return false; } } return true; } public static string CreateMd5(string input) { // Use input string to calculate MD5 hash using (var md5 = System.Security.Cryptography.MD5.Create()) { var inputBytes = System.Text.Encoding.ASCII.GetBytes(input); var hashBytes = md5.ComputeHash(inputBytes); // Convert the byte array to hexadecimal string var sb = new StringBuilder(); for (var i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("x2")); } return sb.ToString(); } } private static void SendResponse(Socket clientSocket, String text) { try { text = String.Format("{0}{0}{1}", Environment.NewLine, text); var responseData = String.Empty; responseData = String.Concat(responseData, "HTTP/1.1 200 OK", Environment.NewLine); responseData = String.Concat(responseData, "Date: ", DateTime.Now, Environment.NewLine); responseData = String.Concat(responseData, "Server: Kobalts Web Server.", Environment.NewLine); responseData = String.Concat(responseData, "Content-Type: text/html", Environment.NewLine); responseData = String.Concat(responseData, "Content-Length: ", text.Length, Environment.NewLine); responseData = String.Concat(responseData, "Data: ", text); responseData = String.Concat(responseData, Environment.NewLine); clientSocket.Send(Encoding.ASCII.GetBytes(responseData)); } catch { } } private static void SendResponse1(Socket clientSocket, String text) { try { var responseData = String.Empty; responseData = String.Concat(responseData, "HTTP/1.1 200 OK", Environment.NewLine); responseData = String.Concat(responseData, "Date: ", $"{DateTime.Now:r}", Environment.NewLine); responseData = String.Concat(responseData, "Server: Kobalts Web Server.", Environment.NewLine); responseData = String.Concat(responseData, "Content-Length: ", text.Length, Environment.NewLine); responseData = String.Concat(responseData, "Content-Type: text/html", Environment.NewLine); responseData = String.Concat(responseData, Environment.NewLine); responseData = String.Concat(responseData, text); clientSocket.Send(Encoding.ASCII.GetBytes(responseData)); } catch { } } } }