@@ -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