forked from SelfPrivacy/selfprivacy.org.app
update
parent
25a386d511
commit
a07a7247f5
|
@ -4,6 +4,7 @@ import 'dart:typed_data';
|
||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:hive_flutter/hive_flutter.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/cloudflare_domain.dart';
|
||||||
import 'package:selfprivacy/logic/models/server_details.dart';
|
import 'package:selfprivacy/logic/models/server_details.dart';
|
||||||
import 'package:selfprivacy/logic/models/user.dart';
|
import 'package:selfprivacy/logic/models/user.dart';
|
||||||
|
@ -14,6 +15,7 @@ class HiveConfig {
|
||||||
Hive.registerAdapter(UserAdapter());
|
Hive.registerAdapter(UserAdapter());
|
||||||
Hive.registerAdapter(HetznerServerDetailsAdapter());
|
Hive.registerAdapter(HetznerServerDetailsAdapter());
|
||||||
Hive.registerAdapter(CloudFlareDomainAdapter());
|
Hive.registerAdapter(CloudFlareDomainAdapter());
|
||||||
|
Hive.registerAdapter(BackblazeCredentialAdapter());
|
||||||
|
|
||||||
await Hive.openBox(BNames.appSettings);
|
await Hive.openBox(BNames.appSettings);
|
||||||
var cipher = HiveAesCipher(await getEncriptedKey());
|
var cipher = HiveAesCipher(await getEncriptedKey());
|
||||||
|
|
|
@ -70,7 +70,7 @@ class HetznerApi extends ApiMap {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<HetznerServerDetails> reset({
|
Future<HetznerServerDetails> restart({
|
||||||
HetznerServerDetails server,
|
HetznerServerDetails server,
|
||||||
}) async {
|
}) async {
|
||||||
await loggedClient.post('/${server.id}/actions/poweron');
|
await loggedClient.post('/${server.id}/actions/poweron');
|
||||||
|
|
|
@ -3,6 +3,7 @@ import 'dart:async';
|
||||||
import 'package:bloc/bloc.dart';
|
import 'package:bloc/bloc.dart';
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
import 'package:flutter/foundation.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/cloudflare_domain.dart';
|
||||||
|
|
||||||
import 'package:selfprivacy/logic/models/server_details.dart';
|
import 'package:selfprivacy/logic/models/server_details.dart';
|
||||||
|
@ -12,17 +13,23 @@ import 'app_config_repository.dart';
|
||||||
|
|
||||||
part 'app_config_state.dart';
|
part 'app_config_state.dart';
|
||||||
|
|
||||||
/// initializeing steps:
|
/// Initializing steps:
|
||||||
/// 1. Hetzner key |setHetznerKey
|
/// 1. Hetzner key |setHetznerKey
|
||||||
/// 2. Cloudflare key |setCloudflareKey
|
/// 2. Cloudflare key |setCloudflareKey
|
||||||
/// 3. Set Domain address |setDomain
|
/// 3. Backblaze Id + Key |setBackblazeKey
|
||||||
/// 4. Set Root user name password |setRootUser
|
|
||||||
/// 5. Set Create server ans set DNS-Records |createServerAndSetDnsRecords
|
/// 4. Set Domain address |setDomain
|
||||||
|
/// 5. Set Root user name password |setRootUser
|
||||||
|
/// 6. Set Create server ans set DNS-Records |createServerAndSetDnsRecords
|
||||||
/// (without start)
|
/// (without start)
|
||||||
/// 6. ChecksAndSets:
|
/// 7. ChecksAndSets:
|
||||||
/// 6.1 checkDnsAndStartServer |checkDnsAndStartServer
|
/// 7.1 checkDnsAndStartServer |checkDnsAndStartServer
|
||||||
/// 6.2 setDkim |setDkim
|
/// 7.2 setDkim |setDkim
|
||||||
/// (checkServer + getDkim + Set DKIM)
|
/// a. checkServer
|
||||||
|
/// b. getDkim
|
||||||
|
/// c. Set DKIM
|
||||||
|
/// d. server restart
|
||||||
|
|
||||||
|
|
||||||
class AppConfigCubit extends Cubit<AppConfigState> {
|
class AppConfigCubit extends Cubit<AppConfigState> {
|
||||||
AppConfigCubit() : super(InitialAppConfigState());
|
AppConfigCubit() : super(InitialAppConfigState());
|
||||||
|
@ -76,7 +83,8 @@ class AppConfigCubit extends Cubit<AppConfigState> {
|
||||||
state.cloudFlareKey,
|
state.cloudFlareKey,
|
||||||
state.cloudFlareDomain.zoneId,
|
state.cloudFlareDomain.zoneId,
|
||||||
);
|
);
|
||||||
var hetznerServerDetails = await repository.reset(
|
|
||||||
|
var hetznerServerDetails = await repository.restart(
|
||||||
state.hetznerKey,
|
state.hetznerKey,
|
||||||
state.hetznerServer,
|
state.hetznerServer,
|
||||||
);
|
);
|
||||||
|
@ -153,8 +161,12 @@ class AppConfigCubit extends Cubit<AppConfigState> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setBackblazeKey(String backblazeKey) {
|
void setBackblazeKey(String keyId, String applicationKey) {
|
||||||
repository.saveBackblazeKey(backblazeKey);
|
var backblazeCredential = BackblazeCredential(
|
||||||
emit(state.copyWith(backblazeKey: backblazeKey));
|
keyId: keyId,
|
||||||
|
applicationKey: applicationKey,
|
||||||
|
);
|
||||||
|
repository.saveBackblazeKey(backblazeCredential);
|
||||||
|
emit(state.copyWith(backblazeCredential: backblazeCredential));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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/cloudflare.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/hetzner.dart';
|
import 'package:selfprivacy/logic/api_maps/hetzner.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/server.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/cloudflare_domain.dart';
|
||||||
import 'package:selfprivacy/logic/models/server_details.dart';
|
import 'package:selfprivacy/logic/models/server_details.dart';
|
||||||
import 'package:selfprivacy/logic/models/user.dart';
|
import 'package:selfprivacy/logic/models/user.dart';
|
||||||
|
@ -20,7 +21,7 @@ class AppConfigRepository {
|
||||||
hetznerKey: box.get(BNames.hetznerKey),
|
hetznerKey: box.get(BNames.hetznerKey),
|
||||||
cloudFlareKey: box.get(BNames.cloudFlareKey),
|
cloudFlareKey: box.get(BNames.cloudFlareKey),
|
||||||
cloudFlareDomain: box.get(BNames.cloudFlareDomain),
|
cloudFlareDomain: box.get(BNames.cloudFlareDomain),
|
||||||
backblazeKey: box.get(BNames.backblazeKey),
|
backblazeCredential: box.get(BNames.backblazeKey),
|
||||||
rootUser: box.get(BNames.rootUser),
|
rootUser: box.get(BNames.rootUser),
|
||||||
hetznerServer: box.get(BNames.hetznerServer),
|
hetznerServer: box.get(BNames.hetznerServer),
|
||||||
isServerStarted: box.get(BNames.isServerStarted, defaultValue: false),
|
isServerStarted: box.get(BNames.isServerStarted, defaultValue: false),
|
||||||
|
@ -37,8 +38,8 @@ class AppConfigRepository {
|
||||||
box.put(BNames.hetznerKey, key);
|
box.put(BNames.hetznerKey, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveBackblazeKey(String key) {
|
void saveBackblazeKey(BackblazeCredential backblazeCredential) {
|
||||||
box.put(BNames.backblazeKey, key);
|
box.put(BNames.backblazeKey, backblazeCredential);
|
||||||
}
|
}
|
||||||
|
|
||||||
void saveCloudFlare(String key) {
|
void saveCloudFlare(String key) {
|
||||||
|
@ -166,11 +167,11 @@ class AppConfigRepository {
|
||||||
cloudflareApi.close();
|
cloudflareApi.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<HetznerServerDetails> reset(
|
Future<HetznerServerDetails> restart(
|
||||||
String hetznerKey,
|
String hetznerKey,
|
||||||
HetznerServerDetails server,
|
HetznerServerDetails server,
|
||||||
) async {
|
) async {
|
||||||
var hetznerApi = HetznerApi(hetznerKey);
|
var hetznerApi = HetznerApi(hetznerKey);
|
||||||
return await hetznerApi.reset(server: server);
|
return await hetznerApi.restart(server: server);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ class AppConfigState extends Equatable {
|
||||||
const AppConfigState({
|
const AppConfigState({
|
||||||
this.hetznerKey,
|
this.hetznerKey,
|
||||||
this.cloudFlareKey,
|
this.cloudFlareKey,
|
||||||
this.backblazeKey,
|
this.backblazeCredential,
|
||||||
this.cloudFlareDomain,
|
this.cloudFlareDomain,
|
||||||
this.rootUser,
|
this.rootUser,
|
||||||
this.hetznerServer,
|
this.hetznerServer,
|
||||||
|
@ -21,7 +21,7 @@ class AppConfigState extends Equatable {
|
||||||
List<Object> get props => [
|
List<Object> get props => [
|
||||||
hetznerKey,
|
hetznerKey,
|
||||||
cloudFlareKey,
|
cloudFlareKey,
|
||||||
backblazeKey,
|
backblazeCredential,
|
||||||
cloudFlareDomain,
|
cloudFlareDomain,
|
||||||
rootUser,
|
rootUser,
|
||||||
hetznerServer,
|
hetznerServer,
|
||||||
|
@ -35,7 +35,7 @@ class AppConfigState extends Equatable {
|
||||||
|
|
||||||
final String hetznerKey;
|
final String hetznerKey;
|
||||||
final String cloudFlareKey;
|
final String cloudFlareKey;
|
||||||
final String backblazeKey;
|
final BackblazeCredential backblazeCredential;
|
||||||
final CloudFlareDomain cloudFlareDomain;
|
final CloudFlareDomain cloudFlareDomain;
|
||||||
final User rootUser;
|
final User rootUser;
|
||||||
final HetznerServerDetails hetznerServer;
|
final HetznerServerDetails hetznerServer;
|
||||||
|
@ -50,7 +50,7 @@ class AppConfigState extends Equatable {
|
||||||
AppConfigState copyWith({
|
AppConfigState copyWith({
|
||||||
String hetznerKey,
|
String hetznerKey,
|
||||||
String cloudFlareKey,
|
String cloudFlareKey,
|
||||||
String backblazeKey,
|
BackblazeCredential backblazeCredential,
|
||||||
CloudFlareDomain cloudFlareDomain,
|
CloudFlareDomain cloudFlareDomain,
|
||||||
User rootUser,
|
User rootUser,
|
||||||
HetznerServerDetails hetznerServer,
|
HetznerServerDetails hetznerServer,
|
||||||
|
@ -65,7 +65,7 @@ class AppConfigState extends Equatable {
|
||||||
AppConfigState(
|
AppConfigState(
|
||||||
hetznerKey: hetznerKey ?? this.hetznerKey,
|
hetznerKey: hetznerKey ?? this.hetznerKey,
|
||||||
cloudFlareKey: cloudFlareKey ?? this.cloudFlareKey,
|
cloudFlareKey: cloudFlareKey ?? this.cloudFlareKey,
|
||||||
backblazeKey: backblazeKey ?? this.backblazeKey,
|
backblazeCredential: backblazeCredential ?? this.backblazeCredential,
|
||||||
cloudFlareDomain: cloudFlareDomain ?? this.cloudFlareDomain,
|
cloudFlareDomain: cloudFlareDomain ?? this.cloudFlareDomain,
|
||||||
rootUser: rootUser ?? this.rootUser,
|
rootUser: rootUser ?? this.rootUser,
|
||||||
hetznerServer: hetznerServer ?? this.hetznerServer,
|
hetznerServer: hetznerServer ?? this.hetznerServer,
|
||||||
|
@ -81,7 +81,7 @@ class AppConfigState extends Equatable {
|
||||||
|
|
||||||
bool get isHetznerFilled => hetznerKey != null;
|
bool get isHetznerFilled => hetznerKey != null;
|
||||||
bool get isCloudFlareFilled => cloudFlareKey != null;
|
bool get isCloudFlareFilled => cloudFlareKey != null;
|
||||||
bool get isBackblazeFilled => backblazeKey != null;
|
bool get isBackblazeFilled => backblazeCredential != null;
|
||||||
bool get isDomainFilled => cloudFlareDomain != null;
|
bool get isDomainFilled => cloudFlareDomain != null;
|
||||||
bool get isUserFilled => rootUser != null;
|
bool get isUserFilled => rootUser != null;
|
||||||
bool get isServerFilled => hetznerServer != null;
|
bool get isServerFilled => hetznerServer != null;
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
|
||||||
import 'package:cubit_form/cubit_form.dart';
|
import 'package:cubit_form/cubit_form.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/backblaze.dart';
|
import 'package:selfprivacy/logic/api_maps/backblaze.dart';
|
||||||
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
import 'package:selfprivacy/logic/cubit/app_config/app_config_cubit.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/backblaze_credential.dart';
|
||||||
|
|
||||||
class BackblazeFormCubit extends FormCubit {
|
class BackblazeFormCubit extends FormCubit {
|
||||||
BackblazeApi apiClient = BackblazeApi();
|
BackblazeApi apiClient = BackblazeApi();
|
||||||
|
@ -35,10 +34,10 @@ class BackblazeFormCubit extends FormCubit {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOr<void> onSubmit() async {
|
FutureOr<void> onSubmit() async {
|
||||||
String encodedApiKey =
|
initializingCubit.setBackblazeKey(
|
||||||
encodeToBase64(keyId.state.value, applicationKey.state.value);
|
keyId.state.value,
|
||||||
|
applicationKey.state.value,
|
||||||
initializingCubit.setBackblazeKey(encodedApiKey);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final AppConfigCubit initializingCubit;
|
final AppConfigCubit initializingCubit;
|
||||||
|
@ -51,8 +50,10 @@ class BackblazeFormCubit extends FormCubit {
|
||||||
FutureOr<bool> asyncValidation() async {
|
FutureOr<bool> asyncValidation() async {
|
||||||
bool isKeyValid;
|
bool isKeyValid;
|
||||||
try {
|
try {
|
||||||
String encodedApiKey =
|
String encodedApiKey = encodedBackblazeKey(
|
||||||
encodeToBase64(keyId.state.value, applicationKey.state.value);
|
keyId.state.value,
|
||||||
|
applicationKey.state.value,
|
||||||
|
);
|
||||||
isKeyValid = await apiClient.isValid(encodedApiKey);
|
isKeyValid = await apiClient.isValid(encodedApiKey);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
addError(e);
|
addError(e);
|
||||||
|
@ -72,10 +73,4 @@ class BackblazeFormCubit extends FormCubit {
|
||||||
|
|
||||||
return super.close();
|
return super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
String encodeToBase64(String keyId, String applicationKey) {
|
|
||||||
String _apiKey = '$keyId:$applicationKey';
|
|
||||||
String encodedApiKey = base64.encode(utf8.encode(_apiKey));
|
|
||||||
return encodedApiKey;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -19,8 +19,8 @@ class HetznerServerDetailsAdapter extends TypeAdapter<HetznerServerDetails> {
|
||||||
return HetznerServerDetails(
|
return HetznerServerDetails(
|
||||||
ip4: fields[0] as String,
|
ip4: fields[0] as String,
|
||||||
id: fields[1] as int,
|
id: fields[1] as int,
|
||||||
startTime: fields[2] as DateTime,
|
|
||||||
createTime: fields[3] as DateTime,
|
createTime: fields[3] as DateTime,
|
||||||
|
startTime: fields[2] as DateTime,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,10 +32,10 @@ class HetznerServerDetailsAdapter extends TypeAdapter<HetznerServerDetails> {
|
||||||
..write(obj.ip4)
|
..write(obj.ip4)
|
||||||
..writeByte(1)
|
..writeByte(1)
|
||||||
..write(obj.id)
|
..write(obj.id)
|
||||||
..writeByte(2)
|
|
||||||
..write(obj.startTime)
|
|
||||||
..writeByte(3)
|
..writeByte(3)
|
||||||
..write(obj.createTime);
|
..write(obj.createTime)
|
||||||
|
..writeByte(2)
|
||||||
|
..write(obj.startTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
Loading…
Reference in New Issue