summaryrefslogtreecommitdiffstats
path: root/src/main.lib/Plugins/InstallationPlugins/IISWeb
diff options
context:
space:
mode:
authorWouterTinus <wouter.tinus@gmail.com>2019-09-07 01:36:12 +0200
committerWouterTinus <wouter.tinus@gmail.com>2019-09-07 01:36:12 +0200
commit7673fa357a81444cf6c216267dfab4e76684ba5c (patch)
tree73c0bd36e5b6261cd89a168c2a099f6556c59f4d /src/main.lib/Plugins/InstallationPlugins/IISWeb
parent42aa0faa4de6ea4184cfe1a5830508777418b11a (diff)
downloadletsencrypt-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')
-rw-r--r--src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWeb.cs82
-rw-r--r--src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebArguments.cs9
-rw-r--r--src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebArgumentsProvider.cs36
-rw-r--r--src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebOptions.cs32
-rw-r--r--src/main.lib/Plugins/InstallationPlugins/IISWeb/IISWebOptionsFactory.cs74
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;
+ }
+ }
+}