/* * Copyright (C) 2008-2015 TrinityCore * * 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 "Packets.h" #include "BattlenetPacketCrypt.h" #include "Socket.h" #include "BigNumber.h" #include "Callback.h" #include #include struct Realm; using boost::asio::ip::tcp; namespace Battlenet { struct PacketHeader; class BitStream; enum ModuleType { MODULE_PASSWORD, MODULE_TOKEN, MODULE_THUMBPRINT, MODULE_SELECT_GAME_ACCOUNT, MODULE_RISK_FINGERPRINT, MODULE_RESUME, MODULE_COUNT }; enum class BufferSizes : uint32 { SRP_6_V = 0x80, SRP_6_S = 0x20, Read = 0x4000 }; struct AccountInfo { void LoadResult(Field* fields); uint32 Id; std::string Login; bool IsLockedToIP; std::string LockCountry; std::string LastIP; uint32 FailedLogins; bool IsBanned; bool IsPermanenetlyBanned; }; struct GameAccountInfo { void LoadResult(Field* fields); uint32 Id; std::string Name; std::string DisplayName; bool IsBanned; bool IsPermanenetlyBanned; AccountTypes SecurityLevel; }; class Session : public Socket { typedef Socket BattlenetSocket; public: explicit Session(tcp::socket&& socket); ~Session(); void LogUnhandledPacket(PacketHeader const& header); // Authentication void HandleLogonRequest(Authentication::LogonRequest3 const& logonRequest); void HandleResumeRequest(Authentication::ResumeRequest const& resumeRequest); void HandleProofResponse(Authentication::ProofResponse const& proofResponse); // Connection void HandlePing(Connection::Ping const& ping); void HandleEnableEncryption(Connection::EnableEncryption& enableEncryption); void HandleLogoutRequest(Connection::LogoutRequest const& logoutRequest); void HandleConnectionClosing(Connection::ConnectionClosing const& connectionClosing); // WoWRealm void HandleListSubscribeRequest(WoWRealm::ListSubscribeRequest const& listSubscribeRequest); void HandleListUnsubscribe(WoWRealm::ListUnsubscribe const& listUnsubscribe); void HandleJoinRequestV2(WoWRealm::JoinRequestV2 const& joinRequest); // Friends void HandleSocialNetworkCheckConnected(Friends::SocialNetworkCheckConnected const& socialNetworkCheckConnected); // Cache void HandleGetStreamItemsRequest(Cache::GetStreamItemsRequest const& getStreamItemsRequest); void Start() override; bool Update() override; void UpdateRealms(std::vector& realms, std::vector& deletedRealms); uint32 GetAccountId() const { return _accountInfo->Id; } uint32 GetGameAccountId() const { return _gameAccountInfo->Id; } bool IsToonOnline() const { return _toonOnline; } void SetToonOnline(bool online) { _toonOnline = online; } bool IsSubscribedToRealmListUpdates() const { return _subscribedToRealmListUpdates; } void AsyncWrite(ServerPacket* packet); protected: void ReadHandler() override; private: void _SetVSFields(std::string const& rI); typedef bool(Session::*ModuleHandler)(BitStream* dataStream, ServerPacket** response); static ModuleHandler const ModuleHandlers[MODULE_COUNT]; void CheckIpCallback(PreparedQueryResult result); void HandleLogonRequestCallback(PreparedQueryResult result); void HandleResumeRequestCallback(PreparedQueryResult result); void HandleListSubscribeRequestCallback(PreparedQueryResult result); bool HandlePasswordModule(BitStream* dataStream, ServerPacket** response); bool HandleSelectGameAccountModule(BitStream* dataStream, ServerPacket** response); bool HandleRiskFingerprintModule(BitStream* dataStream, ServerPacket** response); bool HandleResumeModule(BitStream* dataStream, ServerPacket** response); bool UnhandledModule(BitStream* dataStream, ServerPacket** response); WoWRealm::ListUpdate* BuildListUpdate(Realm const* realm) const; std::string GetClientInfo() const; AccountInfo* _accountInfo; GameAccountInfo* _gameAccountInfo; // Points at selected game account (inside _gameAccounts) std::vector _gameAccounts; std::string _locale; std::string _os; uint32 _build; std::string _ipCountry; BigNumber N; BigNumber g; BigNumber k; BigNumber I; BigNumber s; BigNumber v; BigNumber b; BigNumber B; BigNumber K; // session key BigNumber _reconnectProof; std::queue _modulesWaitingForData; PacketCrypt _crypt; bool _authed; bool _subscribedToRealmListUpdates; bool _toonOnline; PreparedQueryResultFuture _queryFuture; std::function _queryCallback; }; } #endif // Session_h__