diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2017-10-11 00:45:21 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2017-10-11 00:45:21 -0400 |
| commit | 3e0cfd3af36f024b685ed512d4fa5f8c9b3fbe59 (patch) | |
| tree | 68e0805e5113502803227f5234c795e7ef77307c | |
| parent | 0d214769442f1d76b70138f4ec3bb485be071d55 (diff) | |
fixes #1769 - IsInLocalNetwork returns wrong value
| -rw-r--r-- | Emby.Server.Implementations/Networking/NetworkManager.cs | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/Emby.Server.Implementations/Networking/NetworkManager.cs b/Emby.Server.Implementations/Networking/NetworkManager.cs index 7f0eef0b9..66b2cba39 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<string, string> _subnetLookup = new Dictionary<string, string>(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++) |
