fix(cloudflare): Improve DNS records convertion to deSEC DNS

pull/392/head
NaiJi ✨ 2023-11-22 15:14:02 +04:00
parent e9c881c408
commit 98f107b675
5 changed files with 58 additions and 22 deletions

View File

@ -1,12 +1,17 @@
part of 'desec_dns_info.dart'; part of 'desec_dns_info.dart';
DesecDnsRecord _fromDnsRecord(final DnsRecord dnsRecord) { DesecDnsRecord _fromDnsRecord(
final DnsRecord dnsRecord,
final String domainName,
) {
final String type = dnsRecord.type; final String type = dnsRecord.type;
String content = dnsRecord.content ?? ''; String content = dnsRecord.content ?? '';
String name = dnsRecord.name ?? ''; String name = dnsRecord.name ?? '';
if (name == '@' || name == domainName) {
name = '';
}
if (type == 'MX') { if (type == 'MX') {
name = (name == '@') ? '' : name; content = '${dnsRecord.priority} $content.';
content = '${dnsRecord.priority} $content';
} }
if (type == 'TXT' && content.isNotEmpty && !content.startsWith('"')) { if (type == 'TXT' && content.isNotEmpty && !content.startsWith('"')) {
content = '"$content"'; 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; final String type = desecRecord.type;
String content = desecRecord.records.isEmpty ? '' : desecRecord.records[0]; String content = desecRecord.records.isEmpty ? '' : desecRecord.records[0];
String name = desecRecord.subname; String name = desecRecord.subname;
@ -34,6 +42,9 @@ DnsRecord _toDnsRecord(final DesecDnsRecord desecRecord) {
if (type == 'TXT' && content.isNotEmpty && content.startsWith('"')) { if (type == 'TXT' && content.isNotEmpty && content.startsWith('"')) {
content = content.substring(1, content.length); // cut away quotes content = content.substring(1, content.length); // cut away quotes
} }
if (name.isEmpty) {
name = domainName;
}
return DnsRecord( return DnsRecord(
name: name, name: name,

View File

@ -41,8 +41,11 @@ class DesecDnsRecord {
required this.records, required this.records,
}); });
factory DesecDnsRecord.fromDnsRecord(final DnsRecord dnsRecord) => factory DesecDnsRecord.fromDnsRecord(
_fromDnsRecord(dnsRecord); final DnsRecord dnsRecord,
final String domainName,
) =>
_fromDnsRecord(dnsRecord, domainName);
/// Subdomain string which, together with domain, defines the RRset name. /// Subdomain string which, together with domain, defines the RRset name.
/// Typical examples are www or _443._tcp. /// Typical examples are www or _443._tcp.
@ -69,5 +72,6 @@ class DesecDnsRecord {
static DesecDnsRecord fromJson(final Map<String, dynamic> json) => static DesecDnsRecord fromJson(final Map<String, dynamic> json) =>
_$DesecDnsRecordFromJson(json); _$DesecDnsRecordFromJson(json);
Map<String, dynamic> toJson() => _$DesecDnsRecordToJson(this); Map<String, dynamic> toJson() => _$DesecDnsRecordToJson(this);
DnsRecord toDnsRecord() => _toDnsRecord(this); DnsRecord toDnsRecord(final String domainName) =>
_toDnsRecord(this, domainName);
} }

View File

@ -83,7 +83,7 @@ class DesecDnsProvider extends DnsProvider {
final List<DesecDnsRecord> bulkRecords = []; final List<DesecDnsRecord> bulkRecords = [];
for (final DnsRecord record in listDnsRecords) { for (final DnsRecord record in listDnsRecords) {
bulkRecords.add(DesecDnsRecord.fromDnsRecord(record)); bulkRecords.add(DesecDnsRecord.fromDnsRecord(record, domain.domainName));
} }
return _adapter.api().createMultipleDnsRecords( return _adapter.api().createMultipleDnsRecords(
@ -104,7 +104,10 @@ class DesecDnsProvider extends DnsProvider {
final List<DesecDnsRecord> bulkRecords = []; final List<DesecDnsRecord> bulkRecords = [];
for (final DnsRecord record in listDnsRecords) { for (final DnsRecord record in listDnsRecords) {
final desecRecord = DesecDnsRecord.fromDnsRecord(record); final desecRecord = DesecDnsRecord.fromDnsRecord(
record,
domain.domainName,
);
bulkRecords.add( bulkRecords.add(
DesecDnsRecord( DesecDnsRecord(
subname: desecRecord.subname, subname: desecRecord.subname,
@ -146,7 +149,7 @@ class DesecDnsProvider extends DnsProvider {
try { try {
for (final record in result.data) { for (final record in result.data) {
records.add(record.toDnsRecord()); records.add(record.toDnsRecord(domain.domainName));
} }
} catch (e) { } catch (e) {
print(e); print(e);
@ -167,7 +170,7 @@ class DesecDnsProvider extends DnsProvider {
) async { ) async {
final result = await _adapter.api().createMultipleDnsRecords( final result = await _adapter.api().createMultipleDnsRecords(
domainName: domain.domainName, domainName: domain.domainName,
records: [DesecDnsRecord.fromDnsRecord(record)], records: [DesecDnsRecord.fromDnsRecord(record, domain.domainName)],
); );
return GenericResult( return GenericResult(
@ -197,7 +200,10 @@ class DesecDnsProvider extends DnsProvider {
final List<DesiredDnsRecord> foundRecords = []; final List<DesiredDnsRecord> foundRecords = [];
try { try {
for (final DnsRecord pendingDnsRecord in pendingDnsRecords) { for (final DnsRecord pendingDnsRecord in pendingDnsRecords) {
final record = DesecDnsRecord.fromDnsRecord(pendingDnsRecord); final record = DesecDnsRecord.fromDnsRecord(
pendingDnsRecord,
domain.domainName,
);
if (record.subname == 'selector._domainkey') { if (record.subname == 'selector._domainkey') {
final DesecDnsRecord foundRecord = records.firstWhere( final DesecDnsRecord foundRecord = records.firstWhere(
(final r) => (final r) =>
@ -217,9 +223,13 @@ class DesecDnsProvider extends DnsProvider {
record.records[0].replaceAll(RegExp(r'\s+'), ''); record.records[0].replaceAll(RegExp(r'\s+'), '');
foundRecords.add( foundRecords.add(
DesiredDnsRecord( DesiredDnsRecord(
name: record.subname, name: '${record.subname}.${domain.domainName}',
description:
record.subname.isEmpty ? record.subname : domain.domainName,
content: record.records[0], content: record.records[0],
isSatisfied: foundContent == desiredContent, isSatisfied: foundContent == desiredContent,
type: record.type,
category: DnsRecordsCategory.email,
), ),
); );
} else { } else {
@ -231,9 +241,13 @@ class DesecDnsProvider extends DnsProvider {
); );
foundRecords.add( foundRecords.add(
DesiredDnsRecord( DesiredDnsRecord(
name: record.subname, name: '${record.subname}.${domain.domainName}',
description: record.subname,
content: record.records[0], content: record.records[0],
isSatisfied: foundMatch, isSatisfied: foundMatch,
category: record.type == 'A'
? DnsRecordsCategory.services
: DnsRecordsCategory.email,
), ),
); );
} }

View File

@ -148,13 +148,9 @@ class DigitalOceanDnsProvider extends DnsProvider {
_adapter.api().createMultipleDnsRecords( _adapter.api().createMultipleDnsRecords(
domainName: domain.domainName, domainName: domain.domainName,
records: [ records: [
DigitalOceanDnsRecord( DigitalOceanDnsRecord.fromDnsRecord(
data: record.content ?? '', record,
id: null, domain.domainName,
name: record.name ?? '',
ttl: record.ttl,
type: record.type,
priority: record.priority,
), ),
], ],
); );
@ -180,7 +176,9 @@ class DigitalOceanDnsProvider extends DnsProvider {
try { try {
for (final DnsRecord pendingDnsRecord in pendingDnsRecords) { for (final DnsRecord pendingDnsRecord in pendingDnsRecords) {
final record = DigitalOceanDnsRecord.fromDnsRecord( final record = DigitalOceanDnsRecord.fromDnsRecord(
pendingDnsRecord, domain.domainName); pendingDnsRecord,
domain.domainName,
);
if (record.name == 'selector._domainkey') { if (record.name == 'selector._domainkey') {
final DigitalOceanDnsRecord foundRecord = records.firstWhere( final DigitalOceanDnsRecord foundRecord = records.firstWhere(
(final r) => (r.name == record.name) && r.type == record.type, (final r) => (r.name == record.name) && r.type == record.type,
@ -201,8 +199,11 @@ class DigitalOceanDnsProvider extends DnsProvider {
foundRecords.add( foundRecords.add(
DesiredDnsRecord( DesiredDnsRecord(
name: record.name, name: record.name,
description: record.name == '@' ? domain.domainName : record.name,
content: record.data, content: record.data,
isSatisfied: foundContent == content, isSatisfied: foundContent == content,
type: record.type,
category: DnsRecordsCategory.email,
), ),
); );
} else { } else {
@ -215,8 +216,13 @@ class DigitalOceanDnsProvider extends DnsProvider {
foundRecords.add( foundRecords.add(
DesiredDnsRecord( DesiredDnsRecord(
name: record.name, name: record.name,
description: record.name == '@' ? domain.domainName : record.name,
content: record.data, content: record.data,
isSatisfied: foundMatch, isSatisfied: foundMatch,
type: record.type,
category: record.type == 'A'
? DnsRecordsCategory.services
: DnsRecordsCategory.email,
), ),
); );
} }

View File

@ -59,6 +59,7 @@ abstract class DnsProvider {
/// ///
/// Will return list of [DesiredDnsRecord] objects, which represent /// Will return list of [DesiredDnsRecord] objects, which represent
/// only those records which have successfully passed validation. /// only those records which have successfully passed validation.
/// TODO: Unify across DNS providers
Future<GenericResult<List<DesiredDnsRecord>>> validateDnsRecords( Future<GenericResult<List<DesiredDnsRecord>>> validateDnsRecords(
final ServerDomain domain, final ServerDomain domain,
final String ip4, final String ip4,