diff options
author | Jason Dove <1695733+jasongdove@users.noreply.github.com> | 2025-05-12 11:20:16 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-12 18:20:16 +0200 |
commit | 5ee93f177d8fa88cea5a3fbe103872325908fa87 (patch) | |
tree | 671fd637ae3a9b5fa76b9ef2c8e8935778828e90 | |
parent | 38f40f5413ac3cd096fd1db84b25a3c9bc9f50db (diff) |
Core/Network: Update LoginRESTService to check all addresses together (#30927)
-rw-r--r-- | src/server/bnetserver/REST/LoginRESTService.cpp | 57 | ||||
-rw-r--r-- | src/server/bnetserver/REST/LoginRESTService.h | 7 |
2 files changed, 37 insertions, 27 deletions
diff --git a/src/server/bnetserver/REST/LoginRESTService.cpp b/src/server/bnetserver/REST/LoginRESTService.cpp index 2cb804b4307..740265cfd4b 100644 --- a/src/server/bnetserver/REST/LoginRESTService.cpp +++ b/src/server/bnetserver/REST/LoginRESTService.cpp @@ -42,34 +42,35 @@ bool LoginRESTService::StartNetwork(Trinity::Asio::IoContext& ioContext, std::st if (!HttpService::StartNetwork(ioContext, bindIp, port, threadCount)) return false; + using namespace std::string_view_literals; using Trinity::Net::Http::RequestHandlerFlag; - RegisterHandler(boost::beast::http::verb::get, "/bnetserver/login/", [this](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) + RegisterHandler(boost::beast::http::verb::get, "/bnetserver/login/"sv, [this](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) { return HandleGetForm(std::move(session), context); }); - RegisterHandler(boost::beast::http::verb::get, "/bnetserver/gameAccounts/", [](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) + RegisterHandler(boost::beast::http::verb::get, "/bnetserver/gameAccounts/"sv, [](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) { return HandleGetGameAccounts(std::move(session), context); }); - RegisterHandler(boost::beast::http::verb::get, "/bnetserver/portal/", [this](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) + RegisterHandler(boost::beast::http::verb::get, "/bnetserver/portal/"sv, [this](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) { return HandleGetPortal(std::move(session), context); }); - RegisterHandler(boost::beast::http::verb::post, "/bnetserver/login/", [this](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) + RegisterHandler(boost::beast::http::verb::post, "/bnetserver/login/"sv, [this](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) { return HandlePostLogin(std::move(session), context); }, RequestHandlerFlag::DoNotLogRequestContent); - RegisterHandler(boost::beast::http::verb::post, "/bnetserver/login/srp/", [](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) + RegisterHandler(boost::beast::http::verb::post, "/bnetserver/login/srp/"sv, [](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) { return HandlePostLoginSrpChallenge(std::move(session), context); }); - RegisterHandler(boost::beast::http::verb::post, "/bnetserver/refreshLoginTicket/", [this](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) + RegisterHandler(boost::beast::http::verb::post, "/bnetserver/refreshLoginTicket/"sv, [this](std::shared_ptr<LoginHttpSession> session, HttpRequestContext& context) { return HandlePostRefreshLoginTicket(std::move(session), context); }); @@ -77,24 +78,31 @@ bool LoginRESTService::StartNetwork(Trinity::Asio::IoContext& ioContext, std::st _bindIP = bindIp; _port = port; - using namespace std::string_literals; - std::array<std::string, 2> configKeys = { { "LoginREST.ExternalAddress"s, "LoginREST.LocalAddress"s } }; - Trinity::Net::Resolver resolver(ioContext); - for (std::size_t i = 0; i < _hostnames.size(); ++i) + _externalHostname = sConfigMgr->GetStringDefault("LoginREST.ExternalAddress"sv, "127.0.0.1"); + + std::ranges::transform(resolver.ResolveAll(_externalHostname, ""), + std::back_inserter(_addresses), + [](boost::asio::ip::tcp::endpoint const& endpoint) { return endpoint.address(); }); + + if (_addresses.empty()) { - _hostnames[i].first = sConfigMgr->GetStringDefault(configKeys[i], "127.0.0.1"); + TC_LOG_ERROR("server.http.login", "Could not resolve LoginREST.ExternalAddress {}", _externalHostname); + return false; + } - std::ranges::transform(resolver.ResolveAll(_hostnames[i].first, ""), - std::back_inserter(_hostnames[i].second), - [](boost::asio::ip::tcp::endpoint const& endpoint) { return endpoint.address(); }); + _localHostname = sConfigMgr->GetStringDefault("LoginREST.LocalAddress"sv, "127.0.0.1"); + _firstLocalAddressIndex = _addresses.size(); - if (_hostnames[i].second.empty()) - { - TC_LOG_ERROR("server.http.login", "Could not resolve {} {}", configKeys[i], _hostnames[i].first); - return false; - } + std::ranges::transform(resolver.ResolveAll(_localHostname, ""), + std::back_inserter(_addresses), + [](boost::asio::ip::tcp::endpoint const& endpoint) { return endpoint.address(); }); + + if (_addresses.size() == _firstLocalAddressIndex) + { + TC_LOG_ERROR("server.http.login", "Could not resolve LoginREST.LocalAddress {}", _localHostname); + return false; } // set up form inputs @@ -117,7 +125,7 @@ bool LoginRESTService::StartNetwork(Trinity::Asio::IoContext& ioContext, std::st input->set_type("submit"); input->set_label("Log In"); - _loginTicketDuration = sConfigMgr->GetIntDefault("LoginREST.TicketDuration", 3600); + _loginTicketDuration = sConfigMgr->GetIntDefault("LoginREST.TicketDuration"sv, 3600); MigrateLegacyPasswordHashes(); @@ -130,14 +138,13 @@ bool LoginRESTService::StartNetwork(Trinity::Asio::IoContext& ioContext, std::st std::string const& LoginRESTService::GetHostnameForClient(boost::asio::ip::address const& address) const { - for (std::size_t i = 0; i < _hostnames.size(); ++i) - if (Trinity::Net::SelectAddressForClient(address, _hostnames[i].second)) - return _hostnames[i].first; + if (Optional<std::size_t> addressIndex = Trinity::Net::SelectAddressForClient(address, _addresses)) + return *addressIndex >= _firstLocalAddressIndex ? _localHostname : _externalHostname; if (address.is_loopback()) - return _hostnames[1].first; + return _localHostname; - return _hostnames[0].first; + return _externalHostname; } std::string LoginRESTService::ExtractAuthorization(HttpRequest const& request) diff --git a/src/server/bnetserver/REST/LoginRESTService.h b/src/server/bnetserver/REST/LoginRESTService.h index 517f5e295b7..e9bc68ffdf9 100644 --- a/src/server/bnetserver/REST/LoginRESTService.h +++ b/src/server/bnetserver/REST/LoginRESTService.h @@ -51,7 +51,7 @@ public: using HttpRequestContext = Trinity::Net::Http::RequestContext; using HttpSessionState = Trinity::Net::Http::SessionState; - LoginRESTService() : HttpService("login"), _port(0), _loginTicketDuration(0) { } + LoginRESTService() : HttpService("login"), _port(0), _firstLocalAddressIndex(0), _loginTicketDuration(0) { } static LoginRESTService& Instance(); @@ -81,7 +81,10 @@ private: JSON::Login::FormInputs _formInputs; std::string _bindIP; uint16 _port; - std::array<std::pair<std::string, std::vector<boost::asio::ip::address>>, 2> _hostnames; + std::string _externalHostname; + std::string _localHostname; + std::vector<boost::asio::ip::address> _addresses; + std::size_t _firstLocalAddressIndex; // index inside _addresses where the first local address can be found uint32 _loginTicketDuration; }; } |