Skip to content

Commit df677c8

Browse files
Fixed zone issues
1 parent 0bd6457 commit df677c8

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

AcmeCaPlugin/Clients/DNS/CloudflareDnsProvider.cs

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,9 @@ public CloudflareDnsProvider(string apiToken)
3030

3131
public async Task<bool> CreateRecordAsync(string recordName, string txtValue)
3232
{
33-
// 1) Determine apex zone
34-
var zoneName = ExtractZoneFromRecord(recordName);
35-
var zoneId = await GetZoneIdAsync(zoneName);
36-
if (zoneId == null) return false;
33+
var (zoneName, zoneId) = await FindZoneForRecordAsync(recordName);
34+
if (zoneId == null || zoneName == null) return false;
3735

38-
// 2) Get the relative record name for Cloudflare
3936
var relativeName = GetRelativeRecordName(recordName, zoneName);
4037

4138
var payload = new
@@ -59,12 +56,9 @@ public async Task<bool> CreateRecordAsync(string recordName, string txtValue)
5956

6057
public async Task<bool> DeleteRecordAsync(string recordName)
6158
{
62-
// 1) Determine apex zone
63-
var zoneName = ExtractZoneFromRecord(recordName);
64-
var zoneId = await GetZoneIdAsync(zoneName);
65-
if (zoneId == null) return false;
59+
var (zoneName, zoneId) = await FindZoneForRecordAsync(recordName);
60+
if (zoneId == null || zoneName == null) return false;
6661

67-
// 2) Get the relative record name for Cloudflare
6862
var relativeName = GetRelativeRecordName(recordName, zoneName);
6963

7064
var recordsResp = await _httpClient.GetAsync($"zones/{zoneId}/dns_records?type=TXT&name={relativeName}");
@@ -92,21 +86,35 @@ public async Task<bool> DeleteRecordAsync(string recordName)
9286

9387
var json = await response.Content.ReadAsStringAsync();
9488
var doc = JsonDocument.Parse(json);
95-
return doc.RootElement.GetProperty("result").EnumerateArray()
96-
.FirstOrDefault().GetProperty("id").GetString();
89+
var results = doc.RootElement.GetProperty("result").EnumerateArray();
90+
if (!results.Any()) return null;
91+
return results.First().GetProperty("id").GetString();
9792
}
9893

99-
private string ExtractZoneFromRecord(string recordName)
94+
private async Task<(string? zoneName, string? zoneId)> FindZoneForRecordAsync(string recordName)
10095
{
10196
if (string.IsNullOrWhiteSpace(recordName))
102-
return string.Empty;
97+
return (null, null);
10398

10499
var parts = recordName.TrimEnd('.').Split('.');
105-
if (parts.Length < 2)
106-
return recordName;
107100

108-
// Use last two labels as default zone: e.g., "keyfactoracme.com"
109-
return string.Join(".", parts.Skip(parts.Length - 2));
101+
// Try progressively shorter domain parts to find the actual zone
102+
// e.g., for "_acme-challenge.www.keyfactor.ssl4saas.com", try:
103+
// - www.keyfactor.ssl4saas.com
104+
// - keyfactor.ssl4saas.com
105+
// - ssl4saas.com
106+
for (int i = 1; i < parts.Length - 1; i++)
107+
{
108+
var candidateZone = string.Join(".", parts.Skip(i));
109+
var zoneId = await GetZoneIdAsync(candidateZone);
110+
if (zoneId != null)
111+
{
112+
Console.WriteLine($"Found zone: {candidateZone} (id: {zoneId})");
113+
return (candidateZone, zoneId);
114+
}
115+
}
116+
117+
return (null, null);
110118
}
111119

112120
private string GetRelativeRecordName(string recordName, string zoneName)

0 commit comments

Comments
 (0)