Core/Network: Update LoginRESTService to check all addresses together (#30927)

This commit is contained in:
Jason Dove
2025-05-12 11:20:16 -05:00
committed by GitHub
parent 38f40f5413
commit 5ee93f177d
2 changed files with 37 additions and 27 deletions

View File

@@ -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)

View File

@@ -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;
};
}