From 78320946092d506dda031607a2b8469d3ab25273 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Thu, 25 May 2023 00:15:58 -0300 Subject: [PATCH] chore: Create cloudflare dns provider interface and separate it from api --- .../{cloudflare.dart => cloudflare_api.dart} | 77 +++++++++++++---- ...ctory.dart => cloudflare_api_factory.dart} | 2 +- .../providers/dns_providers/cloudflare.dart | 85 ++++++++++++++++++- 3 files changed, 144 insertions(+), 20 deletions(-) rename lib/logic/api_maps/rest_maps/dns_providers/cloudflare/{cloudflare.dart => cloudflare_api.dart} (85%) rename lib/logic/api_maps/rest_maps/dns_providers/cloudflare/{cloudflare_factory.dart => cloudflare_api_factory.dart} (95%) diff --git a/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare.dart b/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_api.dart similarity index 85% rename from lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare.dart rename to lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_api.dart index 5df05a48..f063faba 100644 --- a/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare.dart +++ b/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_api.dart @@ -19,10 +19,6 @@ class CloudflareApi extends DnsProviderApi { final String? customToken; - @override - RegExp getApiTokenValidation() => - RegExp(r'\s+|[!$%^&*()@+|~=`{}\[\]:<>?,.\/]'); - @override BaseOptions get options { final BaseOptions options = BaseOptions(baseUrl: rootAddress); @@ -45,7 +41,6 @@ class CloudflareApi extends DnsProviderApi { @override String rootAddress = 'https://api.cloudflare.com/client/v4'; - @override Future> isApiTokenValid(final String token) async { bool isValid = false; Response? response; @@ -92,27 +87,32 @@ class CloudflareApi extends DnsProviderApi { ); } - @override - Future getZoneId(final String domain) async { - String? zoneId; + Future>> getZones(final String domain) async { + List zones = []; + late final Response? response; final Dio client = await getClient(); try { - final Response response = await client.get( + response = await client.get( '/zones', queryParameters: {'name': domain}, ); - zoneId = response.data['result'][0]['id']; + zones = response.data['result']; } catch (e) { print(e); + GenericResult( + success: false, + data: zones, + code: response?.statusCode, + message: response?.statusMessage, + ); } finally { close(client); } - return zoneId; + return GenericResult(success: true, data: zones); } - @override Future> removeSimilarRecords({ required final ServerDomain domain, final String? ip4, @@ -151,7 +151,6 @@ class CloudflareApi extends DnsProviderApi { return GenericResult(success: true, data: null); } - @override Future> getDnsRecords({ required final ServerDomain domain, }) async { @@ -189,7 +188,6 @@ class CloudflareApi extends DnsProviderApi { return allRecords; } - @override Future> createMultipleDnsRecords({ required final ServerDomain domain, final String? ip4, @@ -228,7 +226,6 @@ class CloudflareApi extends DnsProviderApi { return GenericResult(success: true, data: null); } - @override Future setDnsRecord( final DnsRecord record, final ServerDomain domain, @@ -249,7 +246,6 @@ class CloudflareApi extends DnsProviderApi { } } - @override Future> domainList() async { final String url = '$rootAddress/zones'; List domains = []; @@ -272,7 +268,6 @@ class CloudflareApi extends DnsProviderApi { return domains; } - @override Future>> validateDnsRecords( final ServerDomain domain, final String ip4, @@ -333,7 +328,6 @@ class CloudflareApi extends DnsProviderApi { ); } - @override List getDesiredDnsRecords( final String? domainName, final String? ip4, @@ -414,4 +408,51 @@ class CloudflareApi extends DnsProviderApi { ), ]; } + + List getProjectDnsRecords( + final String? domainName, + final String? ip4, + ) { + final DnsRecord domainA = + DnsRecord(type: 'A', name: domainName, content: ip4); + + final DnsRecord mx = DnsRecord(type: 'MX', name: '@', content: domainName); + final DnsRecord apiA = DnsRecord(type: 'A', name: 'api', content: ip4); + final DnsRecord cloudA = DnsRecord(type: 'A', name: 'cloud', content: ip4); + final DnsRecord gitA = DnsRecord(type: 'A', name: 'git', content: ip4); + final DnsRecord meetA = DnsRecord(type: 'A', name: 'meet', content: ip4); + final DnsRecord passwordA = + DnsRecord(type: 'A', name: 'password', content: ip4); + final DnsRecord socialA = + DnsRecord(type: 'A', name: 'social', content: ip4); + final DnsRecord vpn = DnsRecord(type: 'A', name: 'vpn', content: ip4); + + final DnsRecord txt1 = DnsRecord( + type: 'TXT', + name: '_dmarc', + content: 'v=DMARC1; p=none', + ttl: 18000, + ); + + final DnsRecord txt2 = DnsRecord( + type: 'TXT', + name: domainName, + content: 'v=spf1 a mx ip4:$ip4 -all', + ttl: 18000, + ); + + return [ + domainA, + apiA, + cloudA, + gitA, + meetA, + passwordA, + socialA, + mx, + txt1, + txt2, + vpn + ]; + } } diff --git a/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_factory.dart b/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_api_factory.dart similarity index 95% rename from lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_factory.dart rename to lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_api_factory.dart index ccb58e6a..ba5bd703 100644 --- a/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_factory.dart +++ b/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_api_factory.dart @@ -1,4 +1,4 @@ -import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare.dart'; +import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_api.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart'; diff --git a/lib/logic/providers/dns_providers/cloudflare.dart b/lib/logic/providers/dns_providers/cloudflare.dart index 6f973a88..192fdd96 100644 --- a/lib/logic/providers/dns_providers/cloudflare.dart +++ b/lib/logic/providers/dns_providers/cloudflare.dart @@ -1,3 +1,86 @@ +import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_api.dart'; import 'package:selfprivacy/logic/providers/dns_providers/dns_provider.dart'; -class CloudflareDnsProvider extends DnsProvider {} +class ApiAdapter { + ApiAdapter({final bool isWithToken = true}) + : _api = CloudflareApi( + isWithToken: isWithToken, + ); + + CloudflareApi api({final bool getInitialized = true}) => getInitialized + ? _api + : CloudflareApi( + isWithToken: false, + ); + + final CloudflareApi _api; +} + +class CloudflareDnsProvider extends DnsProvider { + CloudflareDnsProvider() : _adapter = ApiAdapter(); + CloudflareDnsProvider.load( + final bool isAuthotized, + ) : _adapter = ApiAdapter( + isWithToken: isAuthotized, + ); + + ApiAdapter _adapter; + + @override + Future> tryInitApiByToken(final String token) async { + final api = _adapter.api(getInitialized: false); + final result = await api.isApiTokenValid(token); + if (!result.data || !result.success) { + return result; + } + + _adapter = ApiAdapter(isWithToken: true); + return result; + } + + @override + Future> getZoneId(final String domain) async { + String? id; + final result = await _adapter.api().getZones(domain); + if (result.data.isEmpty || !result.success) { + return GenericResult( + success: result.success, + data: id, + code: result.code, + message: result.message, + ); + } + + id = result.data[0]['id']; + + return GenericResult(success: true, data: id); + } + + @override + Future> removeDomainRecords({ + required final ServerDomain domain, + final String? ip4, + }) async {} + Future>> getDnsRecords({ + required final ServerDomain domain, + }); + Future> createDomainRecords({ + required final ServerDomain domain, + final String? ip4, + }); + Future> setDnsRecord( + final DnsRecord record, + final ServerDomain domain, + ); + Future>> domainList(); + Future>> validateDnsRecords( + final ServerDomain domain, + final String ip4, + final String dkimPublicKey, + ); + List getDesiredDnsRecords( + final String? domainName, + final String? ip4, + final String? dkimPublicKey, + ); +}