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/ValidationPlugins/Dns/Acme | |
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/ValidationPlugins/Dns/Acme')
5 files changed, 195 insertions, 0 deletions
diff --git a/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/Acme.cs b/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/Acme.cs new file mode 100644 index 0000000..96e7610 --- /dev/null +++ b/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/Acme.cs @@ -0,0 +1,44 @@ +using PKISharp.WACS.Clients; +using PKISharp.WACS.Clients.DNS; +using PKISharp.WACS.Services; + +namespace PKISharp.WACS.Plugins.ValidationPlugins.Dns +{ + class Acme : DnsValidation<AcmeOptions, Acme> + { + private readonly ISettingsService _settings; + private readonly IInputService _input; + private readonly ProxyService _proxy; + + public Acme( + LookupClientProvider dnsClient, + ILogService log, + ISettingsService settings, + IInputService input, + ProxyService proxy, + AcmeOptions options, + string identifier) : + base(dnsClient, log, options, identifier) + { + _settings = settings; + _input = input; + _proxy = proxy; + } + + /// <summary> + /// Send API call to the acme-dns server + /// </summary> + /// <param name="recordName"></param> + /// <param name="token"></param> + public override void CreateRecord(string recordName, string token) + { + var client = new AcmeDnsClient(_dnsClientProvider, _proxy, _log, _settings, _input, _options.BaseUri); + client.Update(_identifier, token); + } + + public override void DeleteRecord(string recordName, string token) + { + // Not supported, ignore the call + } + } +} diff --git a/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeArguments.cs b/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeArguments.cs new file mode 100644 index 0000000..499b38d --- /dev/null +++ b/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeArguments.cs @@ -0,0 +1,7 @@ +namespace PKISharp.WACS.Plugins.ValidationPlugins.Dns +{ + class AcmeArguments + { + public string AcmeDnsServer { get; set; } + } +} diff --git a/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeArgumentsProvider.cs b/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeArgumentsProvider.cs new file mode 100644 index 0000000..e7aeeeb --- /dev/null +++ b/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeArgumentsProvider.cs @@ -0,0 +1,24 @@ +using Fclp; +using PKISharp.WACS.Configuration; + +namespace PKISharp.WACS.Plugins.ValidationPlugins.Dns +{ + class AcmeArgumentsProvider : BaseArgumentsProvider<AcmeArguments> + { + public override string Name => "AcmeDns"; + public override string Group => "Validation"; + public override string Condition => "--validationmode dns-01 --validation acme-dns"; + + public override void Configure(FluentCommandLineParser<AcmeArguments> parser) + { + parser.Setup(o => o.AcmeDnsServer) + .As("acmednsserver") + .WithDescription("Root URI of the acme-dns service"); + } + + public override bool Active(AcmeArguments current) + { + return !string.IsNullOrEmpty(current.AcmeDnsServer); + } + } +} diff --git a/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeOptions.cs b/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeOptions.cs new file mode 100644 index 0000000..c2daeb2 --- /dev/null +++ b/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeOptions.cs @@ -0,0 +1,17 @@ +using Newtonsoft.Json; +using PKISharp.WACS.Extensions; +using PKISharp.WACS.Plugins.Base; +using PKISharp.WACS.Plugins.Base.Options; + +namespace PKISharp.WACS.Plugins.ValidationPlugins.Dns +{ + [Plugin("c13acc1b-7571-432b-9652-7a68a5f506c5")] + class AcmeOptions : ValidationPluginOptions<Acme> + { + public override string Name => "acme-dns"; + public override string Description => "Create verification records with acme-dns (https://github.com/joohoi/acme-dns)"; + public override string ChallengeType { get => Constants.Dns01ChallengeType; } + + public string BaseUri { get; set; } + } +}
\ No newline at end of file diff --git a/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeOptionsFactory.cs b/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeOptionsFactory.cs new file mode 100644 index 0000000..be4e55e --- /dev/null +++ b/src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeOptionsFactory.cs @@ -0,0 +1,103 @@ +using PKISharp.WACS.Clients; +using PKISharp.WACS.Clients.DNS; +using PKISharp.WACS.DomainObjects; +using PKISharp.WACS.Plugins.Base.Factories; +using PKISharp.WACS.Services; +using System; +using System.Linq; +using System.Net; + +namespace PKISharp.WACS.Plugins.ValidationPlugins.Dns +{ + class AcmeOptionsFactory : ValidationPluginOptionsFactory<Acme, AcmeOptions> + { + private readonly ProxyService _proxy; + private readonly ISettingsService _settings; + private readonly LookupClientProvider _dnsClient; + private readonly ILogService _log; + private readonly IArgumentsService _arguments; + + public AcmeOptionsFactory( + LookupClientProvider dnsClient, + ILogService log, + ProxyService proxy, + IArgumentsService arguments) : base(Constants.Dns01ChallengeType) + { + _log = log; + _arguments = arguments; + _proxy = proxy; + _dnsClient = dnsClient; + } + + public override AcmeOptions Aquire(Target target, IInputService input, RunLevel runLevel) + { + var ret = new AcmeOptions(); + Uri baseUri = null; + while (baseUri == null) + { + try + { + baseUri = new Uri(input.RequestString("URL of the acme-dns server")); + } + catch { } + } + ret.BaseUri = baseUri.ToString(); + var acmeDnsClient = new AcmeDnsClient(_dnsClient, _proxy, _log, _settings, input, ret.BaseUri); + var identifiers = target.Parts.SelectMany(x => x.Identifiers).Distinct(); + foreach (var identifier in identifiers) + { + if (!acmeDnsClient.EnsureRegistration(identifier.Replace("*.", ""), true)) + { + // Something failed or was aborted + return null; + } + } + return ret; + } + + public override AcmeOptions Default(Target target) + { + Uri baseUri = null; + try + { + var baseUriRaw = + _arguments.TryGetRequiredArgument(nameof(AcmeArguments.AcmeDnsServer), + _arguments.GetArguments<AcmeArguments>().AcmeDnsServer); + if (!string.IsNullOrEmpty(baseUriRaw)) + { + baseUri = new Uri(baseUriRaw); + } + } catch {} + if (baseUri == null) + { + return null; + } + + var ret = new AcmeOptions + { + BaseUri = baseUri.ToString() + }; + var acmeDnsClient = new AcmeDnsClient(_dnsClient, _proxy, _log, _settings, null, ret.BaseUri); + var identifiers = target.Parts.SelectMany(x => x.Identifiers).Distinct(); + var valid = true; + foreach (var identifier in identifiers) + { + if (!acmeDnsClient.EnsureRegistration(identifier.Replace("*.", ""), false)) + { + valid = false; + } + } + if (!valid) + { + _log.Error($"Setting up this certificate is not possible in unattended mode because no (valid) acme-dns registration could be found for one or more of the specified domains."); + return null; + } + return ret; + } + + public override bool CanValidate(Target target) + { + return true; + } + } +} |