import 'package:dio/dio.dart'; import 'package:hive/hive.dart'; import 'package:selfprivacy/config/hive_config.dart'; import 'package:selfprivacy/logic/api_maps/cloudflare.dart'; import 'package:selfprivacy/logic/api_maps/hetzner.dart'; import 'package:selfprivacy/logic/api_maps/server.dart'; import 'package:selfprivacy/logic/get_it/api_config.dart'; import 'package:selfprivacy/logic/models/backblaze_credential.dart'; import 'package:selfprivacy/logic/models/cloudflare_domain.dart'; import 'package:selfprivacy/logic/models/server_details.dart'; import 'package:selfprivacy/logic/models/user.dart'; import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/get_it/console.dart'; import 'package:selfprivacy/logic/models/message.dart'; import 'package:basic_utils/basic_utils.dart'; import 'package:selfprivacy/ui/components/action_button/action_button.dart'; import 'package:selfprivacy/ui/components/brand_alert/brand_alert.dart'; import 'app_config_cubit.dart'; import 'package:easy_localization/easy_localization.dart'; class AppConfigRepository { Box box = Hive.box(BNames.appConfig); Future load() async { var res = AppConfigState( hetznerKey: getIt().hetznerKey, cloudFlareKey: getIt().cloudFlareKey, cloudFlareDomain: getIt().cloudFlareDomain, backblazeCredential: getIt().backblazeCredential, hetznerServer: getIt().hetznerServer, rootUser: box.get(BNames.rootUser), isServerStarted: box.get(BNames.isServerStarted, defaultValue: false), isServerResetedFirstTime: box.get(BNames.isServerResetedFirstTime, defaultValue: false), isServerResetedSecondTime: box.get(BNames.isServerResetedSecondTime, defaultValue: false), hasFinalChecked: box.get(BNames.hasFinalChecked, defaultValue: false), error: null, isLoading: box.get(BNames.isLoading, defaultValue: false), ); return res; } void clearAppConfig() { box.clear(); } Future startServer( HetznerServerDetails hetznerServer, ) async { var hetznerApi = HetznerApi(); var serverDetails = await hetznerApi.powerOn(); return serverDetails; } Future isDnsAddressesMatch(String? domainName, String? ip4) async { var addresses = [ '$domainName', 'api.$domainName', 'cloud.$domainName', 'meet.$domainName', 'password.$domainName' ]; for (var address in addresses) { var lookupRecordRes = await DnsUtils.lookupRecord( address, RRecordType.A, provider: DnsApiProvider.CLOUDFLARE, ); getIt.get().addMessage( Message( text: 'DnsLookup: address: $address, $RRecordType, provider: CLOUDFLARE, ip4: $ip4', ), ); getIt.get().addMessage( Message( text: 'DnsLookup: ${lookupRecordRes == null ? 'empty' : (lookupRecordRes[0].data != ip4 ? 'wrong ip4' : 'right ip4')}', ), ); if (lookupRecordRes == null || lookupRecordRes.isEmpty || lookupRecordRes[0].data != ip4) { return false; } } return true; } Future createServer( User rootUser, String domainName, String cloudFlareKey, { required void Function() onCancel, required Future Function(HetznerServerDetails serverDetails) onSuccess, }) async { var hetznerApi = HetznerApi(); try { var serverDetails = await hetznerApi.createServer( cloudFlareKey: cloudFlareKey, rootUser: rootUser, domainName: domainName, ); saveServerDetails(serverDetails); onSuccess(serverDetails); } on DioError catch (e) { if (e.response!.data['error']['code'] == 'uniqueness_error') { var nav = getIt.get(); nav.showPopUpDialog( BrandAlert( title: 'modals.1'.tr(), contentText: 'modals.2'.tr(), acitons: [ ActionButton( text: 'basis.delete'.tr(), isRed: true, onPressed: () async { await hetznerApi.deleteSelfprivacyServerAndAllVolumes( domainName: domainName); var serverDetails = await hetznerApi.createServer( cloudFlareKey: cloudFlareKey, rootUser: rootUser, domainName: domainName, ); await saveServerDetails(serverDetails); onSuccess(serverDetails); }, ), ActionButton( text: 'basis.cancel'.tr(), onPressed: () { onCancel(); }, ), ], ), ); } } } Future createDnsRecords( String ip4, CloudFlareDomain cloudFlareDomain, ) async { var cloudflareApi = CloudflareApi(); await cloudflareApi.removeSimilarRecords( ip4: ip4, cloudFlareDomain: cloudFlareDomain, ); await cloudflareApi.createMultipleDnsRecords( ip4: ip4, cloudFlareDomain: cloudFlareDomain, ); await HetznerApi().createReverseDns( ip4: ip4, domainName: cloudFlareDomain.domainName, ); } Future isHttpServerWorking() async { var api = ServerApi(); var isHttpServerWorking = await api.isHttpServerWorking(); return isHttpServerWorking; } Future restart() async { var hetznerApi = HetznerApi(); return await hetznerApi.reset(); } Future powerOn() async { var hetznerApi = HetznerApi(); return await hetznerApi.powerOn(); } Future saveServerDetails(HetznerServerDetails serverDetails) async { await getIt().storeServerDetails(serverDetails); } Future saveHetznerKey(String key) async { await getIt().storeHetznerKey(key); } Future saveBackblazeKey(BackblazeCredential backblazeCredential) async { await getIt().storeBackblazeCredential(backblazeCredential); } Future saveCloudFlareKey(String key) async { await getIt().storeCloudFlareKey(key); } Future saveDomain(CloudFlareDomain cloudFlareDomain) async { await getIt().storeCloudFlareDomain(cloudFlareDomain); } Future saveIsServerStarted(bool value) async { await box.put(BNames.isServerStarted, value); } Future saveIsServerResetedFirstTime(bool value) async { await box.put(BNames.isServerResetedFirstTime, value); } Future saveIsServerResetedSecondTime(bool value) async { await box.put(BNames.isServerResetedSecondTime, value); } Future saveRootUser(User rootUser) async { await box.put(BNames.rootUser, rootUser); } Future saveHasFinalChecked(bool value) async { await box.put(BNames.hasFinalChecked, value); } Future deleteServer(CloudFlareDomain cloudFlareDomain) async { var hetznerApi = HetznerApi(); var cloudFlare = CloudflareApi(); hetznerApi.deleteSelfprivacyServerAndAllVolumes( domainName: cloudFlareDomain.domainName, ); cloudFlare.removeSimilarRecords(cloudFlareDomain: cloudFlareDomain); } Future deleteRecords() async { await box.deleteAll([ BNames.hetznerServer, BNames.isServerStarted, BNames.isServerResetedFirstTime, BNames.isServerResetedSecondTime, BNames.hasFinalChecked, BNames.isLoading, ]); getIt().init(); } }