diff options
Diffstat (limited to 'src')
16 files changed, 142 insertions, 52 deletions
diff --git a/src/main/Clients/IIS/IISClient.cs b/src/main/Clients/IIS/IISClient.cs index df3dcac..77109a1 100644 --- a/src/main/Clients/IIS/IISClient.cs +++ b/src/main/Clients/IIS/IISClient.cs @@ -313,7 +313,7 @@ namespace PKISharp.WACS.Clients.IIS { var bestMatch = httpMatches.First(); var addOptions = bindingOptions.WithHost(bestMatch.binding.Host); - if (AllowAdd(addOptions, allBindings)) ; + if (AllowAdd(addOptions, allBindings)) { AddBinding(site, addOptions); return bestMatch.binding.Host; diff --git a/src/main/Configuration/MainArguments.cs b/src/main/Configuration/MainArguments.cs index 84d2ac8..5cb8302 100644 --- a/src/main/Configuration/MainArguments.cs +++ b/src/main/Configuration/MainArguments.cs @@ -2,8 +2,6 @@ { public class MainArguments { - #region Basic - public string BaseUri { get; set; } public string ImportBaseUri { get; set; } @@ -26,19 +24,8 @@ public string Store { get; set; } public string Installation { get; set; } - #endregion - - #region Target - - public string SiteId { get; set; } - public string CommonName { get; set; } - public string ExcludeBindings { get; set; } - public bool HideHttps { get; set; } - public string Host { get; set; } - - #endregion - public bool CloseOnFinish { get; set; } + public bool HideHttps { get; set; } public bool NoTaskScheduler { get; set; } public bool UseDefaultTaskUser { get; set; } @@ -46,4 +33,4 @@ public bool AcceptTos { get; set; } public string EmailAddress { get; set; } } -} +}
\ No newline at end of file diff --git a/src/main/Configuration/MainArgumentsProvider.cs b/src/main/Configuration/MainArgumentsProvider.cs index ed02658..923c634 100644 --- a/src/main/Configuration/MainArgumentsProvider.cs +++ b/src/main/Configuration/MainArgumentsProvider.cs @@ -87,29 +87,16 @@ namespace PKISharp.WACS.Configuration .As("installation") .WithDescription("Specify which installation plugins to use. This may be a comma separated list."); - // Remove - parser.Setup(o => o.SiteId) - .As("siteid") - .WithDescription("[--target iissite|iissites|iisbinding] Specify identifier of the site that the plugin should create the target from. For the iissites plugin this may be a comma separated list."); - parser.Setup(o => o.CommonName) - .As("commonname") - .WithDescription("[--target iissite|iissites|manual] Specify the common name of the certificate that should be requested for the target."); - parser.Setup(o => o.ExcludeBindings) - .As("excludebindings") - .WithDescription("[--target iissite|iissites] Exclude bindings from being included in the certificate. This may be a comma separated list."); - parser.Setup(o => o.HideHttps) - .As("hidehttps") - .WithDescription("Hide sites that have existing https bindings."); - parser.Setup(o => o.Host) - .As("host") - .WithDescription("[--target manual|iisbinding] A host name to manually get a certificate for. For the manual plugin this may be a comma separated list."); - // Misc parser.Setup(o => o.CloseOnFinish) .As("closeonfinish") .WithDescription("[--test] Close the application when complete, which usually doesn't happen in test mode."); + parser.Setup(o => o.HideHttps) + .As("hidehttps") + .WithDescription("Hide sites that have existing https bindings."); + parser.Setup(o => o.NoTaskScheduler) .As("notaskscheduler") .WithDescription("Do not create (or offer to update) the scheduled task."); @@ -131,12 +118,9 @@ namespace PKISharp.WACS.Configuration public override bool Active(MainArguments current) { - return !string.IsNullOrEmpty(current.CommonName) || - !string.IsNullOrEmpty(current.ExcludeBindings) || + return !string.IsNullOrEmpty(current.FriendlyName) || - !string.IsNullOrEmpty(current.Host) || !string.IsNullOrEmpty(current.Installation) || - !string.IsNullOrEmpty(current.SiteId) || !string.IsNullOrEmpty(current.Store) || !string.IsNullOrEmpty(current.Target) || !string.IsNullOrEmpty(current.Validation); diff --git a/src/main/Extensions/MainArgumentsExtensions.cs b/src/main/Extensions/MainArgumentsExtensions.cs index 0b131aa..06ac9f0 100644 --- a/src/main/Extensions/MainArgumentsExtensions.cs +++ b/src/main/Extensions/MainArgumentsExtensions.cs @@ -36,8 +36,6 @@ namespace PKISharp.WACS.Extensions options.Renew = false; options.FriendlyName = null; options.Force = false; - options.ExcludeBindings = null; - options.CommonName = null; options.List = false; options.Version = false; options.Help = false; diff --git a/src/main/Plugins/TargetPlugins/IISBinding/IISBinding.cs b/src/main/Plugins/TargetPlugins/IISBinding/IISBinding.cs index 21503a7..002f3b2 100644 --- a/src/main/Plugins/TargetPlugins/IISBinding/IISBinding.cs +++ b/src/main/Plugins/TargetPlugins/IISBinding/IISBinding.cs @@ -28,10 +28,10 @@ namespace PKISharp.WACS.Plugins.TargetPlugins var binding = bindings.FirstOrDefault(x => x.HostUnicode == _options.Host); if (binding == null) { - _log.Error("Binding {binding} no longer found in IIS", _options.Host); + _log.Error("Binding {binding} not yet found in IIS, create it or use the Manual target plugin instead", _options.Host); return null; } - if (binding.SiteId != _options.SiteId) + else if (binding.SiteId != _options.SiteId) { _log.Warning("Binding {binding} moved from site {a} to site {b}", _options.SiteId, binding.SiteId); _options.SiteId = binding.SiteId; diff --git a/src/main/Plugins/TargetPlugins/IISBinding/IISBindingArguments.cs b/src/main/Plugins/TargetPlugins/IISBinding/IISBindingArguments.cs new file mode 100644 index 0000000..7340fb2 --- /dev/null +++ b/src/main/Plugins/TargetPlugins/IISBinding/IISBindingArguments.cs @@ -0,0 +1,8 @@ +namespace PKISharp.WACS.Plugins.TargetPlugins +{ + class IISBindingArguments + { + public string SiteId { get; set; } + public string Host { get; set; } + } +} diff --git a/src/main/Plugins/TargetPlugins/IISBinding/IISBindingArgumentsProvider.cs b/src/main/Plugins/TargetPlugins/IISBinding/IISBindingArgumentsProvider.cs new file mode 100644 index 0000000..2c98f91 --- /dev/null +++ b/src/main/Plugins/TargetPlugins/IISBinding/IISBindingArgumentsProvider.cs @@ -0,0 +1,28 @@ +using Fclp; +using PKISharp.WACS.Configuration; + +namespace PKISharp.WACS.Plugins.TargetPlugins +{ + class IISBindingArgumentsProvider : BaseArgumentsProvider<IISBindingArguments> + { + public override string Name => "IIS Binding"; + public override string Group => "Target"; + public override string Condition => "--target iisbinding"; + + public override bool Active(IISBindingArguments current) + { + return !string.IsNullOrEmpty(current.SiteId) || + !string.IsNullOrEmpty(current.Host); + } + + public override void Configure(FluentCommandLineParser<IISBindingArguments> parser) + { + parser.Setup(o => o.SiteId) + .As("siteid") + .WithDescription("Id of the site where the binding should be found."); + parser.Setup(o => o.Host) + .As("host") + .WithDescription("Host name to get a certificate for."); + } + } +} diff --git a/src/main/Plugins/TargetPlugins/IISBinding/IISBindingOptionsFactory.cs b/src/main/Plugins/TargetPlugins/IISBinding/IISBindingOptionsFactory.cs index 3aa560b..e1395dc 100644 --- a/src/main/Plugins/TargetPlugins/IISBinding/IISBindingOptionsFactory.cs +++ b/src/main/Plugins/TargetPlugins/IISBinding/IISBindingOptionsFactory.cs @@ -42,8 +42,9 @@ namespace PKISharp.WACS.Plugins.TargetPlugins public override IISBindingOptions Default(IOptionsService optionsService) { var ret = new IISBindingOptions(); - var hostName = optionsService.TryGetRequiredOption(nameof(optionsService.MainArguments.Host), optionsService.MainArguments.Host).ToLower(); - var rawSiteId = optionsService.MainArguments.SiteId; + var args = optionsService.GetArguments<IISBindingArguments>(); + var hostName = optionsService.TryGetRequiredOption(nameof(args.Host), args.Host).ToLower(); + var rawSiteId = args.SiteId; var filterSet = _helper.GetBindings(false, false); if (!string.IsNullOrEmpty(rawSiteId)) { diff --git a/src/main/Plugins/TargetPlugins/IISSite/IISSiteArguments.cs b/src/main/Plugins/TargetPlugins/IISSite/IISSiteArguments.cs new file mode 100644 index 0000000..e03ae08 --- /dev/null +++ b/src/main/Plugins/TargetPlugins/IISSite/IISSiteArguments.cs @@ -0,0 +1,9 @@ +namespace PKISharp.WACS.Plugins.TargetPlugins +{ + class IISSiteArguments + { + public string SiteId { get; set; } + public string CommonName { get; set; } + public string ExcludeBindings { get; set; } + } +} diff --git a/src/main/Plugins/TargetPlugins/IISSite/IISSiteArgumentsProvider.cs b/src/main/Plugins/TargetPlugins/IISSite/IISSiteArgumentsProvider.cs new file mode 100644 index 0000000..69520c9 --- /dev/null +++ b/src/main/Plugins/TargetPlugins/IISSite/IISSiteArgumentsProvider.cs @@ -0,0 +1,31 @@ +using Fclp; +using PKISharp.WACS.Configuration; + +namespace PKISharp.WACS.Plugins.TargetPlugins +{ + class IISSiteArgumentsProvider : BaseArgumentsProvider<IISSiteArguments> + { + public override string Name => "IISSite(s)"; + public override string Group => "Target"; + public override string Condition => "--target iissite|iissites"; + public override bool Active(IISSiteArguments current) + { + return !string.IsNullOrEmpty(current.SiteId) || + !string.IsNullOrEmpty(current.CommonName) || + !string.IsNullOrEmpty(current.ExcludeBindings); + } + + public override void Configure(FluentCommandLineParser<IISSiteArguments> parser) + { + parser.Setup(o => o.SiteId) + .As("siteid") + .WithDescription("Specify identifier of the site that the plugin should create the target from. For iissites this may be a comma separated list."); + parser.Setup(o => o.CommonName) + .As("commonname") + .WithDescription("Specify the common name of the certificate that should be requested for the target."); + parser.Setup(o => o.ExcludeBindings) + .As("excludebindings") + .WithDescription("Exclude bindings from the certificate. This may be a comma separated list."); + } + } +} diff --git a/src/main/Plugins/TargetPlugins/IISSite/IISSiteOptionsFactory.cs b/src/main/Plugins/TargetPlugins/IISSite/IISSiteOptionsFactory.cs index bdad9ce..0f7ae42 100644 --- a/src/main/Plugins/TargetPlugins/IISSite/IISSiteOptionsFactory.cs +++ b/src/main/Plugins/TargetPlugins/IISSite/IISSiteOptionsFactory.cs @@ -50,21 +50,22 @@ namespace PKISharp.WACS.Plugins.TargetPlugins public override IISSiteOptions Default(IOptionsService optionsService) { var ret = new IISSiteOptions(); - var rawSiteId = optionsService.TryGetRequiredOption(nameof(optionsService.MainArguments.SiteId), optionsService.MainArguments.SiteId); + var args = optionsService.GetArguments<IISSiteArguments>(); + var rawSiteId = optionsService.TryGetRequiredOption(nameof(args.SiteId), args.SiteId); if (long.TryParse(rawSiteId, out long siteId)) { var site = _helper.GetSites(false, false).FirstOrDefault(binding => binding.Id == siteId); if (site != null) { ret.SiteId = site.Id; - ret.ExcludeBindings = optionsService.MainArguments.ExcludeBindings.ParseCsv(); + ret.ExcludeBindings = args.ExcludeBindings.ParseCsv(); if (ret.ExcludeBindings != null) { ret.ExcludeBindings = ret.ExcludeBindings.Select(x => x.ConvertPunycode()).ToList(); } ret.FriendlyNameSuggestion = $"Site-{ret.SiteId}"; - var commonName = optionsService.MainArguments.CommonName; + var commonName = args.CommonName; if (!string.IsNullOrWhiteSpace(commonName)) { commonName = commonName.ToLower().Trim().ConvertPunycode(); @@ -88,7 +89,7 @@ namespace PKISharp.WACS.Plugins.TargetPlugins } else { - _log.Error("Invalid SiteId {siteId}", optionsService.MainArguments.SiteId); + _log.Error("Invalid SiteId {siteId}", args.SiteId); } return null; } diff --git a/src/main/Plugins/TargetPlugins/IISSites/IISSitesOptionsFactory.cs b/src/main/Plugins/TargetPlugins/IISSites/IISSitesOptionsFactory.cs index 7521e33..bee06ac 100644 --- a/src/main/Plugins/TargetPlugins/IISSites/IISSitesOptionsFactory.cs +++ b/src/main/Plugins/TargetPlugins/IISSites/IISSitesOptionsFactory.cs @@ -49,19 +49,20 @@ namespace PKISharp.WACS.Plugins.TargetPlugins public override IISSitesOptions Default(IOptionsService optionsService) { var ret = new IISSitesOptions(); + var args = optionsService.GetArguments<IISSiteArguments>(); var sites = _helper.GetSites(false, false); - var rawSiteIds = optionsService.TryGetRequiredOption(nameof(optionsService.MainArguments.SiteId), optionsService.MainArguments.SiteId); + var rawSiteIds = optionsService.TryGetRequiredOption(nameof(args.SiteId), args.SiteId); sites = ProcessSiteIds(ret, sites, rawSiteIds); if (sites == null) { return null; } - ret.ExcludeBindings = optionsService.MainArguments.ExcludeBindings.ParseCsv(); + ret.ExcludeBindings = args.ExcludeBindings.ParseCsv(); if (ret.ExcludeBindings != null) { ret.ExcludeBindings = ret.ExcludeBindings.Select(x => x.ConvertPunycode()).ToList(); } - var commonName = optionsService.MainArguments.CommonName; + var commonName = args.CommonName; if (!string.IsNullOrWhiteSpace(commonName)) { commonName = commonName.ToLower().Trim().ConvertPunycode(); diff --git a/src/main/Plugins/TargetPlugins/Manual/ManualArguments.cs b/src/main/Plugins/TargetPlugins/Manual/ManualArguments.cs new file mode 100644 index 0000000..18cae37 --- /dev/null +++ b/src/main/Plugins/TargetPlugins/Manual/ManualArguments.cs @@ -0,0 +1,8 @@ +namespace PKISharp.WACS.Plugins.TargetPlugins +{ + class ManualArguments + { + public string CommonName { get; set; } + public string Host { get; set; } + } +} diff --git a/src/main/Plugins/TargetPlugins/Manual/ManualArgumentsProvider.cs b/src/main/Plugins/TargetPlugins/Manual/ManualArgumentsProvider.cs new file mode 100644 index 0000000..50e24e4 --- /dev/null +++ b/src/main/Plugins/TargetPlugins/Manual/ManualArgumentsProvider.cs @@ -0,0 +1,27 @@ +using Fclp; +using PKISharp.WACS.Configuration; + +namespace PKISharp.WACS.Plugins.TargetPlugins +{ + class ManualArgumentsProvider : BaseArgumentsProvider<ManualArguments> + { + public override string Name => "Manual"; + public override string Group => "Target"; + public override string Condition => "--target manual"; + + public override bool Active(ManualArguments current) + { + return !string.IsNullOrEmpty(current.Host); + } + + public override void Configure(FluentCommandLineParser<ManualArguments> parser) + { + parser.Setup(o => o.CommonName) + .As("commonname") + .WithDescription("Specify the common name of the certificate. If not provided the first host name will be used."); + parser.Setup(o => o.Host) + .As("host") + .WithDescription("A host name to get a certificate for. This may be a comma separated list."); + } + } +} diff --git a/src/main/Plugins/TargetPlugins/Manual/ManualOptionsFactory.cs b/src/main/Plugins/TargetPlugins/Manual/ManualOptionsFactory.cs index 4e82150..86855be 100644 --- a/src/main/Plugins/TargetPlugins/Manual/ManualOptionsFactory.cs +++ b/src/main/Plugins/TargetPlugins/Manual/ManualOptionsFactory.cs @@ -24,9 +24,10 @@ namespace PKISharp.WACS.Plugins.TargetPlugins public override ManualOptions Default(IOptionsService optionsService) { - var input = optionsService.TryGetRequiredOption(nameof(optionsService.MainArguments.Host), optionsService.MainArguments.Host); + var args = optionsService.GetArguments<ManualArguments>(); + var input = optionsService.TryGetRequiredOption(nameof(args.Host), args.Host); var ret = Create(input); - var commonName = optionsService.MainArguments.CommonName; + var commonName = args.CommonName; if (!string.IsNullOrWhiteSpace(commonName)) { commonName = commonName.ToLower().Trim().ConvertPunycode(); diff --git a/src/main/wacs.csproj b/src/main/wacs.csproj index 0782740..e59bd4b 100644 --- a/src/main/wacs.csproj +++ b/src/main/wacs.csproj @@ -339,6 +339,12 @@ <Compile Include="Plugins\StorePlugins\CentralSsl\CentralSslArgumentsProvider.cs" /> <Compile Include="Plugins\StorePlugins\CertificateStore\CertificateStoreArguments.cs" /> <Compile Include="Plugins\StorePlugins\CertificateStore\CertificateStoreArgumentsProvider.cs" /> + <Compile Include="Plugins\TargetPlugins\IISBinding\IISBindingArguments.cs" /> + <Compile Include="Plugins\TargetPlugins\IISBinding\IISBindingArgumentsProvider.cs" /> + <Compile Include="Plugins\TargetPlugins\IISSite\IISSiteArguments.cs" /> + <Compile Include="Plugins\TargetPlugins\IISSite\IISSiteArgumentsProvider.cs" /> + <Compile Include="Plugins\TargetPlugins\Manual\ManualArguments.cs" /> + <Compile Include="Plugins\TargetPlugins\Manual\ManualArgumentsProvider.cs" /> <Compile Include="Plugins\ValidationPlugins\Dns\Manual\Manual.cs" /> <Compile Include="Plugins\ValidationPlugins\Dns\Manual\ManualOptions.cs" /> <Compile Include="Plugins\ValidationPlugins\Dns\Manual\ManualOptionsFactory.cs" /> |