diff --git a/src/net/grunt/ClientLink.cpp b/src/net/grunt/ClientLink.cpp index 035ca0b..c06fb79 100644 --- a/src/net/grunt/ClientLink.cpp +++ b/src/net/grunt/ClientLink.cpp @@ -369,8 +369,50 @@ int32_t Grunt::ClientLink::CmdAuthReconnectChallenge(CDataStore& msg) { } int32_t Grunt::ClientLink::CmdAuthReconnectProof(CDataStore& msg) { - // TODO - return 0; + if (!msg.IsValid()) { + return 0; + } + + if (msg.IsRead()) { + return 0; + } + + uint8_t result; + msg.Get(result); + + if (!msg.IsValid()) { + return 1; + } + + // Reconnect proof failure (result != 0) + + if (result != 0) { + this->SetState(STATE_CONNECTED); + + if (result >= 33) { + result = -1; + } + + this->m_clientResponse->ReconnectResult(static_cast(result), nullptr, 0, 0x0); + + return 2; + } + + // Reconnect proof success (result == 0) + + uint16_t reconnectFlags = 0x0; + + if (!CanRead(msg, sizeof(reconnectFlags))) { + return 0; + } + + msg.Get(reconnectFlags); + + this->SetState(STATE_AUTHENTICATED); + + this->m_clientResponse->ReconnectResult(Grunt::GRUNT_RESULT_0, this->m_reconnectSessionKey, 40, reconnectFlags); + + return 2; } int32_t Grunt::ClientLink::CmdRealmList(CDataStore& msg) { diff --git a/src/net/grunt/ClientLink.hpp b/src/net/grunt/ClientLink.hpp index 92e0d9b..410931b 100644 --- a/src/net/grunt/ClientLink.hpp +++ b/src/net/grunt/ClientLink.hpp @@ -61,6 +61,7 @@ class Grunt::ClientLink : public WowConnectionResponse, Grunt::Pending, Grunt::T ClientResponse* m_clientResponse; char m_accountName[1280]; char m_serverPublicKey[32]; + uint8_t m_reconnectSessionKey[40]; // Virtual member functions virtual void WCMessageReady(WowConnection *conn, uint32_t timeStamp, CDataStore* msg) {}; diff --git a/src/net/grunt/ClientResponse.hpp b/src/net/grunt/ClientResponse.hpp index ff06736..e8241f4 100644 --- a/src/net/grunt/ClientResponse.hpp +++ b/src/net/grunt/ClientResponse.hpp @@ -17,6 +17,7 @@ class Grunt::ClientResponse { virtual void SetMatrixInfo(bool enabled, uint8_t width, uint8_t height, uint8_t a5, uint8_t a6, bool a7, uint8_t challengeCount, uint64_t seed, const uint8_t* sessionKey, uint32_t a11) = 0; virtual void SetTokenInfo(bool enabled, uint8_t required) = 0; virtual void LogonResult(Result result, const uint8_t* sessionKey, uint32_t sessionKeyLen, uint16_t flags) = 0; + virtual void ReconnectResult(Result result, const uint8_t* sessionKey, uint32_t sessionKeyLen, uint16_t flags) = 0; virtual void RealmListResult(CDataStore* msg) = 0; virtual LOGIN_STATE NextSecurityState(LOGIN_STATE state) = 0; virtual int32_t GetServerId() = 0; diff --git a/src/net/login/GruntLogin.cpp b/src/net/login/GruntLogin.cpp index e5d84c8..93dffc0 100644 --- a/src/net/login/GruntLogin.cpp +++ b/src/net/login/GruntLogin.cpp @@ -282,6 +282,10 @@ void GruntLogin::ProveVersion(const uint8_t* versionChecksum) { ); } +void GruntLogin::ReconnectResult(Grunt::Result result, const uint8_t* sessionKey, uint32_t sessionKeyLen, uint16_t flags) { + // TODO +} + void GruntLogin::SetMatrixInfo(bool enabled, uint8_t width, uint8_t height, uint8_t a5, uint8_t a6, bool a7, uint8_t challengeCount, uint64_t seed, const uint8_t* sessionKey, uint32_t a11) { // TODO } diff --git a/src/net/login/GruntLogin.hpp b/src/net/login/GruntLogin.hpp index 5fab315..a035a94 100644 --- a/src/net/login/GruntLogin.hpp +++ b/src/net/login/GruntLogin.hpp @@ -20,6 +20,7 @@ class GruntLogin : public Login { virtual void SetMatrixInfo(bool enabled, uint8_t width, uint8_t height, uint8_t a5, uint8_t a6, bool a7, uint8_t challengeCount, uint64_t seed, const uint8_t* sessionKey, uint32_t a11); virtual void SetTokenInfo(bool enabled, uint8_t required); virtual void LogonResult(Grunt::Result result, const uint8_t* sessionKey, uint32_t sessionKeyLen, uint16_t flags); + virtual void ReconnectResult(Grunt::Result result, const uint8_t* sessionKey, uint32_t sessionKeyLen, uint16_t flags); virtual LOGIN_STATE NextSecurityState(LOGIN_STATE state); virtual int32_t GetServerId(); virtual void GetRealmList();