#include #include // Change this whenever a major client update is made. // NOTE: You must change this on the server as well. #define CURRENT_CLIENT_HEADER 0xDEADBEEF namespace Login { void RemoteLoginTransaction::Start(const char *Username, const char *Password) { // Initialise the header with the client header. m_Header.m_ClientHeader = CURRENT_CLIENT_HEADER; // Initialise the header with the username and password. strcpy_s< 128 >(m_Header.m_Username, Username); strcpy_s< 128 >(m_Header.m_Password, Password); // Initialise the header with the Hardware ID. m_Header.m_HardwareId = GetHardwareId(); // TODO: Verify integrity of system. m_Header.m_IntegrityBit1 = 0; // 0 for integrity passed, random bit for failure m_Header.m_IntegrityBit2 = 0; m_Header.m_IntegrityBit3 = 0; // The checksum bit, the server will check this first to detect possible tampering. m_Header.m_IntegrityBit4 = m_Header.m_IntegrityBit1 | m_Header.m_IntegrityBit2 | m_Header.m_IntegrityBit3; } // TODO: Hardware ID check. ByteArray RemoteLoginTransaction::DoWmiQuery(const char *Query) { ByteArray Response{}; return Response; } uint32_t RemoteLoginTransaction::GetHardwareId() { return 123456789; } bool RemoteLoginTransaction::TranslateResponse(ByteArray &RawResponse) { RemoteLoginResponse ServerResponse = *reinterpret_cast(&RawResponse[0]); switch(ServerResponse) { case RemoteLoginResponse::ACCESS_SPECIAL_USER: // Allow the user to load special access cheats. UserInterface->m_Data.m_SpecialAccess = true; case RemoteLoginResponse::ACCESS_AUTHORISED: return true; case RemoteLoginResponse::OUTDATED_CLIENT: INFO_ASSERT("[000A:%08x] Your client is outdated.\nPlease download the latest client at 'moneybot.cc'.", m_Header.m_HardwareId); break; case RemoteLoginResponse::INTEGRITY_FAILURE: INFO_ASSERT("[000F:%08x] Failed to verify session.\nPlease contact an administrator.", m_Header.m_HardwareId); break; case RemoteLoginResponse::USER_BANNED: INFO_ASSERT("[000D:%08x] Your account is banned.\nPlease contact 'admin@moneybot.cc' for additional information.", m_Header.m_HardwareId); break; case RemoteLoginResponse::INVALID_HARDWARE: UserInterface->m_Data.m_Error = UserExperience::ERROR_INVALID_HWID; //INFO_ASSERT("[000C:%08x] Hardware ID mismatch.\nPlease contact an administrator to request a hardware ID reset.", m_Header.m_HardwareId); break; case RemoteLoginResponse::INVALID_CREDENTIALS: UserInterface->m_Data.m_Error = UserExperience::ERROR_SHADOW_BAN; //INFO_ASSERT("[000C:%08x] Your credentials are invalid. Please check your spelling and try again.", m_Header.m_HardwareId ^ RemoteLoginResponse::INVALID_CREDENTIALS); break; case RemoteLoginResponse::NO_SUBSCRIPTION: INFO_ASSERT("[000G:%08x] No active subscription found.", m_Header.m_HardwareId ^ RemoteLoginResponse::NO_SUBSCRIPTION); break; } return false; } }