From 6be536a73bc8a6e331ce20e7d19e2ea56b99b4d0 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 15 Jul 2023 00:45:16 +0200 Subject: Core/Network: Refactor local/remote ip address selection code and allow using hostnames in LoginREST bnetserver config options --- src/server/shared/Realm/Realm.cpp | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) (limited to 'src/server/shared/Realm/Realm.cpp') diff --git a/src/server/shared/Realm/Realm.cpp b/src/server/shared/Realm/Realm.cpp index 0648de535a3..87b7114111d 100644 --- a/src/server/shared/Realm/Realm.cpp +++ b/src/server/shared/Realm/Realm.cpp @@ -31,31 +31,24 @@ void Realm::SetName(std::string name) boost::asio::ip::address Realm::GetAddressForClient(boost::asio::ip::address const& clientAddr) const { - boost::asio::ip::address realmIp; - - // Attempt to send best address for client - if (clientAddr.is_loopback()) + std::array addresses = std::array{ *ExternalAddress, * LocalAddress }; + if (auto addressIndex = Trinity::Net::SelectAddressForClient(clientAddr, addresses)) { - // Try guessing if realm is also connected locally - if (LocalAddress->is_loopback() || ExternalAddress->is_loopback()) - realmIp = clientAddr; - else + switch (*addressIndex) { - // Assume that user connecting from the machine that bnetserver is located on - // has all realms available in his local network - realmIp = *LocalAddress; + case 0: + return *ExternalAddress; + case 1: + return *LocalAddress; + default: + break; } } - else - { - if (clientAddr.is_v4() && Trinity::Net::IsInNetwork(LocalAddress->to_v4(), LocalSubnetMask->to_v4(), clientAddr.to_v4())) - realmIp = *LocalAddress; - else - realmIp = *ExternalAddress; - } - // Return external IP - return realmIp; + if (clientAddr.is_loopback()) + return *LocalAddress; + + return *ExternalAddress; } uint32 Realm::GetConfigId() const -- cgit v1.2.3