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';
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,

View File

@ -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<String, dynamic> json) =>
_$DesecDnsRecordFromJson(json);
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 = [];
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<DesecDnsRecord> 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<DesiredDnsRecord> 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,
),
);
}

View File

@ -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,
),
);
}

View File

@ -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<GenericResult<List<DesiredDnsRecord>>> validateDnsRecords(
final ServerDomain domain,
final String ip4,