From a352bd5adaa9733f86168e33a2a47fbc2f6c7398 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 22 Nov 2023 16:21:35 +0700 Subject: [PATCH] TF-2331 Fix Read receipt includes weird attachments that are impossible to download (cherry picked from commit 72ae6553ea53fa4bbba74bfdb1c9a3ec82103fc0) --- lib/features/caching/config/cache_version.dart | 2 +- .../presentation/composer_controller.dart | 2 +- .../email/domain/extensions/email_extension.dart | 3 ++- .../usecases/get_email_content_interactor.dart | 4 ++-- lib/features/email/presentation/email_view.dart | 8 +++----- model/lib/extensions/email_extension.dart | 2 ++ .../lib/extensions/list_attachment_extension.dart | 15 ++++++++++++++- 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/lib/features/caching/config/cache_version.dart b/lib/features/caching/config/cache_version.dart index 7d5040c38..4886a5067 100644 --- a/lib/features/caching/config/cache_version.dart +++ b/lib/features/caching/config/cache_version.dart @@ -1,4 +1,4 @@ class CacheVersion { - static const int hiveDBVersion = 8; + static const int hiveDBVersion = 9; } \ No newline at end of file diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index b6c981c59..37811e7b5 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -559,7 +559,7 @@ class ComposerController extends BaseController { void _initAttachments(List attachments) { if (attachments.isNotEmpty) { initialAttachments = attachments; - uploadController.initializeUploadAttachments(attachments.listAttachmentsDisplayedOutSide); + uploadController.initializeUploadAttachments(attachments); } } diff --git a/lib/features/email/domain/extensions/email_extension.dart b/lib/features/email/domain/extensions/email_extension.dart index d7df25e63..782e169e6 100644 --- a/lib/features/email/domain/extensions/email_extension.dart +++ b/lib/features/email/domain/extensions/email_extension.dart @@ -1,6 +1,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/extensions/email_extension.dart'; +import 'package:model/extensions/list_attachment_extension.dart'; import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; extension EmailExtension on Email { @@ -8,7 +9,7 @@ extension EmailExtension on Email { return DetailedEmail( emailId: id!, createdTime: receivedAt?.value ?? DateTime.now(), - attachments: allAttachments, + attachments: allAttachments.getListAttachmentsDisplayedOutside(htmlBodyAttachments), headers: headers, keywords: keywords, htmlEmailContent: htmlEmailContent, diff --git a/lib/features/email/domain/usecases/get_email_content_interactor.dart b/lib/features/email/domain/usecases/get_email_content_interactor.dart index 44a8e19c0..c2e1c6f35 100644 --- a/lib/features/email/domain/usecases/get_email_content_interactor.dart +++ b/lib/features/email/domain/usecases/get_email_content_interactor.dart @@ -61,13 +61,13 @@ class GetEmailContentInteractor { yield Right(GetEmailContentSuccess( htmlEmailContent: newEmailContents.asHtmlString, - attachments: email.allAttachments, + attachments: email.allAttachments.getListAttachmentsDisplayedOutside(email.htmlBodyAttachments), emailCurrent: email )); } else { yield Right(GetEmailContentSuccess( htmlEmailContent: '', - attachments: email.allAttachments, + attachments: email.allAttachments.getListAttachmentsDisplayedOutside(email.htmlBodyAttachments), emailCurrent: email )); } diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index d456475fb..2ecf5a160 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -11,7 +11,6 @@ import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.dart'; -import 'package:model/extensions/list_attachment_extension.dart'; import 'package:model/extensions/list_email_address_extension.dart'; import 'package:model/extensions/presentation_email_extension.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart'; @@ -313,11 +312,10 @@ class EmailView extends GetWidget { emailUnsubscribe: controller.emailUnsubscribe.value )), Obx(() { - final attachments = controller.attachments.listAttachmentsDisplayedOutSide; - if (attachments.isNotEmpty) { + if (controller.attachments.isNotEmpty) { return EmailAttachmentsWidget( responsiveUtils: controller.responsiveUtils, - attachments: attachments, + attachments: controller.attachments, imagePaths: controller.imagePaths, onDragStarted: controller.mailboxDashBoardController.enableDraggableApp, onDragEnd: (details) { @@ -330,7 +328,7 @@ class EmailView extends GetWidget { controller.exportAttachment(context, attachment); } }, - onTapShowAllAttachmentFile: () => controller.openAttachmentList(context, attachments), + onTapShowAllAttachmentFile: () => controller.openAttachmentList(context, controller.attachments), ); } else { return const SizedBox.shrink(); diff --git a/model/lib/extensions/email_extension.dart b/model/lib/extensions/email_extension.dart index e7b50c44b..5e3a61b42 100644 --- a/model/lib/extensions/email_extension.dart +++ b/model/lib/extensions/email_extension.dart @@ -133,6 +133,8 @@ extension EmailExtension on Email { return emailContents ?? []; } + List get htmlBodyAttachments => htmlBody?.map((item) => item.toAttachment()).toList() ?? []; + List get allAttachments => attachments?.map((item) => item.toAttachment()).toList() ?? []; List get attachmentsWithCid => allAttachments.where((attachment) => attachment.hasCid()).toList(); diff --git a/model/lib/extensions/list_attachment_extension.dart b/model/lib/extensions/list_attachment_extension.dart index 7babc9f77..fc5102789 100644 --- a/model/lib/extensions/list_attachment_extension.dart +++ b/model/lib/extensions/list_attachment_extension.dart @@ -1,4 +1,5 @@ +import 'package:collection/collection.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:model/email/attachment.dart'; @@ -13,7 +14,19 @@ extension ListAttachmentExtension on List { return 0; } - List get listAttachmentsDisplayedOutSide => where((attachment) => attachment.noCid() || !attachment.isInlined()).toList(); + List getListAttachmentsDisplayedOutside(List? htmlBodyAttachments) { + return where((attachment) => _validateOutsideAttachment(attachment, htmlBodyAttachments)).toList(); + } + + bool _validateOutsideAttachment(Attachment attachment, List? htmlBodyAttachments) { + final result = (attachment.noCid() || !attachment.isInlined()) && (htmlBodyAttachments == null || !htmlBodyAttachments._include(attachment)); + return result; + } + + bool _include(Attachment newAttachment) { + final matchedAttachment = firstWhereOrNull((attachment) => attachment.blobId == newAttachment.blobId); + return matchedAttachment != null; + } List get listAttachmentsDisplayedInContent => where((attachment) => attachment.hasCid()).toList();