From 9fe2e2e8ffb859db5a8fbb6e78c5c36553482e61 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Tue, 7 Feb 2023 12:13:17 -0600 Subject: [PATCH] feat(net): handle successful authentication in GruntLogin --- src/net/login/GruntLogin.cpp | 65 +++++++++++++++++++++++++++++++++++- src/net/login/GruntLogin.hpp | 2 +- src/net/login/Login.hpp | 1 + 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/net/login/GruntLogin.cpp b/src/net/login/GruntLogin.cpp index b52fef7..217d7a2 100644 --- a/src/net/login/GruntLogin.cpp +++ b/src/net/login/GruntLogin.cpp @@ -135,8 +135,71 @@ void GruntLogin::Logon(const char* a2, const char* a3) { this->m_clientLink->Connect(a2); } -void GruntLogin::LogonResult(Grunt::Result result, const uint8_t* a3, uint32_t a4, uint16_t a5) { +void GruntLogin::LogonResult(Grunt::Result result, const uint8_t* sessionKey, uint32_t sessionKeyLen, uint16_t flags) { + // Reconnect + if (this->IsReconnect()) { + // TODO + // this->m_loginResponse->HandleRealmData(1, 0); + this->m_clientLink->Disconnect(); + + return; + } + + // Authentication success + if (result == Grunt::GRUNT_RESULT_0 || result == Grunt::GRUNT_RESULT_14) { + // TODO + // this->uint8 = 0; + // LOBYTE(this->uint105C) = 0; + + if (sessionKeyLen >= 40) { + sessionKeyLen = 40; + } + memcpy(this->m_sessionKey, sessionKey, sessionKeyLen); + + this->m_loginResponse->m_loginResult = LOGIN_OK; + + if (this->m_clientLink->m_surveyID == 0) { + this->m_loginResponse->m_loginState = LOGIN_STATE_AUTHENTICATED; + + char stateStr[64]; + SStrCopy(stateStr, Grunt::g_LoginStateStringNames[LOGIN_STATE_AUTHENTICATED], sizeof(stateStr)); + + char resultStr[64]; + SStrCopy(resultStr, Grunt::g_LoginResultStringNames[LOGIN_OK], sizeof(resultStr)); + + this->m_loginResponse->LoginServerStatus( + LOGIN_STATE_AUTHENTICATED, + LOGIN_OK, + nullptr, + stateStr, + resultStr, + flags + ); + } else { + this->m_loginResponse->m_loginState = LOGIN_STATE_SURVEY; + + char stateStr[64]; + SStrCopy(stateStr, Grunt::g_LoginStateStringNames[LOGIN_STATE_SURVEY], sizeof(stateStr)); + + char resultStr[64]; + SStrCopy(resultStr, Grunt::g_LoginResultStringNames[LOGIN_OK], sizeof(resultStr)); + + this->m_loginResponse->LoginServerStatus( + LOGIN_STATE_SURVEY, + LOGIN_OK, + nullptr, + stateStr, + resultStr, + flags + ); + } + + return; + } + + // Authentication failure // TODO + } LOGIN_STATE GruntLogin::NextSecurityState(LOGIN_STATE state) { diff --git a/src/net/login/GruntLogin.hpp b/src/net/login/GruntLogin.hpp index 29fb2fb..0c28ad6 100644 --- a/src/net/login/GruntLogin.hpp +++ b/src/net/login/GruntLogin.hpp @@ -19,7 +19,7 @@ class GruntLogin : public Login { virtual void SetPinInfo(bool enabled, uint32_t a3, const uint8_t* a4); virtual void SetMatrixInfo(bool enabled, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, bool a7, uint8_t a8, uint64_t a9, const uint8_t* a10, uint32_t a11); virtual void SetTokenInfo(bool enabled, uint8_t tokenRequired); - virtual void LogonResult(Grunt::Result result, const uint8_t* a3, uint32_t a4, uint16_t a5); + virtual void LogonResult(Grunt::Result result, const uint8_t* sessionKey, uint32_t sessionKeyLen, uint16_t flags); virtual LOGIN_STATE NextSecurityState(LOGIN_STATE state); virtual void GetRealmList(); virtual void Logon(const char* a2, const char* a3); diff --git a/src/net/login/Login.hpp b/src/net/login/Login.hpp index 6ba2265..c4f67e2 100644 --- a/src/net/login/Login.hpp +++ b/src/net/login/Login.hpp @@ -13,6 +13,7 @@ class Login : public Grunt::ClientResponse { char m_accountName[1280] = {}; char m_rawAccountName[1280] = {}; char* m_password = nullptr; + uint8_t m_sessionKey[40] = {}; LoginResponse* m_loginResponse = nullptr; // Virtual member functions