2021-01-28 17:58:17 +00:00
|
|
|
import 'dart:io';
|
2021-01-15 17:41:30 +00:00
|
|
|
import 'package:cake_wallet/core/backup_service.dart';
|
2021-01-13 16:43:34 +00:00
|
|
|
import 'package:cake_wallet/core/execution_state.dart';
|
|
|
|
import 'package:cake_wallet/entities/secret_store_key.dart';
|
|
|
|
import 'package:cake_wallet/store/secret_store.dart';
|
|
|
|
import 'package:flutter/foundation.dart';
|
2023-03-30 22:33:59 +00:00
|
|
|
import 'package:cake_wallet/core/secure_storage.dart';
|
2021-01-13 16:43:34 +00:00
|
|
|
import 'package:mobx/mobx.dart';
|
2021-01-29 20:18:07 +00:00
|
|
|
import 'package:intl/intl.dart';
|
2022-02-02 12:40:40 +00:00
|
|
|
import 'package:cake_wallet/wallet_type_utils.dart';
|
2022-10-26 19:28:27 +00:00
|
|
|
import 'package:path_provider/path_provider.dart';
|
2021-01-13 16:43:34 +00:00
|
|
|
|
|
|
|
part 'backup_view_model.g.dart';
|
|
|
|
|
|
|
|
class BackupExportFile {
|
2022-10-12 17:09:57 +00:00
|
|
|
BackupExportFile(this.content, {required this.name});
|
2021-01-13 16:43:34 +00:00
|
|
|
|
|
|
|
final String name;
|
|
|
|
final List<int> content;
|
|
|
|
}
|
|
|
|
|
|
|
|
class BackupViewModel = BackupViewModelBase with _$BackupViewModel;
|
|
|
|
|
|
|
|
abstract class BackupViewModelBase with Store {
|
|
|
|
BackupViewModelBase(this.secureStorage, this.secretStore, this.backupService)
|
2022-10-12 17:09:57 +00:00
|
|
|
: isBackupPasswordVisible = false,
|
|
|
|
backupPassword = '',
|
|
|
|
state = InitialExecutionState() {
|
2021-01-13 16:43:34 +00:00
|
|
|
final key = generateStoreKeyFor(key: SecretStoreKey.backupPassword);
|
|
|
|
secretStore.values.observe((change) {
|
|
|
|
if (change.key == key) {
|
|
|
|
backupPassword = secretStore.read(key);
|
|
|
|
}
|
|
|
|
}, fireImmediately: true);
|
|
|
|
}
|
|
|
|
|
2023-03-30 22:33:59 +00:00
|
|
|
final SecureStorage secureStorage;
|
2021-01-13 16:43:34 +00:00
|
|
|
final SecretStore secretStore;
|
|
|
|
final BackupService backupService;
|
|
|
|
|
|
|
|
@observable
|
|
|
|
ExecutionState state;
|
|
|
|
|
|
|
|
@observable
|
|
|
|
bool isBackupPasswordVisible;
|
|
|
|
|
|
|
|
@observable
|
|
|
|
String backupPassword;
|
|
|
|
|
|
|
|
@action
|
|
|
|
Future<void> init() async {
|
|
|
|
final key = generateStoreKeyFor(key: SecretStoreKey.backupPassword);
|
2022-10-12 17:09:57 +00:00
|
|
|
backupPassword = (await secureStorage.read(key: key))!;
|
2021-01-13 16:43:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@action
|
2022-10-12 17:09:57 +00:00
|
|
|
Future<BackupExportFile?> exportBackup() async {
|
2021-01-13 16:43:34 +00:00
|
|
|
try {
|
|
|
|
state = IsExecutingState();
|
2021-01-15 17:41:30 +00:00
|
|
|
final backupContent = await backupService.exportBackup(backupPassword);
|
2021-01-13 16:43:34 +00:00
|
|
|
state = ExecutedSuccessfullyState();
|
2021-01-29 20:18:07 +00:00
|
|
|
final now = DateTime.now();
|
|
|
|
final formatter = DateFormat('yyyy-MM-dd_Hm');
|
2022-02-02 12:40:40 +00:00
|
|
|
final snakeAppName = approximatedAppName.replaceAll(' ', '_').toLowerCase();
|
|
|
|
final fileName = '${snakeAppName}_backup_${formatter.format(now)}';
|
2021-01-13 16:43:34 +00:00
|
|
|
|
2022-02-02 12:40:40 +00:00
|
|
|
return BackupExportFile(backupContent.toList(), name: fileName);
|
2021-01-13 16:43:34 +00:00
|
|
|
} catch (e) {
|
|
|
|
print(e.toString());
|
|
|
|
state = FailureState(e.toString());
|
2021-01-15 17:41:30 +00:00
|
|
|
return null;
|
2021-01-13 16:43:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-26 19:28:27 +00:00
|
|
|
Future<String> saveBackupFileLocally(BackupExportFile backup) async {
|
|
|
|
final appDir = await getApplicationDocumentsDirectory();
|
|
|
|
final path = '${appDir.path}/${backup.name}';
|
|
|
|
final backupFile = File(path);
|
|
|
|
await backupFile.writeAsBytes(backup.content);
|
|
|
|
return path;
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> removeBackupFileLocally(BackupExportFile backup) async {
|
|
|
|
final appDir = await getApplicationDocumentsDirectory();
|
|
|
|
final path = '${appDir.path}/${backup.name}';
|
|
|
|
final backupFile = File(path);
|
|
|
|
await backupFile.delete();
|
|
|
|
}
|
|
|
|
|
2021-01-13 16:43:34 +00:00
|
|
|
@action
|
|
|
|
void showMasterPassword() => isBackupPasswordVisible = true;
|
2021-01-28 17:58:17 +00:00
|
|
|
|
|
|
|
@action
|
|
|
|
Future<void> saveToDownload(String name, List<int> content) async {
|
|
|
|
const downloadDirPath = '/storage/emulated/0/Download'; // For Android
|
|
|
|
final filePath = '$downloadDirPath/${name}';
|
|
|
|
final file = File(filePath);
|
|
|
|
await file.writeAsBytes(content);
|
|
|
|
}
|
2021-01-13 16:43:34 +00:00
|
|
|
}
|