fix: Allow unencrypted database if gnome keyring not present or platform does not support it

pull/1017/head
krille-chan 11 months ago
parent 5128785c66
commit d14276f5a9
No known key found for this signature in database

@ -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 {
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(),
);
return password!; await store.setBool(SettingKeys.noEncryptionWarningShown, true);
} }

Loading…
Cancel
Save