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);
                }
            }
        }
Exemple #2
0
        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);
                }
            }
        }
Exemple #3
0
        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);
                }
            }
        }
Exemple #4
0
        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);
        }