diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-03-21 21:07:23 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-03-21 21:07:23 +0100 |
| commit | ac5aee6a98be6434e1f93bf5c973701e41a4540a (patch) | |
| tree | 0cb621804e753e0afd81b5230b04a41f04220a5f /src/server/bnetserver/REST/LoginHttpSession.h | |
| parent | e99482ce9bb7918e23a104fe28305c60d28ed598 (diff) | |
Core: Updated to 10.2.6.53840
Diffstat (limited to 'src/server/bnetserver/REST/LoginHttpSession.h')
| -rw-r--r-- | src/server/bnetserver/REST/LoginHttpSession.h | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/src/server/bnetserver/REST/LoginHttpSession.h b/src/server/bnetserver/REST/LoginHttpSession.h index 2ee70d5afa5..6bd1ec113d0 100644 --- a/src/server/bnetserver/REST/LoginHttpSession.h +++ b/src/server/bnetserver/REST/LoginHttpSession.h @@ -18,8 +18,10 @@ #ifndef TRINITYCORE_LOGIN_HTTP_SESSION_H #define TRINITYCORE_LOGIN_HTTP_SESSION_H +#include "HttpSocket.h" #include "HttpSslSocket.h" #include "SRP6.h" +#include <variant> namespace Battlenet { @@ -28,12 +30,16 @@ struct LoginSessionState : public Trinity::Net::Http::SessionState std::unique_ptr<Trinity::Crypto::SRP::BnetSRP6Base> Srp; }; -class LoginHttpSession : public Trinity::Net::Http::SslSocket<LoginHttpSession> +class LoginHttpSessionWrapper; +std::shared_ptr<Trinity::Net::Http::SessionState> ObtainSessionState(Trinity::Net::Http::RequestContext& context, boost::asio::ip::address const& remoteAddress); + +template<template<typename> typename SocketImpl> +class LoginHttpSession : public SocketImpl<LoginHttpSession<SocketImpl>> { -public: - static constexpr std::string_view SESSION_ID_COOKIE = "JSESSIONID"; + using BaseSocket = SocketImpl<LoginHttpSession<SocketImpl>>; - explicit LoginHttpSession(boost::asio::ip::tcp::socket&& socket); +public: + explicit LoginHttpSession(boost::asio::ip::tcp::socket&& socket, LoginHttpSessionWrapper& owner); ~LoginHttpSession(); void Start() override; @@ -42,10 +48,41 @@ public: Trinity::Net::Http::RequestHandlerResult RequestHandler(Trinity::Net::Http::RequestContext& context) override; - LoginSessionState* GetSessionState() const { return static_cast<LoginSessionState*>(_state.get()); } + LoginSessionState* GetSessionState() const { return static_cast<LoginSessionState*>(this->_state.get()); } protected: - std::shared_ptr<Trinity::Net::Http::SessionState> ObtainSessionState(Trinity::Net::Http::RequestContext& context) const override; + std::shared_ptr<Trinity::Net::Http::SessionState> ObtainSessionState(Trinity::Net::Http::RequestContext& context) const override + { + return Battlenet::ObtainSessionState(context, this->GetRemoteIpAddress()); + } + + LoginHttpSessionWrapper& _owner; +}; + +class LoginHttpSessionWrapper : public Trinity::Net::Http::AbstractSocket, public std::enable_shared_from_this<LoginHttpSessionWrapper> +{ +public: + static constexpr std::string_view SESSION_ID_COOKIE = "JSESSIONID"; + + explicit LoginHttpSessionWrapper(boost::asio::ip::tcp::socket&& socket); + + void Start() { return std::visit([&](auto&& socket) { return socket->Start(); }, _socket); } + bool Update() { return std::visit([&](auto&& socket) { return socket->Update(); }, _socket); } + boost::asio::ip::address GetRemoteIpAddress() const { return std::visit([&](auto&& socket) { return socket->GetRemoteIpAddress(); }, _socket); } + bool IsOpen() const { return std::visit([&](auto&& socket) { return socket->IsOpen(); }, _socket); } + void CloseSocket() { return std::visit([&](auto&& socket) { return socket->CloseSocket(); }, _socket); } + + void SendResponse(Trinity::Net::Http::RequestContext& context) override { return std::visit([&](auto&& socket) { return socket->SendResponse(context); }, _socket); } + void QueueQuery(QueryCallback&& queryCallback) override { return std::visit([&](auto&& socket) { return socket->QueueQuery(std::move(queryCallback)); }, _socket); } + std::string GetClientInfo() const override { return std::visit([&](auto&& socket) { return socket->GetClientInfo(); }, _socket); } + Optional<boost::uuids::uuid> GetSessionId() const override { return std::visit([&](auto&& socket) { return socket->GetSessionId(); }, _socket); } + LoginSessionState* GetSessionState() const { return std::visit([&](auto&& socket) { return socket->GetSessionState(); }, _socket); } + +private: + std::variant< + std::shared_ptr<LoginHttpSession<Trinity::Net::Http::SslSocket>>, + std::shared_ptr<LoginHttpSession<Trinity::Net::Http::Socket>> + > _socket; }; } #endif // TRINITYCORE_LOGIN_HTTP_SESSION_H |
