diff --git a/Source/BNetServer/Managers/LoginServiceManager.cs b/Source/BNetServer/Managers/LoginServiceManager.cs index be39137d5..bcaa4edf7 100644 --- a/Source/BNetServer/Managers/LoginServiceManager.cs +++ b/Source/BNetServer/Managers/LoginServiceManager.cs @@ -18,17 +18,15 @@ namespace BNetServer { public class LoginServiceManager : Singleton { - ConcurrentDictionary<(uint ServiceHash, uint MethodId), BnetServiceHandler> serviceHandlers; - FormInputs formInputs; - IPEndPoint externalAddress; - IPEndPoint localAddress; + ConcurrentDictionary<(uint ServiceHash, uint MethodId), BnetServiceHandler> serviceHandlers = new(); + FormInputs formInputs = new(); + string _externalHostname; + IPEndPoint _externalEndpoint; + string _localHostname; + IPEndPoint _localEndpoint; X509Certificate2 certificate; - LoginServiceManager() - { - serviceHandlers = new ConcurrentDictionary<(uint ServiceHash, uint MethodId), BnetServiceHandler>(); - formInputs = new FormInputs(); - } + LoginServiceManager() { } public void Initialize() { @@ -46,7 +44,9 @@ namespace BNetServer Log.outError(LogFilter.Network, $"Could not resolve LoginREST.ExternalAddress {configuredAddress}"); return; } - externalAddress = new IPEndPoint(address, port); + + _externalEndpoint = new IPEndPoint(address, port); + _externalHostname = $"{configuredAddress}:{port}"; configuredAddress = ConfigMgr.GetDefaultValue("LoginREST.LocalAddress", "127.0.0.1"); if (!IPAddress.TryParse(configuredAddress, out address)) @@ -55,7 +55,8 @@ namespace BNetServer return; } - localAddress = new IPEndPoint(address, port); + _localEndpoint = new IPEndPoint(address, port); + _localHostname = $"{configuredAddress}:{port}"; // set up form inputs formInputs.Type = "LOGIN_FORM"; @@ -117,14 +118,22 @@ namespace BNetServer return serviceHandlers.LookupByKey((serviceHash, methodId)); } - public IPEndPoint GetAddressForClient(IPAddress address) + public IPEndPoint GetEndpointForClient(IPAddress address) { if (IPAddress.IsLoopback(address)) - return localAddress; + return _localEndpoint; - return externalAddress; + return _externalEndpoint; } + public string GetHostnameForClient(IPEndPoint address) + { + if (IPAddress.IsLoopback(address.Address)) + return _localHostname; + + return _externalHostname; + } + public FormInputs GetFormInput() { return formInputs; diff --git a/Source/BNetServer/Networking/Services/Authentication.cs b/Source/BNetServer/Networking/Services/Authentication.cs index 8a84a8fae..c2101eff7 100644 --- a/Source/BNetServer/Networking/Services/Authentication.cs +++ b/Source/BNetServer/Networking/Services/Authentication.cs @@ -39,11 +39,11 @@ namespace BNetServer.Networking os = logonRequest.Platform; build = (uint)logonRequest.ApplicationVersion; - var endpoint = Global.LoginServiceMgr.GetAddressForClient(GetRemoteIpEndPoint().Address); + var hostname = Global.LoginServiceMgr.GetHostnameForClient(GetRemoteIpEndPoint()); ChallengeExternalRequest externalChallenge = new(); externalChallenge.PayloadType = "web_auth_url"; - externalChallenge.Payload = ByteString.CopyFromUtf8($"https://{endpoint.Address}:{endpoint.Port}/bnetserver/login/"); + externalChallenge.Payload = ByteString.CopyFromUtf8($"https://{hostname}/bnetserver/login/"); SendRequest((uint)OriginalHash.ChallengeListener, 3, externalChallenge); return BattlenetRpcErrorCode.Ok; diff --git a/Source/Framework/Database/DatabaseUpdater.cs b/Source/Framework/Database/DatabaseUpdater.cs index 5612bf352..ed757cfc5 100644 --- a/Source/Framework/Database/DatabaseUpdater.cs +++ b/Source/Framework/Database/DatabaseUpdater.cs @@ -37,10 +37,10 @@ namespace Framework.Database fileName = @"/sql/base/characters_database.sql"; break; case "WorldDatabase": - fileName = @"/sql/TDB_full_world_1007.23041_2023_04_02.sql"; + fileName = @"/sql/TDB_full_world_1015.23071_2023_07_14.sql"; break; case "HotfixDatabase": - fileName = @"/sql/TDB_full_hotfixes_1007.23041_2023_04_02.sql"; + fileName = @"/sql/TDB_full_hotfixes_1015.23071_2023_07_14.sql"; break; } diff --git a/Source/Framework/Database/Databases/LoginDatabase.cs b/Source/Framework/Database/Databases/LoginDatabase.cs index 7f482e5d7..7f91e1042 100644 --- a/Source/Framework/Database/Databases/LoginDatabase.cs +++ b/Source/Framework/Database/Databases/LoginDatabase.cs @@ -10,7 +10,7 @@ namespace Framework.Database const string BnetAccountInfo = "ba.id, ba.email, ba.locked, ba.lock_country, ba.last_ip, ba.LoginTicketExpiry, bab.unbandate > UNIX_TIMESTAMP() OR bab.unbandate = bab.bandate, bab.unbandate = bab.bandate"; const string BnetGameAccountInfo = "a.id, a.username, ab.unbandate, ab.unbandate = ab.bandate, aa.SecurityLevel"; - PrepareStatement(LoginStatements.SEL_REALMLIST, "SELECT id, name, address, localAddress, localSubnetMask, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild, Region, Battlegroup FROM realmlist WHERE flag <> 3 ORDER BY name"); + PrepareStatement(LoginStatements.SEL_REALMLIST, "SELECT id, name, address, localAddress, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild, Region, Battlegroup FROM realmlist WHERE flag <> 3 ORDER BY name"); PrepareStatement(LoginStatements.DelExpiredIpBans, "DELETE FROM ip_banned WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()"); PrepareStatement(LoginStatements.UpdExpiredAccountBans, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()"); PrepareStatement(LoginStatements.SelIpInfo, "SELECT unbandate > UNIX_TIMESTAMP() OR unbandate = bandate AS banned, NULL as country FROM ip_banned WHERE ip = ?"); diff --git a/Source/Framework/Realm/Realm.cs b/Source/Framework/Realm/Realm.cs index 4f189a767..ff99d2374 100644 --- a/Source/Framework/Realm/Realm.cs +++ b/Source/Framework/Realm/Realm.cs @@ -18,7 +18,7 @@ public class Realm : IEquatable public IPEndPoint GetAddressForClient(IPAddress clientAddr) { - IPAddress realmIp; + IPAddress realmIp = ExternalAddress; // Attempt to send best address for client if (IPAddress.IsLoopback(clientAddr)) @@ -33,13 +33,6 @@ public class Realm : IEquatable realmIp = LocalAddress; } } - else - { - if (clientAddr.AddressFamily == AddressFamily.InterNetwork && clientAddr.GetNetworkAddress(LocalSubnetMask).Equals(LocalAddress.GetNetworkAddress(LocalSubnetMask))) - realmIp = LocalAddress; - else - realmIp = ExternalAddress; - } IPEndPoint endpoint = new(realmIp, Port); @@ -66,7 +59,6 @@ public class Realm : IEquatable { return other.ExternalAddress.Equals(ExternalAddress) && other.LocalAddress.Equals(LocalAddress) - && other.LocalSubnetMask.Equals(LocalSubnetMask) && other.Port == Port && other.Name == Name && other.Type == Type @@ -78,14 +70,13 @@ public class Realm : IEquatable public override int GetHashCode() { - return new { ExternalAddress, LocalAddress, LocalSubnetMask, Port, Name, Type, Flags, Timezone, AllowedSecurityLevel, PopulationLevel }.GetHashCode(); + return new { ExternalAddress, LocalAddress, Port, Name, Type, Flags, Timezone, AllowedSecurityLevel, PopulationLevel }.GetHashCode(); } public RealmId Id; public uint Build; public IPAddress ExternalAddress; public IPAddress LocalAddress; - public IPAddress LocalSubnetMask; public ushort Port; public string Name; public string NormalizedName; diff --git a/Source/Framework/Realm/RealmManager.cs b/Source/Framework/Realm/RealmManager.cs index 9fac67866..d3b17d606 100644 --- a/Source/Framework/Realm/RealmManager.cs +++ b/Source/Framework/Realm/RealmManager.cs @@ -94,23 +94,22 @@ public class RealmManager : Singleton realm.Name = result.Read(1); realm.ExternalAddress = IPAddress.Parse(result.Read(2)); realm.LocalAddress = IPAddress.Parse(result.Read(3)); - realm.LocalSubnetMask = IPAddress.Parse(result.Read(4)); - realm.Port = result.Read(5); - RealmType realmType = (RealmType)result.Read(6); + realm.Port = result.Read(4); + RealmType realmType = (RealmType)result.Read(5); if (realmType == RealmType.FFAPVP) realmType = RealmType.PVP; if (realmType >= RealmType.MaxType) realmType = RealmType.Normal; realm.Type = (byte)realmType; - realm.Flags = (RealmFlags)result.Read(7); - realm.Timezone = result.Read(8); - AccountTypes allowedSecurityLevel = (AccountTypes)result.Read(9); + realm.Flags = (RealmFlags)result.Read(6); + realm.Timezone = result.Read(7); + AccountTypes allowedSecurityLevel = (AccountTypes)result.Read(8); realm.AllowedSecurityLevel = (allowedSecurityLevel <= AccountTypes.Administrator ? allowedSecurityLevel : AccountTypes.Administrator); - realm.PopulationLevel = result.Read(10); - realm.Build = result.Read(11); - byte region = result.Read(12); - byte battlegroup = result.Read(13); + realm.PopulationLevel = result.Read(9); + realm.Build = result.Read(10); + byte region = result.Read(11); + byte battlegroup = result.Read(12); realm.Id = new RealmId(region, battlegroup, realmId); diff --git a/Source/Game/World/WorldManager.cs b/Source/Game/World/WorldManager.cs index 9973f0801..78548db67 100644 --- a/Source/Game/World/WorldManager.cs +++ b/Source/Game/World/WorldManager.cs @@ -2438,23 +2438,22 @@ namespace Game public bool LoadRealmInfo() { - SQLResult result = DB.Login.Query("SELECT id, name, address, localAddress, localSubnetMask, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild, Region, Battlegroup FROM realmlist WHERE id = {0}", _realm.Id.Index); + SQLResult result = DB.Login.Query("SELECT id, name, address, localAddress, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild, Region, Battlegroup FROM realmlist WHERE id = {0}", _realm.Id.Index); if (result.IsEmpty()) return false; _realm.SetName(result.Read(1)); _realm.ExternalAddress = System.Net.IPAddress.Parse(result.Read(2)); _realm.LocalAddress = System.Net.IPAddress.Parse(result.Read(3)); - _realm.LocalSubnetMask = System.Net.IPAddress.Parse(result.Read(4)); - _realm.Port = result.Read(5); - _realm.Type = result.Read(6); - _realm.Flags = (RealmFlags)result.Read(7); - _realm.Timezone = result.Read(8); - _realm.AllowedSecurityLevel = (AccountTypes)result.Read(9); - _realm.PopulationLevel = result.Read(10); - _realm.Id.Region = result.Read(12); - _realm.Id.Site = result.Read(13); - _realm.Build = result.Read(11); + _realm.Port = result.Read(4); + _realm.Type = result.Read(5); + _realm.Flags = (RealmFlags)result.Read(6); + _realm.Timezone = result.Read(7); + _realm.AllowedSecurityLevel = (AccountTypes)result.Read(8); + _realm.PopulationLevel = result.Read(9); + _realm.Build = result.Read(10); + _realm.Id.Region = result.Read(11); + _realm.Id.Site = result.Read(12); return true; }