mirror of
https://github.com/BeamMP/BeamMP-Server.git
synced 2025-07-03 00:05:34 +00:00
Security Improvements
This commit is contained in:
parent
3d29067cab
commit
ed0e35400d
@ -204,15 +204,16 @@ int lua_dropPlayer(lua_State *L){
|
|||||||
if(lua_isnumber(L,1)){
|
if(lua_isnumber(L,1)){
|
||||||
int ID = lua_tonumber(L, 1);
|
int ID = lua_tonumber(L, 1);
|
||||||
Client*c = GetClient(ID);
|
Client*c = GetClient(ID);
|
||||||
|
if(c == nullptr)return 0;
|
||||||
|
if(c->GetRole() == "MDEV")return 0;
|
||||||
std::string Reason;
|
std::string Reason;
|
||||||
if(Args > 1 && lua_isstring(L,2)){
|
if(Args > 1 && lua_isstring(L,2)){
|
||||||
Reason = std::string(" Reason : ")+lua_tostring(L,2);
|
Reason = std::string(" Reason : ")+lua_tostring(L,2);
|
||||||
}
|
}
|
||||||
if(c != nullptr){
|
|
||||||
Respond(c,"C:Server:You have been Kicked from the server!" + Reason,true);
|
Respond(c,"C:Server:You have been Kicked from the server!" + Reason,true);
|
||||||
c->SetStatus(-2);
|
c->SetStatus(-2);
|
||||||
closesocket(c->GetTCPSock());
|
closesocket(c->GetTCPSock());
|
||||||
}
|
|
||||||
}else SendError(L,"DropPlayer not enough arguments");
|
}else SendError(L,"DropPlayer not enough arguments");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -245,13 +246,16 @@ int lua_RemoveVehicle(lua_State *L){
|
|||||||
int PID = lua_tointeger(L,1);
|
int PID = lua_tointeger(L,1);
|
||||||
int VID = lua_tointeger(L,2);
|
int VID = lua_tointeger(L,2);
|
||||||
Client *c = GetClient(PID);
|
Client *c = GetClient(PID);
|
||||||
if(c != nullptr){
|
if(c == nullptr){
|
||||||
|
SendError(L,"RemoveVehicle invalid Player ID");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if(c->GetRole() == "MDEV")return 0;
|
||||||
if(!c->GetCarData(VID).empty()){
|
if(!c->GetCarData(VID).empty()){
|
||||||
std::string Destroy = "Od:" + std::to_string(PID)+"-"+std::to_string(VID);
|
std::string Destroy = "Od:" + std::to_string(PID)+"-"+std::to_string(VID);
|
||||||
SendToAll(nullptr,Destroy,true,true);
|
SendToAll(nullptr,Destroy,true,true);
|
||||||
c->DeleteCar(VID);
|
c->DeleteCar(VID);
|
||||||
}
|
}
|
||||||
}else SendError(L,"RemoveVehicle invalid Player ID");
|
|
||||||
}else SendError(L,"RemoveVehicle invalid argument expected number");
|
}else SendError(L,"RemoveVehicle invalid argument expected number");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include "../logger.h"
|
#include "../logger.h"
|
||||||
#include "../Settings.hpp"
|
#include "../Settings.hpp"
|
||||||
#include "../Lua System/LuaSystem.hpp"
|
#include "../Lua System/LuaSystem.hpp"
|
||||||
|
#include <thread>
|
||||||
void UDPSend(Client*c,const std::string&Data);
|
void UDPSend(Client*c,const std::string&Data);
|
||||||
void TCPSend(Client*c,const std::string&Data);
|
void TCPSend(Client*c,const std::string&Data);
|
||||||
|
|
||||||
@ -75,6 +75,8 @@ void OnDisconnect(Client*c,bool kicked){
|
|||||||
Destroy(c); ///Removes the Client from existence
|
Destroy(c); ///Removes the Client from existence
|
||||||
}
|
}
|
||||||
void SyncResources(Client*c);
|
void SyncResources(Client*c);
|
||||||
|
|
||||||
|
|
||||||
void OnConnect(Client*c){
|
void OnConnect(Client*c){
|
||||||
c->SetID(OpenID());
|
c->SetID(OpenID());
|
||||||
std::cout << "New Client Created! ID : " << c->GetID() << std::endl;
|
std::cout << "New Client Created! ID : " << c->GetID() << std::endl;
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include "../Lua System/LuaSystem.hpp"
|
#include "../Lua System/LuaSystem.hpp"
|
||||||
|
|
||||||
void SendToAll(Client*c, const std::string& Data, bool Self, bool Rel);
|
void SendToAll(Client*c, const std::string& Data, bool Self, bool Rel);
|
||||||
std::string HTTP_REQUEST(const std::string& IP,int port);
|
|
||||||
void Respond(Client*c, const std::string& MSG, bool Rel);
|
void Respond(Client*c, const std::string& MSG, bool Rel);
|
||||||
void UpdatePlayers();
|
void UpdatePlayers();
|
||||||
|
|
||||||
@ -73,23 +72,7 @@ void SyncVehicles(Client*c){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTTP(Client*c){
|
|
||||||
if(!c->GetDID().empty()){
|
|
||||||
std::string a = HTTP_REQUEST("https://beamng-mp.com/entitlement?did="+c->GetDID(),443);
|
|
||||||
if(!a.empty()){
|
|
||||||
int pos = a.find('"');
|
|
||||||
if(c != nullptr){
|
|
||||||
c->SetRole(a.substr(pos+1,a.find('"',pos+1)-2));
|
|
||||||
if(Debug)debug("ROLE -> " + c->GetRole() + " ID -> " + c->GetDID());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GrabRole(Client*c){
|
|
||||||
std::thread t1(HTTP,c);
|
|
||||||
t1.detach();
|
|
||||||
}
|
|
||||||
extern int PPS;
|
extern int PPS;
|
||||||
void GlobalParser(Client*c, const std::string&Packet){
|
void GlobalParser(Client*c, const std::string&Packet){
|
||||||
if(Packet.empty())return;
|
if(Packet.empty())return;
|
||||||
@ -104,14 +87,6 @@ void GlobalParser(Client*c, const std::string&Packet){
|
|||||||
Respond(c,"p",false);
|
Respond(c,"p",false);
|
||||||
UpdatePlayers();
|
UpdatePlayers();
|
||||||
return;
|
return;
|
||||||
case 'N':
|
|
||||||
if(SubCode == 'R'){
|
|
||||||
c->SetName(Packet.substr(2,Packet.find(':')-2));
|
|
||||||
c->SetDID(Packet.substr(Packet.find(':')+1));
|
|
||||||
GrabRole(c);
|
|
||||||
}
|
|
||||||
std::cout << "Name : " << c->GetName() << std::endl;
|
|
||||||
return;
|
|
||||||
case 'O':
|
case 'O':
|
||||||
if(Packet.length() > 1000) {
|
if(Packet.length() > 1000) {
|
||||||
std::cout << "Received data from: " << c->GetName() << " Size: " << Packet.length() << std::endl;
|
std::cout << "Received data from: " << c->GetName() << " Size: " << Packet.length() << std::endl;
|
||||||
|
@ -79,14 +79,6 @@ void Parse(Client*c,char*data){
|
|||||||
STCPSend(c,std::string(FileList+FileSizes),0);
|
STCPSend(c,std::string(FileList+FileSizes),0);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case 'N':
|
|
||||||
if(SubCode == 'R'){
|
|
||||||
c->SetName(Packet.substr(2,Packet.find(':')-2));
|
|
||||||
c->SetDID(Packet.substr(Packet.find(':')+1));
|
|
||||||
GrabRole(c);
|
|
||||||
}
|
|
||||||
std::cout << "Name : " << c->GetName() << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool STCPRecv(Client*c){
|
bool STCPRecv(Client*c){
|
||||||
@ -97,6 +89,7 @@ bool STCPRecv(Client*c){
|
|||||||
if (BytesRcv == 0){
|
if (BytesRcv == 0){
|
||||||
std::cout << "(TCP) Connection closing..." << std::endl;
|
std::cout << "(TCP) Connection closing..." << std::endl;
|
||||||
if(c->GetStatus() > -1)c->SetStatus(-1);
|
if(c->GetStatus() > -1)c->SetStatus(-1);
|
||||||
|
closesocket(c->GetTCPSock());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (BytesRcv < 0) {
|
else if (BytesRcv < 0) {
|
||||||
@ -113,6 +106,7 @@ bool STCPRecv(Client*c){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void SyncResources(Client*c){
|
void SyncResources(Client*c){
|
||||||
|
STCPSend(c,std::string("WS"),0);
|
||||||
while(c->GetStatus() > -1 && STCPRecv(c));
|
while(c->GetStatus() > -1 && STCPRecv(c));
|
||||||
c->isDownloading = false;
|
c->isDownloading = false;
|
||||||
}
|
}
|
@ -7,19 +7,22 @@
|
|||||||
std::string StatReport = "-";
|
std::string StatReport = "-";
|
||||||
int PPS = 0;
|
int PPS = 0;
|
||||||
[[noreturn]] void Monitor(){
|
[[noreturn]] void Monitor(){
|
||||||
int R,C;
|
int R,C,V=0;
|
||||||
while(true){
|
while(true){
|
||||||
if(Clients.empty()){
|
if(Clients.empty()){
|
||||||
StatReport = "-";
|
StatReport = "-";
|
||||||
}else{
|
}else{
|
||||||
C = 0;
|
C = 0;
|
||||||
for(Client *c : Clients){
|
for(Client *c : Clients){
|
||||||
if(c->GetCarCount() > 0)C++;
|
if(c->GetCarCount() > 0){
|
||||||
|
C++;
|
||||||
|
V += c->GetCarCount();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(C == 0 || PPS == 0){
|
if(C == 0 || PPS == 0){
|
||||||
StatReport = "-";
|
StatReport = "-";
|
||||||
}else{
|
}else{
|
||||||
R = PPS/C;
|
R = (PPS/C)/V;
|
||||||
StatReport = std::to_string(R);
|
StatReport = std::to_string(R);
|
||||||
PPS = 0;
|
PPS = 0;
|
||||||
}
|
}
|
||||||
|
@ -8,17 +8,86 @@
|
|||||||
#include <WS2tcpip.h>
|
#include <WS2tcpip.h>
|
||||||
#include "../logger.h"
|
#include "../logger.h"
|
||||||
#include "../Settings.hpp"
|
#include "../Settings.hpp"
|
||||||
|
#include <thread>
|
||||||
|
std::string HTTP_REQUEST(const std::string& IP,int port);
|
||||||
|
struct Sequence{
|
||||||
|
SOCKET TCPSock;
|
||||||
|
bool Done = false;
|
||||||
|
};
|
||||||
void CreateNewThread(Client*client);
|
void CreateNewThread(Client*client);
|
||||||
void CreateClient(SOCKET TCPSock){
|
void CreateClient(SOCKET TCPSock,const std::string &Name, const std::string &DID) {
|
||||||
auto *client = new Client;
|
auto *client = new Client;
|
||||||
client->SetTCPSock(TCPSock);
|
client->SetTCPSock(TCPSock);
|
||||||
|
client->SetName(Name);
|
||||||
|
client->SetDID(DID);
|
||||||
Clients.insert(client);
|
Clients.insert(client);
|
||||||
CreateNewThread(client);
|
CreateNewThread(client);
|
||||||
}
|
}
|
||||||
|
std::string TCPRcv(SOCKET TCPSock){
|
||||||
|
char buf[4096];
|
||||||
|
int len = 4096;
|
||||||
|
ZeroMemory(buf, len);
|
||||||
|
int BytesRcv = recv(TCPSock, buf, len,0);
|
||||||
|
if (BytesRcv == 0){
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else if (BytesRcv < 0) {
|
||||||
|
closesocket(TCPSock);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return std::string(buf);
|
||||||
|
}
|
||||||
|
std::string HTTP(const std::string &DID){
|
||||||
|
if(!DID.empty()){
|
||||||
|
std::string a = HTTP_REQUEST("https://beamng-mp.com/entitlement?did="+DID,443);
|
||||||
|
if(!a.empty()){
|
||||||
|
int pos = a.find('"');
|
||||||
|
if(pos != std::string::npos){
|
||||||
|
return a.substr(pos+1,a.find('"',pos+1)-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
void Check(Sequence* S){
|
||||||
|
std::this_thread::sleep_for(std::chrono::seconds(5));
|
||||||
|
if(S != nullptr){
|
||||||
|
if(!S->Done)closesocket(S->TCPSock);
|
||||||
|
delete S;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Identification(SOCKET TCPSock){
|
||||||
|
Sequence* S = new Sequence;
|
||||||
|
S->TCPSock = TCPSock;
|
||||||
|
std::thread Timeout(Check,S);
|
||||||
|
Timeout.detach();
|
||||||
|
std::string Name,DID,Role,Res = TCPRcv(TCPSock);
|
||||||
|
S->Done = true;
|
||||||
|
if(Res.size() > 3 && Res.substr(0,2) == "NR"){
|
||||||
|
if(Res.find(':') == std::string::npos){
|
||||||
|
closesocket(TCPSock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Name = Res.substr(2,Res.find(':')-2);
|
||||||
|
DID = Res.substr(Res.find(':')+1);
|
||||||
|
Role = HTTP(DID);
|
||||||
|
if(Role.empty() || Role.find("Error") != std::string::npos){
|
||||||
|
closesocket(TCPSock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(Debug)debug("Name -> " + Name + ", Role -> " + Role + ", ID -> " + DID);
|
||||||
|
if(Role == "MDEV"){
|
||||||
|
CreateClient(TCPSock,Name,DID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
closesocket(TCPSock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(Clients.size() < MaxPlayers)CreateClient(TCPSock,Name,DID);
|
||||||
|
}
|
||||||
|
|
||||||
void TCPServerMain(){
|
void TCPServerMain(){
|
||||||
|
|
||||||
WSADATA wsaData;
|
WSADATA wsaData;
|
||||||
if (WSAStartup(514, &wsaData)) //2.2
|
if (WSAStartup(514, &wsaData)) //2.2
|
||||||
{
|
{
|
||||||
@ -57,7 +126,8 @@ void TCPServerMain(){
|
|||||||
std::cout << "invalid client socket" << std::endl;
|
std::cout << "invalid client socket" << std::endl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(Clients.size() < MaxPlayers)CreateClient(client);
|
std::thread ID(Identification,client);
|
||||||
|
ID.detach();
|
||||||
}while(client);
|
}while(client);
|
||||||
|
|
||||||
closesocket(client);
|
closesocket(client);
|
||||||
|
@ -45,28 +45,24 @@ void ParseConfig(){
|
|||||||
|
|
||||||
|
|
||||||
void SetValues(const std::string& Line, int Index) {
|
void SetValues(const std::string& Line, int Index) {
|
||||||
int i = 0, state = 0;
|
int state = 0;
|
||||||
char Data[50] = "";
|
std::string Data;
|
||||||
bool Switch = false;
|
bool Switch = false;
|
||||||
if (Index > 5)Switch = true;
|
if (Index > 5)Switch = true;
|
||||||
for (char c : Line) {
|
for (char c : Line) {
|
||||||
if (Switch) {
|
if (Switch) {
|
||||||
if (c == '\"'){state++;}
|
if (c == '\"'){state++;}
|
||||||
if (state > 0 && state < 2) {
|
if (state > 0 && state < 2) {
|
||||||
Data[i] = c;
|
Data += c;
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (c == ' ') { state++; }
|
if (c == ' ') { state++; }
|
||||||
if (state > 1) {
|
if (state > 1) {
|
||||||
Data[i] = c;
|
Data += c;
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int C = 1; C <= i; C++){
|
Data = Data.substr(1);
|
||||||
Data[C-1] = Data[C];
|
|
||||||
}
|
|
||||||
std::string::size_type sz;
|
std::string::size_type sz;
|
||||||
bool Boolean = std::string(Data).find("true") != std::string::npos;//searches for "true"
|
bool Boolean = std::string(Data).find("true") != std::string::npos;//searches for "true"
|
||||||
switch (Index){
|
switch (Index){
|
||||||
@ -111,12 +107,10 @@ void GenerateConfig(){
|
|||||||
|
|
||||||
|
|
||||||
std::string RemoveComments(const std::string& Line){
|
std::string RemoveComments(const std::string& Line){
|
||||||
int i = 0;
|
std::string Return;
|
||||||
char Data[50] = "";
|
|
||||||
for(char c : Line) {
|
for(char c : Line) {
|
||||||
if(c == '#'){break;} //when it finds the # it will stop
|
if(c == '#'){break;} //when it finds the # it will stop
|
||||||
Data[i] = c;
|
Return += c;
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
return std::string(Data); //Converts it from a char array to string and returns it
|
return Return; //Converts it from a char array to string and returns it
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user