diff --git a/OpenRA.Game/Network/GeoIP.cs b/OpenRA.Game/Network/GeoIP.cs index 6df4d1247a..44072720e6 100644 --- a/OpenRA.Game/Network/GeoIP.cs +++ b/OpenRA.Game/Network/GeoIP.cs @@ -54,13 +54,16 @@ namespace OpenRA.Network static Reader database; - public static void Initialize() + public static void Initialize(string databasePath) { + if (string.IsNullOrEmpty(databasePath)) + return; + try { - using (var fileStream = new FileStream("GeoLite2-Country.mmdb.gz", FileMode.Open, FileAccess.Read)) - using (var gzipStream = new GZipInputStream(fileStream)) - database = new Reader(gzipStream); + using (var fileStream = new FileStream(databasePath, FileMode.Open, FileAccess.Read)) + using (var gzipStream = new GZipInputStream(fileStream)) + database = new Reader(gzipStream); } catch (Exception e) { @@ -68,23 +71,23 @@ namespace OpenRA.Network } } - public static string LookupCountry(string ip) + public static string LookupCountry(IPAddress ip) { - const string Unknown = "Unknown Location"; + if (database != null) + { + try + { + var record = database.Find(ip); + if (record != null) + return record.Country.Names.English; + } + catch (Exception e) + { + Log.Write("geoip", "LookupCountry failed: {0}", e); + } + } - try - { - var record = database.Find(IPAddress.Parse(ip)); - if (record != null) - return record.Country.Names.English; - else - return Unknown; - } - catch (Exception e) - { - Log.Write("geoip", "LookupCountry failed: {0}", e); - return Unknown; - } + return "Unknown Location"; } } } diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 8c94753262..9ad42ed72e 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -149,7 +149,7 @@ namespace OpenRA.Server randomSeed = (int)DateTime.Now.ToBinary(); - GeoIP.Initialize(); + GeoIP.Initialize(settings.GeoIPDatabase); if (UPnP.Status == UPnPStatus.Enabled) UPnP.ForwardPort(Settings.ListenPort, Settings.ListenPort).Wait(); @@ -348,7 +348,7 @@ namespace OpenRA.Server { Name = OpenRA.Settings.SanitizedPlayerName(handshake.Client.Name), IpAddress = ipAddress.ToString(), - Location = GeoIP.LookupCountry(ipAddress.ToString()), + Location = GeoIP.LookupCountry(ipAddress), Index = newConn.PlayerIndex, PreferredColor = handshake.Client.PreferredColor, Color = handshake.Client.Color, diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs index 132db8dcc4..3610e22827 100644 --- a/OpenRA.Game/Settings.cs +++ b/OpenRA.Game/Settings.cs @@ -82,6 +82,10 @@ namespace OpenRA [Desc("Sets the timestamp format. Defaults to the ISO 8601 standard.")] public string TimestampFormat = "yyyy-MM-ddTHH:mm:ss"; + [Desc("Path to a MaxMind GeoLite2 database to use for player geo-location.", + "Database files can be downloaded from https://dev.maxmind.com/geoip/geoip2/geolite2/")] + public string GeoIPDatabase = null; + public ServerSettings Clone() { return (ServerSettings)MemberwiseClone(); diff --git a/launch-dedicated.cmd b/launch-dedicated.cmd index d2bfad7af2..ca140e909a 100644 --- a/launch-dedicated.cmd +++ b/launch-dedicated.cmd @@ -8,6 +8,8 @@ set ListenPort=1234 set AdvertiseOnline=True set Password="" +set GeoIPDatabase="" + set RequireAuthentication=False set ProfileIDBlacklist="" set ProfileIDWhitelist="" @@ -17,6 +19,6 @@ set EnableSyncReports=False :loop -OpenRA.Server.exe Game.Mod=%Mod% Server.Name=%Name% Server.ListenPort=%ListenPort% Server.AdvertiseOnline=%AdvertiseOnline% Server.EnableSingleplayer=%EnableSingleplayer% Server.Password=%Password% Server.RequireAuthentication=%RequireAuthentication% Server.ProfileIDBlacklist=%ProfileIDBlacklist% Server.ProfileIDWhitelist=%ProfileIDWhitelist% Server.EnableSyncReports=%EnableSyncReports% +OpenRA.Server.exe Game.Mod=%Mod% Server.Name=%Name% Server.ListenPort=%ListenPort% Server.AdvertiseOnline=%AdvertiseOnline% Server.EnableSingleplayer=%EnableSingleplayer% Server.Password=%Password% Server.GeoIPDatabase=%GeoIPDatabase% Server.RequireAuthentication=%RequireAuthentication% Server.ProfileIDBlacklist=%ProfileIDBlacklist% Server.ProfileIDWhitelist=%ProfileIDWhitelist% Server.EnableSyncReports=%EnableSyncReports% -goto loop \ No newline at end of file +goto loop diff --git a/launch-dedicated.sh b/launch-dedicated.sh index faf0a30950..604a1c31f6 100755 --- a/launch-dedicated.sh +++ b/launch-dedicated.sh @@ -12,6 +12,8 @@ ListenPort="${ListenPort:-"1234"}" AdvertiseOnline="${AdvertiseOnline:-"True"}" Password="${Password:-""}" +GeoIPDatabase="${GeoIPDatabase:-""}" + RequireAuthentication="${RequireAuthentication:-"False"}" ProfileIDBlacklist="${ProfileIDBlacklist:-""}" ProfileIDWhitelist="${ProfileIDWhitelist:-""}" @@ -26,6 +28,7 @@ while true; do Server.AdvertiseOnline="$AdvertiseOnline" \ Server.EnableSingleplayer="$EnableSingleplayer" \ Server.Password="$Password" \ + Server.GeoIPDatabase="$GeoIPDatabase" \ Server.RequireAuthentication="$RequireAuthentication" \ Server.ProfileIDBlacklist="$ProfileIDBlacklist" \ Server.ProfileIDWhitelist="$ProfileIDWhitelist" \