adding support for switching steamID for the nosteam webclients
This commit is contained in:
parent
86c714fb1b
commit
0aab8e0bd6
@ -74,6 +74,12 @@
|
|||||||
"library" "engine"
|
"library" "engine"
|
||||||
"linux" "@_ZN13CSteam3Server28OnValidateAuthTicketResponseEP28ValidateAuthTicketResponse_t"
|
"linux" "@_ZN13CSteam3Server28OnValidateAuthTicketResponseEP28ValidateAuthTicketResponse_t"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"CBaseClient__SetSteamID"
|
||||||
|
{
|
||||||
|
"library" "engine"
|
||||||
|
"linux" "@_ZN11CBaseClient10SetSteamIDERK8CSteamID"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,6 +37,7 @@ ConVar g_SvNoSteam("sv_nosteam", "0", FCVAR_NOTIFY, "Disable steam validation an
|
|||||||
ConVar g_SvForceSteam("sv_forcesteam", "0", FCVAR_NOTIFY, "Force steam authentication.");
|
ConVar g_SvForceSteam("sv_forcesteam", "0", FCVAR_NOTIFY, "Force steam authentication.");
|
||||||
ConVar g_SvGameDesc("sv_gamedesc_override", "default", FCVAR_NOTIFY, "Overwrite the default game description. Set to 'default' to keep default description.");
|
ConVar g_SvGameDesc("sv_gamedesc_override", "default", FCVAR_NOTIFY, "Overwrite the default game description. Set to 'default' to keep default description.");
|
||||||
ConVar g_SvMapName("sv_mapname_override", "default", FCVAR_NOTIFY, "Overwrite the map name. Set to 'default' to keep default name.");
|
ConVar g_SvMapName("sv_mapname_override", "default", FCVAR_NOTIFY, "Overwrite the map name. Set to 'default' to keep default name.");
|
||||||
|
ConVar g_SvSetSteamIDIPS("sv_set_steam_id_ips", "default", FCVAR_NOTIFY, "IP's allowed for webclient nosteamers");
|
||||||
|
|
||||||
|
|
||||||
IGameConfig *g_pGameConf = NULL;
|
IGameConfig *g_pGameConf = NULL;
|
||||||
@ -150,6 +151,7 @@ public:
|
|||||||
|
|
||||||
CDetour* detourCBaseServer__ConnectClient = nullptr;
|
CDetour* detourCBaseServer__ConnectClient = nullptr;
|
||||||
CDetour *g_Detour_CSteam3Server__OnValidateAuthTicketResponse = NULL;
|
CDetour *g_Detour_CSteam3Server__OnValidateAuthTicketResponse = NULL;
|
||||||
|
CDetour *g_Detour_CBaseClient__SetSteamID = NULL;
|
||||||
|
|
||||||
bool g_bSuppressBeginAuthSession = false;
|
bool g_bSuppressBeginAuthSession = false;
|
||||||
|
|
||||||
@ -227,6 +229,7 @@ public:
|
|||||||
bool SteamLegal;
|
bool SteamLegal;
|
||||||
bool SteamAuthFailed;
|
bool SteamAuthFailed;
|
||||||
bool ManualRetry;
|
bool ManualRetry;
|
||||||
|
bool Webclient;
|
||||||
|
|
||||||
void *pvTicket;
|
void *pvTicket;
|
||||||
int cbTicket;
|
int cbTicket;
|
||||||
@ -250,6 +253,7 @@ public:
|
|||||||
this->SteamLegal = false;
|
this->SteamLegal = false;
|
||||||
this->SteamAuthFailed = false;
|
this->SteamAuthFailed = false;
|
||||||
this->ManualRetry = false;
|
this->ManualRetry = false;
|
||||||
|
this->Webclient = false;
|
||||||
|
|
||||||
// Calculate and store the ticket pointer
|
// Calculate and store the ticket pointer
|
||||||
this->pvTicket = (void *)((intptr_t)this->pCookie + sizeof(uint64));
|
this->pvTicket = (void *)((intptr_t)this->pCookie + sizeof(uint64));
|
||||||
@ -258,6 +262,61 @@ public:
|
|||||||
};
|
};
|
||||||
StringHashMap<ConnectClientStorage> g_ConnectClientStorage;
|
StringHashMap<ConnectClientStorage> g_ConnectClientStorage;
|
||||||
|
|
||||||
|
|
||||||
|
//ai generated function
|
||||||
|
uint64 GenerateSteamIDFromName(const char *pchName)
|
||||||
|
{
|
||||||
|
uint64 hash = 14695981039346656037ULL;
|
||||||
|
for (const char *p = pchName; *p; p++)
|
||||||
|
{
|
||||||
|
hash ^= (uint64)(unsigned char)*p;
|
||||||
|
hash *= 1099511628211ULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 W = hash & 1;
|
||||||
|
// Range within existing Steam accounts: 1 to 700,000,000
|
||||||
|
uint32 Z = 1 + (uint32)((hash >> 1) % 699999999);
|
||||||
|
|
||||||
|
uint64 steamID64 = 0x0110000100000000ULL | ((uint64)Z << 1) | W;
|
||||||
|
return steamID64;
|
||||||
|
}
|
||||||
|
|
||||||
|
DETOUR_DECL_MEMBER1(CBaseClient__SetSteamID, void, const CSteamID &, steamID)
|
||||||
|
{
|
||||||
|
char aSteamID[32];
|
||||||
|
V_strncpy(aSteamID, steamID.Render(), 32);
|
||||||
|
ConnectClientStorage storage;
|
||||||
|
if (g_ConnectClientStorage.retrieve(aSteamID, &storage))
|
||||||
|
{
|
||||||
|
if (storage.SteamAuthFailed)
|
||||||
|
{
|
||||||
|
char IpsAllowed[255];
|
||||||
|
V_strncpy(IpsAllowed, g_SvSetSteamIDIPS.GetString(), 255);
|
||||||
|
|
||||||
|
char ipString[30];
|
||||||
|
V_snprintf(ipString, sizeof(ipString), "%u.%u.%u.%u", storage.address.ip[0], storage.address.ip[1], storage.address.ip[2], storage.address.ip[3]);
|
||||||
|
|
||||||
|
//smutils->LogMessage(myself, "inside SetSteamID steamAuthFailed. IpsAllowed: %s. ipString: %s", IpsAllowed, ipString);
|
||||||
|
//connects from the IP's designated for the webclients.
|
||||||
|
if (strcmp(IpsAllowed, ipString) == 0)
|
||||||
|
{
|
||||||
|
uint64 steamID64 = GenerateSteamIDFromName(storage.pchName);
|
||||||
|
CSteamID newSteamID = CSteamID(steamID64);
|
||||||
|
//smutils->LogMessage(myself, "Generated SteamID64: %llu for name: %s", steamID64, storage.pchName);
|
||||||
|
//smutils->LogMessage(myself, "SteamID render: %s", newSteamID.Render());
|
||||||
|
|
||||||
|
storage.ullSteamID = steamID64;
|
||||||
|
storage.Webclient = true;
|
||||||
|
|
||||||
|
g_ConnectClientStorage.replace(aSteamID, storage);
|
||||||
|
DETOUR_MEMBER_CALL(CBaseClient__SetSteamID)(newSteamID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DETOUR_MEMBER_CALL(CBaseClient__SetSteamID)(steamID);
|
||||||
|
}
|
||||||
|
|
||||||
DETOUR_DECL_MEMBER1(CSteam3Server__OnValidateAuthTicketResponse, int, ValidateAuthTicketResponse_t *, pResponse)
|
DETOUR_DECL_MEMBER1(CSteam3Server__OnValidateAuthTicketResponse, int, ValidateAuthTicketResponse_t *, pResponse)
|
||||||
{
|
{
|
||||||
char aSteamID[32];
|
char aSteamID[32];
|
||||||
@ -580,17 +639,41 @@ DETOUR_DECL_MEMBER9(CBaseServer__ConnectClient, IClient*, netadr_t&, address, in
|
|||||||
//auto client = DETOUR_MEMBER_MCALL_ORIGINAL(CBaseServer__ConnectClient, this)(address, nProtocol, iChallenge, iClientChallenge, nAuthProtocol, pchName, pchPassword, pCookie, cbCookie);
|
//auto client = DETOUR_MEMBER_MCALL_ORIGINAL(CBaseServer__ConnectClient, this)(address, nProtocol, iChallenge, iClientChallenge, nAuthProtocol, pchName, pchPassword, pCookie, cbCookie);
|
||||||
g_bSuppressBeginAuthSession = false;
|
g_bSuppressBeginAuthSession = false;
|
||||||
g_pSM->LogMessage(myself, "finished DETOUR_MEMBER_CALL. %s", aSteamID);
|
g_pSM->LogMessage(myself, "finished DETOUR_MEMBER_CALL. %s", aSteamID);
|
||||||
Storage.pClient = client;
|
|
||||||
g_ConnectClientStorage.replace(aSteamID, Storage);
|
|
||||||
|
|
||||||
if (client && SteamAuthFailed)
|
//doing another retrieve in case of SetSteamID for webclient.
|
||||||
|
ConnectClientStorage storage_setSteamID;
|
||||||
|
g_ConnectClientStorage.retrieve(aSteamID, &storage_setSteamID);
|
||||||
|
if (storage_setSteamID.Webclient)
|
||||||
{
|
{
|
||||||
ValidateAuthTicketResponse_t Response;
|
CSteamID newSteamID = CSteamID(storage_setSteamID.ullSteamID);
|
||||||
Response.m_SteamID = g_lastClientSteamID;
|
storage_setSteamID.pClient = client;
|
||||||
Response.m_eAuthSessionResponse = k_EAuthSessionResponseAuthTicketInvalid; //nosteamer monkeys
|
g_ConnectClientStorage.replace(newSteamID.Render(), storage_setSteamID);
|
||||||
Response.m_OwnerSteamID = Response.m_SteamID;
|
g_ConnectClientStorage.remove(aSteamID);
|
||||||
g_pSM->LogMessage(myself, "about to do OnValidateAuthTicketResponse. %s", aSteamID);
|
|
||||||
DETOUR_MEMBER_MCALL_CALLBACK(CSteam3Server__OnValidateAuthTicketResponse, g_pSteam3Server)(&Response);
|
if (client && SteamAuthFailed)
|
||||||
|
{
|
||||||
|
ValidateAuthTicketResponse_t Response;
|
||||||
|
Response.m_SteamID = newSteamID;
|
||||||
|
Response.m_eAuthSessionResponse = k_EAuthSessionResponseAuthTicketInvalid; //nosteamer monkeys
|
||||||
|
Response.m_OwnerSteamID = Response.m_SteamID;
|
||||||
|
g_pSM->LogMessage(myself, "about to do OnValidateAuthTicketResponse webclient. %s", newSteamID.Render());
|
||||||
|
DETOUR_MEMBER_MCALL_CALLBACK(CSteam3Server__OnValidateAuthTicketResponse, g_pSteam3Server)(&Response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Storage.pClient = client;
|
||||||
|
g_ConnectClientStorage.replace(aSteamID, Storage);
|
||||||
|
|
||||||
|
if (client && SteamAuthFailed)
|
||||||
|
{
|
||||||
|
ValidateAuthTicketResponse_t Response;
|
||||||
|
Response.m_SteamID = g_lastClientSteamID;
|
||||||
|
Response.m_eAuthSessionResponse = k_EAuthSessionResponseAuthTicketInvalid; //nosteamer monkeys
|
||||||
|
Response.m_OwnerSteamID = Response.m_SteamID;
|
||||||
|
g_pSM->LogMessage(myself, "about to do OnValidateAuthTicketResponse. %s", aSteamID);
|
||||||
|
DETOUR_MEMBER_MCALL_CALLBACK(CSteam3Server__OnValidateAuthTicketResponse, g_pSteam3Server)(&Response);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
g_pSM->LogMessage(myself, "MEMBER 9 end. %s", aSteamID);
|
g_pSM->LogMessage(myself, "MEMBER 9 end. %s", aSteamID);
|
||||||
return client;
|
return client;
|
||||||
@ -699,6 +782,14 @@ bool Connect::SDK_OnLoad(char *error, size_t maxlen, bool late)
|
|||||||
}
|
}
|
||||||
g_Detour_CSteam3Server__OnValidateAuthTicketResponse->EnableDetour();
|
g_Detour_CSteam3Server__OnValidateAuthTicketResponse->EnableDetour();
|
||||||
|
|
||||||
|
g_Detour_CBaseClient__SetSteamID = DETOUR_CREATE_MEMBER(CBaseClient__SetSteamID, "CBaseClient__SetSteamID");
|
||||||
|
if(!g_Detour_CBaseClient__SetSteamID)
|
||||||
|
{
|
||||||
|
snprintf(error, maxlen, "Failed to detour CBaseClient__SetSteamID.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
g_Detour_CBaseClient__SetSteamID->EnableDetour();
|
||||||
|
|
||||||
g_pConnectForward = g_pForwards->CreateForward("OnClientPreConnectEx", ET_LowEvent, 5, NULL, Param_String, Param_String, Param_String, Param_String, Param_String);
|
g_pConnectForward = g_pForwards->CreateForward("OnClientPreConnectEx", ET_LowEvent, 5, NULL, Param_String, Param_String, Param_String, Param_String, Param_String);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -733,6 +824,12 @@ bool Connect::SDK_OnMetamodUnload(char *error, size_t maxlen)
|
|||||||
delete g_Detour_CSteam3Server__OnValidateAuthTicketResponse;
|
delete g_Detour_CSteam3Server__OnValidateAuthTicketResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_Detour_CBaseClient__SetSteamID)
|
||||||
|
{
|
||||||
|
g_Detour_CBaseClient__SetSteamID->DisableDetour();
|
||||||
|
delete g_Detour_CBaseClient__SetSteamID;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user