diff options
| author | Luke <luke.pulverenti@gmail.com> | 2017-10-11 02:27:06 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-10-11 02:27:06 -0400 |
| commit | 526dea4f6fad60626aa4eb6b8560a4f00ec52351 (patch) | |
| tree | eef63482de5f1e1d2868581f7245aba6fc1a3e79 /Emby.Server.Implementations/Networking | |
| parent | a91918450e3c43df7c474098eeff2781517171d9 (diff) | |
| parent | f534ac2c3e83ea0e7965c58092a135fa77ae6dfc (diff) | |
Merge pull request #2950 from MediaBrowser/dev
Dev
Diffstat (limited to 'Emby.Server.Implementations/Networking')
| -rw-r--r-- | Emby.Server.Implementations/Networking/NetworkManager.cs | 81 |
1 files changed, 76 insertions, 5 deletions
diff --git a/Emby.Server.Implementations/Networking/NetworkManager.cs b/Emby.Server.Implementations/Networking/NetworkManager.cs index 5fb8f7fc9..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,74 @@ namespace Emby.Server.Implementations.Networking return Is172AddressPrivate(endpoint); } - return + 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]; - endpoint.StartsWith("localhost", StringComparison.OrdinalIgnoreCase) || + string subnet_Match = ""; + if ( endpoint.StartsWith("127.", StringComparison.OrdinalIgnoreCase) || endpoint.StartsWith("10.", StringComparison.OrdinalIgnoreCase) || endpoint.StartsWith("192.168", StringComparison.OrdinalIgnoreCase) || - endpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase); + endpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase) + ) + { + 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()); + } + } + + 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) |
