summaryrefslogtreecommitdiffstats
path: root/src/main.lib/Plugins/ValidationPlugins/Dns/Acme
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/ValidationPlugins/Dns/Acme
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/ValidationPlugins/Dns/Acme')
-rw-r--r--src/main.lib/Plugins/ValidationPlugins/Dns/Acme/Acme.cs44
-rw-r--r--src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeArguments.cs7
-rw-r--r--src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeArgumentsProvider.cs24
-rw-r--r--src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeOptions.cs17
-rw-r--r--src/main.lib/Plugins/ValidationPlugins/Dns/Acme/AcmeOptionsFactory.cs103
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;
+ }
+ }
+}