selfprivacy.org.app/lib/logic/cubit/server_installation/server_installation_reposit...

684 lines
21 KiB
Dart
Raw Normal View History

import 'dart:io';
2022-02-08 08:59:19 +02:00
import 'package:basic_utils/basic_utils.dart';
import 'package:device_info_plus/device_info_plus.dart';
2021-02-15 20:58:29 +02:00
import 'package:dio/dio.dart';
2022-02-08 08:59:19 +02:00
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
2021-01-21 09:35:38 +02:00
import 'package:hive/hive.dart';
import 'package:pub_semver/pub_semver.dart';
2022-02-08 08:59:19 +02:00
import 'package:selfprivacy/config/get_it_config.dart';
2021-01-21 09:35:38 +02:00
import 'package:selfprivacy/config/hive_config.dart';
import 'package:selfprivacy/logic/api_maps/cloudflare.dart';
import 'package:selfprivacy/logic/api_maps/hetzner.dart';
2021-01-21 23:01:42 +02:00
import 'package:selfprivacy/logic/api_maps/server.dart';
2022-06-05 22:36:32 +03:00
import 'package:selfprivacy/logic/common_enum/common_enum.dart';
import 'package:selfprivacy/logic/models/hive/backblaze_credential.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/models/hive/server_domain.dart';
import 'package:selfprivacy/logic/models/hive/user.dart';
import 'package:selfprivacy/logic/models/json/device_token.dart';
2022-06-05 22:36:32 +03:00
import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart';
import 'package:selfprivacy/logic/models/message.dart';
import 'package:selfprivacy/logic/models/server_basic_info.dart';
2021-02-15 20:58:29 +02:00
import 'package:selfprivacy/ui/components/action_button/action_button.dart';
import 'package:selfprivacy/ui/components/brand_alert/brand_alert.dart';
2022-02-08 08:59:19 +02:00
2022-06-05 22:36:32 +03:00
import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart';
2021-01-21 09:35:38 +02:00
class IpNotFoundException implements Exception {
IpNotFoundException(this.message);
2022-06-05 22:36:32 +03:00
final String message;
}
class ServerAuthorizationException implements Exception {
ServerAuthorizationException(this.message);
2022-06-05 22:36:32 +03:00
final String message;
}
class ServerInstallationRepository {
Box box = Hive.box(BNames.serverInstallationBox);
Box<User> usersBox = Hive.box(BNames.usersBox);
2021-01-21 09:35:38 +02:00
Future<ServerInstallationState> load() async {
2022-06-05 22:36:32 +03:00
final String? hetznerToken = getIt<ApiConfigModel>().hetznerKey;
final String? cloudflareToken = getIt<ApiConfigModel>().cloudFlareKey;
final ServerDomain? serverDomain = getIt<ApiConfigModel>().serverDomain;
final BackblazeCredential? backblazeCredential =
getIt<ApiConfigModel>().backblazeCredential;
final ServerHostingDetails? serverDetails =
getIt<ApiConfigModel>().serverDetails;
if (box.get(BNames.hasFinalChecked, defaultValue: false)) {
return ServerInstallationFinished(
hetznerKey: hetznerToken!,
cloudFlareKey: cloudflareToken!,
serverDomain: serverDomain!,
backblazeCredential: backblazeCredential!,
serverDetails: serverDetails!,
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),
);
}
2022-05-31 02:06:08 +03:00
if (box.get(BNames.isRecoveringServer, defaultValue: false) &&
serverDomain != null) {
return ServerInstallationRecovery(
hetznerKey: hetznerToken,
cloudFlareKey: cloudflareToken,
serverDomain: serverDomain,
backblazeCredential: backblazeCredential,
serverDetails: serverDetails,
rootUser: box.get(BNames.rootUser),
currentStep: _getCurrentRecoveryStep(
hetznerToken,
cloudflareToken,
serverDomain,
serverDetails,
),
recoveryCapabilities: await getRecoveryCapabilities(serverDomain),
);
}
2021-03-26 01:30:34 +02:00
return ServerInstallationNotFinished(
hetznerKey: hetznerToken,
cloudFlareKey: cloudflareToken,
serverDomain: serverDomain,
backblazeCredential: backblazeCredential,
serverDetails: serverDetails,
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),
isLoading: box.get(BNames.isLoading, defaultValue: false),
dnsMatches: null,
);
}
RecoveryStep _getCurrentRecoveryStep(
2022-06-05 22:36:32 +03:00
final String? hetznerToken,
final String? cloudflareToken,
final ServerDomain serverDomain,
final ServerHostingDetails? serverDetails,
) {
if (serverDetails != null) {
if (hetznerToken != null) {
2022-05-24 21:55:39 +03:00
if (serverDetails.provider != ServerProvider.unknown) {
if (serverDomain.provider != DnsProvider.unknown) {
return RecoveryStep.backblazeToken;
}
2022-05-24 21:55:39 +03:00
return RecoveryStep.cloudflareToken;
}
2022-05-24 21:55:39 +03:00
return RecoveryStep.serverSelection;
}
2022-05-24 21:55:39 +03:00
return RecoveryStep.hetznerToken;
}
2022-05-24 21:55:39 +03:00
return RecoveryStep.selecting;
2021-01-21 09:35:38 +02:00
}
2021-02-03 21:51:07 +02:00
void clearAppConfig() {
2021-01-21 09:35:38 +02:00
box.clear();
usersBox.clear();
2021-01-21 09:35:38 +02:00
}
Future<ServerHostingDetails> startServer(
2022-06-05 22:36:32 +03:00
final ServerHostingDetails hetznerServer,
2021-01-21 09:35:38 +02:00
) async {
2022-06-05 22:36:32 +03:00
final HetznerApi hetznerApi = HetznerApi();
final ServerHostingDetails serverDetails = await hetznerApi.powerOn();
2021-01-21 09:35:38 +02:00
return serverDetails;
}
2022-06-05 22:36:32 +03:00
Future<String?> getDomainId(final String token, final String domain) async {
final CloudflareApi cloudflareApi = CloudflareApi(
isWithToken: false,
customToken: token,
);
try {
2022-06-05 22:36:32 +03:00
final String domainId = await cloudflareApi.getZoneId(domain);
return domainId;
} on DomainNotFoundException {
return null;
}
}
Future<Map<String, bool>> isDnsAddressesMatch(
final String? domainName,
final String? ip4,
2022-06-09 19:15:53 +03:00
final Map<String, bool> skippedMatches,
) async {
2022-06-05 22:36:32 +03:00
final List<String> addresses = <String>[
2021-01-21 09:35:38 +02:00
'$domainName',
'api.$domainName',
'cloud.$domainName',
'meet.$domainName',
'password.$domainName'
];
2022-06-05 22:36:32 +03:00
final Map<String, bool> matches = <String, bool>{};
2022-02-08 08:59:19 +02:00
2022-06-05 22:36:32 +03:00
for (final String address in addresses) {
2022-06-09 19:15:53 +03:00
if (skippedMatches[address] ?? false) {
2022-02-08 08:59:19 +02:00
matches[address] = true;
continue;
}
2022-06-05 22:36:32 +03:00
final List<RRecord>? lookupRecordRes = await DnsUtils.lookupRecord(
2021-01-21 09:35:38 +02:00
address,
RRecordType.A,
provider: DnsApiProvider.CLOUDFLARE,
);
getIt.get<ConsoleModel>().addMessage(
Message(
text:
'DnsLookup: address: $address, $RRecordType, provider: CLOUDFLARE, ip4: $ip4',
),
);
getIt.get<ConsoleModel>().addMessage(
Message(
text:
2021-01-27 20:33:00 +02:00
'DnsLookup: ${lookupRecordRes == null ? 'empty' : (lookupRecordRes[0].data != ip4 ? 'wrong ip4' : 'right ip4')}',
2021-01-21 09:35:38 +02:00
),
);
2021-01-27 20:33:00 +02:00
if (lookupRecordRes == null ||
lookupRecordRes.isEmpty ||
lookupRecordRes[0].data != ip4) {
2022-02-08 08:59:19 +02:00
matches[address] = false;
} else {
matches[address] = true;
2021-01-21 09:35:38 +02:00
}
}
2022-02-08 08:59:19 +02:00
return matches;
2021-01-21 09:35:38 +02:00
}
2021-02-15 20:58:29 +02:00
Future<void> createServer(
2022-06-05 22:36:32 +03:00
final User rootUser,
final String domainName,
final String cloudFlareKey,
final BackblazeCredential backblazeCredential, {
required final void Function() onCancel,
required final Future<void> Function(ServerHostingDetails serverDetails)
2021-03-23 21:21:42 +02:00
onSuccess,
2021-02-15 20:58:29 +02:00
}) async {
2022-06-05 22:36:32 +03:00
final HetznerApi hetznerApi = HetznerApi();
late ServerVolume dataBase;
2021-01-21 09:35:38 +02:00
2021-02-15 20:58:29 +02:00
try {
2021-10-12 00:10:04 +03:00
dataBase = await hetznerApi.createVolume();
2022-06-09 09:51:29 +03:00
final ServerHostingDetails? serverDetails = await hetznerApi.createServer(
2021-02-15 20:58:29 +02:00
cloudFlareKey: cloudFlareKey,
rootUser: rootUser,
domainName: domainName,
2021-10-12 00:10:04 +03:00
dataBase: dataBase,
2021-02-15 20:58:29 +02:00
);
2022-06-09 09:51:29 +03:00
if (serverDetails == null) {
print('Server is not initialized!');
return;
}
2021-03-25 10:32:00 +02:00
saveServerDetails(serverDetails);
2021-02-15 20:58:29 +02:00
onSuccess(serverDetails);
} on DioError catch (e) {
2021-03-15 17:39:44 +02:00
if (e.response!.data['error']['code'] == 'uniqueness_error') {
2022-06-05 22:36:32 +03:00
final NavigationService nav = getIt.get<NavigationService>();
2021-02-15 20:58:29 +02:00
nav.showPopUpDialog(
BrandAlert(
2021-03-23 21:21:42 +02:00
title: 'modals.1'.tr(),
contentText: 'modals.2'.tr(),
2021-12-06 20:31:19 +02:00
actions: [
2021-02-15 20:58:29 +02:00
ActionButton(
2021-03-23 22:00:17 +02:00
text: 'basis.delete'.tr(),
2021-02-15 20:58:29 +02:00
isRed: true,
onPressed: () async {
2021-03-31 14:37:39 +03:00
await hetznerApi.deleteSelfprivacyServerAndAllVolumes(
domainName: domainName,
);
2021-02-15 20:58:29 +02:00
2022-06-09 09:51:29 +03:00
final ServerHostingDetails? serverDetails =
await hetznerApi.createServer(
2021-02-15 20:58:29 +02:00
cloudFlareKey: cloudFlareKey,
rootUser: rootUser,
domainName: domainName,
2021-10-12 00:10:04 +03:00
dataBase: dataBase,
2021-02-15 20:58:29 +02:00
);
2022-06-09 09:51:29 +03:00
if (serverDetails == null) {
print('Server is not initialized!');
return;
}
2021-03-25 10:32:00 +02:00
await saveServerDetails(serverDetails);
2021-02-15 20:58:29 +02:00
onSuccess(serverDetails);
},
),
ActionButton(
2021-03-23 22:00:17 +02:00
text: 'basis.cancel'.tr(),
2022-06-05 22:36:32 +03:00
onPressed: onCancel,
2021-02-15 20:58:29 +02:00
),
],
),
);
}
}
2021-01-21 09:35:38 +02:00
}
Future<void> createDnsRecords(
2022-06-05 22:36:32 +03:00
final String ip4,
final ServerDomain cloudFlareDomain, {
required final void Function() onCancel,
}) async {
2022-06-05 22:36:32 +03:00
final CloudflareApi cloudflareApi = CloudflareApi();
2021-01-21 09:35:38 +02:00
2021-01-27 20:33:00 +02:00
await cloudflareApi.removeSimilarRecords(
ip4: ip4,
cloudFlareDomain: cloudFlareDomain,
);
try {
await cloudflareApi.createMultipleDnsRecords(
ip4: ip4,
cloudFlareDomain: cloudFlareDomain,
);
} on DioError catch (e) {
2022-06-05 22:36:32 +03:00
final HetznerApi hetznerApi = HetznerApi();
final NavigationService nav = getIt.get<NavigationService>();
nav.showPopUpDialog(
BrandAlert(
2022-05-24 21:55:39 +03:00
title: e.response!.data['errors'][0]['code'] == 1038
? 'modals.10'.tr()
: 'providers.domain.states.error'.tr(),
contentText: 'modals.6'.tr(),
actions: [
ActionButton(
text: 'basis.delete'.tr(),
isRed: true,
onPressed: () async {
await hetznerApi.deleteSelfprivacyServerAndAllVolumes(
domainName: cloudFlareDomain.domainName,
);
onCancel();
},
),
ActionButton(
text: 'basis.cancel'.tr(),
2022-06-05 22:36:32 +03:00
onPressed: onCancel,
),
],
),
);
}
2021-05-17 15:38:38 +03:00
await HetznerApi().createReverseDns(
ip4: ip4,
2021-05-17 15:40:06 +03:00
domainName: cloudFlareDomain.domainName,
2021-05-17 15:38:38 +03:00
);
2021-01-21 23:01:42 +02:00
}
2022-06-05 22:36:32 +03:00
Future<void> createDkimRecord(final ServerDomain cloudFlareDomain) async {
final CloudflareApi cloudflareApi = CloudflareApi();
final ServerApi api = ServerApi();
2022-02-01 03:56:05 +02:00
2022-06-05 22:36:32 +03:00
final String? dkimRecordString = await api.getDkim();
2022-02-01 03:56:05 +02:00
2022-05-24 21:55:39 +03:00
await cloudflareApi.setDkim(dkimRecordString ?? '', cloudFlareDomain);
2022-02-01 03:56:05 +02:00
}
2021-03-26 01:30:34 +02:00
Future<bool> isHttpServerWorking() async {
2022-06-05 22:36:32 +03:00
final ServerApi api = ServerApi();
final bool isHttpServerWorking = await api.isHttpServerWorking();
2022-02-01 03:56:05 +02:00
try {
await api.getDkim();
} catch (e) {
return false;
}
2021-01-21 23:01:42 +02:00
return isHttpServerWorking;
}
Future<ServerHostingDetails> restart() async {
2022-06-05 22:36:32 +03:00
final HetznerApi hetznerApi = HetznerApi();
return hetznerApi.reset();
2021-03-31 17:33:58 +03:00
}
Future<ServerHostingDetails> powerOn() async {
2022-06-05 22:36:32 +03:00
final HetznerApi hetznerApi = HetznerApi();
return hetznerApi.powerOn();
2021-02-03 21:51:07 +02:00
}
2021-03-25 10:32:00 +02:00
Future<ServerRecoveryCapabilities> getRecoveryCapabilities(
2022-06-05 22:36:32 +03:00
final ServerDomain serverDomain,
) async {
2022-06-05 22:36:32 +03:00
final ServerApi serverApi = ServerApi(
isWithToken: false,
overrideDomain: serverDomain.domainName,
);
2022-06-05 22:36:32 +03:00
final String? serverApiVersion = await serverApi.getApiVersion();
if (serverApiVersion == null) {
return ServerRecoveryCapabilities.none;
}
try {
2022-06-05 22:36:32 +03:00
final Version parsedVersion = Version.parse(serverApiVersion);
2022-05-23 17:21:34 +03:00
if (!VersionConstraint.parse('>=1.2.0').allows(parsedVersion)) {
return ServerRecoveryCapabilities.legacy;
}
return ServerRecoveryCapabilities.loginTokens;
} on FormatException {
return ServerRecoveryCapabilities.none;
}
}
2022-06-05 22:36:32 +03:00
Future<String> getServerIpFromDomain(final ServerDomain serverDomain) async {
final List<RRecord>? lookup = await DnsUtils.lookupRecord(
serverDomain.domainName,
RRecordType.A,
provider: DnsApiProvider.CLOUDFLARE,
);
if (lookup == null || lookup.isEmpty) {
throw IpNotFoundException('No IP found for domain $serverDomain');
}
return lookup[0].data;
}
Future<String> getDeviceName() async {
final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
if (kIsWeb) {
return deviceInfo.webBrowserInfo.then(
(final WebBrowserInfo value) =>
'${value.browserName} ${value.platform}',
);
} else {
if (Platform.isAndroid) {
return deviceInfo.androidInfo.then(
(final AndroidDeviceInfo value) =>
'${value.model} ${value.version.release}',
);
} else if (Platform.isIOS) {
return deviceInfo.iosInfo.then(
(final IosDeviceInfo value) =>
'${value.utsname.machine} ${value.systemName} ${value.systemVersion}',
);
} else if (Platform.isLinux) {
return deviceInfo.linuxInfo
.then((final LinuxDeviceInfo value) => value.prettyName);
} else if (Platform.isMacOS) {
return deviceInfo.macOsInfo.then(
(final MacOsDeviceInfo value) =>
'${value.hostName} ${value.computerName}',
);
} else if (Platform.isWindows) {
return deviceInfo.windowsInfo
.then((final WindowsDeviceInfo value) => value.computerName);
}
}
return 'Unidentified';
}
Future<ServerHostingDetails> authorizeByNewDeviceKey(
2022-06-05 22:36:32 +03:00
final ServerDomain serverDomain,
final String newDeviceKey,
final ServerRecoveryCapabilities recoveryCapabilities,
) async {
2022-06-05 22:36:32 +03:00
final ServerApi serverApi = ServerApi(
isWithToken: false,
overrideDomain: serverDomain.domainName,
);
2022-06-05 22:36:32 +03:00
final String serverIp = await getServerIpFromDomain(serverDomain);
final ApiResponse<String> apiResponse = await serverApi.authorizeDevice(
DeviceToken(device: await getDeviceName(), token: newDeviceKey),
);
if (apiResponse.isSuccess) {
return ServerHostingDetails(
apiToken: apiResponse.data,
volume: ServerVolume(
id: 0,
name: '',
),
2022-05-24 21:55:39 +03:00
provider: ServerProvider.unknown,
id: 0,
ip4: serverIp,
startTime: null,
createTime: null,
);
}
throw ServerAuthorizationException(
apiResponse.errorMessage ?? apiResponse.data,
);
}
Future<ServerHostingDetails> authorizeByRecoveryKey(
2022-06-05 22:36:32 +03:00
final ServerDomain serverDomain,
final String recoveryKey,
final ServerRecoveryCapabilities recoveryCapabilities,
) async {
2022-06-05 22:36:32 +03:00
final ServerApi serverApi = ServerApi(
isWithToken: false,
overrideDomain: serverDomain.domainName,
);
2022-06-05 22:36:32 +03:00
final String serverIp = await getServerIpFromDomain(serverDomain);
final ApiResponse<String> apiResponse = await serverApi.useRecoveryToken(
DeviceToken(device: await getDeviceName(), token: recoveryKey),
);
if (apiResponse.isSuccess) {
return ServerHostingDetails(
apiToken: apiResponse.data,
volume: ServerVolume(
id: 0,
name: '',
),
2022-05-24 21:55:39 +03:00
provider: ServerProvider.unknown,
id: 0,
ip4: serverIp,
startTime: null,
createTime: null,
);
}
throw ServerAuthorizationException(
apiResponse.errorMessage ?? apiResponse.data,
);
}
Future<ServerHostingDetails> authorizeByApiToken(
2022-06-05 22:36:32 +03:00
final ServerDomain serverDomain,
final String apiToken,
final ServerRecoveryCapabilities recoveryCapabilities,
) async {
2022-06-05 22:36:32 +03:00
final ServerApi serverApi = ServerApi(
isWithToken: false,
overrideDomain: serverDomain.domainName,
customToken: apiToken,
);
2022-06-05 22:36:32 +03:00
final String serverIp = await getServerIpFromDomain(serverDomain);
if (recoveryCapabilities == ServerRecoveryCapabilities.legacy) {
final Map<ServiceTypes, bool> apiResponse =
await serverApi.servicesPowerCheck();
if (apiResponse.isNotEmpty) {
return ServerHostingDetails(
apiToken: apiToken,
volume: ServerVolume(
id: 0,
name: '',
),
provider: ServerProvider.unknown,
id: 0,
ip4: serverIp,
startTime: null,
createTime: null,
);
} else {
throw ServerAuthorizationException(
2022-06-05 22:36:32 +03:00
"Couldn't connect to server with this token",
);
}
}
final ApiResponse<String> deviceAuthKey =
await serverApi.createDeviceToken();
2022-06-05 22:36:32 +03:00
final ApiResponse<String> apiResponse = await serverApi.authorizeDevice(
DeviceToken(device: await getDeviceName(), token: deviceAuthKey.data),
);
if (apiResponse.isSuccess) {
return ServerHostingDetails(
apiToken: apiResponse.data,
volume: ServerVolume(
id: 0,
name: '',
),
2022-05-24 21:55:39 +03:00
provider: ServerProvider.unknown,
id: 0,
ip4: serverIp,
startTime: null,
createTime: null,
);
}
throw ServerAuthorizationException(
apiResponse.errorMessage ?? apiResponse.data,
);
}
2022-05-23 17:21:34 +03:00
Future<User> getMainUser() async {
2022-06-05 22:36:32 +03:00
final ServerApi serverApi = ServerApi();
const User fallbackUser = User(
2022-05-23 17:21:34 +03:00
isFoundOnServer: false,
2022-06-05 22:36:32 +03:00
note: "Couldn't find main user on server, API is outdated",
2022-05-23 17:21:34 +03:00
login: 'UNKNOWN',
sshKeys: [],
);
2022-06-05 22:36:32 +03:00
final String? serverApiVersion = await serverApi.getApiVersion();
final ApiResponse<List<String>> users =
await serverApi.getUsersList(withMainUser: true);
2022-05-23 17:21:34 +03:00
if (serverApiVersion == null || !users.isSuccess) {
return fallbackUser;
}
try {
2022-06-05 22:36:32 +03:00
final Version parsedVersion = Version.parse(serverApiVersion);
2022-05-23 17:21:34 +03:00
if (!VersionConstraint.parse('>=1.2.5').allows(parsedVersion)) {
return fallbackUser;
}
return User(
isFoundOnServer: true,
login: users.data[0],
);
} on FormatException {
return fallbackUser;
}
}
Future<List<ServerBasicInfo>> getServersOnHetznerAccount() async {
2022-06-05 22:36:32 +03:00
final HetznerApi hetznerApi = HetznerApi();
final List<HetznerServerInfo> servers = await hetznerApi.getServers();
return servers
.map(
(final HetznerServerInfo server) => ServerBasicInfo(
id: server.id,
name: server.name,
ip: server.publicNet.ipv4.ip,
reverseDns: server.publicNet.ipv4.reverseDns,
created: server.created,
volumeId: server.volumes.isNotEmpty ? server.volumes[0] : 0,
),
)
.toList();
}
Future<void> saveServerDetails(
final ServerHostingDetails serverDetails,
) async {
2021-03-25 22:09:56 +02:00
await getIt<ApiConfigModel>().storeServerDetails(serverDetails);
2021-03-25 10:32:00 +02:00
}
2022-06-05 22:36:32 +03:00
Future<void> saveHetznerKey(final String key) async {
2021-10-14 00:49:24 +03:00
print('saved');
2021-03-25 22:09:56 +02:00
await getIt<ApiConfigModel>().storeHetznerKey(key);
2021-03-25 10:32:00 +02:00
}
Future<void> deleteHetznerKey() async {
await box.delete(BNames.hetznerKey);
getIt<ApiConfigModel>().init();
}
Future<void> saveBackblazeKey(
final BackblazeCredential backblazeCredential,
) async {
2021-03-25 22:09:56 +02:00
await getIt<ApiConfigModel>().storeBackblazeCredential(backblazeCredential);
2021-03-25 10:32:00 +02:00
}
2022-06-05 22:36:32 +03:00
Future<void> saveCloudFlareKey(final String key) async {
2021-03-25 22:09:56 +02:00
await getIt<ApiConfigModel>().storeCloudFlareKey(key);
2021-03-25 10:32:00 +02:00
}
2022-06-05 22:36:32 +03:00
Future<void> saveDomain(final ServerDomain serverDomain) async {
await getIt<ApiConfigModel>().storeServerDomain(serverDomain);
2021-03-25 10:32:00 +02:00
}
Future<void> deleteDomain() async {
await box.delete(BNames.serverDomain);
getIt<ApiConfigModel>().init();
}
2022-06-05 22:36:32 +03:00
Future<void> saveIsServerStarted(final bool value) async {
2021-03-25 22:09:56 +02:00
await box.put(BNames.isServerStarted, value);
2021-03-25 10:32:00 +02:00
}
2022-06-05 22:36:32 +03:00
Future<void> saveIsServerResetedFirstTime(final bool value) async {
2021-03-31 14:37:39 +03:00
await box.put(BNames.isServerResetedFirstTime, value);
}
2022-06-05 22:36:32 +03:00
Future<void> saveIsServerResetedSecondTime(final bool value) async {
2021-03-31 14:37:39 +03:00
await box.put(BNames.isServerResetedSecondTime, value);
2021-03-25 10:32:00 +02:00
}
2022-06-05 22:36:32 +03:00
Future<void> saveRootUser(final User rootUser) async {
2021-03-25 10:32:00 +02:00
await box.put(BNames.rootUser, rootUser);
}
2022-06-05 22:36:32 +03:00
Future<void> saveIsRecoveringServer(final bool value) async {
2022-05-31 02:06:08 +03:00
await box.put(BNames.isRecoveringServer, value);
}
2022-06-05 22:36:32 +03:00
Future<void> saveHasFinalChecked(final bool value) async {
2021-03-25 10:32:00 +02:00
await box.put(BNames.hasFinalChecked, value);
}
2021-04-22 21:04:24 +03:00
2022-06-05 22:36:32 +03:00
Future<void> deleteServer(final ServerDomain serverDomain) async {
final HetznerApi hetznerApi = HetznerApi();
final CloudflareApi cloudFlare = CloudflareApi();
2021-04-22 21:04:24 +03:00
2021-10-12 00:10:04 +03:00
await hetznerApi.deleteSelfprivacyServerAndAllVolumes(
domainName: serverDomain.domainName,
2021-04-22 21:04:24 +03:00
);
2021-10-12 00:10:04 +03:00
2021-10-14 00:49:24 +03:00
await box.put(BNames.hasFinalChecked, false);
await box.put(BNames.isServerStarted, false);
await box.put(BNames.isServerResetedFirstTime, false);
await box.put(BNames.isServerResetedSecondTime, false);
await box.put(BNames.isLoading, false);
await box.put(BNames.serverDetails, null);
2021-10-14 00:49:24 +03:00
await cloudFlare.removeSimilarRecords(cloudFlareDomain: serverDomain);
2021-04-22 21:04:24 +03:00
}
2022-05-31 17:30:35 +03:00
Future<void> deleteServerRelatedRecords() async {
2021-04-22 21:04:24 +03:00
await box.deleteAll([
BNames.serverDetails,
2021-04-22 21:04:24 +03:00
BNames.isServerStarted,
BNames.isServerResetedFirstTime,
BNames.isServerResetedSecondTime,
BNames.hasFinalChecked,
BNames.isLoading,
]);
getIt<ApiConfigModel>().init();
}
2021-01-21 09:35:38 +02:00
}