-
Notifications
You must be signed in to change notification settings - Fork 1
/
storage_service.dart
86 lines (70 loc) · 3.06 KB
/
storage_service.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import 'dart:convert';
import 'dart:io';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:get_it/get_it.dart';
import 'package:path_provider/path_provider.dart';
import 'package:secretum/main.dart';
import 'package:secretum/models/enums/log_type.dart';
import 'package:secretum/models/secret.dart';
import 'package:secretum/services/encryption_service.dart';
class StorageService {
static const String _kSecretKey = 'secretKey';
final EncryptionService _encryptionService;
final FlutterSecureStorage _flutterSecureStorage;
StorageService({FlutterSecureStorage? flutterSecureStorage})
: this._encryptionService = GetIt.instance<EncryptionService>(),
this._flutterSecureStorage = flutterSecureStorage ?? FlutterSecureStorage();
/// Not hashed and not encrypted secretKey (raw)
Future<String?> getSecretKey() async {
final String? secretKey = await _flutterSecureStorage.read(key: _kSecretKey);
print(secretKey);
if (secretKey != null) {
loggingService.log('StorageService.getSecretKey: SecretKey retrieved: $secretKey');
return secretKey;
} else {
loggingService.log('StorageService.getSecretKey: SecretKey is null');
return null;
}
}
/// Not hashed and not encrypted secretKey (raw)
Future<void> initSecretKey(String secretKey) async {
await _flutterSecureStorage.write(key: _kSecretKey, value: secretKey);
_encryptionService.updateSecretKey(secretKey);
loggingService.log("StorageService.initSecretKey: SecretKey init'd. $secretKey");
}
Future<String> exportBackup(List<Secret> secrets, String fileName) async {
final Directory directory = await getBackupsDirectory();
final File file = File('${directory.path}/$fileName.txt');
final List<Map<String, dynamic>> secretsJson = secrets.map((e) => e.toJson()).toList();
final String secretsJsonString = json.encode(secretsJson);
await file.writeAsString(secretsJsonString);
return file.path;
}
Future<void> resetStorage() async {
await _flutterSecureStorage.deleteAll();
_encryptionService.updateSecretKey('');
await deleteBackupFiles();
loggingService.log('StorageService.resetStorage: Storage reset');
}
Future<bool> deleteBackupFiles() async {
final Directory directory = await getBackupsDirectory();
try {
await directory.delete(recursive: true);
return true;
} catch (e) {
loggingService.log('StorageService.deleteBackupFiles: Cannot delete backups. Exception: $e', logType: LogType.error);
return false;
}
}
Future<Directory> getBackupsDirectory() async {
final Directory directory = await getApplicationDocumentsDirectory();
// Cannot simply use root, because if we try to delete it, iOS throws an error
final Directory backupsDirectory = Directory('${directory.path}/backups');
final bool doesDirectoryExists = await backupsDirectory.exists();
// Very first time directory does not exist, therefore create it
if (!doesDirectoryExists) {
await backupsDirectory.create();
}
return backupsDirectory;
}
}