From aeae9d75d110bac7d3568df9554d3647c363e766 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 17 Feb 2013 08:09:49 -0800 Subject: [PATCH] fixed jobprovider teardown breaking in mono. --- NzbDrone.Common/SecurityProvider.cs | 393 +++++++++--------- .../JobProviderTests/JobProviderFixture.cs | 6 +- 2 files changed, 197 insertions(+), 202 deletions(-) diff --git a/NzbDrone.Common/SecurityProvider.cs b/NzbDrone.Common/SecurityProvider.cs index d918af749..c236bc5f8 100644 --- a/NzbDrone.Common/SecurityProvider.cs +++ b/NzbDrone.Common/SecurityProvider.cs @@ -3,225 +3,216 @@ using System.Diagnostics; using System.Linq; using System.Security.Principal; using NLog; +#if __MonoCS__ +#else using NetFwTypeLib; +#endif namespace NzbDrone.Common { - public class SecurityProvider - { - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + public class SecurityProvider + { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger (); - private readonly ConfigFileProvider _configFileProvider; - private readonly EnvironmentProvider _environmentProvider; - private readonly ProcessProvider _processProvider; + private readonly ConfigFileProvider _configFileProvider; + private readonly EnvironmentProvider _environmentProvider; + private readonly ProcessProvider _processProvider; - public SecurityProvider(ConfigFileProvider configFileProvider, EnvironmentProvider environmentProvider, + public SecurityProvider (ConfigFileProvider configFileProvider, EnvironmentProvider environmentProvider, ProcessProvider processProvider) - { - _configFileProvider = configFileProvider; - _environmentProvider = environmentProvider; - _processProvider = processProvider; - } - - public SecurityProvider() - { - } - - public virtual void MakeAccessible() - { - if (!IsCurrentUserAdmin()) - { - Logger.Trace("User is not an admin, skipping."); - return; - } - - int port = 0; - - if (IsFirewallEnabled()) - { - if(IsNzbDronePortOpen()) - { - Logger.Trace("NzbDrone port is already open, skipping."); - return; - } - - //Close any old ports - port = CloseFirewallPort(); - - //Open the new port - OpenFirewallPort(_configFileProvider.Port); - } - - //Skip Url Register if not Vista or 7 - if (_environmentProvider.GetOsVersion().Major < 6) - return; - - //Unregister Url (if port != 0) - if (port != 0) - UnregisterUrl(port); - - //Register Url - RegisterUrl(_configFileProvider.Port); - } - - public virtual bool IsCurrentUserAdmin() - { - try - { - var principal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); - return principal.IsInRole(WindowsBuiltInRole.Administrator); - } - catch(Exception ex) - { - Logger.WarnException("Error checking if the current user is an administrator.", ex); - return false; - } - } - - public virtual bool IsNzbDronePortOpen() - { - try - { - var netFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false); - var mgr = (INetFwMgr)Activator.CreateInstance(netFwMgrType); - - if (!mgr.LocalPolicy.CurrentProfile.FirewallEnabled) - return false; - - var ports = mgr.LocalPolicy.CurrentProfile.GloballyOpenPorts; - - foreach (INetFwOpenPort p in ports) - { - if (p.Port == _configFileProvider.Port) - return true; - } - } - catch(Exception ex) - { - Logger.WarnException("Failed to check for open port in firewall", ex); - } - return false; - } - - private bool OpenFirewallPort(int portNumber) - { - try - { - var type = Type.GetTypeFromProgID("HNetCfg.FWOpenPort", false); - var port = Activator.CreateInstance(type) as INetFwOpenPort; - - port.Port = portNumber; - port.Name = "NzbDrone"; - port.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP; - port.Enabled = true; - - var netFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false); - var mgr = (INetFwMgr)Activator.CreateInstance(netFwMgrType); - var ports = mgr.LocalPolicy.CurrentProfile.GloballyOpenPorts; - - ports.Add(port); - return true; - } - catch(Exception ex) - { - Logger.WarnException("Failed to open port in firewall for NzbDrone " + portNumber, ex); - return false; - } - } - - private int CloseFirewallPort() - { - try - { - var netFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false); - var mgr = (INetFwMgr)Activator.CreateInstance(netFwMgrType); - var ports = mgr.LocalPolicy.CurrentProfile.GloballyOpenPorts; - - var portNumber = 8989; - - foreach (INetFwOpenPort p in ports) - { - if (p.Name == "NzbDrone") - { - portNumber = p.Port; - break; - } - } - - if (portNumber != _configFileProvider.Port) - { - ports.Remove(portNumber, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP); - return portNumber; - } - } - catch(Exception ex) - { - Logger.WarnException("Failed to close port in firewall for NzbDrone", ex); - } - - return 0; - } - - private bool IsFirewallEnabled() - { - try - { - var netFwMgrType = Type.GetTypeFromProgID("HNetCfg.FwMgr", false); - var mgr = (INetFwMgr)Activator.CreateInstance(netFwMgrType); - return mgr.LocalPolicy.CurrentProfile.FirewallEnabled; - } - - catch(Exception ex) - { - Logger.WarnException("Failed to check if the firewall is enabled", ex); - return false; - } - } - - private bool RegisterUrl(int portNumber) - { - try - { - var startInfo = new ProcessStartInfo() + { + _configFileProvider = configFileProvider; + _environmentProvider = environmentProvider; + _processProvider = processProvider; + } + + public SecurityProvider () + { + } + + public virtual void MakeAccessible () + { + if (!IsCurrentUserAdmin ()) { + Logger.Trace ("User is not an admin, skipping."); + return; + } + + int port = 0; + + if (IsFirewallEnabled ()) { + if (IsNzbDronePortOpen ()) { + Logger.Trace ("NzbDrone port is already open, skipping."); + return; + } + + //Close any old ports + port = CloseFirewallPort (); + + //Open the new port + OpenFirewallPort (_configFileProvider.Port); + } + + //Skip Url Register if not Vista or 7 + if (_environmentProvider.GetOsVersion ().Major < 6) + return; + + //Unregister Url (if port != 0) + if (port != 0) + UnregisterUrl (port); + + //Register Url + RegisterUrl (_configFileProvider.Port); + } + + public virtual bool IsCurrentUserAdmin () + { + try { + var principal = new WindowsPrincipal (WindowsIdentity.GetCurrent ()); + return principal.IsInRole (WindowsBuiltInRole.Administrator); + } catch (Exception ex) { + Logger.WarnException ("Error checking if the current user is an administrator.", ex); + return false; + } + } + + public virtual bool IsNzbDronePortOpen () + { +#if __MonoCS__ +#else + + try { + var netFwMgrType = Type.GetTypeFromProgID ("HNetCfg.FwMgr", false); + + + var mgr = (INetFwMgr)Activator.CreateInstance (netFwMgrType); + + if (!mgr.LocalPolicy.CurrentProfile.FirewallEnabled) + return false; + + var ports = mgr.LocalPolicy.CurrentProfile.GloballyOpenPorts; + + foreach (INetFwOpenPort p in ports) { + if (p.Port == _configFileProvider.Port) + return true; + } + } catch (Exception ex) { + Logger.WarnException ("Failed to check for open port in firewall", ex); + } +#endif + return false; + } + + private bool OpenFirewallPort (int portNumber) + { +#if __MonoCS__ + return true; +#else + try { + var type = Type.GetTypeFromProgID ("HNetCfg.FWOpenPort", false); + var port = Activator.CreateInstance (type) as INetFwOpenPort; + + port.Port = portNumber; + port.Name = "NzbDrone"; + port.Protocol = NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP; + port.Enabled = true; + + var netFwMgrType = Type.GetTypeFromProgID ("HNetCfg.FwMgr", false); + var mgr = (INetFwMgr)Activator.CreateInstance (netFwMgrType); + var ports = mgr.LocalPolicy.CurrentProfile.GloballyOpenPorts; + + ports.Add (port); + return true; + } catch (Exception ex) { + Logger.WarnException ("Failed to open port in firewall for NzbDrone " + portNumber, ex); + return false; + } +#endif + } + + private int CloseFirewallPort () + { + +#if __MonoCS__ +#else + + try { + var netFwMgrType = Type.GetTypeFromProgID ("HNetCfg.FwMgr", false); + var mgr = (INetFwMgr)Activator.CreateInstance (netFwMgrType); + var ports = mgr.LocalPolicy.CurrentProfile.GloballyOpenPorts; + + var portNumber = 8989; + + foreach (INetFwOpenPort p in ports) { + if (p.Name == "NzbDrone") { + portNumber = p.Port; + break; + } + } + + if (portNumber != _configFileProvider.Port) { + ports.Remove (portNumber, NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP); + return portNumber; + } + } catch (Exception ex) { + Logger.WarnException ("Failed to close port in firewall for NzbDrone", ex); + } +#endif + return 0; + } + + private bool IsFirewallEnabled () + { +#if __MonoCS__ + return true; +#else + + try { + var netFwMgrType = Type.GetTypeFromProgID ("HNetCfg.FwMgr", false); + var mgr = (INetFwMgr)Activator.CreateInstance (netFwMgrType); + return mgr.LocalPolicy.CurrentProfile.FirewallEnabled; + } catch (Exception ex) { + Logger.WarnException ("Failed to check if the firewall is enabled", ex); + return false; + } +#endif + } + + private bool RegisterUrl (int portNumber) + { + try { + var startInfo = new ProcessStartInfo () { FileName = "netsh.exe", Arguments = string.Format("http add urlacl http://*:{0}/ user=EVERYONE", portNumber) }; - var process = _processProvider.Start(startInfo); - process.WaitForExit(5000); - return true; - } - - catch(Exception ex) - { - Logger.WarnException("Error registering URL", ex); - } + var process = _processProvider.Start (startInfo); + process.WaitForExit (5000); + return true; + } catch (Exception ex) { + Logger.WarnException ("Error registering URL", ex); + } - return false; - } + return false; + } - private bool UnregisterUrl(int portNumber) - { - try - { - var startInfo = new ProcessStartInfo() + private bool UnregisterUrl (int portNumber) + { + try { + var startInfo = new ProcessStartInfo () { FileName = "netsh.exe", Arguments = string.Format("http delete urlacl http://*:{0}/", portNumber) }; - var process = _processProvider.Start(startInfo); - process.WaitForExit(5000); - return true; - } - - catch (Exception ex) - { - Logger.WarnException("Error registering URL", ex); - } + var process = _processProvider.Start (startInfo); + process.WaitForExit (5000); + return true; + } catch (Exception ex) { + Logger.WarnException ("Error registering URL", ex); + } - return false; - } - } + return false; + } + } } diff --git a/NzbDrone.Core.Test/ProviderTests/JobProviderTests/JobProviderFixture.cs b/NzbDrone.Core.Test/ProviderTests/JobProviderTests/JobProviderFixture.cs index 3b5efc61f..11bb2423d 100644 --- a/NzbDrone.Core.Test/ProviderTests/JobProviderTests/JobProviderFixture.cs +++ b/NzbDrone.Core.Test/ProviderTests/JobProviderTests/JobProviderFixture.cs @@ -8,6 +8,7 @@ using FizzWare.NBuilder; using FluentAssertions; using NCrunch.Framework; using NUnit.Framework; +using NzbDrone.Common; using NzbDrone.Core.Jobs; using NzbDrone.Core.Model; using NzbDrone.Core.Repository; @@ -40,7 +41,10 @@ namespace NzbDrone.Core.Test.ProviderTests.JobProviderTests [TearDown] public void TearDown() { - Mocker.Resolve().Queue.Should().BeEmpty(); + if(!EnvironmentProvider.IsMono) + { + Mocker.Resolve().Queue.Should().BeEmpty(); + } } private void ResetLastExecution()