diff options
Diffstat (limited to 'NorthstarDLL/serverauthentication.h')
-rw-r--r-- | NorthstarDLL/serverauthentication.h | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/NorthstarDLL/serverauthentication.h b/NorthstarDLL/serverauthentication.h new file mode 100644 index 00000000..e79577e6 --- /dev/null +++ b/NorthstarDLL/serverauthentication.h @@ -0,0 +1,112 @@ +#pragma once +#include "convar.h" +#include "httplib.h" +#include <unordered_map> +#include <string> + +struct AuthData +{ + char uid[33]; + char username[64]; + + // pdata + char* pdata; + size_t pdataSize; +}; + +struct AdditionalPlayerData +{ + bool usingLocalPdata; + size_t pdataSize; + bool needPersistenceWriteOnLeave = true; + + double lastClientCommandQuotaStart = -1.0; + int numClientCommandsInQuota = 0; + + double lastNetChanProcessingLimitStart = -1.0; + double netChanProcessingLimitTime = 0.0; + + double lastSayTextLimitStart = -1.0; + int sayTextLimitCount = 0; + + uint64_t uid; +}; + +#pragma once +typedef enum +{ + NA_NULL = 0, + NA_LOOPBACK, + NA_IP, +} netadrtype_t; + +#pragma pack(push, 1) +typedef struct netadr_s +{ + netadrtype_t type; + unsigned char ip[16]; // IPv6 + // IPv4's 127.0.0.1 is [::ffff:127.0.0.1], that is: + // 00 00 00 00 00 00 00 00 00 00 FF FF 7F 00 00 01 + unsigned short port; +} netadr_t; +#pragma pack(pop) + +#pragma pack(push, 1) +typedef struct netpacket_s +{ + netadr_t adr; // sender address + // int source; // received source + char unk[10]; + double received_time; + unsigned char* data; // pointer to raw packet data + void* message; // easy bitbuf data access // 'inpacket.message' etc etc (pointer) + char unk2[16]; + int size; + + // bf_read message; // easy bitbuf data access // 'inpacket.message' etc etc (pointer) + // int size; // size in bytes + // int wiresize; // size in bytes before decompression + // bool stream; // was send as stream + // struct netpacket_s* pNext; // for internal use, should be NULL in public +} netpacket_t; +#pragma pack(pop) + +struct UnconnectedPlayerSendData +{ + char ip[16]; + double lastQuotaStart = 0.0; + int packetCount = 0; + double timeoutEnd = -1.0; +}; + +class ServerAuthenticationManager +{ + private: + httplib::Server m_playerAuthServer; + + public: + std::mutex m_authDataMutex; + std::unordered_map<std::string, AuthData> m_authData; + std::unordered_map<void*, AdditionalPlayerData> m_additionalPlayerData; + std::vector<UnconnectedPlayerSendData> m_unconnectedPlayerSendData; + bool m_runningPlayerAuthThread = false; + bool m_bNeedLocalAuthForNewgame = false; + bool m_bForceReadLocalPlayerPersistenceFromDisk = false; + + public: + void StartPlayerAuthServer(); + void StopPlayerAuthServer(); + bool AuthenticatePlayer(void* player, int64_t uid, char* authToken); + char* VerifyPlayerName(void* player, char* authToken, char* name); + bool RemovePlayerAuthData(void* player); + void WritePersistentData(void* player); + bool CheckPlayerChatRatelimit(void* player); +}; + +typedef void (*CBaseClient__DisconnectType)(void* self, uint32_t unknownButAlways1, const char* reason, ...); +extern CBaseClient__DisconnectType CBaseClient__Disconnect; + +void InitialiseServerAuthentication(HMODULE baseAddress); + +extern ServerAuthenticationManager* g_ServerAuthenticationManager; +extern ConVar* Cvar_ns_player_auth_port; |