/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef Session_h__ #define Session_h__ #include "AsyncCallbackProcessor.h" #include "Realm.h" #include "SslContext.h" #include "SslSocket.h" #include "Socket.h" #include "QueryResult.h" #include #include #include namespace pb = google::protobuf; class ServiceBase; namespace bgs::protocol { class Variant; namespace account::v1 { class GetAccountStateRequest; class GetAccountStateResponse; class GetGameAccountStateRequest; class GetGameAccountStateResponse; } namespace authentication::v1 { class GenerateWebCredentialsRequest; class LogonRequest; class VerifyWebCredentialsRequest; } namespace game_utilities::v1 { class ClientRequest; class ClientResponse; class GetAllValuesForAttributeRequest; class GetAllValuesForAttributeResponse; } } using namespace bgs::protocol; namespace Battlenet { class Session : public Socket> { typedef Socket> BattlenetSocket; public: struct LastPlayedCharacterInfo { Battlenet::RealmHandle RealmId; std::string CharacterName; uint64 CharacterGUID; uint32 LastPlayedTime; }; struct GameAccountInfo { void LoadResult(Field* fields); uint32 Id; std::string Name; std::string DisplayName; uint32 UnbanDate; bool IsBanned; bool IsPermanenetlyBanned; AccountTypes SecurityLevel; std::unordered_map CharacterCounts; std::unordered_map LastPlayedCharacters; }; struct AccountInfo { void LoadResult(PreparedQueryResult result); uint32 Id; std::string Login; bool IsLockedToIP; std::string LockCountry; std::string LastIP; uint32 LoginTicketExpiry; bool IsBanned; bool IsPermanenetlyBanned; std::unordered_map GameAccounts; }; explicit Session(boost::asio::ip::tcp::socket&& socket); ~Session(); void Start() override; bool Update() override; uint32 GetAccountId() const { return _accountInfo->Id; } uint32 GetGameAccountId() const { return _gameAccountInfo->Id; } void SendResponse(uint32 token, pb::Message const* response); void SendResponse(uint32 token, uint32 status); void SendRequest(uint32 serviceHash, uint32 methodId, pb::Message const* request, std::function callback) { _responseCallbacks[_requestToken] = std::move(callback); SendRequest(serviceHash, methodId, request); } void SendRequest(uint32 serviceHash, uint32 methodId, pb::Message const* request); uint32 HandleLogon(authentication::v1::LogonRequest const* logonRequest, std::function& continuation); uint32 HandleVerifyWebCredentials(authentication::v1::VerifyWebCredentialsRequest const* verifyWebCredentialsRequest, std::function& continuation); uint32 HandleGenerateWebCredentials(authentication::v1::GenerateWebCredentialsRequest const* request, std::function& continuation); uint32 HandleGetAccountState(account::v1::GetAccountStateRequest const* request, account::v1::GetAccountStateResponse* response); uint32 HandleGetGameAccountState(account::v1::GetGameAccountStateRequest const* request, account::v1::GetGameAccountStateResponse* response); uint32 HandleProcessClientRequest(game_utilities::v1::ClientRequest const* request, game_utilities::v1::ClientResponse* response); uint32 HandleGetAllValuesForAttribute(game_utilities::v1::GetAllValuesForAttributeRequest const* request, game_utilities::v1::GetAllValuesForAttributeResponse* response); std::string GetClientInfo() const; protected: void HandshakeHandler(boost::system::error_code const& error); void ReadHandler() override; bool ReadHeaderLengthHandler(); bool ReadHeaderHandler(); bool ReadDataHandler(); private: void AsyncWrite(MessageBuffer* packet); void AsyncHandshake(); void CheckIpCallback(PreparedQueryResult result); uint32 VerifyWebCredentials(std::string const& webCredentials, std::function& continuation); typedef uint32(Session::*ClientRequestHandler)(std::unordered_map const&, game_utilities::v1::ClientResponse*); static std::unordered_map const ClientRequestHandlers; uint32 GetRealmListTicket(std::unordered_map const& params, game_utilities::v1::ClientResponse* response); uint32 GetLastCharPlayed(std::unordered_map const& params, game_utilities::v1::ClientResponse* response); uint32 GetRealmList(std::unordered_map const& params, game_utilities::v1::ClientResponse* response); uint32 JoinRealm(std::unordered_map const& params, game_utilities::v1::ClientResponse* response); MessageBuffer _headerLengthBuffer; MessageBuffer _headerBuffer; MessageBuffer _packetBuffer; std::shared_ptr _accountInfo; GameAccountInfo* _gameAccountInfo; // Points at selected game account (inside _gameAccounts) std::string _locale; std::string _os; uint32 _build; std::string _ipCountry; std::array _clientSecret; bool _authed; QueryCallbackProcessor _queryProcessor; std::unordered_map> _responseCallbacks; uint32 _requestToken; }; } #endif // Session_h__