diff --git a/lib/logic/api_maps/cloudflare.dart b/lib/logic/api_maps/cloudflare.dart index 7dc9994d..c9047a7b 100644 --- a/lib/logic/api_maps/cloudflare.dart +++ b/lib/logic/api_maps/cloudflare.dart @@ -154,6 +154,27 @@ class CloudflareApi extends ApiMap { ]; } + Future setDkim( + String dkimRecordString, CloudFlareDomain cloudFlareDomain) async { + final domainZoneId = cloudFlareDomain.zoneId; + final url = '$rootAddress/zones/$domainZoneId/dns_records'; + + final dkimRecord = DnsRecords( + type: 'TXT', + name: 'selector._domainkey', + content: dkimRecordString, + ttl: 18000, + ); + + var client = await getClient(); + await client.post( + url, + data: dkimRecord.toJson(), + ); + + client.close(); + } + Future> domainList() async { var url = '$rootAddress/zones?per_page=50'; var client = await getClient(); diff --git a/lib/logic/api_maps/hetzner.dart b/lib/logic/api_maps/hetzner.dart index cf50d7a6..6a40199f 100644 --- a/lib/logic/api_maps/hetzner.dart +++ b/lib/logic/api_maps/hetzner.dart @@ -115,7 +115,8 @@ class HetznerApi extends ApiMap { final apiToken = StringGenerators.apiToken(); // Replace all non-alphanumeric characters with an underscore - var hostname = domainName.split('.')[0].replaceAll(RegExp(r'[^a-zA-Z0-9]'), '-'); + var hostname = + domainName.split('.')[0].replaceAll(RegExp(r'[^a-zA-Z0-9]'), '-'); // if hostname ends with -, remove it if (hostname.endsWith('-')) { hostname = hostname.substring(0, hostname.length - 1); diff --git a/lib/logic/api_maps/server.dart b/lib/logic/api_maps/server.dart index 1792e2c1..04d05528 100644 --- a/lib/logic/api_maps/server.dart +++ b/lib/logic/api_maps/server.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:io'; +import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:selfprivacy/config/get_it_config.dart'; @@ -236,6 +237,21 @@ class ServerApi extends ApiMap { client.close(); return response.statusCode == HttpStatus.ok; } + + Future getDkim() async { + var client = await getClient(); + Response response = await client.get('/services/mailserver/dkim'); + client.close(); + + // if got 404 raise exception + if (response.statusCode == HttpStatus.notFound) { + throw Exception('No DKIM key found'); + } + + final base64toString = utf8.fuse(base64); + + return base64toString.decode(response.data).split('(')[1].split(')')[0]; + } } extension UrlServerExt on ServiceTypes { diff --git a/lib/logic/cubit/app_config/app_config_cubit.dart b/lib/logic/cubit/app_config/app_config_cubit.dart index 8c881dc6..bfe2f6e4 100644 --- a/lib/logic/cubit/app_config/app_config_cubit.dart +++ b/lib/logic/cubit/app_config/app_config_cubit.dart @@ -239,6 +239,7 @@ class AppConfigCubit extends Cubit { var isServerWorking = await repository.isHttpServerWorking(); if (isServerWorking) { + await repository.createDkimRecord(state.cloudFlareDomain!); await repository.saveHasFinalChecked(true); emit(state.finish()); diff --git a/lib/logic/cubit/app_config/app_config_repository.dart b/lib/logic/cubit/app_config/app_config_repository.dart index 025c2f6d..2eb71e7f 100644 --- a/lib/logic/cubit/app_config/app_config_repository.dart +++ b/lib/logic/cubit/app_config/app_config_repository.dart @@ -189,9 +189,23 @@ class AppConfigRepository { ); } + Future createDkimRecord(CloudFlareDomain cloudFlareDomain) async { + var cloudflareApi = CloudflareApi(); + var api = ServerApi(); + + var dkimRecordString = await api.getDkim(); + + await cloudflareApi.setDkim(dkimRecordString, cloudFlareDomain); + } + Future isHttpServerWorking() async { var api = ServerApi(); var isHttpServerWorking = await api.isHttpServerWorking(); + try { + await api.getDkim(); + } catch (e) { + return false; + } return isHttpServerWorking; } diff --git a/lib/logic/cubit/backups/backups_cubit.dart b/lib/logic/cubit/backups/backups_cubit.dart index 4bee9ea8..5550eb73 100644 --- a/lib/logic/cubit/backups/backups_cubit.dart +++ b/lib/logic/cubit/backups/backups_cubit.dart @@ -85,8 +85,8 @@ class BackupsCubit extends AppConfigDependendCubit { Future createBucket() async { emit(state.copyWith(preventActions: true)); - final domain = - appConfigCubit.state.cloudFlareDomain!.domainName.replaceAll(RegExp(r'[^a-zA-Z0-9]'), '-'); + final domain = appConfigCubit.state.cloudFlareDomain!.domainName + .replaceAll(RegExp(r'[^a-zA-Z0-9]'), '-'); final serverId = appConfigCubit.state.hetznerServer!.id; var bucketName = 'selfprivacy-$domain-$serverId'; // If bucket name is too long, shorten it