From 46d77bff5d1ce1bd8bebdb5f97e42eb74da3320e Mon Sep 17 00:00:00 2001 From: Krille Fear Date: Mon, 26 Dec 2022 17:47:08 +0100 Subject: [PATCH] design: New encryption page --- assets/encryption.png | Bin 0 -> 52175 bytes assets/l10n/intl_en.arb | 7 +- lib/config/app_config.dart | 2 + lib/pages/chat/encryption_button.dart | 108 ++---- .../chat_encryption_settings.dart | 94 ++++-- .../chat_encryption_settings_view.dart | 317 ++++++++---------- lib/widgets/fluffy_chat_app.dart | 1 + 7 files changed, 236 insertions(+), 293 deletions(-) create mode 100644 assets/encryption.png diff --git a/assets/encryption.png b/assets/encryption.png new file mode 100644 index 0000000000000000000000000000000000000000..af2ba3c24b39bc2eddf1ade05138c87ca3d125df GIT binary patch literal 52175 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

Vo*Zr5mq2hHiQC&|ke{mM!0hP+rkKG=aOb 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 N002ovPDHLkV1iDDO|Sp} literal 0 HcmV?d00001 diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 6d0e93469..c5c0579e4 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -2979,5 +2979,10 @@ "oldDisplayName": {} } }, - "newSpaceDescription": "Spaces allows you to consolidate your chats and build private or public communities." + "newSpaceDescription": "Spaces allows you to consolidate your chats and build private or public communities.", + "encryptThisChat": "Encrypt this chat", + "endToEndEncryption": "End to end encryption", + "disableEncryptionWarning": "For security reasons you can not disable encryption in a chat, where it has been enabled before.", + "sorryThatsNotPossible": "Sorry... that is not possible", + "deviceKeys": "Device keys:" } diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index 41683a6bb..bfe4c449b 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -24,6 +24,8 @@ abstract class AppConfig { static String get privacyUrl => _privacyUrl; static const String enablePushTutorial = 'https://gitlab.com/famedly/fluffychat/-/wikis/Push-Notifications-without-Google-Services'; + static const String encryptionTutorial = + 'https://gitlab.com/famedly/fluffychat/-/wikis/How-to-use-end-to-end-encryption-in-FluffyChat'; static const String appId = 'im.fluffychat.FluffyChat'; static const String appOpenUrlScheme = 'im.fluffychat'; static String _webBaseUrl = 'https://fluffychat.im/web'; diff --git a/lib/pages/chat/encryption_button.dart b/lib/pages/chat/encryption_button.dart index 2d3edee6d..1c4bef335 100644 --- a/lib/pages/chat/encryption_button.dart +++ b/lib/pages/chat/encryption_button.dart @@ -1,93 +1,45 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; import 'package:vrouter/vrouter.dart'; import '../../widgets/matrix.dart'; -class EncryptionButton extends StatefulWidget { +class EncryptionButton extends StatelessWidget { final Room room; const EncryptionButton(this.room, {Key? key}) : super(key: key); - @override - EncryptionButtonState createState() => EncryptionButtonState(); -} - -class EncryptionButtonState extends State { - StreamSubscription? _onSyncSub; - - void _enableEncryptionAction() async { - if (widget.room.encrypted) { - VRouter.of(context).toSegments(['rooms', widget.room.id, 'encryption']); - return; - } - if (widget.room.joinRules == JoinRules.public) { - await showOkAlertDialog( - useRootNavigator: false, - context: context, - okLabel: L10n.of(context)!.ok, - message: L10n.of(context)!.noEncryptionForPublicRooms, - ); - return; - } - if (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.enableEncryption, - message: widget.room.client.encryptionEnabled - ? L10n.of(context)!.enableEncryptionWarning - : L10n.of(context)!.needPantalaimonWarning, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.ok) { - await showFutureLoadingDialog( - context: context, - future: () => widget.room.enableEncryption(), - ); - // we want to enable the lock icon - setState(() {}); - } - } - - @override - void dispose() { - _onSyncSub?.cancel(); - super.dispose(); - } @override Widget build(BuildContext context) { - if (widget.room.encrypted) { - _onSyncSub ??= Matrix.of(context) - .client - .onSync - .stream - .where((s) => s.deviceLists != null) - .listen((s) => setState(() {})); - } - return FutureBuilder( - future: widget.room.calcEncryptionHealthState(), - builder: (BuildContext context, snapshot) => IconButton( - tooltip: widget.room.encrypted - ? L10n.of(context)!.encrypted - : L10n.of(context)!.encryptionNotEnabled, - icon: Icon( - widget.room.encrypted - ? Icons.lock_outlined - : Icons.lock_open_outlined, - size: 20, - color: widget.room.joinRules != JoinRules.public && - !widget.room.encrypted - ? Colors.red - : snapshot.data == EncryptionHealthState.unverifiedDevices - ? Colors.orange - : null), - onPressed: _enableEncryptionAction, - )); + return StreamBuilder( + stream: Matrix.of(context) + .client + .onSync + .stream + .where((s) => s.deviceLists != null), + builder: (context, snapshot) { + return FutureBuilder( + future: room.calcEncryptionHealthState(), + builder: (BuildContext context, snapshot) => IconButton( + tooltip: room.encrypted + ? L10n.of(context)!.encrypted + : L10n.of(context)!.encryptionNotEnabled, + icon: Icon( + room.encrypted + ? Icons.lock_outlined + : Icons.lock_open_outlined, + size: 20, + color: room.joinRules != JoinRules.public && + !room.encrypted + ? Colors.red + : snapshot.data == + EncryptionHealthState.unverifiedDevices + ? Colors.orange + : null), + onPressed: () => VRouter.of(context) + .toSegments(['rooms', room.id, 'encryption']), + )); + }); } } diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart index 5892cf9bc..b85a672be 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart @@ -1,5 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:adaptive_dialog/adaptive_dialog.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; import 'package:vrouter/vrouter.dart'; @@ -19,49 +22,68 @@ class ChatEncryptionSettings extends StatefulWidget { class ChatEncryptionSettingsController extends State { String? get roomId => VRouter.of(context).pathParameters['roomid']; + Room get room => Matrix.of(context).client.getRoomById(roomId!)!; + Future unblock(DeviceKeys key) async { if (key.blocked) { await key.setBlocked(false); } } - Future onSelected( - BuildContext context, String action, DeviceKeys key) async { - final room = Matrix.of(context).client.getRoomById(roomId!); - switch (action) { - case 'verify': - await unblock(key); - final req = key.startVerification(); - req.onUpdate = () { - if (req.state == KeyVerificationState.done) { - setState(() {}); - } - }; - await KeyVerificationDialog(request: req).show(context); - break; - case 'verify_user': - await unblock(key); - final req = - await room!.client.userDeviceKeys[key.userId]!.startVerification(); - req.onUpdate = () { - if (req.state == KeyVerificationState.done) { - setState(() {}); - } - }; - await KeyVerificationDialog(request: req).show(context); - break; - case 'block': - if (key.directVerified) { - await key.setVerified(false); - } - await key.setBlocked(true); - setState(() {}); - break; - case 'unblock': - await unblock(key); - setState(() {}); - break; + void enableEncryption(_) async { + if (room.encrypted) { + showOkAlertDialog( + context: context, + title: L10n.of(context)!.sorryThatsNotPossible, + message: L10n.of(context)!.disableEncryptionWarning, + ); + return; + } + if (room.joinRules == JoinRules.public) { + showOkAlertDialog( + context: context, + title: L10n.of(context)!.sorryThatsNotPossible, + message: L10n.of(context)!.noEncryptionForPublicRooms, + ); + return; + } + if (!room.canChangeStateEvent(EventTypes.Encryption)) { + showOkAlertDialog( + context: context, + title: L10n.of(context)!.sorryThatsNotPossible, + message: L10n.of(context)!.noPermission, + ); + return; } + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context)!.areYouSure, + message: L10n.of(context)!.enableEncryptionWarning, + okLabel: L10n.of(context)!.yes, + cancelLabel: L10n.of(context)!.cancel, + ); + if (consent != OkCancelResult.ok) return; + await showFutureLoadingDialog( + context: context, + future: () => room.enableEncryption(), + ); + } + + void startVerification() async { + final req = await room.client.userDeviceKeys[room.directChatMatrixID]! + .startVerification(); + req.onUpdate = () { + if (req.state == KeyVerificationState.done) { + setState(() {}); + } + }; + await KeyVerificationDialog(request: req).show(context); + } + + void toggleDeviceKey(DeviceKeys key) { + setState(() { + key.setBlocked(!key.blocked); + }); } @override diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart index 71cd6abb7..2f5fc360c 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart @@ -2,14 +2,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher.dart'; import 'package:vrouter/vrouter.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/layouts/max_width_body.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/matrix_sdk_extensions.dart/device_extension.dart'; -import '../../widgets/m2_popup_menu_button.dart'; class ChatEncryptionSettingsView extends StatelessWidget { final ChatEncryptionSettingsController controller; @@ -19,184 +16,148 @@ class ChatEncryptionSettingsView extends StatelessWidget { @override Widget build(BuildContext context) { - final room = Matrix.of(context).client.getRoomById(controller.roomId!)!; - - return Scaffold( - appBar: AppBar( - leading: IconButton( - icon: const Icon(Icons.close_outlined), - onPressed: () => - VRouter.of(context).toSegments(['rooms', controller.roomId!]), - ), - title: Text(L10n.of(context)!.tapOnDeviceToVerify), - elevation: 0, - ), - body: MaxWidthBody( - withScrolling: true, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - title: Text(L10n.of(context)!.deviceVerifyDescription), - leading: CircleAvatar( - backgroundColor: Theme.of(context).secondaryHeaderColor, - foregroundColor: Theme.of(context).colorScheme.secondary, - child: const Icon(Icons.lock), + final room = controller.room; + return StreamBuilder( + stream: room.client.onSync.stream.where( + (s) => s.rooms?.join?[room.id] != null || s.deviceLists != null), + builder: (context, _) => Scaffold( + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.close_outlined), + onPressed: () => VRouter.of(context) + .toSegments(['rooms', controller.roomId!]), + ), + title: Text(L10n.of(context)!.endToEndEncryption), + actions: [ + TextButton( + onPressed: () => launch(AppConfig.encryptionTutorial), + child: Text(L10n.of(context)!.help), + ), + ], ), - ), - const Divider(height: 1), - StreamBuilder( - stream: room.onUpdate.stream, - builder: (context, snapshot) { - return FutureBuilder>( - future: room.getUserDeviceKeys(), - builder: (BuildContext context, snapshot) { - if (snapshot.hasError) { - return Center( - child: Text( - '${L10n.of(context)!.oopsSomethingWentWrong}: ${snapshot.error}'), - ); - } - if (!snapshot.hasData) { - return const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2)); - } - final deviceKeys = snapshot.data!; - return ListView.builder( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: deviceKeys.length, - itemBuilder: (BuildContext context, int i) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - if (i == 0 || - deviceKeys[i].userId != - deviceKeys[i - 1].userId) ...{ - const Divider(height: 1, thickness: 1), - M2PopupMenuButton( - onSelected: (dynamic action) => controller - .onSelected(context, action, deviceKeys[i]), - itemBuilder: (c) { - final items = >[]; - if (room - .client - .userDeviceKeys[deviceKeys[i].userId]! - .verified == - UserVerifiedStatus.unknown) { - items.add(PopupMenuItem( - value: 'verify_user', - child: Text(L10n.of(context)!.verifyUser), - )); - } - return items; - }, - child: ListTile( - leading: Avatar( - mxContent: room - .unsafeGetUserFromMemoryOrFallback( - deviceKeys[i].userId) - .avatarUrl, - name: room - .unsafeGetUserFromMemoryOrFallback( - deviceKeys[i].userId) - .calcDisplayname(), - ), - title: Text( - room - .unsafeGetUserFromMemoryOrFallback( - deviceKeys[i].userId) - .calcDisplayname(), - ), - subtitle: Text( - deviceKeys[i].userId, - style: const TextStyle( - fontWeight: FontWeight.w300), - ), - ), - ), - }, - M2PopupMenuButton( - onSelected: (dynamic action) => controller - .onSelected(context, action, deviceKeys[i]), - itemBuilder: (c) { - final items = >[]; - if (deviceKeys[i].blocked || - !deviceKeys[i].verified) { - items.add(PopupMenuItem( - value: deviceKeys[i].userId == - room.client.userID - ? 'verify' - : 'verify_user', - child: Text(L10n.of(context)!.verifyStart), - )); - } - if (deviceKeys[i].blocked) { - items.add(PopupMenuItem( - value: 'unblock', - child: - Text(L10n.of(context)!.unblockDevice), - )); + body: ListView( + children: [ + SwitchListTile( + secondary: CircleAvatar( + foregroundColor: + Theme.of(context).colorScheme.onPrimaryContainer, + backgroundColor: + Theme.of(context).colorScheme.primaryContainer, + child: const Icon(Icons.lock_outlined)), + title: Text(L10n.of(context)!.encryptThisChat), + value: room.encrypted, + onChanged: controller.enableEncryption, + ), + Center( + child: Image.asset( + 'assets/encryption.png', + width: 212, + ), + ), + const Divider(height: 1), + if (room.isDirectChat) + Padding( + padding: const EdgeInsets.all(16.0), + child: Center( + child: ElevatedButton.icon( + onPressed: controller.startVerification, + icon: const Icon(Icons.verified_outlined), + label: Text(L10n.of(context)!.verifyStart), + ), + ), + ), + if (room.encrypted) ...[ + const Divider(height: 1), + ListTile( + title: Text( + L10n.of(context)!.deviceKeys, + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + ), + StreamBuilder( + stream: room.onUpdate.stream, + builder: (context, snapshot) => + FutureBuilder>( + future: room.getUserDeviceKeys(), + builder: (BuildContext context, snapshot) { + if (snapshot.hasError) { + return Center( + child: Text( + '${L10n.of(context)!.oopsSomethingWentWrong}: ${snapshot.error}'), + ); } - if (!deviceKeys[i].blocked) { - items.add(PopupMenuItem( - value: 'block', - child: Text(L10n.of(context)!.blockDevice), - )); + if (!snapshot.hasData) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2)); } - return items; - }, - child: ListTile( - leading: CircleAvatar( - foregroundColor: Colors.white, - backgroundColor: deviceKeys[i].color, - child: Icon(deviceKeys[i].icon), - ), - title: Text( - deviceKeys[i].displayname, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - subtitle: Row( - children: [ - Text( - deviceKeys[i].deviceId!, - style: const TextStyle( - fontWeight: FontWeight.w300), + final deviceKeys = snapshot.data!; + return ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: deviceKeys.length, + itemBuilder: (BuildContext context, int i) => + SwitchListTile( + value: !deviceKeys[i].blocked, + activeColor: deviceKeys[i].verified + ? Colors.green + : Colors.orange, + onChanged: (_) => controller + .toggleDeviceKey(deviceKeys[i]), + title: Row( + children: [ + Expanded( + child: Text( + deviceKeys[i].deviceId ?? + L10n.of(context)!.unknownDevice, + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 4.0), + child: Chip( + label: Text( + deviceKeys[i].userId, + style: const TextStyle( + fontSize: 12, + fontStyle: FontStyle.italic, + ), + ), + ), + ), + ], ), - const Spacer(), - Text( - deviceKeys[i].blocked - ? L10n.of(context)!.blocked - : deviceKeys[i].verified - ? L10n.of(context)!.verified - : L10n.of(context)!.unverified, - style: TextStyle( - fontSize: 14, - color: deviceKeys[i].color, - ), + subtitle: Text( + deviceKeys[i] + .ed25519Key + ?.replaceAllMapped( + RegExp(r'.{4}'), + (s) => '${s.group(0)} ') ?? + L10n.of(context)! + .unknownEncryptionAlgorithm, + style: + const TextStyle(fontFamily: 'Mono'), ), - ], - ), - ), - ), - ], + ), + ); + }), + ), + ] else + Padding( + padding: const EdgeInsets.all(16.0), + child: Center( + child: Text( + L10n.of(context)!.encryptionNotEnabled, + style: const TextStyle( + fontStyle: FontStyle.italic, + ), ), - ); - }, - ); - }), - ], - ), - ), - ); + ), + ), + ], + ), + )); } } - -extension on DeviceKeys { - Color get color => blocked - ? Colors.red - : verified - ? Colors.green - : Colors.orange; -} diff --git a/lib/widgets/fluffy_chat_app.dart b/lib/widgets/fluffy_chat_app.dart index 473348052..5c9025fc2 100644 --- a/lib/widgets/fluffy_chat_app.dart +++ b/lib/widgets/fluffy_chat_app.dart @@ -64,6 +64,7 @@ class FluffyChatAppState extends State { return VRouter( key: FluffyChatApp.routerKey, title: AppConfig.applicationName, + debugShowCheckedModeBanner: false, themeMode: themeMode, theme: FluffyThemes.buildTheme(Brightness.light, primaryColor), darkTheme: FluffyThemes.buildTheme(Brightness.dark, primaryColor),