mirror of
https://github.com/BeamMP/BeamMP-Launcher.git
synced 2025-07-01 23:46:59 +00:00
Add better error handling (#119)
This commit is contained in:
commit
470eeac821
@ -54,10 +54,10 @@ void info(const std::string& toPrint) {
|
||||
addToLog(Print);
|
||||
}
|
||||
void debug(const std::string& toPrint) {
|
||||
if (!Dev)
|
||||
return;
|
||||
std::string Print = getDate() + "[DEBUG] " + toPrint + "\n";
|
||||
std::cout << Print;
|
||||
if (Dev) {
|
||||
std::cout << Print;
|
||||
}
|
||||
addToLog(Print);
|
||||
}
|
||||
void warn(const std::string& toPrint) {
|
||||
@ -75,7 +75,7 @@ void fatal(const std::string& toPrint) {
|
||||
std::cout << Print;
|
||||
addToLog(Print);
|
||||
std::this_thread::sleep_for(std::chrono::seconds(5));
|
||||
_Exit(-1);
|
||||
std::exit(1);
|
||||
}
|
||||
void except(const std::string& toPrint) {
|
||||
std::string Print = getDate() + "[EXCEP] " + toPrint + "\n";
|
||||
|
@ -178,8 +178,10 @@ void Parse(std::string Data, SOCKET CSocket) {
|
||||
TCPTerminate = true;
|
||||
ping = -1;
|
||||
}
|
||||
if (SubCode == 'G')
|
||||
if (SubCode == 'G') {
|
||||
debug("Closing via 'G' packet");
|
||||
exit(2);
|
||||
}
|
||||
Data.clear();
|
||||
break;
|
||||
case 'R': // will send mod name
|
||||
|
@ -17,7 +17,6 @@
|
||||
#endif
|
||||
#include "Logger.h"
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
|
||||
@ -34,24 +33,8 @@ void lowExit(int code) {
|
||||
std::this_thread::sleep_for(std::chrono::seconds(10));
|
||||
exit(2);
|
||||
}
|
||||
/*void Exit(int code){
|
||||
TraceBack = 0;
|
||||
std::string msg =
|
||||
"Sorry. We do not support cracked copies report this if you believe this is a mistake code ";
|
||||
error(msg+std::to_string(code));
|
||||
std::this_thread::sleep_for(std::chrono::seconds(10));
|
||||
exit(3);
|
||||
}
|
||||
void SteamExit(int code){
|
||||
TraceBack = 0;
|
||||
std::string msg =
|
||||
"Illegal steam modifications detected report this if you believe this is a mistake code ";
|
||||
error(msg+std::to_string(code));
|
||||
std::this_thread::sleep_for(std::chrono::seconds(10));
|
||||
exit(4);
|
||||
}*/
|
||||
|
||||
std::string GetGameDir() {
|
||||
// if(TraceBack != 4)Exit(0);
|
||||
#if defined(_WIN32)
|
||||
return GameDir.substr(0, GameDir.find_last_of('\\'));
|
||||
#elif defined(__linux__)
|
||||
@ -175,151 +158,7 @@ void FileList(std::vector<std::string>& a, const std::string& Path) {
|
||||
}
|
||||
}
|
||||
}
|
||||
bool Find(const std::string& FName, const std::string& Path) {
|
||||
std::vector<std::string> FS;
|
||||
FileList(FS, Path + "\\userdata");
|
||||
for (std::string& a : FS) {
|
||||
if (a.find(FName) != std::string::npos) {
|
||||
FS.clear();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
FS.clear();
|
||||
return false;
|
||||
}
|
||||
bool FindHack(const std::string& Path) {
|
||||
bool s = true;
|
||||
for (const auto& entry : fs::directory_iterator(Path)) {
|
||||
std::string Name = entry.path().filename().string();
|
||||
for (char& c : Name)
|
||||
c = char(tolower(c));
|
||||
if (Name == "steam.exe")
|
||||
s = false;
|
||||
if (Name.find("greenluma") != -1) {
|
||||
error("Found malicious file/folder \"" + Name + "\"");
|
||||
return true;
|
||||
}
|
||||
Name.clear();
|
||||
}
|
||||
return s;
|
||||
}
|
||||
std::vector<std::string> GetID(const std::string& log) {
|
||||
std::string vec, t, r;
|
||||
std::vector<std::string> Ret;
|
||||
std::ifstream f(log.c_str(), std::ios::binary);
|
||||
f.seekg(0, std::ios_base::end);
|
||||
std::streampos fileSize = f.tellg();
|
||||
vec.resize(size_t(fileSize) + 1);
|
||||
f.seekg(0, std::ios_base::beg);
|
||||
f.read(&vec[0], fileSize);
|
||||
f.close();
|
||||
std::stringstream ss(vec);
|
||||
bool S = false;
|
||||
while (std::getline(ss, t, '{')) {
|
||||
if (!S)
|
||||
S = true;
|
||||
else {
|
||||
for (char& c : t) {
|
||||
if (isdigit(c))
|
||||
r += c;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
Ret.emplace_back(r);
|
||||
r.clear();
|
||||
S = false;
|
||||
bool L = true;
|
||||
while (std::getline(ss, t, '}')) {
|
||||
if (L) {
|
||||
L = false;
|
||||
continue;
|
||||
}
|
||||
for (char& c : t) {
|
||||
if (c == '"') {
|
||||
if (!S)
|
||||
S = true;
|
||||
else {
|
||||
if (r.length() > 10) {
|
||||
Ret.emplace_back(r);
|
||||
}
|
||||
r.clear();
|
||||
S = false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (isdigit(c))
|
||||
r += c;
|
||||
}
|
||||
}
|
||||
vec.clear();
|
||||
return Ret;
|
||||
}
|
||||
std::string GetManifest(const std::string& Man) {
|
||||
std::string vec;
|
||||
std::ifstream f(Man.c_str(), std::ios::binary);
|
||||
f.seekg(0, std::ios_base::end);
|
||||
std::streampos fileSize = f.tellg();
|
||||
vec.resize(size_t(fileSize) + 1);
|
||||
f.seekg(0, std::ios_base::beg);
|
||||
f.read(&vec[0], fileSize);
|
||||
f.close();
|
||||
std::string ToFind = "\"LastOwner\"\t\t\"";
|
||||
int pos = int(vec.find(ToFind));
|
||||
if (pos != -1) {
|
||||
pos += int(ToFind.length());
|
||||
vec = vec.substr(pos);
|
||||
return vec.substr(0, vec.find('\"'));
|
||||
} else
|
||||
return "";
|
||||
}
|
||||
bool IDCheck(std::string Man, std::string steam) {
|
||||
bool a = false, b = true;
|
||||
int pos = int(Man.rfind("steamapps"));
|
||||
// if(pos == -1)Exit(5);
|
||||
Man = Man.substr(0, pos + 9) + "\\appmanifest_284160.acf";
|
||||
steam += "\\config\\loginusers.vdf";
|
||||
if (fs::exists(Man) && fs::exists(steam)) {
|
||||
for (const std::string& ID : GetID(steam)) {
|
||||
if (ID == GetManifest(Man))
|
||||
b = false;
|
||||
}
|
||||
// if(b)Exit(6);
|
||||
} else
|
||||
a = true;
|
||||
return a;
|
||||
}
|
||||
void LegitimacyCheck() {
|
||||
|
||||
// std::string K1 = R"(Software\Valve\Steam)";
|
||||
// std::string K2 = R"(Software\Valve\Steam\Apps\284160)";
|
||||
|
||||
/*LONG dwRegOPenKey = OpenKey(HKEY_CURRENT_USER, K1.c_str(), &hKey);
|
||||
|
||||
if(dwRegOPenKey == ERROR_SUCCESS) {
|
||||
Result = QueryKey(hKey, 1);
|
||||
if(Result.empty())Exit(1);
|
||||
|
||||
if(fs::exists(Result)){
|
||||
if(!Find("284160.json",Result))Exit(2);
|
||||
if(FindHack(Result))SteamExit(1);
|
||||
}else Exit(3);
|
||||
|
||||
T = Result;
|
||||
Result.clear();
|
||||
TraceBack++;
|
||||
}else Exit(4);
|
||||
|
||||
K1.clear();
|
||||
RegCloseKey(hKey);
|
||||
dwRegOPenKey = OpenKey(HKEY_CURRENT_USER, K2.c_str(), &hKey);
|
||||
if(dwRegOPenKey == ERROR_SUCCESS) {
|
||||
Result = QueryKey(hKey, 2);
|
||||
if(Result.empty())lowExit(1);
|
||||
TraceBack++;
|
||||
}else lowExit(2);
|
||||
K2.clear();
|
||||
RegCloseKey(hKey);*/
|
||||
#if defined(_WIN32)
|
||||
std::string Result;
|
||||
std::string K3 = R"(Software\BeamNG\BeamNG.drive)";
|
||||
@ -327,17 +166,18 @@ RegCloseKey(hKey);*/
|
||||
LONG dwRegOPenKey = OpenKey(HKEY_CURRENT_USER, K3.c_str(), &hKey);
|
||||
if (dwRegOPenKey == ERROR_SUCCESS) {
|
||||
Result = QueryKey(hKey, 3);
|
||||
if (Result.empty())
|
||||
if (Result.empty()) {
|
||||
debug("Failed to QUERY key HKEY_CURRENT_USER\\Software\\BeamNG\\BeamNG.drive");
|
||||
lowExit(3);
|
||||
// if(IDCheck(Result,T))lowExit(5);
|
||||
}
|
||||
GameDir = Result;
|
||||
// TraceBack++;
|
||||
} else
|
||||
} else {
|
||||
debug("Failed to OPEN key HKEY_CURRENT_USER\\Software\\BeamNG\\BeamNG.drive");
|
||||
lowExit(4);
|
||||
}
|
||||
K3.clear();
|
||||
Result.clear();
|
||||
RegCloseKey(hKey);
|
||||
// if(TraceBack < 3)exit(-1);
|
||||
#elif defined(__linux__)
|
||||
struct passwd* pw = getpwuid(getuid());
|
||||
std::string homeDir = pw->pw_dir;
|
||||
|
18
src/main.cpp
18
src/main.cpp
@ -20,7 +20,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
int main(int argc, char** argv) try {
|
||||
#ifdef DEBUG
|
||||
std::thread th(flush);
|
||||
th.detach();
|
||||
@ -42,13 +42,21 @@ int main(int argc, char* argv[]) {
|
||||
try {
|
||||
LegitimacyCheck();
|
||||
} catch (std::exception& e) {
|
||||
fatal("Main 1 : " + std::string(e.what()));
|
||||
error("Failure in LegitimacyCheck: " + std::string(e.what()));
|
||||
throw;
|
||||
}
|
||||
|
||||
HTTP::StartProxy();
|
||||
try {
|
||||
HTTP::StartProxy();
|
||||
} catch (const std::exception& e) {
|
||||
error(std::string("Failed to start HTTP proxy: Some in-game functions may not work. Error: ") + e.what());
|
||||
}
|
||||
PreGame(GetGameDir());
|
||||
InitGame(GetGameDir());
|
||||
CoreNetwork();
|
||||
|
||||
/// TODO: make sure to use argv[0] for everything that should be in the same dir (mod down ect...)
|
||||
} catch (const std::exception& e) {
|
||||
error(std::string("Exception in main(): ") + e.what());
|
||||
info("Closing in 5 seconds");
|
||||
info("If this keeps happening, contact us on either: Forum: https://forum.beammp.com, Discord: https://discord.gg/beammp");
|
||||
std::this_thread::sleep_for(std::chrono::seconds(5));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user