Merge pull request #1017 from krille-chan/krille/allow-unencrypted-database
fix: Allow unencrypted database if gnome keyring not present or platform does not support it
This commit is contained in:
commit
783296fedd
4 changed files with 39 additions and 15 deletions
|
|
@ -2601,5 +2601,6 @@
|
||||||
"appname": {},
|
"appname": {},
|
||||||
"unread": {}
|
"unread": {}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"noDatabaseEncryption": "Database encryption is not supported on this platform"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,4 +30,6 @@ abstract class SettingKeys {
|
||||||
static const String showPresences = 'chat.fluffy.show_presences';
|
static const String showPresences = 'chat.fluffy.show_presences';
|
||||||
static const String displayChatDetailsColumn =
|
static const String displayChatDetailsColumn =
|
||||||
'chat.fluffy.display_chat_details_column';
|
'chat.fluffy.display_chat_details_column';
|
||||||
|
static const String noEncryptionWarningShown =
|
||||||
|
'chat.fluffy.no_encryption_warning_shown';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -81,21 +81,23 @@ Future<MatrixSdkDatabase> _constructDatabase(Client client) async {
|
||||||
|
|
||||||
// in case we got a cipher, we use the encryption helper
|
// in case we got a cipher, we use the encryption helper
|
||||||
// to manage SQLite encryption
|
// to manage SQLite encryption
|
||||||
final helper = SQfLiteEncryptionHelper(
|
final helper = cipher == null
|
||||||
factory: factory,
|
? null
|
||||||
path: path,
|
: SQfLiteEncryptionHelper(
|
||||||
cipher: cipher,
|
factory: factory,
|
||||||
);
|
path: path,
|
||||||
|
cipher: cipher,
|
||||||
|
);
|
||||||
|
|
||||||
// check whether the DB is already encrypted and otherwise do so
|
// check whether the DB is already encrypted and otherwise do so
|
||||||
await helper.ensureDatabaseFileEncrypted();
|
await helper?.ensureDatabaseFileEncrypted();
|
||||||
|
|
||||||
final database = await factory.openDatabase(
|
final database = await factory.openDatabase(
|
||||||
path,
|
path,
|
||||||
options: OpenDatabaseOptions(
|
options: OpenDatabaseOptions(
|
||||||
version: 1,
|
version: 1,
|
||||||
// most important : apply encryption when opening the DB
|
// most important : apply encryption when opening the DB
|
||||||
onConfigure: helper.applyPragmaKey,
|
onConfigure: helper?.applyPragmaKey,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,20 @@
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
|
import 'package:fluffychat/config/setting_keys.dart';
|
||||||
|
import 'package:fluffychat/utils/client_manager.dart';
|
||||||
|
|
||||||
const _passwordStorageKey = 'database_password';
|
const _passwordStorageKey = 'database_password';
|
||||||
|
|
||||||
Future<String> getDatabaseCipher() async {
|
Future<String?> getDatabaseCipher() async {
|
||||||
String? password;
|
String? password;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
@ -28,21 +34,34 @@ Future<String> getDatabaseCipher() async {
|
||||||
// workaround for if we just wrote to the key and it still doesn't exist
|
// workaround for if we just wrote to the key and it still doesn't exist
|
||||||
password = await secureStorage.read(key: _passwordStorageKey);
|
password = await secureStorage.read(key: _passwordStorageKey);
|
||||||
if (password == null) throw MissingPluginException();
|
if (password == null) throw MissingPluginException();
|
||||||
} on MissingPluginException catch (_) {
|
} on MissingPluginException catch (e) {
|
||||||
const FlutterSecureStorage()
|
const FlutterSecureStorage()
|
||||||
.delete(key: _passwordStorageKey)
|
.delete(key: _passwordStorageKey)
|
||||||
.catchError((_) {});
|
.catchError((_) {});
|
||||||
Logs().i('Database encryption is not supported on this platform');
|
Logs().w('Database encryption is not supported on this platform', e);
|
||||||
|
_sendNoEncryptionWarning(e);
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
const FlutterSecureStorage()
|
const FlutterSecureStorage()
|
||||||
.delete(key: _passwordStorageKey)
|
.delete(key: _passwordStorageKey)
|
||||||
.catchError((_) {});
|
.catchError((_) {});
|
||||||
Logs().w('Unable to init database encryption', e, s);
|
Logs().w('Unable to init database encryption', e, s);
|
||||||
|
_sendNoEncryptionWarning(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// with the new database, we should no longer allow unencrypted storage
|
return password;
|
||||||
// secure_storage now supports all platforms we support
|
}
|
||||||
assert(password != null);
|
|
||||||
|
void _sendNoEncryptionWarning(Object exception) async {
|
||||||
return password!;
|
final store = await SharedPreferences.getInstance();
|
||||||
|
final isStored = store.getBool(SettingKeys.noEncryptionWarningShown);
|
||||||
|
|
||||||
|
if (isStored == true) return;
|
||||||
|
|
||||||
|
final l10n = lookupL10n(PlatformDispatcher.instance.locale);
|
||||||
|
ClientManager.sendInitNotification(
|
||||||
|
l10n.noDatabaseEncryption,
|
||||||
|
exception.toString(),
|
||||||
|
);
|
||||||
|
|
||||||
|
await store.setBool(SettingKeys.noEncryptionWarningShown, true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue