From f5cb81951ac2ab8d654fc3d9a6665b6b6c7ee31f Mon Sep 17 00:00:00 2001 From: Qstick Date: Wed, 17 Nov 2021 22:33:39 -0600 Subject: [PATCH] New: Use native .NET socks proxy --- .../Http/Proxy/ManagedWebProxyFactory.cs | 67 +++++++------------ src/NzbDrone.Common/Prowlarr.Common.csproj | 1 - .../IndexerProxies/Socks4/Socks4.cs | 42 +++--------- .../IndexerProxies/Socks5/Socks5.cs | 42 +++--------- 4 files changed, 45 insertions(+), 107 deletions(-) diff --git a/src/NzbDrone.Common/Http/Proxy/ManagedWebProxyFactory.cs b/src/NzbDrone.Common/Http/Proxy/ManagedWebProxyFactory.cs index ca58fedee..7a972d84f 100644 --- a/src/NzbDrone.Common/Http/Proxy/ManagedWebProxyFactory.cs +++ b/src/NzbDrone.Common/Http/Proxy/ManagedWebProxyFactory.cs @@ -1,9 +1,5 @@ -using System; -using System.Linq; +using System; using System.Net; -using System.Net.Sockets; -using com.LandonKey.SocksWebProxy; -using com.LandonKey.SocksWebProxy.Proxy; using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; @@ -34,53 +30,36 @@ namespace NzbDrone.Common.Http.Proxy private IWebProxy CreateWebProxy(HttpProxySettings proxySettings) { - switch (proxySettings.Type) - { - case ProxyType.Http: - if (proxySettings.Username.IsNotNullOrWhiteSpace() && proxySettings.Password.IsNotNullOrWhiteSpace()) - { - return new WebProxy(proxySettings.Host + ":" + proxySettings.Port, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray, new NetworkCredential(proxySettings.Username, proxySettings.Password)); - } - else - { - return new WebProxy(proxySettings.Host + ":" + proxySettings.Port, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray); - } + var uri = GetProxyUri(proxySettings); - case ProxyType.Socks4: - return new SocksWebProxy(new ProxyConfig(IPAddress.Loopback, GetNextFreePort(), GetProxyIpAddress(proxySettings.Host), proxySettings.Port, ProxyConfig.SocksVersion.Four, proxySettings.Username, proxySettings.Password), false); - case ProxyType.Socks5: - return new SocksWebProxy(new ProxyConfig(IPAddress.Loopback, GetNextFreePort(), GetProxyIpAddress(proxySettings.Host), proxySettings.Port, ProxyConfig.SocksVersion.Five, proxySettings.Username, proxySettings.Password), false); + if (uri == null) + { + return null; } - return null; - } - - private static IPAddress GetProxyIpAddress(string host) - { - IPAddress ipAddress; - if (!IPAddress.TryParse(host, out ipAddress)) + if (proxySettings.Username.IsNotNullOrWhiteSpace() && proxySettings.Password.IsNotNullOrWhiteSpace()) { - try - { - ipAddress = Dns.GetHostEntry(host).AddressList.OrderByDescending(a => a.AddressFamily == AddressFamily.InterNetwork).First(); - } - catch (Exception e) - { - throw new InvalidOperationException(string.Format("Unable to resolve proxy hostname '{0}' to a valid IP address.", host), e); - } + return new WebProxy(uri, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray, new NetworkCredential(proxySettings.Username, proxySettings.Password)); + } + else + { + return new WebProxy(uri, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray); } - - return ipAddress; } - private static int GetNextFreePort() + private Uri GetProxyUri(HttpProxySettings proxySettings) { - var listener = new TcpListener(IPAddress.Loopback, 0); - listener.Start(); - var port = ((IPEndPoint)listener.LocalEndpoint).Port; - listener.Stop(); - - return port; + switch (proxySettings.Type) + { + case ProxyType.Http: + return new Uri("http://" + proxySettings.Host + ":" + proxySettings.Port); + case ProxyType.Socks4: + return new Uri("socks4://" + proxySettings.Host + ":" + proxySettings.Port); + case ProxyType.Socks5: + return new Uri("socks5://" + proxySettings.Host + ":" + proxySettings.Port); + default: + return null; + } } } } diff --git a/src/NzbDrone.Common/Prowlarr.Common.csproj b/src/NzbDrone.Common/Prowlarr.Common.csproj index 87080ea74..ea03b36c4 100644 --- a/src/NzbDrone.Common/Prowlarr.Common.csproj +++ b/src/NzbDrone.Common/Prowlarr.Common.csproj @@ -4,7 +4,6 @@ ISMUSL - diff --git a/src/NzbDrone.Core/IndexerProxies/Socks4/Socks4.cs b/src/NzbDrone.Core/IndexerProxies/Socks4/Socks4.cs index 54177a917..9fccb766a 100644 --- a/src/NzbDrone.Core/IndexerProxies/Socks4/Socks4.cs +++ b/src/NzbDrone.Core/IndexerProxies/Socks4/Socks4.cs @@ -1,9 +1,5 @@ using System; -using System.Linq; using System.Net; -using System.Net.Sockets; -using com.LandonKey.SocksWebProxy; -using com.LandonKey.SocksWebProxy.Proxy; using NLog; using NzbDrone.Common.Cloud; using NzbDrone.Common.Extensions; @@ -22,13 +18,20 @@ namespace NzbDrone.Core.IndexerProxies.Socks4 public override string Name => "Socks4"; public override HttpRequest PreRequest(HttpRequest request) { + var uri = GetProxyUri(Settings); + + if (uri == null) + { + return null; + } + if (Settings.Username.IsNotNullOrWhiteSpace() && Settings.Password.IsNotNullOrWhiteSpace()) { - request.Proxy = new SocksWebProxy(new ProxyConfig(IPAddress.Loopback, GetNextFreePort(), GetProxyIpAddress(Settings.Host), Settings.Port, ProxyConfig.SocksVersion.Four, Settings.Username, Settings.Password), false); + request.Proxy = new WebProxy(uri, false, null, new NetworkCredential(Settings.Username, Settings.Password)); } else { - request.Proxy = new SocksWebProxy(new ProxyConfig(IPAddress.Loopback, GetNextFreePort(), GetProxyIpAddress(Settings.Host), Settings.Port, ProxyConfig.SocksVersion.Four), false); + request.Proxy = new WebProxy(uri); } _logger.Debug("Applying Socks4 Proxy {0} to request {1}", Name, request.Url); @@ -36,32 +39,9 @@ namespace NzbDrone.Core.IndexerProxies.Socks4 return request; } - private static int GetNextFreePort() + private Uri GetProxyUri(Socks4Settings proxySettings) { - var listener = new TcpListener(IPAddress.Loopback, 0); - listener.Start(); - var port = ((IPEndPoint)listener.LocalEndpoint).Port; - listener.Stop(); - - return port; - } - - private static IPAddress GetProxyIpAddress(string host) - { - IPAddress ipAddress; - if (!IPAddress.TryParse(host, out ipAddress)) - { - try - { - ipAddress = Dns.GetHostEntry(host).AddressList.OrderByDescending(a => a.AddressFamily == AddressFamily.InterNetwork).First(); - } - catch (Exception e) - { - throw new InvalidOperationException(string.Format("Unable to resolve proxy hostname '{0}' to a valid IP address.", host), e); - } - } - - return ipAddress; + return new Uri("socks4://" + proxySettings.Host + ":" + proxySettings.Port); } } } diff --git a/src/NzbDrone.Core/IndexerProxies/Socks5/Socks5.cs b/src/NzbDrone.Core/IndexerProxies/Socks5/Socks5.cs index c41c00549..dfd572977 100644 --- a/src/NzbDrone.Core/IndexerProxies/Socks5/Socks5.cs +++ b/src/NzbDrone.Core/IndexerProxies/Socks5/Socks5.cs @@ -1,9 +1,5 @@ using System; -using System.Linq; using System.Net; -using System.Net.Sockets; -using com.LandonKey.SocksWebProxy; -using com.LandonKey.SocksWebProxy.Proxy; using NLog; using NzbDrone.Common.Cloud; using NzbDrone.Common.Extensions; @@ -23,13 +19,20 @@ namespace NzbDrone.Core.IndexerProxies.Socks5 public override HttpRequest PreRequest(HttpRequest request) { + var uri = GetProxyUri(Settings); + + if (uri == null) + { + return null; + } + if (Settings.Username.IsNotNullOrWhiteSpace() && Settings.Password.IsNotNullOrWhiteSpace()) { - request.Proxy = new SocksWebProxy(new ProxyConfig(IPAddress.Loopback, GetNextFreePort(), GetProxyIpAddress(Settings.Host), Settings.Port, ProxyConfig.SocksVersion.Five, Settings.Username, Settings.Password), false); + request.Proxy = new WebProxy(uri, false, null, new NetworkCredential(Settings.Username, Settings.Password)); } else { - request.Proxy = new SocksWebProxy(new ProxyConfig(IPAddress.Loopback, GetNextFreePort(), GetProxyIpAddress(Settings.Host), Settings.Port, ProxyConfig.SocksVersion.Five), false); + request.Proxy = new WebProxy(uri); } _logger.Debug("Applying Socks5 Proxy {0} to request {1}", Name, request.Url); @@ -37,32 +40,9 @@ namespace NzbDrone.Core.IndexerProxies.Socks5 return request; } - private static int GetNextFreePort() + private Uri GetProxyUri(Socks5Settings proxySettings) { - var listener = new TcpListener(IPAddress.Loopback, 0); - listener.Start(); - var port = ((IPEndPoint)listener.LocalEndpoint).Port; - listener.Stop(); - - return port; - } - - private static IPAddress GetProxyIpAddress(string host) - { - IPAddress ipAddress; - if (!IPAddress.TryParse(host, out ipAddress)) - { - try - { - ipAddress = Dns.GetHostEntry(host).AddressList.OrderByDescending(a => a.AddressFamily == AddressFamily.InterNetwork).First(); - } - catch (Exception e) - { - throw new InvalidOperationException(string.Format("Unable to resolve proxy hostname '{0}' to a valid IP address.", host), e); - } - } - - return ipAddress; + return new Uri("socks5://" + proxySettings.Host + ":" + proxySettings.Port); } } }