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

295 lines
8.6 KiB
Dart
Raw Normal View History

2021-01-21 23:01:42 +02:00
import 'dart:async';
2021-01-06 19:35:57 +02:00
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
2021-09-15 17:37:22 +03:00
import 'package:selfprivacy/config/get_it_config.dart';
import 'package:selfprivacy/logic/get_it/ssh.dart';
import 'package:selfprivacy/logic/models/hive/backblaze_credential.dart';
import 'package:selfprivacy/logic/models/hive/server_domain.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/models/hive/user.dart';
2021-01-21 09:35:38 +02:00
import 'app_config_repository.dart';
2022-02-08 08:59:19 +02:00
2021-03-18 02:55:38 +02:00
export 'package:provider/provider.dart';
2021-01-06 19:35:57 +02:00
part 'app_config_state.dart';
class AppConfigCubit extends Cubit<AppConfigState> {
AppConfigCubit() : super(AppConfigEmpty());
2021-01-06 19:35:57 +02:00
2021-01-21 09:35:38 +02:00
final repository = AppConfigRepository();
2021-01-06 19:35:57 +02:00
Timer? timer;
2021-03-31 17:33:58 +03:00
Future<void> load() async {
var state = await repository.load();
2021-02-16 20:48:15 +02:00
if (state is AppConfigFinished) {
2021-02-16 20:48:15 +02:00
emit(state);
} else if (state is AppConfigNotFinished) {
if (state.progress == ServerSetupProgress.serverCreated) {
startServerIfDnsIsOkay(state: state);
} else if (state.progress == ServerSetupProgress.serverStarted) {
resetServerIfServerIsOkay(state: state);
} else if (state.progress == ServerSetupProgress.serverResetedFirstTime) {
oneMoreReset(state: state);
} else if (state.progress ==
ServerSetupProgress.serverResetedSecondTime) {
finishCheckIfServerIsOkay(state: state);
2021-10-14 00:49:24 +03:00
} else {
emit(state);
}
} else if (state is AppConfigRecovery) {
emit(state);
} else {
throw 'wrong state';
2021-02-16 20:48:15 +02:00
}
}
void setHetznerKey(String hetznerKey) async {
await repository.saveHetznerKey(hetznerKey);
emit((state as AppConfigNotFinished).copyWith(hetznerKey: hetznerKey));
}
2021-02-16 20:48:15 +02:00
void setCloudflareKey(String cloudFlareKey) async {
await repository.saveCloudFlareKey(cloudFlareKey);
emit(
(state as AppConfigNotFinished).copyWith(cloudFlareKey: cloudFlareKey));
}
void setBackblazeKey(String keyId, String applicationKey) async {
var backblazeCredential = BackblazeCredential(
keyId: keyId,
applicationKey: applicationKey,
);
await repository.saveBackblazeKey(backblazeCredential);
emit((state as AppConfigNotFinished)
.copyWith(backblazeCredential: backblazeCredential));
}
void setDomain(ServerDomain serverDomain) async {
await repository.saveDomain(serverDomain);
emit((state as AppConfigNotFinished).copyWith(serverDomain: serverDomain));
}
void setRootUser(User rootUser) async {
await repository.saveRootUser(rootUser);
emit((state as AppConfigNotFinished).copyWith(rootUser: rootUser));
}
void createServerAndSetDnsRecords() async {
AppConfigNotFinished _stateCopy = state as AppConfigNotFinished;
var onCancel =
() => emit((state as AppConfigNotFinished).copyWith(isLoading: false));
var onSuccess = (ServerHostingDetails serverDetails) async {
await repository.createDnsRecords(
serverDetails.ip4,
state.serverDomain!,
onCancel: onCancel,
);
emit((state as AppConfigNotFinished).copyWith(
isLoading: false,
serverDetails: serverDetails,
));
runDelayed(startServerIfDnsIsOkay, Duration(seconds: 30), null);
};
try {
emit((state as AppConfigNotFinished).copyWith(isLoading: true));
await repository.createServer(
state.rootUser!,
state.serverDomain!.domainName,
state.cloudFlareKey!,
state.backblazeCredential!,
onCancel: onCancel,
onSuccess: onSuccess,
);
} catch (e) {
emit(_stateCopy);
}
}
2021-02-16 20:48:15 +02:00
void startServerIfDnsIsOkay({AppConfigNotFinished? state}) async {
final dataState = state ?? this.state as AppConfigNotFinished;
2021-02-16 20:48:15 +02:00
emit(TimerState(dataState: dataState, isLoading: true));
2021-02-16 20:48:15 +02:00
var ip4 = dataState.serverDetails!.ip4;
var domainName = dataState.serverDomain!.domainName;
2021-03-25 10:32:00 +02:00
var matches = await repository.isDnsAddressesMatch(
domainName, ip4, dataState.dnsMatches);
if (matches.values.every((value) => value)) {
var server = await repository.startServer(
dataState.serverDetails!,
);
await repository.saveServerDetails(server);
await repository.saveIsServerStarted(true);
2021-02-16 20:48:15 +02:00
emit(
dataState.copyWith(
isServerStarted: true,
isLoading: false,
serverDetails: server,
),
);
runDelayed(resetServerIfServerIsOkay, Duration(seconds: 60), dataState);
2021-02-16 20:48:15 +02:00
} else {
emit(
dataState.copyWith(
isLoading: false,
dnsMatches: matches,
),
);
runDelayed(startServerIfDnsIsOkay, Duration(seconds: 30), dataState);
2021-02-16 20:48:15 +02:00
}
}
void oneMoreReset({AppConfigNotFinished? state}) async {
final dataState = state ?? this.state as AppConfigNotFinished;
2021-02-16 20:48:15 +02:00
emit(TimerState(dataState: dataState, isLoading: true));
2021-02-16 20:48:15 +02:00
var isServerWorking = await repository.isHttpServerWorking();
2021-02-16 20:48:15 +02:00
if (isServerWorking) {
var pauseDuration = Duration(seconds: 30);
emit(TimerState(
dataState: dataState,
timerStart: DateTime.now(),
isLoading: false,
duration: pauseDuration,
));
timer = Timer(pauseDuration, () async {
var hetznerServerDetails = await repository.restart();
await repository.saveIsServerResetedSecondTime(true);
await repository.saveServerDetails(hetznerServerDetails);
emit(
dataState.copyWith(
isServerResetedSecondTime: true,
serverDetails: hetznerServerDetails,
isLoading: false,
),
);
runDelayed(finishCheckIfServerIsOkay, Duration(seconds: 60), dataState);
});
2021-03-31 14:37:39 +03:00
} else {
runDelayed(oneMoreReset, Duration(seconds: 60), dataState);
2021-03-31 14:37:39 +03:00
}
}
void resetServerIfServerIsOkay({
AppConfigNotFinished? state,
2021-03-31 14:37:39 +03:00
}) async {
final dataState = state ?? this.state as AppConfigNotFinished;
2021-03-31 14:37:39 +03:00
emit(TimerState(dataState: dataState, isLoading: true));
2021-03-31 14:37:39 +03:00
var isServerWorking = await repository.isHttpServerWorking();
2021-03-31 14:37:39 +03:00
if (isServerWorking) {
var pauseDuration = Duration(seconds: 30);
emit(TimerState(
dataState: dataState,
timerStart: DateTime.now(),
isLoading: false,
duration: pauseDuration,
));
timer = Timer(pauseDuration, () async {
var hetznerServerDetails = await repository.restart();
await repository.saveIsServerResetedFirstTime(true);
await repository.saveServerDetails(hetznerServerDetails);
emit(
dataState.copyWith(
isServerResetedFirstTime: true,
serverDetails: hetznerServerDetails,
isLoading: false,
),
);
runDelayed(oneMoreReset, Duration(seconds: 60), dataState);
});
2021-02-16 20:48:15 +02:00
} else {
runDelayed(resetServerIfServerIsOkay, Duration(seconds: 60), dataState);
2021-02-16 20:48:15 +02:00
}
}
void finishCheckIfServerIsOkay({
AppConfigNotFinished? state,
2021-02-16 20:48:15 +02:00
}) async {
final dataState = state ?? this.state as AppConfigNotFinished;
2021-02-16 20:48:15 +02:00
emit(TimerState(dataState: dataState, isLoading: true));
2021-02-16 20:48:15 +02:00
var isServerWorking = await repository.isHttpServerWorking();
2021-02-16 20:48:15 +02:00
if (isServerWorking) {
await repository.createDkimRecord(dataState.serverDomain!);
await repository.saveHasFinalChecked(true);
2021-03-25 10:32:00 +02:00
emit(dataState.finish());
2021-02-16 20:48:15 +02:00
} else {
runDelayed(finishCheckIfServerIsOkay, Duration(seconds: 60), dataState);
2021-02-16 20:48:15 +02:00
}
2021-01-06 19:35:57 +02:00
}
void runDelayed(
void Function() work, Duration delay, AppConfigNotFinished? state) async {
final dataState = state ?? this.state as AppConfigNotFinished;
emit(TimerState(
dataState: dataState,
timerStart: DateTime.now(),
duration: delay,
isLoading: false,
));
timer = Timer(delay, work);
}
2021-02-03 21:51:07 +02:00
void clearAppConfig() {
2021-03-30 20:38:40 +03:00
closeTimer();
2021-08-29 16:54:28 +03:00
2021-02-03 21:51:07 +02:00
repository.clearAppConfig();
emit(AppConfigEmpty());
2021-01-06 19:35:57 +02:00
}
2021-04-22 21:04:24 +03:00
Future<void> serverDelete() async {
closeTimer();
2021-08-29 16:54:28 +03:00
if (state.serverDetails != null) {
await repository.deleteServer(state.serverDomain!);
2021-09-15 17:37:22 +03:00
await getIt<SSHModel>().clear();
2021-04-22 21:04:24 +03:00
}
await repository.deleteRecords();
2021-10-12 00:10:04 +03:00
emit(AppConfigNotFinished(
hetznerKey: state.hetznerKey,
serverDomain: state.serverDomain,
2021-10-12 00:10:04 +03:00
cloudFlareKey: state.cloudFlareKey,
backblazeCredential: state.backblazeCredential,
rootUser: state.rootUser,
serverDetails: null,
2021-10-12 00:10:04 +03:00
isServerStarted: false,
isServerResetedFirstTime: false,
isServerResetedSecondTime: false,
isLoading: false,
2022-02-08 08:59:19 +02:00
dnsMatches: null,
2021-10-12 00:10:04 +03:00
));
2021-04-22 21:04:24 +03:00
}
2021-02-16 20:48:15 +02:00
close() {
2021-03-30 20:38:40 +03:00
closeTimer();
2021-02-16 20:48:15 +02:00
return super.close();
}
2021-03-30 20:38:40 +03:00
void closeTimer() {
2021-03-15 17:39:44 +02:00
if (timer != null && timer!.isActive) {
timer!.cancel();
2021-02-16 20:48:15 +02:00
}
2021-02-03 21:51:07 +02:00
}
2021-01-06 19:35:57 +02:00
}