mirror of
https://git.selfprivacy.org/kherel/selfprivacy.org.app.git
synced 2025-03-12 01:34:10 +00:00
fix(cloudflare): Improve DNS records convertion to deSEC DNS
This commit is contained in:
parent
e9c881c408
commit
98f107b675
5 changed files with 58 additions and 22 deletions
lib/logic
models/json/dns_providers
providers/dns_providers
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Reference in a new issue