selfprivacy.org.app/lib/logic/cubit/app_config/app_config_repository.dart

213 lines
6.5 KiB
Dart
Raw Normal View History

2021-02-15 20:58:29 +02:00
import 'package:dio/dio.dart';
2021-01-21 09:35:38 +02:00
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';
2021-01-21 23:01:42 +02:00
import 'package:selfprivacy/logic/api_maps/server.dart';
2021-02-03 22:26:38 +02:00
import 'package:selfprivacy/logic/models/backblaze_credential.dart';
2021-01-21 09:35:38 +02:00
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';
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';
2021-01-21 09:35:38 +02:00
import 'app_config_cubit.dart';
class AppConfigRepository {
Box box = Hive.box(BNames.appConfig);
AppConfigState load() {
return AppConfigState(
hetznerKey: box.get(BNames.hetznerKey),
cloudFlareKey: box.get(BNames.cloudFlareKey),
cloudFlareDomain: box.get(BNames.cloudFlareDomain),
2021-02-03 22:26:38 +02:00
backblazeCredential: box.get(BNames.backblazeKey),
2021-01-21 09:35:38 +02:00
rootUser: box.get(BNames.rootUser),
hetznerServer: box.get(BNames.hetznerServer),
2021-01-21 23:01:42 +02:00
isServerStarted: box.get(BNames.isServerStarted, defaultValue: false),
2021-02-16 20:48:15 +02:00
error: null,
hasFinalChecked: box.get(BNames.hasFinalChecked, defaultValue: false),
isLoading: box.get(BNames.isLoading, defaultValue: false),
isServerReseted: box.get(BNames.isServerReseted, defaultValue: false),
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();
}
void saveHetznerKey(String key) {
box.put(BNames.hetznerKey, key);
}
2021-02-03 22:26:38 +02:00
void saveBackblazeKey(BackblazeCredential backblazeCredential) {
box.put(BNames.backblazeKey, backblazeCredential);
2021-02-03 21:51:07 +02:00
}
2021-01-21 09:35:38 +02:00
void saveCloudFlare(String key) {
box.put(BNames.cloudFlareKey, key);
}
void saveDomain(CloudFlareDomain cloudFlareDomain) {
box.put(BNames.cloudFlareDomain, cloudFlareDomain);
}
void saveRootUser(User rootUser) {
box.put(BNames.rootUser, rootUser);
}
Future<HetznerServerDetails> startServer(
2021-03-15 17:39:44 +02:00
String? hetznerKey,
2021-01-21 09:35:38 +02:00
HetznerServerDetails hetznerServer,
) async {
var hetznerApi = HetznerApi(hetznerKey);
var serverDetails = await hetznerApi.startServer(server: hetznerServer);
hetznerApi.close();
2021-01-21 23:01:42 +02:00
box.put(BNames.isServerStarted, true);
2021-01-21 09:35:38 +02:00
return serverDetails;
}
Future<void> saveServerDetails(HetznerServerDetails serverDetails) async {
await box.put(BNames.hetznerServer, serverDetails);
}
2021-03-15 17:39:44 +02:00
Future<bool> isDnsAddressesMatch(String? domainName, String? ip4) async {
2021-01-27 20:33:00 +02:00
print(domainName);
2021-01-21 09:35:38 +02:00
var addresses = <String>[
'$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<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) {
2021-01-21 09:35:38 +02:00
return false;
}
}
2021-02-16 20:48:15 +02:00
box.put(BNames.hasFinalChecked, true);
2021-01-21 23:01:42 +02:00
2021-01-21 09:35:38 +02:00
return true;
}
2021-02-15 20:58:29 +02:00
Future<void> createServer(
2021-03-15 17:39:44 +02:00
String? hetznerKey,
2021-02-15 20:58:29 +02:00
User rootUser,
2021-03-15 17:39:44 +02:00
String? domainName,
String? cloudFlareKey, {
void Function()? onCancel,
required Future<void> Function(HetznerServerDetails serverDetails) onSuccess,
2021-02-15 20:58:29 +02:00
}) async {
2021-01-21 09:35:38 +02:00
var hetznerApi = HetznerApi(hetznerKey);
2021-02-15 20:58:29 +02:00
try {
var serverDetails = await hetznerApi.createServer(
cloudFlareKey: cloudFlareKey,
rootUser: rootUser,
domainName: domainName,
);
await box.put(BNames.hetznerServer, serverDetails);
hetznerApi.close();
onSuccess(serverDetails);
} on DioError catch (e) {
2021-03-15 17:39:44 +02:00
if (e.response!.data['error']['code'] == 'uniqueness_error') {
2021-02-15 20:58:29 +02:00
var nav = getIt.get<NavigationService>();
nav.showPopUpDialog(
BrandAlert(
title: 'Сервер с таким именем уже существует',
contentText: 'Уничтожить сервер и создать новый?',
acitons: [
ActionButton(
text: 'Удалить',
isRed: true,
onPressed: () async {
await hetznerApi.deleteSelfprivacyServer(
cloudFlareKey: cloudFlareKey,
);
var serverDetails = await hetznerApi.createServer(
cloudFlareKey: cloudFlareKey,
rootUser: rootUser,
domainName: domainName,
);
hetznerApi.close();
await box.put(BNames.hetznerServer, serverDetails);
onSuccess(serverDetails);
},
),
ActionButton(
text: 'Отменить',
onPressed: () {
hetznerApi.close();
2021-03-15 17:39:44 +02:00
onCancel!();
2021-02-15 20:58:29 +02:00
},
),
],
),
);
}
}
2021-01-21 09:35:38 +02:00
}
Future<void> createDnsRecords(
2021-03-15 17:39:44 +02:00
String? cloudFlareKey,
String? ip4,
2021-01-21 09:35:38 +02:00
CloudFlareDomain cloudFlareDomain,
) async {
var cloudflareApi = CloudflareApi(cloudFlareKey);
2021-01-27 20:33:00 +02:00
await cloudflareApi.removeSimilarRecords(
ip4: ip4,
cloudFlareDomain: cloudFlareDomain,
);
2021-01-21 09:35:38 +02:00
await cloudflareApi.createMultipleDnsRecords(
ip4: ip4,
cloudFlareDomain: cloudFlareDomain,
);
2021-01-21 23:01:42 +02:00
cloudflareApi.close();
}
2021-03-15 17:39:44 +02:00
Future<bool> isHttpServerWorking(String? domainName) async {
2021-01-21 23:01:42 +02:00
var api = ServerApi(domainName);
var isHttpServerWorking = await api.isHttpServerWorking();
api.close();
return isHttpServerWorking;
}
2021-02-03 22:26:38 +02:00
Future<HetznerServerDetails> restart(
2021-03-15 17:39:44 +02:00
String? hetznerKey,
2021-02-03 21:51:07 +02:00
HetznerServerDetails server,
) async {
var hetznerApi = HetznerApi(hetznerKey);
2021-02-03 22:26:38 +02:00
return await hetznerApi.restart(server: server);
2021-02-03 21:51:07 +02:00
}
2021-01-21 09:35:38 +02:00
}