From ab717517fd4ad32a70d74692f58cd5eb8a07242c Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 26 Jan 2024 08:18:31 +0700 Subject: [PATCH] TF-2510 Validate outside & inline attachment Signed-off-by: dab246 --- model/lib/email/attachment.dart | 9 ++++++++- model/lib/extensions/attachment_extension.dart | 6 ++++++ .../extensions/list_attachment_extension.dart | 16 +++++++--------- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/model/lib/email/attachment.dart b/model/lib/email/attachment.dart index 88420ec5d..cdbafa59a 100644 --- a/model/lib/email/attachment.dart +++ b/model/lib/email/attachment.dart @@ -11,6 +11,7 @@ class Attachment with EquatableMixin { static const String eventICSSubtype = 'ics'; static const String eventCalendarSubtype = 'calendar'; + static const String applicationRTFType = 'application/rtf'; final PartId? partId; final Id? blobId; @@ -34,7 +35,13 @@ class Attachment with EquatableMixin { bool hasCid() => cid != null && cid?.isNotEmpty == true; - bool isInlined() => disposition == ContentDisposition.inline; + bool isDispositionInlined() => disposition == ContentDisposition.inline; + + bool isDispositionAttachment() => disposition == ContentDisposition.attachment; + + bool isDispositionAttachmentNoCID() => isDispositionAttachment() && noCid(); + + bool isApplicationRTFInlined() => type?.mimeType == applicationRTFType && isDispositionInlined(); String getDownloadUrl(String baseDownloadUrl, AccountId accountId) { final downloadUriTemplate = UriTemplate(baseDownloadUrl); diff --git a/model/lib/extensions/attachment_extension.dart b/model/lib/extensions/attachment_extension.dart index 74c799e41..7a0d06ac2 100644 --- a/model/lib/extensions/attachment_extension.dart +++ b/model/lib/extensions/attachment_extension.dart @@ -27,4 +27,10 @@ extension AttachmentExtension on Attachment { disposition: disposition ?? this.disposition ); } + + bool isOutsideAttachment(List htmlBodyAttachments) { + return (isDispositionAttachmentNoCID() || !isDispositionInlined()) && + !isApplicationRTFInlined() && + !htmlBodyAttachments.include(this); + } } \ No newline at end of file diff --git a/model/lib/extensions/list_attachment_extension.dart b/model/lib/extensions/list_attachment_extension.dart index fc5102789..e882fa117 100644 --- a/model/lib/extensions/list_attachment_extension.dart +++ b/model/lib/extensions/list_attachment_extension.dart @@ -2,6 +2,7 @@ import 'package:collection/collection.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:model/email/attachment.dart'; +import 'package:model/extensions/attachment_extension.dart'; extension ListAttachmentExtension on List { @@ -14,21 +15,18 @@ extension ListAttachmentExtension on List { return 0; } - List getListAttachmentsDisplayedOutside(List? htmlBodyAttachments) { - return where((attachment) => _validateOutsideAttachment(attachment, htmlBodyAttachments)).toList(); + List getListAttachmentsDisplayedOutside(List htmlBodyAttachments) { + return where((attachment) => attachment.isOutsideAttachment(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) { + bool include(Attachment newAttachment) { final matchedAttachment = firstWhereOrNull((attachment) => attachment.blobId == newAttachment.blobId); return matchedAttachment != null; } - List get listAttachmentsDisplayedInContent => where((attachment) => attachment.hasCid()).toList(); + List get listAttachmentsDisplayedInContent => + where((attachment) => attachment.hasCid() && attachment.isDispositionInlined()) + .toList(); Map toMapCidImageDownloadUrl({ required AccountId accountId,