From 98f107b675f090cf49e76ec156af76fe5d593bb7 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Wed, 22 Nov 2023 15:14:02 +0400 Subject: [PATCH] fix(cloudflare): Improve DNS records convertion to deSEC DNS --- .../json/dns_providers/desec_dns_adapter.dart | 19 ++++++++++--- .../json/dns_providers/desec_dns_info.dart | 10 +++++-- lib/logic/providers/dns_providers/desec.dart | 28 ++++++++++++++----- .../dns_providers/digital_ocean_dns.dart | 22 +++++++++------ .../providers/dns_providers/dns_provider.dart | 1 + 5 files changed, 58 insertions(+), 22 deletions(-) diff --git a/lib/logic/models/json/dns_providers/desec_dns_adapter.dart b/lib/logic/models/json/dns_providers/desec_dns_adapter.dart index 7d2828c0..b20210fb 100644 --- a/lib/logic/models/json/dns_providers/desec_dns_adapter.dart +++ b/lib/logic/models/json/dns_providers/desec_dns_adapter.dart @@ -1,12 +1,17 @@ part of 'desec_dns_info.dart'; -DesecDnsRecord _fromDnsRecord(final DnsRecord dnsRecord) { +DesecDnsRecord _fromDnsRecord( + final DnsRecord dnsRecord, + final String domainName, +) { final String type = dnsRecord.type; String content = dnsRecord.content ?? ''; String name = dnsRecord.name ?? ''; + if (name == '@' || name == domainName) { + name = ''; + } if (type == 'MX') { - name = (name == '@') ? '' : name; - content = '${dnsRecord.priority} $content'; + content = '${dnsRecord.priority} $content.'; } if (type == 'TXT' && content.isNotEmpty && !content.startsWith('"')) { content = '"$content"'; @@ -20,7 +25,10 @@ DesecDnsRecord _fromDnsRecord(final DnsRecord dnsRecord) { ); } -DnsRecord _toDnsRecord(final DesecDnsRecord desecRecord) { +DnsRecord _toDnsRecord( + final DesecDnsRecord desecRecord, + final String domainName, +) { final String type = desecRecord.type; String content = desecRecord.records.isEmpty ? '' : desecRecord.records[0]; String name = desecRecord.subname; @@ -34,6 +42,9 @@ DnsRecord _toDnsRecord(final DesecDnsRecord desecRecord) { if (type == 'TXT' && content.isNotEmpty && content.startsWith('"')) { content = content.substring(1, content.length); // cut away quotes } + if (name.isEmpty) { + name = domainName; + } return DnsRecord( name: name, diff --git a/lib/logic/models/json/dns_providers/desec_dns_info.dart b/lib/logic/models/json/dns_providers/desec_dns_info.dart index b9a599e7..1e6efbd1 100644 --- a/lib/logic/models/json/dns_providers/desec_dns_info.dart +++ b/lib/logic/models/json/dns_providers/desec_dns_info.dart @@ -41,8 +41,11 @@ class DesecDnsRecord { required this.records, }); - factory DesecDnsRecord.fromDnsRecord(final DnsRecord dnsRecord) => - _fromDnsRecord(dnsRecord); + factory DesecDnsRecord.fromDnsRecord( + final DnsRecord dnsRecord, + final String domainName, + ) => + _fromDnsRecord(dnsRecord, domainName); /// Subdomain string which, together with domain, defines the RRset name. /// Typical examples are www or _443._tcp. @@ -69,5 +72,6 @@ class DesecDnsRecord { static DesecDnsRecord fromJson(final Map json) => _$DesecDnsRecordFromJson(json); Map toJson() => _$DesecDnsRecordToJson(this); - DnsRecord toDnsRecord() => _toDnsRecord(this); + DnsRecord toDnsRecord(final String domainName) => + _toDnsRecord(this, domainName); } diff --git a/lib/logic/providers/dns_providers/desec.dart b/lib/logic/providers/dns_providers/desec.dart index 71e18df7..727508f6 100644 --- a/lib/logic/providers/dns_providers/desec.dart +++ b/lib/logic/providers/dns_providers/desec.dart @@ -83,7 +83,7 @@ class DesecDnsProvider extends DnsProvider { final List bulkRecords = []; for (final DnsRecord record in listDnsRecords) { - bulkRecords.add(DesecDnsRecord.fromDnsRecord(record)); + bulkRecords.add(DesecDnsRecord.fromDnsRecord(record, domain.domainName)); } return _adapter.api().createMultipleDnsRecords( @@ -104,7 +104,10 @@ class DesecDnsProvider extends DnsProvider { final List bulkRecords = []; for (final DnsRecord record in listDnsRecords) { - final desecRecord = DesecDnsRecord.fromDnsRecord(record); + final desecRecord = DesecDnsRecord.fromDnsRecord( + record, + domain.domainName, + ); bulkRecords.add( DesecDnsRecord( subname: desecRecord.subname, @@ -146,7 +149,7 @@ class DesecDnsProvider extends DnsProvider { try { for (final record in result.data) { - records.add(record.toDnsRecord()); + records.add(record.toDnsRecord(domain.domainName)); } } catch (e) { print(e); @@ -167,7 +170,7 @@ class DesecDnsProvider extends DnsProvider { ) async { final result = await _adapter.api().createMultipleDnsRecords( domainName: domain.domainName, - records: [DesecDnsRecord.fromDnsRecord(record)], + records: [DesecDnsRecord.fromDnsRecord(record, domain.domainName)], ); return GenericResult( @@ -197,7 +200,10 @@ class DesecDnsProvider extends DnsProvider { final List foundRecords = []; try { for (final DnsRecord pendingDnsRecord in pendingDnsRecords) { - final record = DesecDnsRecord.fromDnsRecord(pendingDnsRecord); + final record = DesecDnsRecord.fromDnsRecord( + pendingDnsRecord, + domain.domainName, + ); if (record.subname == 'selector._domainkey') { final DesecDnsRecord foundRecord = records.firstWhere( (final r) => @@ -217,9 +223,13 @@ class DesecDnsProvider extends DnsProvider { record.records[0].replaceAll(RegExp(r'\s+'), ''); foundRecords.add( DesiredDnsRecord( - name: record.subname, + name: '${record.subname}.${domain.domainName}', + description: + record.subname.isEmpty ? record.subname : domain.domainName, content: record.records[0], isSatisfied: foundContent == desiredContent, + type: record.type, + category: DnsRecordsCategory.email, ), ); } else { @@ -231,9 +241,13 @@ class DesecDnsProvider extends DnsProvider { ); foundRecords.add( DesiredDnsRecord( - name: record.subname, + name: '${record.subname}.${domain.domainName}', + description: record.subname, content: record.records[0], isSatisfied: foundMatch, + category: record.type == 'A' + ? DnsRecordsCategory.services + : DnsRecordsCategory.email, ), ); } diff --git a/lib/logic/providers/dns_providers/digital_ocean_dns.dart b/lib/logic/providers/dns_providers/digital_ocean_dns.dart index 68757203..776c37e5 100644 --- a/lib/logic/providers/dns_providers/digital_ocean_dns.dart +++ b/lib/logic/providers/dns_providers/digital_ocean_dns.dart @@ -148,13 +148,9 @@ class DigitalOceanDnsProvider extends DnsProvider { _adapter.api().createMultipleDnsRecords( domainName: domain.domainName, records: [ - DigitalOceanDnsRecord( - data: record.content ?? '', - id: null, - name: record.name ?? '', - ttl: record.ttl, - type: record.type, - priority: record.priority, + DigitalOceanDnsRecord.fromDnsRecord( + record, + domain.domainName, ), ], ); @@ -180,7 +176,9 @@ class DigitalOceanDnsProvider extends DnsProvider { try { for (final DnsRecord pendingDnsRecord in pendingDnsRecords) { final record = DigitalOceanDnsRecord.fromDnsRecord( - pendingDnsRecord, domain.domainName); + pendingDnsRecord, + domain.domainName, + ); if (record.name == 'selector._domainkey') { final DigitalOceanDnsRecord foundRecord = records.firstWhere( (final r) => (r.name == record.name) && r.type == record.type, @@ -201,8 +199,11 @@ class DigitalOceanDnsProvider extends DnsProvider { foundRecords.add( DesiredDnsRecord( name: record.name, + description: record.name == '@' ? domain.domainName : record.name, content: record.data, isSatisfied: foundContent == content, + type: record.type, + category: DnsRecordsCategory.email, ), ); } else { @@ -215,8 +216,13 @@ class DigitalOceanDnsProvider extends DnsProvider { foundRecords.add( DesiredDnsRecord( name: record.name, + description: record.name == '@' ? domain.domainName : record.name, content: record.data, isSatisfied: foundMatch, + type: record.type, + category: record.type == 'A' + ? DnsRecordsCategory.services + : DnsRecordsCategory.email, ), ); } diff --git a/lib/logic/providers/dns_providers/dns_provider.dart b/lib/logic/providers/dns_providers/dns_provider.dart index b2110b95..9ff6f611 100644 --- a/lib/logic/providers/dns_providers/dns_provider.dart +++ b/lib/logic/providers/dns_providers/dns_provider.dart @@ -59,6 +59,7 @@ abstract class DnsProvider { /// /// Will return list of [DesiredDnsRecord] objects, which represent /// only those records which have successfully passed validation. + /// TODO: Unify across DNS providers Future>> validateDnsRecords( final ServerDomain domain, final String ip4,