2022-02-16 07:09:53 +00:00
|
|
|
import 'package:cubit_form/cubit_form.dart';
|
2022-11-18 03:07:42 +00:00
|
|
|
import 'package:selfprivacy/logic/api_maps/rest_maps/api_controller.dart';
|
2022-07-14 13:34:08 +00:00
|
|
|
import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider.dart';
|
2022-02-16 07:09:53 +00:00
|
|
|
import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart';
|
2022-05-14 02:54:40 +00:00
|
|
|
import 'package:selfprivacy/logic/models/hive/server_domain.dart';
|
|
|
|
import 'package:selfprivacy/logic/models/json/dns_records.dart';
|
2022-02-16 07:09:53 +00:00
|
|
|
|
2022-11-16 00:24:40 +00:00
|
|
|
import 'package:selfprivacy/logic/api_maps/graphql_maps/server_api/server_api.dart';
|
2022-10-30 14:21:38 +00:00
|
|
|
import 'package:selfprivacy/utils/network_utils.dart';
|
2022-02-16 07:09:53 +00:00
|
|
|
|
|
|
|
part 'dns_records_state.dart';
|
|
|
|
|
2022-05-17 13:31:34 +00:00
|
|
|
class DnsRecordsCubit
|
|
|
|
extends ServerInstallationDependendCubit<DnsRecordsState> {
|
2022-06-05 19:36:32 +00:00
|
|
|
DnsRecordsCubit(final ServerInstallationCubit serverInstallationCubit)
|
2022-06-05 22:40:34 +00:00
|
|
|
: super(
|
|
|
|
serverInstallationCubit,
|
|
|
|
const DnsRecordsState(dnsState: DnsRecordsStatus.refreshing),
|
|
|
|
);
|
2022-02-16 07:09:53 +00:00
|
|
|
|
2022-06-05 19:36:32 +00:00
|
|
|
final ServerApi api = ServerApi();
|
2022-02-16 07:09:53 +00:00
|
|
|
|
2022-05-24 18:55:39 +00:00
|
|
|
@override
|
2022-02-16 07:09:53 +00:00
|
|
|
Future<void> load() async {
|
2022-06-05 22:40:34 +00:00
|
|
|
emit(
|
|
|
|
DnsRecordsState(
|
2022-02-16 07:09:53 +00:00
|
|
|
dnsState: DnsRecordsStatus.refreshing,
|
2022-10-30 14:21:38 +00:00
|
|
|
dnsRecords: getDesiredDnsRecords(
|
2022-06-05 22:40:34 +00:00
|
|
|
serverInstallationCubit.state.serverDomain?.domainName,
|
|
|
|
'',
|
|
|
|
'',
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
2022-07-14 13:34:08 +00:00
|
|
|
|
2022-05-17 20:08:28 +00:00
|
|
|
if (serverInstallationCubit.state is ServerInstallationFinished) {
|
|
|
|
final ServerDomain? domain = serverInstallationCubit.state.serverDomain;
|
|
|
|
final String? ipAddress =
|
|
|
|
serverInstallationCubit.state.serverDetails?.ip4;
|
2022-02-16 07:09:53 +00:00
|
|
|
if (domain != null && ipAddress != null) {
|
2022-11-18 03:07:42 +00:00
|
|
|
final List<DnsRecord> records = await ApiController
|
|
|
|
.currentDnsProviderApiFactory!
|
2022-07-14 13:34:08 +00:00
|
|
|
.getDnsProvider()
|
|
|
|
.getDnsRecords(domain: domain);
|
2022-10-30 14:21:38 +00:00
|
|
|
final String? dkimPublicKey =
|
|
|
|
extractDkimRecord(await api.getDnsRecords())?.content;
|
2022-06-05 19:36:32 +00:00
|
|
|
final List<DesiredDnsRecord> desiredRecords =
|
2022-10-30 14:21:38 +00:00
|
|
|
getDesiredDnsRecords(domain.domainName, ipAddress, dkimPublicKey);
|
2022-06-05 19:36:32 +00:00
|
|
|
final List<DesiredDnsRecord> foundRecords = [];
|
|
|
|
for (final DesiredDnsRecord record in desiredRecords) {
|
2022-10-03 23:32:35 +00:00
|
|
|
if (record.description == 'record.dkim') {
|
2022-06-05 19:36:32 +00:00
|
|
|
final DnsRecord foundRecord = records.firstWhere(
|
2022-06-05 22:40:34 +00:00
|
|
|
(final r) => r.name == record.name && r.type == record.type,
|
|
|
|
orElse: () => DnsRecord(
|
|
|
|
name: record.name,
|
|
|
|
type: record.type,
|
|
|
|
content: '',
|
|
|
|
ttl: 800,
|
|
|
|
proxied: false,
|
|
|
|
),
|
|
|
|
);
|
2022-02-16 07:09:53 +00:00
|
|
|
// remove all spaces and tabulators from
|
|
|
|
// the foundRecord.content and the record.content
|
|
|
|
// to compare them
|
2022-06-05 19:36:32 +00:00
|
|
|
final String? foundContent =
|
2022-02-16 07:09:53 +00:00
|
|
|
foundRecord.content?.replaceAll(RegExp(r'\s+'), '');
|
2022-06-05 22:40:34 +00:00
|
|
|
final String content =
|
|
|
|
record.content.replaceAll(RegExp(r'\s+'), '');
|
2022-02-16 07:09:53 +00:00
|
|
|
if (foundContent == content) {
|
|
|
|
foundRecords.add(record.copyWith(isSatisfied: true));
|
|
|
|
} else {
|
|
|
|
foundRecords.add(record.copyWith(isSatisfied: false));
|
|
|
|
}
|
|
|
|
} else {
|
2022-06-05 22:40:34 +00:00
|
|
|
if (records.any(
|
|
|
|
(final r) =>
|
|
|
|
r.name == record.name &&
|
|
|
|
r.type == record.type &&
|
|
|
|
r.content == record.content,
|
|
|
|
)) {
|
2022-02-16 07:09:53 +00:00
|
|
|
foundRecords.add(record.copyWith(isSatisfied: true));
|
|
|
|
} else {
|
|
|
|
foundRecords.add(record.copyWith(isSatisfied: false));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-06-05 22:40:34 +00:00
|
|
|
emit(
|
|
|
|
DnsRecordsState(
|
|
|
|
dnsRecords: foundRecords,
|
|
|
|
dnsState: foundRecords.any((final r) => r.isSatisfied == false)
|
|
|
|
? DnsRecordsStatus.error
|
|
|
|
: DnsRecordsStatus.good,
|
|
|
|
),
|
|
|
|
);
|
2022-02-16 07:09:53 +00:00
|
|
|
} else {
|
2022-05-24 18:55:39 +00:00
|
|
|
emit(const DnsRecordsState());
|
2022-02-16 07:09:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
2022-06-05 19:36:32 +00:00
|
|
|
void onChange(final Change<DnsRecordsState> change) {
|
2022-03-03 17:38:30 +00:00
|
|
|
// print(change);
|
2022-02-16 07:09:53 +00:00
|
|
|
super.onChange(change);
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future<void> clear() async {
|
2022-05-24 18:55:39 +00:00
|
|
|
emit(const DnsRecordsState(dnsState: DnsRecordsStatus.error));
|
2022-02-16 07:09:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> refresh() async {
|
|
|
|
emit(state.copyWith(dnsState: DnsRecordsStatus.refreshing));
|
|
|
|
await load();
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> fix() async {
|
|
|
|
emit(state.copyWith(dnsState: DnsRecordsStatus.refreshing));
|
2022-05-17 20:08:28 +00:00
|
|
|
final ServerDomain? domain = serverInstallationCubit.state.serverDomain;
|
|
|
|
final String? ipAddress = serverInstallationCubit.state.serverDetails?.ip4;
|
2022-07-14 13:34:08 +00:00
|
|
|
final DnsProviderApi dnsProviderApi =
|
2022-11-18 03:07:42 +00:00
|
|
|
ApiController.currentDnsProviderApiFactory!.getDnsProvider();
|
2022-07-14 13:34:08 +00:00
|
|
|
await dnsProviderApi.removeSimilarRecords(domain: domain!);
|
|
|
|
await dnsProviderApi.createMultipleDnsRecords(
|
|
|
|
domain: domain,
|
2022-06-05 22:40:34 +00:00
|
|
|
ip4: ipAddress,
|
|
|
|
);
|
2022-02-16 07:09:53 +00:00
|
|
|
|
2022-10-30 14:21:38 +00:00
|
|
|
final List<DnsRecord> records = await api.getDnsRecords();
|
|
|
|
final DnsRecord? dkimRecord = extractDkimRecord(records);
|
|
|
|
if (dkimRecord != null) {
|
|
|
|
await dnsProviderApi.setDnsRecord(dkimRecord, domain);
|
2022-02-16 07:09:53 +00:00
|
|
|
}
|
2022-10-30 14:21:38 +00:00
|
|
|
|
|
|
|
await load();
|
2022-02-16 07:09:53 +00:00
|
|
|
}
|
|
|
|
}
|