diff --git a/lib/config/hive_config.dart b/lib/config/hive_config.dart index 0b686adf..b8eae252 100644 --- a/lib/config/hive_config.dart +++ b/lib/config/hive_config.dart @@ -4,6 +4,7 @@ import 'dart:typed_data'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:hive/hive.dart'; import 'package:hive_flutter/hive_flutter.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'; @@ -14,6 +15,7 @@ class HiveConfig { Hive.registerAdapter(UserAdapter()); Hive.registerAdapter(HetznerServerDetailsAdapter()); Hive.registerAdapter(CloudFlareDomainAdapter()); + Hive.registerAdapter(BackblazeCredentialAdapter()); await Hive.openBox(BNames.appSettings); var cipher = HiveAesCipher(await getEncriptedKey()); diff --git a/lib/logic/api_maps/hetzner.dart b/lib/logic/api_maps/hetzner.dart index 1753b13c..54f8f69b 100644 --- a/lib/logic/api_maps/hetzner.dart +++ b/lib/logic/api_maps/hetzner.dart @@ -70,7 +70,7 @@ class HetznerApi extends ApiMap { ); } - Future reset({ + Future restart({ HetznerServerDetails server, }) async { await loggedClient.post('/${server.id}/actions/poweron'); diff --git a/lib/logic/cubit/app_config/app_config_cubit.dart b/lib/logic/cubit/app_config/app_config_cubit.dart index 8b0828bf..c4a1f67a 100644 --- a/lib/logic/cubit/app_config/app_config_cubit.dart +++ b/lib/logic/cubit/app_config/app_config_cubit.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/foundation.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'; @@ -12,17 +13,23 @@ import 'app_config_repository.dart'; part 'app_config_state.dart'; -/// initializeing steps: +/// Initializing steps: /// 1. Hetzner key |setHetznerKey /// 2. Cloudflare key |setCloudflareKey -/// 3. Set Domain address |setDomain -/// 4. Set Root user name password |setRootUser -/// 5. Set Create server ans set DNS-Records |createServerAndSetDnsRecords +/// 3. Backblaze Id + Key |setBackblazeKey + +/// 4. Set Domain address |setDomain +/// 5. Set Root user name password |setRootUser +/// 6. Set Create server ans set DNS-Records |createServerAndSetDnsRecords /// (without start) -/// 6. ChecksAndSets: -/// 6.1 checkDnsAndStartServer |checkDnsAndStartServer -/// 6.2 setDkim |setDkim -/// (checkServer + getDkim + Set DKIM) +/// 7. ChecksAndSets: +/// 7.1 checkDnsAndStartServer |checkDnsAndStartServer +/// 7.2 setDkim |setDkim +/// a. checkServer +/// b. getDkim +/// c. Set DKIM +/// d. server restart + class AppConfigCubit extends Cubit { AppConfigCubit() : super(InitialAppConfigState()); @@ -76,7 +83,8 @@ class AppConfigCubit extends Cubit { state.cloudFlareKey, state.cloudFlareDomain.zoneId, ); - var hetznerServerDetails = await repository.reset( + + var hetznerServerDetails = await repository.restart( state.hetznerKey, state.hetznerServer, ); @@ -153,8 +161,12 @@ class AppConfigCubit extends Cubit { } } - void setBackblazeKey(String backblazeKey) { - repository.saveBackblazeKey(backblazeKey); - emit(state.copyWith(backblazeKey: backblazeKey)); + void setBackblazeKey(String keyId, String applicationKey) { + var backblazeCredential = BackblazeCredential( + keyId: keyId, + applicationKey: applicationKey, + ); + repository.saveBackblazeKey(backblazeCredential); + emit(state.copyWith(backblazeCredential: backblazeCredential)); } } diff --git a/lib/logic/cubit/app_config/app_config_repository.dart b/lib/logic/cubit/app_config/app_config_repository.dart index d0844470..1b6fee8a 100644 --- a/lib/logic/cubit/app_config/app_config_repository.dart +++ b/lib/logic/cubit/app_config/app_config_repository.dart @@ -3,6 +3,7 @@ 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/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'; @@ -20,7 +21,7 @@ class AppConfigRepository { hetznerKey: box.get(BNames.hetznerKey), cloudFlareKey: box.get(BNames.cloudFlareKey), cloudFlareDomain: box.get(BNames.cloudFlareDomain), - backblazeKey: box.get(BNames.backblazeKey), + backblazeCredential: box.get(BNames.backblazeKey), rootUser: box.get(BNames.rootUser), hetznerServer: box.get(BNames.hetznerServer), isServerStarted: box.get(BNames.isServerStarted, defaultValue: false), @@ -37,8 +38,8 @@ class AppConfigRepository { box.put(BNames.hetznerKey, key); } - void saveBackblazeKey(String key) { - box.put(BNames.backblazeKey, key); + void saveBackblazeKey(BackblazeCredential backblazeCredential) { + box.put(BNames.backblazeKey, backblazeCredential); } void saveCloudFlare(String key) { @@ -166,11 +167,11 @@ class AppConfigRepository { cloudflareApi.close(); } - Future reset( + Future restart( String hetznerKey, HetznerServerDetails server, ) async { var hetznerApi = HetznerApi(hetznerKey); - return await hetznerApi.reset(server: server); + return await hetznerApi.restart(server: server); } } diff --git a/lib/logic/cubit/app_config/app_config_state.dart b/lib/logic/cubit/app_config/app_config_state.dart index 37cb368d..4ce6d7e6 100644 --- a/lib/logic/cubit/app_config/app_config_state.dart +++ b/lib/logic/cubit/app_config/app_config_state.dart @@ -4,7 +4,7 @@ class AppConfigState extends Equatable { const AppConfigState({ this.hetznerKey, this.cloudFlareKey, - this.backblazeKey, + this.backblazeCredential, this.cloudFlareDomain, this.rootUser, this.hetznerServer, @@ -21,7 +21,7 @@ class AppConfigState extends Equatable { List get props => [ hetznerKey, cloudFlareKey, - backblazeKey, + backblazeCredential, cloudFlareDomain, rootUser, hetznerServer, @@ -35,7 +35,7 @@ class AppConfigState extends Equatable { final String hetznerKey; final String cloudFlareKey; - final String backblazeKey; + final BackblazeCredential backblazeCredential; final CloudFlareDomain cloudFlareDomain; final User rootUser; final HetznerServerDetails hetznerServer; @@ -50,7 +50,7 @@ class AppConfigState extends Equatable { AppConfigState copyWith({ String hetznerKey, String cloudFlareKey, - String backblazeKey, + BackblazeCredential backblazeCredential, CloudFlareDomain cloudFlareDomain, User rootUser, HetznerServerDetails hetznerServer, @@ -65,7 +65,7 @@ class AppConfigState extends Equatable { AppConfigState( hetznerKey: hetznerKey ?? this.hetznerKey, cloudFlareKey: cloudFlareKey ?? this.cloudFlareKey, - backblazeKey: backblazeKey ?? this.backblazeKey, + backblazeCredential: backblazeCredential ?? this.backblazeCredential, cloudFlareDomain: cloudFlareDomain ?? this.cloudFlareDomain, rootUser: rootUser ?? this.rootUser, hetznerServer: hetznerServer ?? this.hetznerServer, @@ -81,7 +81,7 @@ class AppConfigState extends Equatable { bool get isHetznerFilled => hetznerKey != null; bool get isCloudFlareFilled => cloudFlareKey != null; - bool get isBackblazeFilled => backblazeKey != null; + bool get isBackblazeFilled => backblazeCredential != null; bool get isDomainFilled => cloudFlareDomain != null; bool get isUserFilled => rootUser != null; bool get isServerFilled => hetznerServer != null; diff --git a/lib/logic/cubit/forms/initializing/backblaze_form_cubit.dart b/lib/logic/cubit/forms/initializing/backblaze_form_cubit.dart index 8b594c09..0f202584 100644 --- a/lib/logic/cubit/forms/initializing/backblaze_form_cubit.dart +++ b/lib/logic/cubit/forms/initializing/backblaze_form_cubit.dart @@ -1,9 +1,8 @@ - import 'dart:async'; -import 'dart:convert'; import 'package:cubit_form/cubit_form.dart'; import 'package:selfprivacy/logic/api_maps/backblaze.dart'; import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart'; +import 'package:selfprivacy/logic/models/backblaze_credential.dart'; class BackblazeFormCubit extends FormCubit { BackblazeApi apiClient = BackblazeApi(); @@ -35,10 +34,10 @@ class BackblazeFormCubit extends FormCubit { @override FutureOr onSubmit() async { - String encodedApiKey = - encodeToBase64(keyId.state.value, applicationKey.state.value); - - initializingCubit.setBackblazeKey(encodedApiKey); + initializingCubit.setBackblazeKey( + keyId.state.value, + applicationKey.state.value, + ); } final AppConfigCubit initializingCubit; @@ -51,8 +50,10 @@ class BackblazeFormCubit extends FormCubit { FutureOr asyncValidation() async { bool isKeyValid; try { - String encodedApiKey = - encodeToBase64(keyId.state.value, applicationKey.state.value); + String encodedApiKey = encodedBackblazeKey( + keyId.state.value, + applicationKey.state.value, + ); isKeyValid = await apiClient.isValid(encodedApiKey); } catch (e) { addError(e); @@ -72,10 +73,4 @@ class BackblazeFormCubit extends FormCubit { return super.close(); } - - String encodeToBase64(String keyId, String applicationKey) { - String _apiKey = '$keyId:$applicationKey'; - String encodedApiKey = base64.encode(utf8.encode(_apiKey)); - return encodedApiKey; - } -} \ No newline at end of file +} diff --git a/lib/logic/models/backblaze_credential.dart b/lib/logic/models/backblaze_credential.dart new file mode 100644 index 00000000..28d146fe --- /dev/null +++ b/lib/logic/models/backblaze_credential.dart @@ -0,0 +1,29 @@ +import 'dart:convert'; + +import 'package:hive/hive.dart'; + +part 'backblaze_credential.g.dart'; + +@HiveType(typeId: 4) +class BackblazeCredential { + BackblazeCredential({this.keyId, this.applicationKey}); + + @HiveField(0) + final String keyId; + + @HiveField(1) + final String applicationKey; + + get encodedApiKey => encodedBackblazeKey(keyId, applicationKey); + + @override + String toString() { + return '$keyId: $encodedApiKey'; + } +} + +String encodedBackblazeKey(String keyId, String applicationKey) { + String _apiKey = '$keyId:$applicationKey'; + String encodedApiKey = base64.encode(utf8.encode(_apiKey)); + return encodedApiKey; +} diff --git a/lib/logic/models/backblaze_credential.g.dart b/lib/logic/models/backblaze_credential.g.dart new file mode 100644 index 00000000..c6ad373e --- /dev/null +++ b/lib/logic/models/backblaze_credential.g.dart @@ -0,0 +1,44 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'backblaze_credential.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class BackblazeCredentialAdapter extends TypeAdapter { + @override + final int typeId = 4; + + @override + BackblazeCredential read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return BackblazeCredential( + keyId: fields[0] as String, + applicationKey: fields[1] as String, + ); + } + + @override + void write(BinaryWriter writer, BackblazeCredential obj) { + writer + ..writeByte(2) + ..writeByte(0) + ..write(obj.keyId) + ..writeByte(1) + ..write(obj.applicationKey); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is BackblazeCredentialAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/logic/models/server_details.g.dart b/lib/logic/models/server_details.g.dart index fe05f186..c5318044 100644 --- a/lib/logic/models/server_details.g.dart +++ b/lib/logic/models/server_details.g.dart @@ -19,8 +19,8 @@ class HetznerServerDetailsAdapter extends TypeAdapter { return HetznerServerDetails( ip4: fields[0] as String, id: fields[1] as int, - startTime: fields[2] as DateTime, createTime: fields[3] as DateTime, + startTime: fields[2] as DateTime, ); } @@ -32,10 +32,10 @@ class HetznerServerDetailsAdapter extends TypeAdapter { ..write(obj.ip4) ..writeByte(1) ..write(obj.id) - ..writeByte(2) - ..write(obj.startTime) ..writeByte(3) - ..write(obj.createTime); + ..write(obj.createTime) + ..writeByte(2) + ..write(obj.startTime); } @override