diff --git a/include/Network/network.hpp b/include/Network/network.hpp index 5c0b2b3..9d59e74 100644 --- a/include/Network/network.hpp +++ b/include/Network/network.hpp @@ -36,7 +36,6 @@ extern std::string MStatus; extern std::string UlStatus; extern std::string PublicKey; extern std::string PrivateKey; -extern std::string ListOfMods; int KillSocket(uint64_t Dead); void UUl(const std::string& R); void UDPSend(std::string Data); @@ -52,3 +51,5 @@ void TCPSend(const std::string& Data, uint64_t Sock); void TCPClientMain(const std::string& IP, int Port); void UDPClientMain(const std::string& IP, int Port); void TCPGameServer(const std::string& IP, int Port); +bool SecurityWarning(); +void CoreSend(std::string data); diff --git a/src/Network/Core.cpp b/src/Network/Core.cpp index 3ee86b9..641b49e 100644 --- a/src/Network/Core.cpp +++ b/src/Network/Core.cpp @@ -44,6 +44,26 @@ std::string UlStatus; std::string MStatus; bool ModLoaded; int ping = -1; +SOCKET CoreSocket = -1; +signed char confirmed = -1; + +bool SecurityWarning() { + confirmed = -1; + CoreSend("WMODS_FOUND"); + + while (confirmed == -1) + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + + if (confirmed == 1) + return true; + + NetReset(); + Terminate = true; + TCPTerminate = true; + ping = -1; + + return false; +} void StartSync(const std::string& Data) { std::string IP = GetAddr(Data.substr(1, Data.find(':') - 1)); @@ -52,8 +72,8 @@ void StartSync(const std::string& Data) { UlStatus = "UlConnection Failed! (DNS Lookup Failed)"; else UlStatus = "UlConnection Failed! (WSA failed to start)"; - ListOfMods = "-"; Terminate = true; + CoreSend("L"); return; } CheckLocalKey(); @@ -67,6 +87,15 @@ void StartSync(const std::string& Data) { info("Connecting to server"); } +void CoreSend(std::string data) { + if (CoreSocket != -1) { + int res = send(CoreSocket, (data + "\n").c_str(), int(data.size()) + 1, 0); + if (res < 0) { + debug("(Core) send failed with error: " + std::to_string(WSAGetLastError())); + } + } +} + bool IsAllowedLink(const std::string& Link) { std::regex link_pattern(R"(https:\/\/(?:\w+)?(?:\.)?(?:beammp\.com|discord\.gg|patreon\.com\/BeamMP))"); std::smatch link_match; @@ -88,15 +117,8 @@ void Parse(std::string Data, SOCKET CSocket) { Data = Code + HTTP::Get("https://backend.beammp.com/servers-info"); break; case 'C': - ListOfMods.clear(); StartSync(Data); - while (ListOfMods.empty() && !Terminate) { - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - if (ListOfMods == "-") - Data = "L"; - else - Data = "L" + ListOfMods; + Data.clear(); break; case 'O': // open default browser with URL if (IsAllowedLink(Data.substr(1))) { @@ -189,6 +211,15 @@ void Parse(std::string Data, SOCKET CSocket) { Data = "N" + Login(Data.substr(Data.find(':') + 1)); } break; + case 'W': + if (SubCode == 'Y') { + confirmed = 1; + } else if (SubCode == 'N') { + confirmed = 0; + } + + Data.clear(); + break; default: Data.clear(); break; @@ -201,7 +232,7 @@ void Parse(std::string Data, SOCKET CSocket) { } } void GameHandler(SOCKET Client) { - + CoreSocket = Client; int32_t Size, Temp, Rcv; char Header[10] = { 0 }; do { diff --git a/src/Network/Resources.cpp b/src/Network/Resources.cpp index 74ae789..510e262 100644 --- a/src/Network/Resources.cpp +++ b/src/Network/Resources.cpp @@ -32,7 +32,6 @@ #include namespace fs = std::filesystem; -std::string ListOfMods; void CheckForDir() { if (!fs::exists("Resources")) { @@ -64,16 +63,20 @@ std::string Auth(SOCKET Sock) { if (Res.empty() || Res[0] == 'E' || Res[0] == 'K') { Abord(); + CoreSend("L"); return ""; } TCPSend(PublicKey, Sock); - if (Terminate) + if (Terminate) { + CoreSend("L"); return ""; + } Res = TCPRcv(Sock); if (Res.empty() || Res[0] != 'P') { Abord(); + CoreSend("L"); return ""; } @@ -82,23 +85,27 @@ std::string Auth(SOCKET Sock) { ClientID = std::stoi(Res); } else { Abord(); + CoreSend("L"); UUl("Authentication failed!"); return ""; } TCPSend("SR", Sock); - if (Terminate) + if (Terminate) { + CoreSend("L"); return ""; + } Res = TCPRcv(Sock); if (Res[0] == 'E' || Res[0] == 'K') { Abord(); + CoreSend("L"); return ""; } if (Res.empty() || Res == "-") { info("Didn't Receive any mods..."); - ListOfMods = "-"; + CoreSend("L"); TCPSend("Done", Sock); info("Done!"); return ""; @@ -229,6 +236,9 @@ void SyncResources(SOCKET Sock) { if (Ret.empty()) return; + if (!SecurityWarning()) + return; + info("Checking Resources..."); CheckForDir(); @@ -246,9 +256,9 @@ void SyncResources(SOCKET Sock) { } } if (t.empty()) - ListOfMods = "-"; + CoreSend("L"); else - ListOfMods = t; + CoreSend("L" + t); t.clear(); for (auto FN = FNames.begin(), FS = FSizes.begin(); FN != FNames.end() && !Terminate; ++FN, ++FS) { auto pos = FN->find_last_of('/'); diff --git a/src/Network/VehicleEvent.cpp b/src/Network/VehicleEvent.cpp index c02a572..7201763 100644 --- a/src/Network/VehicleEvent.cpp +++ b/src/Network/VehicleEvent.cpp @@ -152,6 +152,7 @@ void TCPClientMain(const std::string& IP, int Port) { KillSocket(TCPSock); WSACleanup(); Terminate = true; + CoreSend("L"); return; } info("Connected!");