From 9f9f52fa02dd5773e0fe7133d157ace810134300 Mon Sep 17 00:00:00 2001 From: Krille Date: Tue, 4 Feb 2025 15:07:07 +0100 Subject: [PATCH] feat: Pick share keys with --- lib/config/setting_keys.dart | 1 + .../settings_security/settings_security.dart | 11 ++++++ .../settings_security_view.dart | 38 +++++++++++++++++++ lib/utils/client_manager.dart | 12 +++++- lib/widgets/matrix.dart | 1 + pubspec.lock | 7 ++-- pubspec.yaml | 4 +- 7 files changed, 67 insertions(+), 7 deletions(-) diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index 7c0e50df8..6d30298dd 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -34,4 +34,5 @@ abstract class SettingKeys { 'chat.fluffy.display_chat_details_column'; static const String noEncryptionWarningShown = 'chat.fluffy.no_encryption_warning_shown'; + static const String shareKeysWith = 'chat.fluffy.share_keys_with'; } diff --git a/lib/pages/settings_security/settings_security.dart b/lib/pages/settings_security/settings_security.dart index 18625dc04..970aa2988 100644 --- a/lib/pages/settings_security/settings_security.dart +++ b/lib/pages/settings_security/settings_security.dart @@ -1,3 +1,4 @@ +import 'package:fluffychat/config/setting_keys.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -108,6 +109,16 @@ class SettingsSecurityController extends State { Future dehydrateAction() => Matrix.of(context).dehydrateAction(context); + void changeShareKeysWith(ShareKeysWith? shareKeysWith) async { + if (shareKeysWith == null) return; + Matrix.of(context).store.setString( + SettingKeys.shareKeysWith, + shareKeysWith.name, + ); + Matrix.of(context).client.shareKeysWith = shareKeysWith; + setState(() {}); + } + @override Widget build(BuildContext context) => SettingsSecurityView(this); } diff --git a/lib/pages/settings_security/settings_security_view.dart b/lib/pages/settings_security/settings_security_view.dart index e26f1deef..144ee2d5a 100644 --- a/lib/pages/settings_security/settings_security_view.dart +++ b/lib/pages/settings_security/settings_security_view.dart @@ -10,6 +10,7 @@ import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/settings_switch_list_tile.dart'; +import 'package:matrix/matrix.dart'; import 'settings_security.dart'; class SettingsSecurityView extends StatelessWidget { @@ -88,6 +89,43 @@ class SettingsSecurityView extends StatelessWidget { ), }, Divider(color: theme.dividerColor), + ListTile( + title: Text( + 'Share keys with', + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text( + 'Which devices should be trusted so that they can read along your messages in encrypted chats?', + ), + ), + ListTile( + title: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + color: theme.colorScheme.onInverseSurface, + child: DropdownButton( + isExpanded: true, + padding: const EdgeInsets.symmetric(horizontal: 8.0), + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + underline: const SizedBox.shrink(), + value: Matrix.of(context).client.shareKeysWith, + items: ShareKeysWith.values + .map( + (share) => DropdownMenuItem( + value: share, + child: Text(share.name), + ), + ) + .toList(), + onChanged: controller.changeShareKeysWith, + ), + ), + ), + Divider(color: theme.dividerColor), ListTile( title: Text( L10n.of(context).account, diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index d6bc69669..450a280a2 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -1,5 +1,7 @@ import 'dart:io'; +import 'package:collection/collection.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:flutter/foundation.dart'; import 'package:desktop_notifications/desktop_notifications.dart'; @@ -43,7 +45,8 @@ abstract class ClientManager { clientNames.add(PlatformInfos.clientName); await store.setStringList(clientNamespace, clientNames.toList()); } - final clients = clientNames.map(createClient).toList(); + final clients = + clientNames.map((name) => createClient(name, store)).toList(); if (initialize) { await Future.wait( clients.map( @@ -97,7 +100,9 @@ abstract class ClientManager { ? const NativeImplementationsDummy() : NativeImplementationsIsolate(compute); - static Client createClient(String clientName) { + static Client createClient(String clientName, SharedPreferences store) { + final shareKeysWith = store.getString(SettingKeys.shareKeysWith) ?? 'all'; + return Client( clientName, httpClient: @@ -122,6 +127,9 @@ abstract class ClientManager { customImageResizer: PlatformInfos.isMobile ? customImageResizer : null, defaultNetworkRequestTimeout: const Duration(minutes: 30), enableDehydratedDevices: true, + shareKeysWith: ShareKeysWith.values + .singleWhereOrNull((share) => share.name == shareKeysWith) ?? + ShareKeysWith.all, ); } diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 677bfb744..125ec0b49 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -154,6 +154,7 @@ class MatrixState extends State with WidgetsBindingObserver { } final candidate = _loginClientCandidate ??= ClientManager.createClient( '${AppConfig.applicationName}-${DateTime.now().millisecondsSinceEpoch}', + store, )..onLoginStateChanged .stream .where((l) => l == LoginState.loggedIn) diff --git a/pubspec.lock b/pubspec.lock index b423ecb40..8e4ef09e6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1125,10 +1125,9 @@ packages: matrix: dependency: "direct main" description: - name: matrix - sha256: "519e1d18623f741de5aa984a9d04cf3f660149d1e167fa06e17ddec8cec5f52d" - url: "https://pub.dev" - source: hosted + path: "../matrix-dart-sdk" + relative: true + source: path version: "0.37.0" meta: dependency: transitive diff --git a/pubspec.yaml b/pubspec.yaml index 606b7e961..6e58d291e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -152,4 +152,6 @@ msix_config: install_certificate: false dependency_overrides: - win32: 5.5.3 \ No newline at end of file + win32: 5.5.3 + matrix: + path: ../matrix-dart-sdk/ \ No newline at end of file