From 47e884b93915ed71fd2223b81f617c0c1f8c336c Mon Sep 17 00:00:00 2001 From: Tatsuro Shibamura Date: Thu, 30 Sep 2021 11:21:31 +0900 Subject: [PATCH] Improvement GoDaddy provider (#376) * Fixed godaddy http request error * Adding name server validation --- KeyVault.Acmebot/Providers/GoDaddyProvider.cs | 45 ++++++++----------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/KeyVault.Acmebot/Providers/GoDaddyProvider.cs b/KeyVault.Acmebot/Providers/GoDaddyProvider.cs index 1f9c7150..cb67b6f6 100644 --- a/KeyVault.Acmebot/Providers/GoDaddyProvider.cs +++ b/KeyVault.Acmebot/Providers/GoDaddyProvider.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; +using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; @@ -20,6 +22,7 @@ public GoDaddyProvider(GoDaddyOptions options) } private readonly GoDaddyClient _client; + private readonly IdnMapping _idnMapping = new IdnMapping(); public int PropagationSeconds => 600; @@ -27,7 +30,7 @@ public async Task> ListZonesAsync() { var zones = await _client.ListZonesAsync(); - return zones.Select(x => new DnsZone { Id = x.Domain, Name = x.Domain }).ToArray(); + return zones.Select(x => new DnsZone { Id = x.DomainId, Name = _idnMapping.GetAscii(x.Domain), NameServers = x.NameServers }).ToArray(); } public async Task CreateTxtRecordAsync(DnsZone zone, string relativeRecordName, IEnumerable values) @@ -45,19 +48,12 @@ public async Task CreateTxtRecordAsync(DnsZone zone, string relativeRecordName, }); } - await _client.AddRecordAsync(zone.Id, entries); + await _client.AddRecordAsync(zone.Name, entries); } public async Task DeleteTxtRecordAsync(DnsZone zone, string relativeRecordName) { - var records = await _client.ListRecordsAsync(zone.Id); - - var recordsToDelete = records.Where(r => r.Name == relativeRecordName && r.Type == "TXT"); - - foreach (var record in recordsToDelete) - { - await _client.DeleteRecordAsync(zone.Id, record); - } + await _client.DeleteRecordAsync(zone.Name, "TXT", relativeRecordName); } private class GoDaddyClient @@ -87,7 +83,7 @@ public GoDaddyClient(string apiKey, string apiSecret) public async Task> ListZonesAsync() { - var response = await _httpClient.GetAsync("v1/domains?statuses=ACTIVE"); + var response = await _httpClient.GetAsync("v1/domains?statuses=ACTIVE&includes=nameServers"); response.EnsureSuccessStatusCode(); @@ -96,27 +92,19 @@ public async Task> ListZonesAsync() return domains; } - public async Task> ListRecordsAsync(string zoneId) + public async Task DeleteRecordAsync(string domain, string type, string name) { - var response = await _httpClient.GetAsync($"v1/domains/{zoneId}/records"); + var response = await _httpClient.DeleteAsync($"v1/domains/{domain}/records/{type}/{name}"); - response.EnsureSuccessStatusCode(); - - var entries = await response.Content.ReadAsAsync(); - - return entries; - } - - public async Task DeleteRecordAsync(string zoneId, DnsEntry entry) - { - var response = await _httpClient.DeleteAsync($"v1/domains/{zoneId}/records/{entry.Type}/{entry.Name}"); - - response.EnsureSuccessStatusCode(); + if (response.StatusCode != HttpStatusCode.NotFound) + { + response.EnsureSuccessStatusCode(); + } } - public async Task AddRecordAsync(string zoneId, IReadOnlyList entries) + public async Task AddRecordAsync(string domain, IReadOnlyList entries) { - var response = await _httpClient.PatchAsync($"v1/domains/{zoneId}/records", entries); + var response = await _httpClient.PatchAsync($"v1/domains/{domain}/records", entries); response.EnsureSuccessStatusCode(); } @@ -129,6 +117,9 @@ public class ZoneDomain [JsonProperty("domainId")] public string DomainId { get; set; } + + [JsonProperty("nameServers")] + public string[] NameServers { get; set; } } public class DnsEntry