aboutsummaryrefslogtreecommitdiff
path: root/src/server/bnetserver/REST/LoginRESTService.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-07-15 00:45:16 +0200
committerShauren <shauren.trinity@gmail.com>2023-07-15 00:45:16 +0200
commit6be536a73bc8a6e331ce20e7d19e2ea56b99b4d0 (patch)
tree2ad2ae6d9f4096c97235063eff60e7d69641a2b9 /src/server/bnetserver/REST/LoginRESTService.cpp
parentcdfaecda52e165bb04381e1677108ff87b8bdf13 (diff)
Core/Network: Refactor local/remote ip address selection code and allow using hostnames in LoginREST bnetserver config options
Diffstat (limited to 'src/server/bnetserver/REST/LoginRESTService.cpp')
-rw-r--r--src/server/bnetserver/REST/LoginRESTService.cpp54
1 files changed, 43 insertions, 11 deletions
diff --git a/src/server/bnetserver/REST/LoginRESTService.cpp b/src/server/bnetserver/REST/LoginRESTService.cpp
index 5267b2bd761..6e260b4df56 100644
--- a/src/server/bnetserver/REST/LoginRESTService.cpp
+++ b/src/server/bnetserver/REST/LoginRESTService.cpp
@@ -90,7 +90,8 @@ bool LoginRESTService::Start(Trinity::Asio::IoContext* ioContext)
return false;
}
- _externalAddress = *externalAddress;
+ _externalEndpoint = *externalAddress;
+ _externalHostname = Trinity::StringFormat("{}:{}", configuredAddress, _port);
configuredAddress = sConfigMgr->GetStringDefault("LoginREST.LocalAddress", "127.0.0.1");
Optional<boost::asio::ip::tcp::endpoint> localAddress = resolver.Resolve(boost::asio::ip::tcp::v4(), configuredAddress, std::to_string(_port));
@@ -100,8 +101,8 @@ bool LoginRESTService::Start(Trinity::Asio::IoContext* ioContext)
return false;
}
- _localAddress = *localAddress;
- _localNetmask = Trinity::Net::GetDefaultNetmaskV4(_localAddress.address().to_v4());
+ _localEndpoint = *localAddress;
+ _localHostname = Trinity::StringFormat("{}:{}", configuredAddress, _port);
// set up form inputs
Battlenet::JSON::Login::FormInput* input;
@@ -135,17 +136,48 @@ void LoginRESTService::Stop()
_thread.join();
}
-boost::asio::ip::tcp::endpoint const& LoginRESTService::GetAddressForClient(boost::asio::ip::address const& address) const
+boost::asio::ip::tcp::endpoint const& LoginRESTService::GetEndpointForClient(boost::asio::ip::address const& address) const
{
+ std::array<boost::asio::ip::address, 2> addresses = std::array{ _externalEndpoint.address(), _localEndpoint.address() };
+ if (auto addressIndex = Trinity::Net::SelectAddressForClient(address, addresses))
+ {
+ switch (*addressIndex)
+ {
+ case 0:
+ return _externalEndpoint;
+ case 1:
+ return _localEndpoint;
+ default:
+ break;
+ }
+ }
+
if (address.is_loopback())
- return _localAddress;
- else if (_localAddress.address().is_loopback())
- return _externalAddress;
+ return _localEndpoint;
+
+ return _externalEndpoint;
+}
- if (Trinity::Net::IsInNetwork(_localAddress.address().to_v4(), _localNetmask, address.to_v4()))
- return _localAddress;
+std::string const& LoginRESTService::GetHostnameForClient(boost::asio::ip::address const& address) const
+{
+ std::array<boost::asio::ip::address, 2> addresses = std::array{ _externalEndpoint.address(), _localEndpoint.address() };
+ if (auto addressIndex = Trinity::Net::SelectAddressForClient(address, addresses))
+ {
+ switch (*addressIndex)
+ {
+ case 0:
+ return _externalHostname;
+ case 1:
+ return _localHostname;
+ default:
+ break;
+ }
+ }
+
+ if (address.is_loopback())
+ return _localHostname;
- return _externalAddress;
+ return _externalHostname;
}
void LoginRESTService::Run()
@@ -298,7 +330,7 @@ int32 LoginRESTService::HandleGetGameAccounts(std::shared_ptr<AsyncRequest> requ
int32 LoginRESTService::HandleGetPortal(std::shared_ptr<AsyncRequest> request)
{
- boost::asio::ip::tcp::endpoint const& endpoint = GetAddressForClient(boost::asio::ip::address_v4(request->GetClient()->ip));
+ boost::asio::ip::tcp::endpoint const& endpoint = GetEndpointForClient(boost::asio::ip::address_v4(request->GetClient()->ip));
std::string response = Trinity::StringFormat("{}:{}", endpoint.address().to_string(), sConfigMgr->GetIntDefault("BattlenetPort", 1119));
soap_response(request->GetClient(), SOAP_FILE);