From 4c6bae722ec60314e51b4260044eef4c24098c13 Mon Sep 17 00:00:00 2001 From: TheOneWithTheBraid Date: Thu, 13 Jan 2022 13:44:48 +0100 Subject: [PATCH] fix: Seahorse does not properly work on many Linux devices - stop use of `flutter_secure_storage` for Linux in favor of unencrypted storage Unlike many other platforms, many Linux distributions have built-in support for FDE or home directory encryption. As long as `flutter_secure_storage` makes FluffyChat useles on many Linuxes, this seems to be the only solution until they stop using Seahorse. Signed-off-by: TheOneWithTheBraid --- lib/pages/add_story/add_story.dart | 6 +++--- lib/pages/add_story/add_story_view.dart | 2 +- .../matrix_sdk_extensions.dart/fluffybox_database.dart | 2 ++ .../flutter_matrix_hive_database.dart | 2 +- lib/widgets/lock_screen.dart | 9 +++++++-- lib/widgets/matrix.dart | 10 ++++++++-- pubspec.lock | 4 ++-- pubspec.yaml | 1 + 8 files changed, 25 insertions(+), 11 deletions(-) diff --git a/lib/pages/add_story/add_story.dart b/lib/pages/add_story/add_story.dart index cf4c15ec..23e43ced 100644 --- a/lib/pages/add_story/add_story.dart +++ b/lib/pages/add_story/add_story.dart @@ -39,11 +39,11 @@ class AddStoryController extends State { bool get hasMedia => image != null || video != null; - void updateColors(String text) => hasMedia + void updateColors() => hasMedia ? null : setState(() { - backgroundColor = text.color; - backgroundColorDark = text.darkColor; + backgroundColor = controller.text.color; + backgroundColorDark = controller.text.darkColor; }); void importMedia() async { diff --git a/lib/pages/add_story/add_story_view.dart b/lib/pages/add_story/add_story_view.dart index 5508c301..84b0f4c8 100644 --- a/lib/pages/add_story/add_story_view.dart +++ b/lib/pages/add_story/add_story_view.dart @@ -98,7 +98,7 @@ class AddStoryView extends StatelessWidget { color: Colors.white, backgroundColor: !controller.hasMedia ? null : Colors.black, ), - onChanged: controller.updateColors, + onEditingComplete: controller.updateColors, decoration: InputDecoration( border: InputBorder.none, hintText: controller.hasMedia diff --git a/lib/utils/matrix_sdk_extensions.dart/fluffybox_database.dart b/lib/utils/matrix_sdk_extensions.dart/fluffybox_database.dart index 3c74812e..89a6d42a 100644 --- a/lib/utils/matrix_sdk_extensions.dart/fluffybox_database.dart +++ b/lib/utils/matrix_sdk_extensions.dart/fluffybox_database.dart @@ -40,6 +40,8 @@ class FlutterFluffyBoxDatabase extends FluffyBoxDatabase { final containsEncryptionKey = await secureStorage.containsKey(key: _cipherStorageKey); if (!containsEncryptionKey) { + // do not try to create a buggy secure storage for new Linux users + if (Platform.isLinux) throw MissingPluginException(); final key = Hive.generateSecureKey(); await secureStorage.write( key: _cipherStorageKey, diff --git a/lib/utils/matrix_sdk_extensions.dart/flutter_matrix_hive_database.dart b/lib/utils/matrix_sdk_extensions.dart/flutter_matrix_hive_database.dart index cbe14b2e..3ee56bde 100644 --- a/lib/utils/matrix_sdk_extensions.dart/flutter_matrix_hive_database.dart +++ b/lib/utils/matrix_sdk_extensions.dart/flutter_matrix_hive_database.dart @@ -31,7 +31,7 @@ class FlutterMatrixHiveStore extends FamedlySdkHiveDatabase { HiveCipher hiverCipher; try { // Workaround for secure storage is calling Platform.operatingSystem on web - if (kIsWeb) throw MissingPluginException(); + if (kIsWeb || Platform.isLinux) throw MissingPluginException(); const secureStorage = FlutterSecureStorage(); final containsEncryptionKey = diff --git a/lib/widgets/lock_screen.dart b/lib/widgets/lock_screen.dart index 52853b55..429d8a2c 100644 --- a/lib/widgets/lock_screen.dart +++ b/lib/widgets/lock_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter_app_lock/flutter_app_lock.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:pin_code_text_field/pin_code_text_field.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; @@ -71,8 +72,12 @@ class _LockScreenState extends State { hasError: _wrongInput, onDone: (String input) async { if (input == - await const FlutterSecureStorage() - .read(key: SettingKeys.appLockKey)) { + await ([TargetPlatform.linux] + .contains(Theme.of(context).platform) + ? SharedPreferences.getInstance().then((prefs) => + prefs.getString(SettingKeys.appLockKey)) + : const FlutterSecureStorage() + .read(key: SettingKeys.appLockKey))) { AppLock.of(context).didUnlock(); } else { _textEditingController.clear(); diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 8ab087ae..81d29153 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -14,6 +14,7 @@ import 'package:http/http.dart' as http; import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:universal_html/html.dart' as html; import 'package:url_launcher/url_launcher.dart'; import 'package:vrouter/vrouter.dart'; @@ -32,6 +33,8 @@ import '../utils/background_push.dart'; import '../utils/famedlysdk_store.dart'; import '../utils/platform_infos.dart'; +// import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + class Matrix extends StatefulWidget { static const String callNamespace = 'chat.fluffy.jitsi_call'; @@ -407,8 +410,11 @@ class MatrixState extends State with WidgetsBindingObserver { // Display the app lock if (PlatformInfos.isMobile) { WidgetsBinding.instance.addPostFrameCallback((_) { - const FlutterSecureStorage() - .read(key: SettingKeys.appLockKey) + ([TargetPlatform.linux].contains(Theme.of(context).platform) + ? SharedPreferences.getInstance() + .then((prefs) => prefs.getString(SettingKeys.appLockKey)) + : const FlutterSecureStorage() + .read(key: SettingKeys.appLockKey)) .then((lock) { if (lock?.isNotEmpty ?? false) { AppLock.of(widget.context).enable(); diff --git a/pubspec.lock b/pubspec.lock index b1953bb7..a0cd211a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1233,12 +1233,12 @@ packages: source: hosted version: "2.0.4" shared_preferences: - dependency: transitive + dependency: "direct main" description: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.12" shared_preferences_android: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ff545285..82aaea8b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -66,6 +66,7 @@ dependencies: scroll_to_index: ^2.1.0 sentry: ^6.0.1 share: ^2.0.4 + shared_preferences: ^2.0.12 slugify: ^2.0.0 swipe_to_action: ^0.2.0 uni_links: ^0.5.1