Merge pull request #108 from WiserTixx/implement-mods-warning

Implement mods warning
This commit is contained in:
Lion 2024-09-22 19:46:34 +02:00 committed by GitHub
commit 85086909a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 60 additions and 17 deletions

View File

@ -36,7 +36,6 @@ extern std::string MStatus;
extern std::string UlStatus; extern std::string UlStatus;
extern std::string PublicKey; extern std::string PublicKey;
extern std::string PrivateKey; extern std::string PrivateKey;
extern std::string ListOfMods;
int KillSocket(uint64_t Dead); int KillSocket(uint64_t Dead);
void UUl(const std::string& R); void UUl(const std::string& R);
void UDPSend(std::string Data); 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 TCPClientMain(const std::string& IP, int Port);
void UDPClientMain(const std::string& IP, int Port); void UDPClientMain(const std::string& IP, int Port);
void TCPGameServer(const std::string& IP, int Port); void TCPGameServer(const std::string& IP, int Port);
bool SecurityWarning();
void CoreSend(std::string data);

View File

@ -44,6 +44,26 @@ std::string UlStatus;
std::string MStatus; std::string MStatus;
bool ModLoaded; bool ModLoaded;
int ping = -1; 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) { void StartSync(const std::string& Data) {
std::string IP = GetAddr(Data.substr(1, Data.find(':') - 1)); 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)"; UlStatus = "UlConnection Failed! (DNS Lookup Failed)";
else else
UlStatus = "UlConnection Failed! (WSA failed to start)"; UlStatus = "UlConnection Failed! (WSA failed to start)";
ListOfMods = "-";
Terminate = true; Terminate = true;
CoreSend("L");
return; return;
} }
CheckLocalKey(); CheckLocalKey();
@ -67,6 +87,15 @@ void StartSync(const std::string& Data) {
info("Connecting to server"); 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) { bool IsAllowedLink(const std::string& Link) {
std::regex link_pattern(R"(https:\/\/(?:\w+)?(?:\.)?(?:beammp\.com|discord\.gg|patreon\.com\/BeamMP))"); std::regex link_pattern(R"(https:\/\/(?:\w+)?(?:\.)?(?:beammp\.com|discord\.gg|patreon\.com\/BeamMP))");
std::smatch link_match; 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"); Data = Code + HTTP::Get("https://backend.beammp.com/servers-info");
break; break;
case 'C': case 'C':
ListOfMods.clear();
StartSync(Data); StartSync(Data);
while (ListOfMods.empty() && !Terminate) { Data.clear();
std::this_thread::sleep_for(std::chrono::seconds(1));
}
if (ListOfMods == "-")
Data = "L";
else
Data = "L" + ListOfMods;
break; break;
case 'O': // open default browser with URL case 'O': // open default browser with URL
if (IsAllowedLink(Data.substr(1))) { if (IsAllowedLink(Data.substr(1))) {
@ -189,6 +211,15 @@ void Parse(std::string Data, SOCKET CSocket) {
Data = "N" + Login(Data.substr(Data.find(':') + 1)); Data = "N" + Login(Data.substr(Data.find(':') + 1));
} }
break; break;
case 'W':
if (SubCode == 'Y') {
confirmed = 1;
} else if (SubCode == 'N') {
confirmed = 0;
}
Data.clear();
break;
default: default:
Data.clear(); Data.clear();
break; break;
@ -201,7 +232,7 @@ void Parse(std::string Data, SOCKET CSocket) {
} }
} }
void GameHandler(SOCKET Client) { void GameHandler(SOCKET Client) {
CoreSocket = Client;
int32_t Size, Temp, Rcv; int32_t Size, Temp, Rcv;
char Header[10] = { 0 }; char Header[10] = { 0 };
do { do {

View File

@ -32,7 +32,6 @@
#include <Utils.h> #include <Utils.h>
namespace fs = std::filesystem; namespace fs = std::filesystem;
std::string ListOfMods;
void CheckForDir() { void CheckForDir() {
if (!fs::exists("Resources")) { if (!fs::exists("Resources")) {
@ -64,16 +63,20 @@ std::string Auth(SOCKET Sock) {
if (Res.empty() || Res[0] == 'E' || Res[0] == 'K') { if (Res.empty() || Res[0] == 'E' || Res[0] == 'K') {
Abord(); Abord();
CoreSend("L");
return ""; return "";
} }
TCPSend(PublicKey, Sock); TCPSend(PublicKey, Sock);
if (Terminate) if (Terminate) {
CoreSend("L");
return ""; return "";
}
Res = TCPRcv(Sock); Res = TCPRcv(Sock);
if (Res.empty() || Res[0] != 'P') { if (Res.empty() || Res[0] != 'P') {
Abord(); Abord();
CoreSend("L");
return ""; return "";
} }
@ -82,23 +85,27 @@ std::string Auth(SOCKET Sock) {
ClientID = std::stoi(Res); ClientID = std::stoi(Res);
} else { } else {
Abord(); Abord();
CoreSend("L");
UUl("Authentication failed!"); UUl("Authentication failed!");
return ""; return "";
} }
TCPSend("SR", Sock); TCPSend("SR", Sock);
if (Terminate) if (Terminate) {
CoreSend("L");
return ""; return "";
}
Res = TCPRcv(Sock); Res = TCPRcv(Sock);
if (Res[0] == 'E' || Res[0] == 'K') { if (Res[0] == 'E' || Res[0] == 'K') {
Abord(); Abord();
CoreSend("L");
return ""; return "";
} }
if (Res.empty() || Res == "-") { if (Res.empty() || Res == "-") {
info("Didn't Receive any mods..."); info("Didn't Receive any mods...");
ListOfMods = "-"; CoreSend("L");
TCPSend("Done", Sock); TCPSend("Done", Sock);
info("Done!"); info("Done!");
return ""; return "";
@ -229,6 +236,9 @@ void SyncResources(SOCKET Sock) {
if (Ret.empty()) if (Ret.empty())
return; return;
if (!SecurityWarning())
return;
info("Checking Resources..."); info("Checking Resources...");
CheckForDir(); CheckForDir();
@ -246,9 +256,9 @@ void SyncResources(SOCKET Sock) {
} }
} }
if (t.empty()) if (t.empty())
ListOfMods = "-"; CoreSend("L");
else else
ListOfMods = t; CoreSend("L" + t);
t.clear(); t.clear();
for (auto FN = FNames.begin(), FS = FSizes.begin(); FN != FNames.end() && !Terminate; ++FN, ++FS) { for (auto FN = FNames.begin(), FS = FSizes.begin(); FN != FNames.end() && !Terminate; ++FN, ++FS) {
auto pos = FN->find_last_of('/'); auto pos = FN->find_last_of('/');

View File

@ -152,6 +152,7 @@ void TCPClientMain(const std::string& IP, int Port) {
KillSocket(TCPSock); KillSocket(TCPSock);
WSACleanup(); WSACleanup();
Terminate = true; Terminate = true;
CoreSend("L");
return; return;
} }
info("Connected!"); info("Connected!");