aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/bnetserver/REST/LoginRESTService.cpp57
-rw-r--r--src/server/bnetserver/REST/LoginRESTService.h7
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;
};
}