diff options
Diffstat (limited to 'MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs')
| -rw-r--r-- | MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs | 87 |
1 files changed, 85 insertions, 2 deletions
diff --git a/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs b/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs index e15c32518..8159be634 100644 --- a/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs +++ b/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs @@ -1,4 +1,5 @@ -using System; +using MediaBrowser.Model.Logging; +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -10,6 +11,13 @@ namespace MediaBrowser.Common.Implementations.Networking { public abstract class BaseNetworkManager { + protected ILogger Logger { get; private set; } + + protected BaseNetworkManager(ILogger logger) + { + Logger = logger; + } + /// <summary> /// Gets the machine's local ip address /// </summary> @@ -26,6 +34,81 @@ namespace MediaBrowser.Common.Implementations.Networking return GetLocalIpAddressesFallback(); } + public bool IsInLocalNetwork(string endpoint) + { + return IsInLocalNetworkInternal(endpoint, true); + } + + public bool IsInLocalNetworkInternal(string endpoint, bool resolveHost) + { + if (string.IsNullOrWhiteSpace(endpoint)) + { + throw new ArgumentNullException("endpoint"); + } + + const int lengthMatch = 4; + + if (endpoint.Length >= lengthMatch) + { + var prefix = endpoint.Substring(0, lengthMatch); + + if (GetLocalIpAddresses() + .Any(i => i.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))) + { + return true; + } + } + + // Private address space: + // http://en.wikipedia.org/wiki/Private_network + + var isPrivate = + + // If url was requested with computer name, we may see this + endpoint.IndexOf("::", StringComparison.OrdinalIgnoreCase) != -1 || + + endpoint.StartsWith("10.", StringComparison.OrdinalIgnoreCase) || + endpoint.StartsWith("192.", StringComparison.OrdinalIgnoreCase) || + endpoint.StartsWith("172.", StringComparison.OrdinalIgnoreCase) || + endpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase); + + if (isPrivate) + { + return true; + } + + IPAddress address; + if (resolveHost && !IPAddress.TryParse(endpoint, out address)) + { + var host = new Uri(endpoint).DnsSafeHost; + + Logger.Debug("Resolving host {0}", host); + + try + { + address = GetIpAddresses(host).FirstOrDefault(); + + if (address != null) + { + Logger.Debug("{0} resolved to {1}", host, address); + + return IsInLocalNetworkInternal(address.ToString(), false); + } + } + catch (Exception ex) + { + Logger.ErrorException("Error resovling hostname {0}", ex, host); + } + } + + return false; + } + + public IEnumerable<IPAddress> GetIpAddresses(string hostName) + { + return Dns.GetHostAddresses(hostName); + } + private IEnumerable<IPAddress> GetIPsDefault() { foreach (var adapter in NetworkInterface.GetAllNetworkInterfaces()) @@ -63,7 +146,7 @@ namespace MediaBrowser.Common.Implementations.Networking .Select(i => i.ToString()) .Reverse(); } - + /// <summary> /// Gets a random port number that is currently available /// </summary> |
