mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Network: Update LoginRESTService to check all addresses together (#30927)
(cherry picked from commit 5ee93f177d)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user