diff options
author | WouterTinus <wouter.tinus@gmail.com> | 2019-09-07 01:36:12 +0200 |
---|---|---|
committer | WouterTinus <wouter.tinus@gmail.com> | 2019-09-07 01:36:12 +0200 |
commit | 7673fa357a81444cf6c216267dfab4e76684ba5c (patch) | |
tree | 73c0bd36e5b6261cd89a168c2a099f6556c59f4d /src/main.lib/Plugins/InstallationPlugins/IISWeb | |
parent | 42aa0faa4de6ea4184cfe1a5830508777418b11a (diff) | |
download | letsencrypt-win-simple-7673fa357a81444cf6c216267dfab4e76684ba5c.zip letsencrypt-win-simple-7673fa357a81444cf6c216267dfab4e76684ba5c.tar.gz letsencrypt-win-simple-7673fa357a81444cf6c216267dfab4e76684ba5c.tar.bz2 |
move plugins & re-implement WebDav
Diffstat (limited to 'src/main.lib/Plugins/InstallationPlugins/IISWeb')
5 files changed, 233 insertions, 0 deletions
diff --git a/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWeb.cs b/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWeb.cs new file mode 100644 index 0000000..f5e8aa8 --- /dev/null +++ b/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWeb.cs @@ -0,0 +1,82 @@ +using PKISharp.WACS.Clients.IIS; +using PKISharp.WACS.DomainObjects; +using PKISharp.WACS.Plugins.Interfaces; +using PKISharp.WACS.Plugins.StorePlugins; +using PKISharp.WACS.Services; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace PKISharp.WACS.Plugins.InstallationPlugins +{ + internal class IISWeb : IInstallationPlugin + { + private readonly Target _target; + private readonly ILogService _log; + private readonly IIISClient _iisClient; + private readonly IISWebOptions _options; + + public IISWeb(Target target, IISWebOptions options, IIISClient iisClient, ILogService log) + { + _iisClient = iisClient; + _log = log; + _options = options; + _target = target; + } + + void IInstallationPlugin.Install(IEnumerable<IStorePlugin> stores, CertificateInfo newCertificate, CertificateInfo oldCertificate) + { + var bindingOptions = new BindingOptions(). + WithThumbprint(newCertificate.Certificate.GetCertHash()); + + var centralSsl = stores.FirstOrDefault(x => x is CentralSsl); + var certificateStore = stores.FirstOrDefault(x => x is CertificateStore); + + if (centralSsl != null) + { + if (_iisClient.Version.Major < 8) + { + var errorMessage = "Centralized SSL is only supported on IIS8+"; + _log.Error(errorMessage); + throw new InvalidOperationException(errorMessage); + } + else + { + bindingOptions = bindingOptions.WithFlags(SSLFlags.CentralSSL); + } + } + else if (certificateStore != null) + { + bindingOptions = bindingOptions.WithStore(newCertificate.StoreInfo[typeof(CertificateStore)].Path); + } + else + { + // Unknown/unsupported store + var errorMessage = "This installation plugin cannot be used in combination with the store plugin"; + _log.Error(errorMessage); + throw new InvalidOperationException(errorMessage); + } + + // Optionaly overrule the standard IP for new bindings + if (!string.IsNullOrEmpty(_options.NewBindingIp)) + { + bindingOptions = bindingOptions.WithIP(_options.NewBindingIp); + } + + // Optionaly overrule the standard port for new bindings + if (_options.NewBindingPort > 0) + { + bindingOptions = bindingOptions.WithPort(_options.NewBindingPort.Value); + } + + var oldThumb = oldCertificate?.Certificate?.GetCertHash(); + foreach (var part in _target.Parts) + { + _iisClient.AddOrUpdateBindings( + part.Identifiers, + bindingOptions.WithSiteId(_options.SiteId ?? part.SiteId), + oldThumb); + } + } + } +} diff --git a/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebArguments.cs b/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebArguments.cs new file mode 100644 index 0000000..94f2e1f --- /dev/null +++ b/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebArguments.cs @@ -0,0 +1,9 @@ +namespace PKISharp.WACS.Plugins.InstallationPlugins +{ + class IISWebArguments + { + public long? InstallationSiteId { get; set; } + public int SSLPort { get; set; } + public string SSLIPAddress { get; set; } + } +} diff --git a/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebArgumentsProvider.cs b/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebArgumentsProvider.cs new file mode 100644 index 0000000..0d12454 --- /dev/null +++ b/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebArgumentsProvider.cs @@ -0,0 +1,36 @@ +using Fclp; +using PKISharp.WACS.Clients.IIS; +using PKISharp.WACS.Configuration; + +namespace PKISharp.WACS.Plugins.InstallationPlugins +{ + class IISWebArgumentsProvider : BaseArgumentsProvider<IISWebArguments> + { + public override string Name => "IIS Web plugin"; + public override string Group => "Installation"; + public override string Condition => "--installation iis"; + + public override void Configure(FluentCommandLineParser<IISWebArguments> parser) + { + parser.Setup(o => o.InstallationSiteId) + .As("installationsiteid") + .WithDescription("Specify site to install new bindings to. Defaults to the target if that is an IIS site."); + parser.Setup(o => o.SSLPort) + .As("sslport") + .SetDefault(IISClient.DefaultBindingPort) + .WithDescription($"Port number to use for newly created HTTPS bindings. Defaults to {IISClient.DefaultBindingPort}."); + parser.Setup(o => o.SSLIPAddress) + .As("sslipaddress") + .SetDefault(IISClient.DefaultBindingIp) + .WithDescription($"IP address to use for newly created HTTPS bindings. Defaults to {IISClient.DefaultBindingIp}."); + } + + public override bool Active(IISWebArguments current) + { + return current.SSLIPAddress != IISClient.DefaultBindingIp || + current.SSLPort != IISClient.DefaultBindingPort || + current.InstallationSiteId != null; + } + + } +} diff --git a/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebOptions.cs b/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebOptions.cs new file mode 100644 index 0000000..30a5192 --- /dev/null +++ b/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebOptions.cs @@ -0,0 +1,32 @@ +using PKISharp.WACS.Clients.IIS; +using PKISharp.WACS.Plugins.Base; +using PKISharp.WACS.Plugins.Base.Options; + +namespace PKISharp.WACS.Plugins.InstallationPlugins +{ + [Plugin("ea6a5be3-f8de-4d27-a6bd-750b619b2ee2")] + class IISWebOptions : InstallationPluginOptions<IISWeb> + { + public long? SiteId { get; set; } + public string NewBindingIp { get; set; } + public int? NewBindingPort { get; set; } + + public override string Name => "IIS"; + public override string Description => "Create or update https bindings in IIS"; + + public IISWebOptions() { } + public IISWebOptions(IISWebArguments args) + { + var sslIp = args.SSLIPAddress; + if (!string.IsNullOrEmpty(sslIp) && sslIp != IISClient.DefaultBindingIp) + { + NewBindingIp = sslIp; + } + var sslPort = args.SSLPort; + if (sslPort != IISClient.DefaultBindingPort) + { + NewBindingPort = sslPort; + } + } + } +} diff --git a/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebOptionsFactory.cs b/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebOptionsFactory.cs new file mode 100644 index 0000000..4a0dece --- /dev/null +++ b/src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebOptionsFactory.cs @@ -0,0 +1,74 @@ +using PKISharp.WACS.Clients.IIS; +using PKISharp.WACS.DomainObjects; +using PKISharp.WACS.Plugins.Base.Factories; +using PKISharp.WACS.Plugins.StorePlugins; +using PKISharp.WACS.Services; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace PKISharp.WACS.Plugins.InstallationPlugins +{ + internal class IISWebOptionsFactory : InstallationPluginFactory<IISWeb, IISWebOptions> + { + public override int Order => 5; + private readonly IIISClient _iisClient; + private IArgumentsService _arguments; + + public IISWebOptionsFactory(IIISClient iisClient, IArgumentsService arguments) + { + _iisClient = iisClient; + _arguments = arguments; + } + + public override bool CanInstall(IEnumerable<Type> storeTypes) + { + return _iisClient.HasWebSites && + (storeTypes.Contains(typeof(CertificateStore)) || + storeTypes.Contains(typeof(CentralSsl))); + } + + public override IISWebOptions Aquire(Target target, IInputService inputService, RunLevel runLevel) + { + var args = _arguments.GetArguments<IISWebArguments>(); + var ret = new IISWebOptions(args); + var ask = true; + if (target.IIS) + { + if (runLevel.HasFlag(RunLevel.Advanced)) + { + ask = inputService.PromptYesNo("Use different site for installation?", false); + } + else + { + ask = false; + } + } + if (ask) + { + var chosen = inputService.ChooseFromList("Choose site to create new bindings", + _iisClient.WebSites, + x => Choice.Create(x.Id, x.Name, x.Id.ToString())); + ret.SiteId = chosen; + } + return ret; + } + + public override IISWebOptions Default(Target target) + { + var args = _arguments.GetArguments<IISWebArguments>(); + var ret = new IISWebOptions(args); + if (args.InstallationSiteId != null) + { + // Throws exception when not found + var site = _iisClient.GetWebSite(args.InstallationSiteId.Value); + ret.SiteId = site.Id; + } + else if (!target.IIS) + { + throw new Exception($"Missing parameter --{nameof(args.InstallationSiteId).ToLower()}"); + } + return ret; + } + } +} |