fdroid
Kherel 2021-02-03 21:26:38 +01:00
parent 25a386d511
commit a07a7247f5
9 changed files with 126 additions and 43 deletions

View File

@ -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());

View File

@ -70,7 +70,7 @@ class HetznerApi extends ApiMap {
);
}
Future<HetznerServerDetails> reset({
Future<HetznerServerDetails> restart({
HetznerServerDetails server,
}) async {
await loggedClient.post('/${server.id}/actions/poweron');

View File

@ -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<AppConfigState> {
AppConfigCubit() : super(InitialAppConfigState());
@ -76,7 +83,8 @@ class AppConfigCubit extends Cubit<AppConfigState> {
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<AppConfigState> {
}
}
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));
}
}

View File

@ -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<HetznerServerDetails> reset(
Future<HetznerServerDetails> restart(
String hetznerKey,
HetznerServerDetails server,
) async {
var hetznerApi = HetznerApi(hetznerKey);
return await hetznerApi.reset(server: server);
return await hetznerApi.restart(server: server);
}
}

View File

@ -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<Object> 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;

View File

@ -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<void> 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<bool> 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;
}
}
}

View File

@ -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;
}

View File

@ -0,0 +1,44 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'backblaze_credential.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class BackblazeCredentialAdapter extends TypeAdapter<BackblazeCredential> {
@override
final int typeId = 4;
@override
BackblazeCredential read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
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;
}

View File

@ -19,8 +19,8 @@ class HetznerServerDetailsAdapter extends TypeAdapter<HetznerServerDetails> {
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<HetznerServerDetails> {
..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