mirror of
https://git.selfprivacy.org/kherel/selfprivacy.org.app.git
synced 2025-02-02 14:16:58 +00:00
fix(cloudflare): Improve DNS records convertion to deSEC DNS
This commit is contained in:
parent
e9c881c408
commit
98f107b675
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue