mirror of
https://github.com/BeamMP/BeamMP-Launcher.git
synced 2025-07-01 23:46:59 +00:00
new auth system + cleanup
This commit is contained in:
parent
cf459a67d0
commit
4914d251f1
@ -5,24 +5,28 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
void NetReset();
|
void NetReset();
|
||||||
extern bool Dev;
|
extern bool Dev;
|
||||||
|
extern int ping;
|
||||||
void CoreNetwork();
|
void CoreNetwork();
|
||||||
extern int ClientID;
|
extern int ClientID;
|
||||||
extern bool ModLoaded;
|
extern bool ModLoaded;
|
||||||
extern long long ping;
|
|
||||||
extern bool Terminate;
|
extern bool Terminate;
|
||||||
extern int DEFAULT_PORT;
|
extern int DEFAULT_PORT;
|
||||||
|
extern uint64_t UDPSock;
|
||||||
|
extern uint64_t TCPSock;
|
||||||
extern bool TCPTerminate;
|
extern bool TCPTerminate;
|
||||||
extern std::string MStatus;
|
extern std::string MStatus;
|
||||||
extern std::string UlStatus;
|
extern std::string UlStatus;
|
||||||
extern std::string PublicKey;
|
extern std::string PublicKey;
|
||||||
extern std::string ListOfMods;
|
extern std::string ListOfMods;
|
||||||
void UDPSend(std::string Data);
|
|
||||||
int KillSocket(uint64_t Dead);
|
int KillSocket(uint64_t Dead);
|
||||||
|
void UDPSend(std::string Data);
|
||||||
void GameSend(std::string Data);
|
void GameSend(std::string Data);
|
||||||
void SendLarge(std::string Data);
|
void SendLarge(std::string Data);
|
||||||
void TCPSend(const std::string&Data);
|
std::string TCPRcv(uint64_t Sock);
|
||||||
std::string GetAddr(const std::string&IP);
|
std::string GetAddr(const std::string&IP);
|
||||||
void ServerParser(const std::string& Data);
|
void ServerParser(const std::string& Data);
|
||||||
|
std::string Login(const std::string& fields);
|
||||||
|
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);
|
||||||
|
@ -8,4 +8,4 @@ void InitGame(const std::string& Dir,const std::string&Current);
|
|||||||
std::string CheckVer(const std::string &path);
|
std::string CheckVer(const std::string &path);
|
||||||
std::string GetGameDir();
|
std::string GetGameDir();
|
||||||
void LegitimacyCheck();
|
void LegitimacyCheck();
|
||||||
void CheckLocalKey();
|
void CheckLocalKey();
|
@ -2,6 +2,7 @@
|
|||||||
/// Created by Anonymous275 on 7/20/2020
|
/// Created by Anonymous275 on 7/20/2020
|
||||||
///
|
///
|
||||||
#include "Network/network.h"
|
#include "Network/network.h"
|
||||||
|
#include "Security/Init.h"
|
||||||
#include "Security/Enc.h"
|
#include "Security/Enc.h"
|
||||||
#include "Curl/http.h"
|
#include "Curl/http.h"
|
||||||
#include <WinSock2.h>
|
#include <WinSock2.h>
|
||||||
@ -22,7 +23,8 @@ std::string UlStatus;
|
|||||||
std::string MStatus;
|
std::string MStatus;
|
||||||
bool once = false;
|
bool once = false;
|
||||||
bool ModLoaded;
|
bool ModLoaded;
|
||||||
long long ping = -1;
|
bool LoginAuth = false;
|
||||||
|
int ping = -1;
|
||||||
|
|
||||||
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));
|
||||||
@ -33,6 +35,7 @@ void StartSync(const std::string &Data){
|
|||||||
Terminate = true;
|
Terminate = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
CheckLocalKey();
|
||||||
UlStatus = Sec("UlLoading...");
|
UlStatus = Sec("UlLoading...");
|
||||||
TCPTerminate = false;
|
TCPTerminate = false;
|
||||||
Terminate = false;
|
Terminate = false;
|
||||||
@ -101,6 +104,13 @@ void Parse(std::string Data,SOCKET CSocket){
|
|||||||
case 'Z':
|
case 'Z':
|
||||||
Data = "Z" + GetVer();
|
Data = "Z" + GetVer();
|
||||||
break;
|
break;
|
||||||
|
case 'N':
|
||||||
|
if (SubCode == 'c'){
|
||||||
|
Data = "N{\"Auth\":"+std::to_string(LoginAuth)+"}";
|
||||||
|
}else{
|
||||||
|
Data = "N" + Login(Data.substr(Data.find(':') + 1));
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Data.clear();
|
Data.clear();
|
||||||
break;
|
break;
|
||||||
|
@ -15,8 +15,6 @@
|
|||||||
std::chrono::time_point<std::chrono::steady_clock> PingStart,PingEnd;
|
std::chrono::time_point<std::chrono::steady_clock> PingStart,PingEnd;
|
||||||
bool GConnected = false;
|
bool GConnected = false;
|
||||||
bool CServer = true;
|
bool CServer = true;
|
||||||
extern SOCKET UDPSock;
|
|
||||||
extern SOCKET TCPSock;
|
|
||||||
SOCKET CSocket = -1;
|
SOCKET CSocket = -1;
|
||||||
SOCKET GSocket = -1;
|
SOCKET GSocket = -1;
|
||||||
|
|
||||||
@ -78,7 +76,7 @@ void ServerSend(std::string Data, bool Rel){
|
|||||||
if(C == 'W' || C == 'Y' || C == 'V' || C == 'E')Rel = true;
|
if(C == 'W' || C == 'Y' || C == 'V' || C == 'E')Rel = true;
|
||||||
if(Ack || Rel){
|
if(Ack || Rel){
|
||||||
if(Ack || DLen > 1000)SendLarge(Data);
|
if(Ack || DLen > 1000)SendLarge(Data);
|
||||||
else TCPSend(Data);
|
else TCPSend(Data,TCPSock);
|
||||||
}else UDPSend(Data);
|
}else UDPSend(Data);
|
||||||
|
|
||||||
if (DLen > 1000) {
|
if (DLen > 1000) {
|
||||||
@ -177,11 +175,11 @@ void ParserAsync(const std::string& Data){
|
|||||||
case 'p':
|
case 'p':
|
||||||
PingEnd = std::chrono::high_resolution_clock::now();
|
PingEnd = std::chrono::high_resolution_clock::now();
|
||||||
if(PingStart > PingEnd)ping = 0;
|
if(PingStart > PingEnd)ping = 0;
|
||||||
else ping = std::chrono::duration_cast<std::chrono::milliseconds>(PingEnd-PingStart).count();
|
else ping = int(std::chrono::duration_cast<std::chrono::milliseconds>(PingEnd-PingStart).count());
|
||||||
return;
|
return;
|
||||||
case 'M':
|
case 'M':
|
||||||
MStatus = Data;
|
MStatus = Data;
|
||||||
UlStatus = Sec("Uldone");
|
UlStatus = "Uldone";
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -197,7 +195,7 @@ void NetMain(const std::string& IP, int Port){
|
|||||||
UDPClientMain(IP,Port);
|
UDPClientMain(IP,Port);
|
||||||
CServer = true;
|
CServer = true;
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
info(Sec("Connection Terminated!"));
|
info("Connection Terminated!");
|
||||||
}
|
}
|
||||||
void TCPGameServer(const std::string& IP, int Port){
|
void TCPGameServer(const std::string& IP, int Port){
|
||||||
GSocket = SetupListener();
|
GSocket = SetupListener();
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
///
|
///
|
||||||
/// Created by Anonymous275 on 4/11/2020
|
/// Created by Anonymous275 on 4/11/2020
|
||||||
///
|
///
|
||||||
#include "Discord/discord_info.h"
|
|
||||||
#include "Network/network.h"
|
#include "Network/network.h"
|
||||||
|
#include "Security/Init.h"
|
||||||
#include "Security/Enc.h"
|
#include "Security/Enc.h"
|
||||||
#include <WS2tcpip.h>
|
#include <WS2tcpip.h>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include "Startup.h"
|
#include "Startup.h"
|
||||||
#include <algorithm>
|
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -18,8 +17,6 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace fs = std::experimental::filesystem;
|
namespace fs = std::experimental::filesystem;
|
||||||
std::string ListOfMods;
|
std::string ListOfMods;
|
||||||
std::vector<std::string> Split(const std::string& String,const std::string& delimiter){
|
std::vector<std::string> Split(const std::string& String,const std::string& delimiter){
|
||||||
@ -35,48 +32,6 @@ std::vector<std::string> Split(const std::string& String,const std::string& deli
|
|||||||
return Val;
|
return Val;
|
||||||
}
|
}
|
||||||
|
|
||||||
void STCPSendRaw(SOCKET socket,const std::vector<char>& Data){
|
|
||||||
if(socket == -1){
|
|
||||||
Terminate = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int BytesSent = send(socket, Data.data(), int(Data.size()), 0);
|
|
||||||
if (BytesSent == 0){
|
|
||||||
debug(Sec("(TCP) Connection closing..."));
|
|
||||||
Terminate = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (BytesSent < 0) {
|
|
||||||
debug(Sec("(TCP) send failed with error: ") + std::to_string(WSAGetLastError()));
|
|
||||||
KillSocket(socket);
|
|
||||||
Terminate = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(200));
|
|
||||||
}
|
|
||||||
void STCPSend(SOCKET socket,const std::string&Data){
|
|
||||||
STCPSendRaw(socket,std::vector<char>(Data.begin(),Data.end()));
|
|
||||||
}
|
|
||||||
std::pair<char*,size_t> STCPRecv(SOCKET socket){
|
|
||||||
char buf[64000];
|
|
||||||
int len = 64000;
|
|
||||||
ZeroMemory(buf, len);
|
|
||||||
int BytesRcv = recv(socket, buf, len,0);
|
|
||||||
if (BytesRcv == 0){
|
|
||||||
info(Sec("(TCP) Connection closing..."));
|
|
||||||
Terminate = true;
|
|
||||||
return std::make_pair((char*)"",0);
|
|
||||||
}else if (BytesRcv < 0) {
|
|
||||||
info(Sec("(TCP) recv failed with error: ") + std::to_string(WSAGetLastError()));
|
|
||||||
KillSocket(socket);
|
|
||||||
Terminate = true;
|
|
||||||
return std::make_pair((char*)"",0);
|
|
||||||
}
|
|
||||||
char* Ret = new char[BytesRcv];
|
|
||||||
memcpy_s(Ret,BytesRcv,buf,BytesRcv);
|
|
||||||
ZeroMemory(buf, len);
|
|
||||||
return std::make_pair(Ret,BytesRcv);
|
|
||||||
}
|
|
||||||
void CheckForDir(){
|
void CheckForDir(){
|
||||||
struct stat info{};
|
struct stat info{};
|
||||||
if(stat( Sec("Resources"), &info) != 0){
|
if(stat( Sec("Resources"), &info) != 0){
|
||||||
@ -90,104 +45,54 @@ void WaitForConfirm(){
|
|||||||
ModLoaded = false;
|
ModLoaded = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int N,E;
|
|
||||||
void Parse(const std::string& msg){
|
void Abord(){
|
||||||
std::stringstream ss(msg);
|
Terminate = true;
|
||||||
std::string t;
|
TCPTerminate = true;
|
||||||
while (std::getline(ss, t, 'g')) {
|
info("Terminated!");
|
||||||
if(t.find_first_not_of(Sec("0123456789abcdef")) != std::string::npos)return;
|
|
||||||
if(N == 0){
|
|
||||||
N = std::stoi(t, nullptr, 16);
|
|
||||||
}else if(E == 0){
|
|
||||||
E = std::stoi(t, nullptr, 16);
|
|
||||||
}else return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::string GenerateM(RSA*key){
|
|
||||||
std::stringstream stream;
|
|
||||||
stream << std::hex << key->n << "g" << key->e << "g" << RSA_E(Sec("IDC"),key->e,key->n);
|
|
||||||
return stream.str();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Check(SOCKET TCPSock,std::shared_ptr<std::atomic_bool> ok){
|
std::string Auth(SOCKET Sock){
|
||||||
size_t accum = 0;
|
TCPSend("VC" + GetVer(),Sock);
|
||||||
while (!*ok) {
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
||||||
accum += 100;
|
|
||||||
if (accum >= 5000) {
|
|
||||||
error(Sec("Identification timed out (Check accum)"));
|
|
||||||
KillSocket(TCPSock);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::vector<char> PrependSize(const std::string& str) {
|
|
||||||
uint32_t Size = htonl(uint32_t(str.size()) + 1);
|
|
||||||
std::vector<char> result;
|
|
||||||
// +1 for \0, +4 for the size
|
|
||||||
result.resize(str.size() + 1 + 4);
|
|
||||||
memcpy(result.data(), &Size, 4);
|
|
||||||
memcpy(result.data() + 4, str.data(), str.size() + 1);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
std::string HandShake(SOCKET Sock,RSA*LKey){
|
|
||||||
std::shared_ptr<std::atomic_bool> ok = std::make_shared<std::atomic_bool>(false);
|
|
||||||
std::thread Timeout(Check,Sock,ok);
|
|
||||||
Timeout.detach();
|
|
||||||
N = 0;E = 0;
|
|
||||||
auto Res = STCPRecv(Sock);
|
|
||||||
std::string msg(Res.first,Res.second);
|
|
||||||
Parse(msg);
|
|
||||||
if(N != 0 && E != 0) {
|
|
||||||
STCPSendRaw(Sock,PrependSize(GenerateM(LKey)));
|
|
||||||
Res = STCPRecv(Sock);
|
|
||||||
msg = std::string(Res.first,Res.second);
|
|
||||||
if(RSA_D(msg,LKey->d,LKey->n) != "HC"){
|
|
||||||
Terminate = true;
|
|
||||||
}
|
|
||||||
}else Terminate = true;
|
|
||||||
*ok = true;
|
|
||||||
|
|
||||||
if(Terminate){
|
auto Res = TCPRcv(Sock);
|
||||||
TCPTerminate = true;
|
|
||||||
UlStatus = Sec("UlDisconnected: full or outdated server");
|
if(Res.empty() || Res[0] == 'E'){
|
||||||
info(Sec("Terminated!"));
|
Abord();
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
msg = RSA_E("NR" + GetDName() + ":" + GetDID(),E,N);
|
|
||||||
if(!msg.empty()) {
|
|
||||||
STCPSendRaw(Sock, PrependSize(msg));
|
|
||||||
STCPSendRaw(Sock, PrependSize(RSA_E("VC" + GetVer(),E,N)));
|
|
||||||
Res = STCPRecv(Sock);
|
|
||||||
msg = Res.first;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(N == 0 || E == 0 || msg.size() < 2 || msg.substr(0,2) != "WS"){
|
TCPSend(PublicKey,Sock);
|
||||||
|
if(Terminate)return "";
|
||||||
|
|
||||||
Terminate = true;
|
Res = TCPRcv(Sock);
|
||||||
TCPTerminate = true;
|
if(Res.empty() || Res[0] == 'E' || Res != "WS"){
|
||||||
UlStatus = Sec("UlDisconnected: full or outdated server");
|
Abord();
|
||||||
info(Sec("Terminated!"));
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
STCPSend(Sock,Sec("SR"));
|
|
||||||
Res = STCPRecv(Sock);
|
TCPSend("SR",Sock);
|
||||||
if(strlen(Res.first) == 0 || std::string(Res.first) == "-"){
|
if(Terminate)return "";
|
||||||
info(Sec("Didn't Receive any mods..."));
|
|
||||||
|
Res = TCPRcv(Sock);
|
||||||
|
|
||||||
|
if(Res[0] == 'E'){
|
||||||
|
Abord();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Res.empty() || Res == "-"){
|
||||||
|
info("Didn't Receive any mods...");
|
||||||
ListOfMods = "-";
|
ListOfMods = "-";
|
||||||
STCPSend(Sock,Sec("Done"));
|
TCPSend("Done",Sock);
|
||||||
info(Sec("Done!"));
|
info("Done!");
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
return Res.first;
|
return Res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyncResources(SOCKET Sock){
|
void SyncResources(SOCKET Sock){
|
||||||
RSA*LKey = GenKey();
|
std::string Ret = Auth(Sock);
|
||||||
|
|
||||||
std::string Ret = HandShake(Sock,LKey);
|
|
||||||
delete LKey;
|
|
||||||
|
|
||||||
if(Ret.empty())return;
|
if(Ret.empty())return;
|
||||||
|
|
||||||
info(Sec("Checking Resources..."));
|
info(Sec("Checking Resources..."));
|
||||||
@ -239,26 +144,21 @@ void SyncResources(SOCKET Sock){
|
|||||||
}
|
}
|
||||||
CheckForDir();
|
CheckForDir();
|
||||||
do {
|
do {
|
||||||
STCPSend(Sock, "f" + *FN);
|
TCPSend("f" + *FN,Sock);
|
||||||
int Recv = 0,Size = std::stoi(*FS);
|
int Recv = 0,Size = std::stoi(*FS);
|
||||||
char*File = new char[Size];
|
char*File = new char[Size];
|
||||||
ZeroMemory(File,Size);
|
ZeroMemory(File,Size);
|
||||||
do {
|
do {
|
||||||
auto Pair = STCPRecv(Sock);
|
auto Data = TCPRcv(Sock);
|
||||||
char* Data = Pair.first;
|
size_t BytesRcv = Data.size();
|
||||||
size_t BytesRcv = Pair.second;
|
if (Data == "Cannot Open" || Terminate)break;
|
||||||
if (strcmp(Data, Sec("Cannot Open")) == 0 || Terminate){
|
memcpy_s(File+Recv,BytesRcv,&Data[0],BytesRcv);
|
||||||
if(BytesRcv != 0)delete[] Data;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
memcpy_s(File+Recv,BytesRcv,Data,BytesRcv);
|
|
||||||
Recv += int(BytesRcv);
|
Recv += int(BytesRcv);
|
||||||
float per = float(Recv)/std::stof(*FS) * 100;
|
float per = float(Recv)/std::stof(*FS) * 100;
|
||||||
std::string Percent = std::to_string(truncf(per * 10) / 10);
|
std::string Percent = std::to_string(truncf(per * 10) / 10);
|
||||||
UlStatus = Sec("UlDownloading Resource: (") + std::to_string(Pos) + "/" + std::to_string(Amount) +
|
UlStatus = Sec("UlDownloading Resource: (") + std::to_string(Pos) + "/" + std::to_string(Amount) +
|
||||||
"): " + a.substr(a.find_last_of('/')) + " (" +
|
"): " + a.substr(a.find_last_of('/')) + " (" +
|
||||||
Percent.substr(0, Percent.find('.') + 2) + "%)";
|
Percent.substr(0, Percent.find('.') + 2) + "%)";
|
||||||
delete[] Data;
|
|
||||||
} while (Recv != Size && Recv < Size && !Terminate);
|
} while (Recv != Size && Recv < Size && !Terminate);
|
||||||
if(Terminate)break;
|
if(Terminate)break;
|
||||||
UlStatus = Sec("UlLoading Resource: (") + std::to_string(Pos) + "/" + std::to_string(Amount) +
|
UlStatus = Sec("UlLoading Resource: (") + std::to_string(Pos) + "/" + std::to_string(Amount) +
|
||||||
@ -278,10 +178,10 @@ void SyncResources(SOCKET Sock){
|
|||||||
FSizes.clear();
|
FSizes.clear();
|
||||||
a.clear();
|
a.clear();
|
||||||
if(!Terminate){
|
if(!Terminate){
|
||||||
STCPSend(Sock,Sec("Done"));
|
TCPSend("Done",Sock);
|
||||||
info(Sec("Done!"));
|
info("Done!");
|
||||||
}else{
|
}else{
|
||||||
UlStatus = Sec("Ulstart");
|
UlStatus = "Ulstart";
|
||||||
info(Sec("Connection Terminated!"));
|
info("Connection Terminated!");
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -29,7 +29,7 @@ void SendLarge(std::string Data){
|
|||||||
std::string CMP(Comp(Data));
|
std::string CMP(Comp(Data));
|
||||||
Data = "ABG:" + CMP;
|
Data = "ABG:" + CMP;
|
||||||
}
|
}
|
||||||
TCPSend(Data);
|
TCPSend(Data,TCPSock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UDPParser(std::string Packet){
|
void UDPParser(std::string Packet){
|
||||||
@ -61,7 +61,7 @@ void UDPClientMain(const std::string& IP,int Port){
|
|||||||
inet_pton(AF_INET, IP.c_str(), &ToServer->sin_addr);
|
inet_pton(AF_INET, IP.c_str(), &ToServer->sin_addr);
|
||||||
UDPSock = socket(AF_INET, SOCK_DGRAM, 0);
|
UDPSock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
TCPSend(Sec("P"));
|
TCPSend("P",TCPSock);
|
||||||
UDPSend(Sec("p"));
|
UDPSend(Sec("p"));
|
||||||
while(!Terminate)UDPRcv();
|
while(!Terminate)UDPRcv();
|
||||||
KillSocket(UDPSock);
|
KillSocket(UDPSock);
|
||||||
|
@ -14,26 +14,28 @@
|
|||||||
SOCKET TCPSock = -1;
|
SOCKET TCPSock = -1;
|
||||||
bool CheckBytes(int32_t Bytes){
|
bool CheckBytes(int32_t Bytes){
|
||||||
if (Bytes == 0){
|
if (Bytes == 0){
|
||||||
debug(Sec("(TCP) Connection closing... CheckBytes(16)"));
|
debug("(TCP) Connection closing... CheckBytes(16)");
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
return false;
|
return false;
|
||||||
}else if (Bytes < 0) {
|
}else if (Bytes < 0) {
|
||||||
debug(Sec("(TCP CB) recv failed with error: ") + std::to_string(WSAGetLastError()));
|
debug("(TCP CB) recv failed with error: " + std::to_string(WSAGetLastError()));
|
||||||
KillSocket(TCPSock);
|
KillSocket(TCPSock);
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void TCPSend(const std::string&Data){
|
void UpdateUl(const std::string& R){
|
||||||
if(TCPSock == -1){
|
UlStatus = "UlDisconnected: " + R;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSend(const std::string&Data,uint64_t Sock){
|
||||||
|
if(Sock == -1){
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
|
UpdateUl("Invalid Socket");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Size is BIG-ENDIAN!
|
|
||||||
//auto Size = htonl(int32_t(Data.size()));
|
|
||||||
///TODO
|
|
||||||
int32_t Size,Sent,Temp;
|
int32_t Size,Sent,Temp;
|
||||||
std::string Send(4,0);
|
std::string Send(4,0);
|
||||||
Size = int32_t(Data.size());
|
Size = int32_t(Data.size());
|
||||||
@ -44,46 +46,63 @@ void TCPSend(const std::string&Data){
|
|||||||
Size += 4;
|
Size += 4;
|
||||||
do{
|
do{
|
||||||
if (size_t(Sent) >= Send.size()) {
|
if (size_t(Sent) >= Send.size()) {
|
||||||
error(Sec("string OOB in ") + std::string(__func__));
|
error("string OOB in " + std::string(__func__));
|
||||||
|
UpdateUl("TCP Send OOB");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Temp = send(Sock, &Send[Sent], Size - Sent, 0);
|
||||||
|
if(!CheckBytes(Temp)){
|
||||||
|
UpdateUl("Socket Closed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Temp = send(TCPSock, &Send[Sent], Size - Sent, 0);
|
|
||||||
if(!CheckBytes(Temp))return;
|
|
||||||
Sent += Temp;
|
Sent += Temp;
|
||||||
}while(Sent < Size);
|
}while(Sent < Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCPRcv(){
|
std::string TCPRcv(SOCKET Sock){
|
||||||
if(TCPSock == -1){
|
if(Sock == -1){
|
||||||
Terminate = true;
|
Terminate = true;
|
||||||
return;
|
UpdateUl("Invalid Socket");
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
int32_t Header,BytesRcv = 0,Temp;
|
int32_t Header,BytesRcv = 0,Temp;
|
||||||
std::vector<char> Data(sizeof(Header));
|
std::vector<char> Data(sizeof(Header));
|
||||||
do{
|
do{
|
||||||
Temp = recv(TCPSock,&Data[BytesRcv],4-BytesRcv,0);
|
Temp = recv(Sock,&Data[BytesRcv],4-BytesRcv,0);
|
||||||
if(!CheckBytes(Temp))return;
|
if(!CheckBytes(Temp)){
|
||||||
|
UpdateUl("Socket Closed");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
BytesRcv += Temp;
|
BytesRcv += Temp;
|
||||||
}while(BytesRcv < 4);
|
}while(BytesRcv < 4);
|
||||||
memcpy(&Header,&Data[0],sizeof(Header));
|
memcpy(&Header,&Data[0],sizeof(Header));
|
||||||
|
|
||||||
if(!CheckBytes(BytesRcv))return;
|
if(!CheckBytes(BytesRcv)){
|
||||||
|
UpdateUl("Socket Closed");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
Data.resize(Header);
|
Data.resize(Header);
|
||||||
BytesRcv = 0;
|
BytesRcv = 0;
|
||||||
do{
|
do{
|
||||||
Temp = recv(TCPSock,&Data[BytesRcv],Header-BytesRcv,0);
|
Temp = recv(Sock,&Data[BytesRcv],Header-BytesRcv,0);
|
||||||
if(!CheckBytes(Temp))return;
|
if(!CheckBytes(Temp)){
|
||||||
|
UpdateUl("Socket Closed");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
BytesRcv += Temp;
|
BytesRcv += Temp;
|
||||||
}while(BytesRcv < Header);
|
}while(BytesRcv < Header);
|
||||||
|
|
||||||
std::string Ret(Data.data(),Header);
|
std::string Ret(Data.data(),Header);
|
||||||
|
|
||||||
if (Ret.substr(0, 4) == "ABG:") {
|
if (Ret.substr(0, 4) == "ABG:") {
|
||||||
Ret = DeComp(Ret.substr(4));
|
Ret = DeComp(Ret.substr(4));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
//debug("Parsing from server -> " + std::to_string(Ret.size()));
|
//debug("Parsing from server -> " + std::to_string(Ret.size()));
|
||||||
#endif
|
#endif
|
||||||
ServerParser(Ret);
|
if(Ret[0] == 'E')UpdateUl(Ret.substr(1));
|
||||||
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -115,7 +134,9 @@ void TCPClientMain(const std::string& IP,int Port){
|
|||||||
getsockname(TCPSock, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr));
|
getsockname(TCPSock, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr));
|
||||||
|
|
||||||
SyncResources(TCPSock);
|
SyncResources(TCPSock);
|
||||||
while(!Terminate)TCPRcv();
|
while(!Terminate){
|
||||||
|
ServerParser(TCPRcv(TCPSock));
|
||||||
|
}
|
||||||
GameSend(Sec("T"));
|
GameSend(Sec("T"));
|
||||||
////Game Send Terminate
|
////Game Send Terminate
|
||||||
if(KillSocket(TCPSock) != 0)
|
if(KillSocket(TCPSock) != 0)
|
||||||
|
@ -8,14 +8,9 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "Json.h"
|
#include "Json.h"
|
||||||
|
|
||||||
|
|
||||||
//check file if not present flag for login to the core network
|
|
||||||
//to then get user and pass
|
|
||||||
//if present use to contact the backend to refresh and get a public key for servers
|
|
||||||
//public keys are one time use for a random server
|
|
||||||
|
|
||||||
using namespace std::filesystem;
|
using namespace std::filesystem;
|
||||||
std::string PublicKey;
|
std::string PublicKey;
|
||||||
|
extern bool LoginAuth;
|
||||||
|
|
||||||
void UpdateKey(const char* newKey){
|
void UpdateKey(const char* newKey){
|
||||||
if(newKey){
|
if(newKey){
|
||||||
@ -29,17 +24,39 @@ void UpdateKey(const char* newKey){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AskUser(){
|
|
||||||
//Flag Core Network Update to have a login screen
|
|
||||||
}
|
|
||||||
|
|
||||||
/// "username":"value","password":"value"
|
/// "username":"value","password":"value"
|
||||||
/// "Guest":"Name"
|
/// "Guest":"Name"
|
||||||
/// "pk":"private_key"
|
/// "pk":"private_key"
|
||||||
|
|
||||||
void QueryKey(){
|
std::string Login(const std::string& fields){
|
||||||
/*std::string Buffer = PostHTTP("https://auth.beammp.com/pkToUser", R"({"key":")"+PublicKey+"\"}");
|
info("Attempting to authenticate...");
|
||||||
std::cout << Buffer << std::endl;*/
|
std::string Buffer = PostHTTP("https://auth.beammp.com/userlogin", fields);
|
||||||
|
json::Document d;
|
||||||
|
d.Parse(Buffer.c_str());
|
||||||
|
if(Buffer == "-1"){
|
||||||
|
fatal("Failed to communicate with the auth system!");
|
||||||
|
}
|
||||||
|
if (Buffer.find('{') == -1 || d.HasParseError()) {
|
||||||
|
fatal("Invalid answer from authentication servers, please try again later!");
|
||||||
|
}
|
||||||
|
if(!d["success"].IsNull() && d["success"].GetBool()){
|
||||||
|
LoginAuth = true;
|
||||||
|
if(!d["private_key"].IsNull()){
|
||||||
|
UpdateKey(d["private_key"].GetString());
|
||||||
|
}
|
||||||
|
if(!d["public_key"].IsNull()){
|
||||||
|
PublicKey = d["public_key"].GetString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!d["message"].IsNull()){
|
||||||
|
d.RemoveMember("private_key");
|
||||||
|
d.RemoveMember("public_key");
|
||||||
|
rapidjson::StringBuffer buffer;
|
||||||
|
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
|
||||||
|
d.Accept(writer);
|
||||||
|
return buffer.GetString();
|
||||||
|
}
|
||||||
|
return "{\"success\":false}";
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckLocalKey(){
|
void CheckLocalKey(){
|
||||||
@ -52,28 +69,21 @@ void CheckLocalKey(){
|
|||||||
Key.close();
|
Key.close();
|
||||||
Buffer = PostHTTP("https://auth.beammp.com/userlogin", R"({"pk":")"+Buffer+"\"}");
|
Buffer = PostHTTP("https://auth.beammp.com/userlogin", R"({"pk":")"+Buffer+"\"}");
|
||||||
json::Document d;
|
json::Document d;
|
||||||
std::cout << Buffer << std::endl;
|
|
||||||
d.Parse(Buffer.c_str());
|
d.Parse(Buffer.c_str());
|
||||||
if (Buffer == "-1" || Buffer.find('{') == -1 || d.HasParseError()) {
|
if (Buffer == "-1" || Buffer.find('{') == -1 || d.HasParseError()) {
|
||||||
fatal("Invalid answer from authentication servers, please try again later!");
|
fatal("Invalid answer from authentication servers, please try again later!");
|
||||||
}
|
}
|
||||||
if(d["success"].GetBool()){
|
if(d["success"].GetBool()){
|
||||||
|
LoginAuth = true;
|
||||||
UpdateKey(d["private_key"].GetString());
|
UpdateKey(d["private_key"].GetString());
|
||||||
PublicKey = d["public_key"].GetString();
|
PublicKey = d["public_key"].GetString();
|
||||||
QueryKey();
|
|
||||||
}else{
|
}else{
|
||||||
std::cout << "Well..... re-login" << std::endl;
|
info("Auto-Authentication unsuccessful please re-login!");
|
||||||
std::cout << Buffer << std::endl;
|
UpdateKey(nullptr);
|
||||||
//send it all to the game
|
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
warn("Could not open saved key!");
|
warn("Could not open saved key!");
|
||||||
UpdateKey(nullptr);
|
UpdateKey(nullptr);
|
||||||
AskUser();
|
|
||||||
}
|
}
|
||||||
}else{
|
}else UpdateKey(nullptr);
|
||||||
UpdateKey(nullptr);
|
|
||||||
AskUser();
|
|
||||||
}
|
|
||||||
system("pause");
|
|
||||||
}
|
}
|
||||||
|
@ -16,13 +16,13 @@ extern int TraceBack;
|
|||||||
bool Dev = false;
|
bool Dev = false;
|
||||||
namespace fs = std::experimental::filesystem;
|
namespace fs = std::experimental::filesystem;
|
||||||
std::string GetEN(){
|
std::string GetEN(){
|
||||||
return std::string(Sec("BeamMP-Launcher.exe"));
|
return "BeamMP-Launcher.exe";
|
||||||
}
|
}
|
||||||
std::string GetVer(){
|
std::string GetVer(){
|
||||||
return std::string(Sec("1.70"));
|
return "1.71";
|
||||||
}
|
}
|
||||||
std::string GetPatch(){
|
std::string GetPatch(){
|
||||||
return std::string(Sec(".3"));
|
return "";
|
||||||
}
|
}
|
||||||
void ReLaunch(int argc,char*args[]){
|
void ReLaunch(int argc,char*args[]){
|
||||||
std::string Arg;
|
std::string Arg;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user