aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs
diff options
context:
space:
mode:
author7illusions <z@7illusions.com>2014-08-30 19:06:58 +0200
committer7illusions <z@7illusions.com>2014-08-30 19:06:58 +0200
commit66ad1699e22029b605e17735e8d9450285d8748a (patch)
treeffc92c88d24850b2f82b6b3a8bdd904a2ccc77a5 /MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs
parent34bc54263e886aae777a3537dc50a6535b51330a (diff)
parent9d36f518182bc075c19d78084870f5115fa62d1e (diff)
Merge pull request #1 from MediaBrowser/master
Update to latest
Diffstat (limited to 'MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs')
-rw-r--r--MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs87
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>