private void ListenerThread() { VF.NetworkIncommingMessage msg; while (m_ListenerThread != null) { try { while ((msg = m_Server.WaitMessage(TimeSpan.FromMilliseconds(1000))) != null) { switch (msg.MessageType) { case VF.NetworkMessageType.RawData: { // incoming message from a client WLN_PacketType packetType = (WLN_PacketType)msg.ReadByte(); if (packetType == WLN_PacketType.Request_AddonUpdateInfo) { #region BACKWARDS_COMPATIBILITY_ONLY BackwardsCompatible_Request_AddonUpdateInfo(msg); #endregion BACKWARDS_COMPATIBILITY_ONLY } else if (packetType == WLN_PacketType.Request_AddonUpdateInfoNew) { WLN_RequestPacket_AddonUpdateInfoNew addonUpdateInfoRequest = msg.ReadClass <WLN_RequestPacket_AddonUpdateInfoNew>(); List <WLN_ResponsePacket_AddonUpdateInfo> result = new List <WLN_ResponsePacket_AddonUpdateInfo>(); Logger.ConsoleWriteLine("Received Request_AddonUpdateInfoNew from IP=" + msg.SenderIP.ToString() + ", UserID=" + addonUpdateInfoRequest.UserID + ", LauncherVersion=" + addonUpdateInfoRequest.LauncherVersion); Random rand = new Random((int)DateTime.UtcNow.Ticks); foreach (var addon in addonUpdateInfoRequest.Addons) { WLN_ResponsePacket_AddonUpdateInfo addonUpdateInfo = AddonUpdates.GetAddonUpdate(addonUpdateInfoRequest.UserID, addon); if (addonUpdateInfo != null) { result.Add(addonUpdateInfo); } } var response = msg.CreateResponseMessage(-1); //.SenderConnection.SendPacket_VF(WLN_PacketType.Response_AddonUpdateInfo, result); response.WriteByte((byte)WLN_PacketType.Response_AddonUpdateInfo); response.WriteClass(result); m_Server.SendMessage(response); } else if (packetType == WLN_PacketType.Request_AddonUpdateInfoPeek) { WLN_RequestPacket_AddonUpdateInfoPeek addonUpdateInfoRequest = msg.ReadClass <WLN_RequestPacket_AddonUpdateInfoPeek>(); WLN_ResponsePacket_AddonUpdateInfoPeek result = new WLN_ResponsePacket_AddonUpdateInfoPeek(); if (AddonUpdates.g_LastAddonUpdateTimeUTC > DateTime.UtcNow.AddMinutes(-addonUpdateInfoRequest.MinutesSinceLastPeek)) { result.AddonUpdatesAvailable.Add("null"); } var response = msg.CreateResponseMessage(-1); //.SenderConnection.SendPacket_VF(WLN_PacketType.Response_AddonUpdateInfo, result); response.WriteByte((byte)WLN_PacketType.Response_AddonUpdateInfoPeek); response.WriteClass(result); m_Server.SendMessage(response); } else if (packetType == WLN_PacketType.Upload_AddonData) { WLN_UploadPacket_AddonData uploadedAddonData = msg.ReadClass <WLN_UploadPacket_AddonData>(); Logger.ConsoleWriteLine("Received Upload_AddonData(" + uploadedAddonData.AddonName + ") from " + msg.SenderIP.ToString()); AddonDatabaseService.UploadData(msg.SenderIP, uploadedAddonData); var successResponse = new WLN_UploadPacket_SuccessResponse(); var response = msg.CreateResponseMessage(-1); //.SenderConnection.SendPacket_VF(WLN_PacketType.Response_AddonUpdateInfo, result); response.WriteByte((byte)WLN_PacketType.Upload_SuccessResponse); response.WriteClass(successResponse); m_Server.SendMessage(response); } else if (packetType == WLN_PacketType.Request_RegisterNewUserID) { //WLN_Request_RegisterNewUserID registerPacket = msg.ReadClass<WLN_Request_RegisterNewUserID>(); //Logger.ConsoleWriteLine("Received Register New UserID Request from: \"" + registerPacket.UserID + "\" using password: \"" + registerPacket.RegisterPassword + "\" registering name: \"" + registerPacket.NewUsername + "\"", ConsoleColor.Yellow); //var responseData = new WLN_Response_RegisterNewUserID(); //responseData.UserID = ""; //string userID = ""; //if (ContributorHandler.GenerateUserID(registerPacket.NewUsername, out userID) == true) //{ // ContributorHandler.AddVIPContributor(userID); // ContributorHandler.Save(Program.g_RPPDBFolder + "Database\\"); // UpdateContributorsList(); //} //var response = msg.CreateResponseMessage(-1); //response.WriteByte((byte)WLN_PacketType.Response_RegisterNewUserID); //response.WriteClass(responseData); //m_Server.SendMessage(response); } else { Logger.ConsoleWriteLine("Some unknown data: type=" + (int)packetType + ", dataSize=" + msg.MessageSize, ConsoleColor.Red); } } break; default: Logger.ConsoleWriteLine("Unknown Message Received" + "MessageType: " + msg.MessageType + " MessageSize: " + msg.MessageSize + " bytes", ConsoleColor.Red); break; } } } catch (Exception ex) { Logger.LogException(ex); } } }
private static TemperedStatus DetermineTempered(WLN_UploadPacket_AddonData _Data, out string _DebugResult) { //First x files is other lua files, Last 6 is config files, //If this is ever changed, remember to change on client aswell //Negative values means file is OLDER than Addon Data File //Positive values means file is NEWER than Addon Data File string fileResultStr = ""; int nonTemperedScore = 0; bool confusingResult = false; int wdbFiles = 0; for (int i = 0; i < _Data.FileStatus.Length; ++i) { short currValue = _Data.FileStatus[i]; if (currValue == short.MaxValue) { fileResultStr += "MAX, "; } else if (currValue == short.MinValue) { fileResultStr += "MIN, "; } else { fileResultStr += currValue + ", "; } int voucherValue = 0; if (currValue > -5 && currValue < 5) { //Perfect balance, if the file is within this range the chance of file being tempered is extremely low voucherValue = 5; } else if (currValue > -15 && currValue < 15) { //The superb threshold used so far voucherValue = 3; } else if (currValue > -30 && currValue < 30) { //The normal threshold used so far voucherValue = 1; } else if (currValue <= -30) { //Big chance of file being tempered //But this lua file addon might be disabled } else if (currValue >= 30 && i < _Data.FileStatus.Length - 6) { //Confusing result. This means that something weird might be up confusingResult = true; } if (i >= _Data.FileStatus.Length - 6) { voucherValue *= 2; if (currValue != short.MinValue) { ++wdbFiles; } } nonTemperedScore += voucherValue; } _DebugResult = nonTemperedScore + (confusingResult ? "?confusing?" : "") + " = {" + fileResultStr + "}"; if (wdbFiles == 6) { if (nonTemperedScore > 20) { return(TemperedStatus.OK); } else if (nonTemperedScore > 10) { return(TemperedStatus.Possibly_Tempered); } else { return(TemperedStatus.Tempered); } } else { if (nonTemperedScore > 10) { return(TemperedStatus.OK); } else if (nonTemperedScore > 5) { return(TemperedStatus.Possibly_Tempered); } else { return(TemperedStatus.Tempered); } } }
public static void UploadData(System.Net.IPAddress _UploaderIP, WLN_UploadPacket_AddonData _Data) { var currContributor = ContributorDB.GetContributor(_Data.UserID, _UploaderIP, false); if (currContributor == null) { Logger.ConsoleWriteLine("User(" + _UploaderIP.ToString() + ") tried to access using UserID(" + _Data.UserID + ")"); } else if (currContributor.UserID != _Data.UserID) { Logger.ConsoleWriteLine("User(" + _UploaderIP.ToString() + ") tried to access UserID(" + currContributor.UserID + ") using UserID(" + _Data.UserID + ")"); currContributor = null; } string userID = _Data.UserID; string userIP = _UploaderIP.ToString(); string uploadDataFolder = g_AddonUploadDataFolder + _Data.AddonName + "\\"; string uploadStatsFolder = g_AddonUploadStatsFolder + _Data.AddonName + "\\"; if (currContributor == null) { userID = "Unknown_" + userID; } else if (currContributor.IsVIP() == false) { userID = "NotVIP_" + userID; } string contributionsFolder = "Contributions\\"; if (currContributor == null) { contributionsFolder = "Unknown" + contributionsFolder; userID = "Unknown_" + userID; } else if (currContributor.IsVIP() == false) { contributionsFolder = "NotVIP" + contributionsFolder; userID = "NotVIP_" + userID; } long fileFID = System.Threading.Interlocked.Increment(ref g_FileCounter); string fileName = userID + "_" + userIP + "_" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") + "_FID" + fileFID.ToString("0000"); string debugResult = ""; var temperedResult = DetermineTempered(_Data, out debugResult); string uploadStats = fileName + " @ Result: " + temperedResult.ToString() + ", Details: " + debugResult; Utility.AssertDirectory(uploadStatsFolder); System.IO.File.AppendAllText(uploadStatsFolder + userID + ".txt", uploadStats + "\r\n"); if (temperedResult == TemperedStatus.OK) { Logger.ConsoleWriteLine("Data Received \"" + fileName + "\"", ConsoleColor.Green); } else if (temperedResult == TemperedStatus.Possibly_Tempered) { Logger.ConsoleWriteLine("Possibly Tempered Data Received \"" + fileName + "\"", ConsoleColor.Yellow); } else//if (temperedResult == TemperedStatus.Tempered) { contributionsFolder = "Tempered" + contributionsFolder; Logger.ConsoleWriteLine("Tempered Data Received \"" + fileName + "\"", ConsoleColor.Red); } string fullFilename = uploadDataFolder + contributionsFolder + fileName + ".txt"; Utility.AssertFilePath(fullFilename); System.IO.File.WriteAllText(fullFilename, _Data.Data); if (currContributor != null && currContributor.IsVIP() == true && temperedResult != TemperedStatus.Tempered) { if (_Data.AddonName == "VF_RealmPlayers") { Program.g_RPPDatabaseHandler.AddContribution(new RPPContribution(currContributor, fullFilename)); } else if (_Data.AddonName == "VF_RaidDamage") { Program.g_RDDatabaseHandler.AddContribution(fullFilename); } else if (_Data.AddonName == "VF_RealmPlayersTBC") { Program.g_RPPDatabaseHandler.AddContribution(new RPPContribution(currContributor, fullFilename)); } else if (_Data.AddonName == "VF_RaidStatsTBC") { Program.g_RDDatabaseHandler.AddContribution(fullFilename); } } }
internal static List <string> SendAddonData(string _UserID, string _AddonName, WowVersionEnum _WowVersion, string _ClearLuaVariableName, int _LuaVariableDataLengthThreshold, out bool _SentAll) { var savedVariableFiles = WowUtility.GetSavedVariableFilePaths(_AddonName, _WowVersion);//For Accounts only _LuaVariableDataLengthThreshold = _LuaVariableDataLengthThreshold + 12 /*newlines = {} osv osv*/ + _ClearLuaVariableName.Length; VF.NetworkClient netClient = sm_Client; if (netClient != null && netClient.IsConnected() == false) { netClient.Disconnect(); netClient = null; } List <string> sentAddonFiles = new List <string>(); _SentAll = true;//Default läge try { foreach (var luaFilePath in savedVariableFiles) { string luaFileData = System.IO.File.ReadAllText(luaFilePath); string resultFileData = ""; string variableData = ""; if (WowUtility.ExtractLuaVariableFromFile(luaFileData, _ClearLuaVariableName, out resultFileData, out variableData) == true) { if (variableData.Length < _LuaVariableDataLengthThreshold) { continue; } if (netClient == null) { Logger.ConsoleWriteLine("Trying to connect to server...", ConsoleColor.Gray); netClient = new VF.NetworkClient(g_Host, g_Port); //realmplayers.com Logger.ConsoleWriteLine("Connected to server!", ConsoleColor.Green); } WLN_UploadPacket_AddonData addonData = new WLN_UploadPacket_AddonData(); addonData.AddonName = _AddonName; addonData.UserID = _UserID; addonData.FileStatus = WowUtility.GetFileStatus(luaFilePath); addonData.Data = luaFileData; var newMessage = netClient.CreateMessage(); newMessage.WriteByte((byte)WLN_PacketType.Upload_AddonData); newMessage.WriteClass(addonData); netClient.WaitForConnect(TimeSpan.FromSeconds(60)); netClient.SendMessage(newMessage); Logger.ConsoleWriteLine("Sent SavedVariables file \"" + luaFilePath + "\". Waiting for Response...", ConsoleColor.Gray); WLN_UploadPacket_SuccessResponse response; if (netClient.RecvPacket_VF(WLN_PacketType.Upload_SuccessResponse, out response, TimeSpan.FromSeconds(60)) == true) { Logger.ConsoleWriteLine("Received Response. Data was sent successfully!. Deleting old data", ConsoleColor.Gray); sentAddonFiles.Add(luaFilePath); if (response.MessageToUser != "") { Utility.MessageBoxShow(response.MessageToUser, "Message from Server"); } //TODO: Do something with "response.MessageToUser" System.IO.File.WriteAllText(luaFilePath, resultFileData); //Save the lua file with the variable cleared Logger.ConsoleWriteLine("Operation Successfull! Preparing for next file.", ConsoleColor.Green); } else { Logger.ConsoleWriteLine("Operation Failed! Preparing for next file.", ConsoleColor.Red); _SentAll = false; } } else { } } } catch (Exception ex) { Logger.LogException(ex); _SentAll = false; } finally { if (_SentAll == false) { if (netClient != null) { netClient.Disconnect(); netClient = null; } } sm_Client = netClient; } return(sentAddonFiles); }