From 3e0cfd3af36f024b685ed512d4fa5f8c9b3fbe59 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 11 Oct 2017 00:45:21 -0400 Subject: [PATCH] fixes #1769 - IsInLocalNetwork returns wrong value --- .../Networking/NetworkManager.cs | 57 +++++++++++++++++-- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/Emby.Server.Implementations/Networking/NetworkManager.cs b/Emby.Server.Implementations/Networking/NetworkManager.cs index 7f0eef0b9f..66b2cba39b 100644 --- a/Emby.Server.Implementations/Networking/NetworkManager.cs +++ b/Emby.Server.Implementations/Networking/NetworkManager.cs @@ -81,8 +81,18 @@ namespace Emby.Server.Implementations.Networking return true; } - // Handle ipv4 mapped to ipv6 - endpoint = endpoint.Replace("::ffff:", string.Empty); + // ipv6 + if (endpoint.Split('.').Length > 4) + { + // Handle ipv4 mapped to ipv6 + var originalEndpoint = endpoint; + endpoint = endpoint.Replace("::ffff:", string.Empty); + + if (string.Equals(endpoint, originalEndpoint, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + } // Private address space: // http://en.wikipedia.org/wiki/Private_network @@ -92,13 +102,15 @@ namespace Emby.Server.Implementations.Networking return Is172AddressPrivate(endpoint); } - return - endpoint.StartsWith("localhost", StringComparison.OrdinalIgnoreCase) || + return endpoint.StartsWith("localhost", StringComparison.OrdinalIgnoreCase) || + endpoint.StartsWith("127.0.0.1", StringComparison.OrdinalIgnoreCase) || IsInPrivateAddressSpaceAndLocalSubnet(endpoint); } public bool IsInPrivateAddressSpaceAndLocalSubnet(string endpoint) { + var endpointFirstPart = endpoint.Split('.')[0]; + string subnet_Match = ""; if ( endpoint.StartsWith("127.", StringComparison.OrdinalIgnoreCase) || @@ -109,7 +121,7 @@ namespace Emby.Server.Implementations.Networking { foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) foreach (UnicastIPAddressInformation unicastIPAddressInformation in adapter.GetIPProperties().UnicastAddresses) - if (unicastIPAddressInformation.Address.AddressFamily == AddressFamily.InterNetwork && endpoint.Split('.')[0] == unicastIPAddressInformation.Address.ToString().Split('.')[0]) + if (unicastIPAddressInformation.Address.AddressFamily == AddressFamily.InterNetwork && endpointFirstPart == unicastIPAddressInformation.Address.ToString().Split('.')[0]) { int subnet_Test = 0; foreach (string part in unicastIPAddressInformation.IPv4Mask.ToString().Split('.')) @@ -125,6 +137,41 @@ namespace Emby.Server.Implementations.Networking return endpoint.StartsWith(subnet_Match + ".", StringComparison.OrdinalIgnoreCase); } + private Dictionary _subnetLookup = new Dictionary(StringComparer.Ordinal); + private string GetSubnet(string endpointFirstPart) + { + string subnet_Match = ""; + + lock (_subnetLookup) + { + if (_subnetLookup.TryGetValue(endpointFirstPart, out subnet_Match)) + { + return subnet_Match; + } + + foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) + foreach (UnicastIPAddressInformation unicastIPAddressInformation in adapter.GetIPProperties().UnicastAddresses) + if (unicastIPAddressInformation.Address.AddressFamily == AddressFamily.InterNetwork && endpointFirstPart == unicastIPAddressInformation.Address.ToString().Split('.')[0]) + { + int subnet_Test = 0; + foreach (string part in unicastIPAddressInformation.IPv4Mask.ToString().Split('.')) + { + if (part.Equals("0")) break; + subnet_Test++; + } + + subnet_Match = String.Join(".", unicastIPAddressInformation.Address.ToString().Split('.').Take(subnet_Test).ToArray()); + } + + if (!string.IsNullOrWhiteSpace(subnet_Match)) + { + _subnetLookup[endpointFirstPart] = subnet_Match; + } + } + + return subnet_Match; + } + private bool Is172AddressPrivate(string endpoint) { for (var i = 16; i <= 31; i++)