Skip to content

Commit 94e2c31

Browse files
committed
Standardize HTML sanitizing when preview email
1 parent 124c4ce commit 94e2c31

10 files changed

+146
-26
lines changed

contact/pubspec.lock

+9
Original file line numberDiff line numberDiff line change
@@ -992,6 +992,15 @@ packages:
992992
url: "https://pub.dev"
993993
source: hosted
994994
version: "3.2.1"
995+
sanitize_html:
996+
dependency: transitive
997+
description:
998+
path: sanitize_html
999+
ref: twake-supported
1000+
resolved-ref: "5b9986c42cc86c7e565c941648f875f2e1d2f7bd"
1001+
url: "https://github.com/dab246/dart-neats.git"
1002+
source: git
1003+
version: "2.1.0"
9951004
shelf:
9961005
dependency: transitive
9971006
description:

core/lib/presentation/utils/html_transformer/message_content_transformer.dart

+24-17
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@ class MessageContentTransformer {
2323
Map<String, String>? mapUrlDownloadCID
2424
}) async {
2525
await Future.wait([
26-
if (_configuration.domTransformers.isNotEmpty)
27-
..._configuration.domTransformers.map((domTransformer) async =>
28-
domTransformer.process(
29-
document: document,
30-
dioClient: _dioClient,
31-
mapUrlDownloadCID: mapUrlDownloadCID,
32-
)
26+
..._configuration.domTransformers.map((domTransformer) async =>
27+
domTransformer.process(
28+
document: document,
29+
dioClient: _dioClient,
30+
mapUrlDownloadCID: mapUrlDownloadCID,
31+
)
3332
)
3433
]);
3534
}
@@ -38,24 +37,32 @@ class MessageContentTransformer {
3837
required String message,
3938
Map<String, String>? mapUrlDownloadCID
4039
}) async {
41-
final document = parse(message);
42-
await _transformDocument(
43-
document: document,
44-
mapUrlDownloadCID: mapUrlDownloadCID,
45-
);
40+
final newMessage = _configuration.textTransformers.isNotEmpty
41+
? _transformMessage(message)
42+
: message;
43+
44+
final document = parse(newMessage);
45+
46+
if (_configuration.domTransformers.isNotEmpty) {
47+
await _transformDocument(
48+
document: document,
49+
mapUrlDownloadCID: mapUrlDownloadCID,
50+
);
51+
}
52+
4653
return document;
4754
}
4855

4956
String _transformMessage(String message) {
50-
if (_configuration.textTransformers.isNotEmpty) {
51-
for (var transformer in _configuration.textTransformers) {
52-
message = transformer.process(message, _htmlEscape);
53-
}
57+
for (var transformer in _configuration.textTransformers) {
58+
message = transformer.process(message, _htmlEscape);
5459
}
5560
return message;
5661
}
5762

5863
String toMessage(String message) {
59-
return _transformMessage(message);
64+
return _configuration.textTransformers.isNotEmpty
65+
? _transformMessage(message)
66+
: message;
6067
}
6168
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:core/utils/app_logger.dart';
2+
import 'package:sanitize_html/sanitize_html.dart';
3+
4+
class SanitizeHtml {
5+
String process({
6+
required String inputHtml,
7+
List<String>? allowAttributes,
8+
List<String>? allowTags,
9+
List<String>? allowClassNames,
10+
}) {
11+
final outputHtml = sanitizeHtml(
12+
inputHtml,
13+
allowAttributes: allowAttributes,
14+
allowTags: allowTags,
15+
allowClassName: (className) =>
16+
allowClassNames?.contains(className.toLowerCase()) == true
17+
);
18+
return outputHtml;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import 'dart:convert';
2+
import 'package:core/presentation/utils/html_transformer/base/text_transformer.dart';
3+
import 'package:core/presentation/utils/html_transformer/sanitize_html.dart';
4+
5+
class StandardizeHtmlSanitizingTransformers extends TextTransformer {
6+
7+
static const List<String> mailAllowedHtmlAttributes = [
8+
'style',
9+
'public-asset-id',
10+
'data-filename',
11+
'bgcolor',
12+
];
13+
14+
static const List<String> mailAllowedHtmlTags = [
15+
'font',
16+
'u',
17+
18+
'center',
19+
];
20+
21+
static const List<String> mailAllowedHtmlClassNames = [
22+
'tmail-signature',
23+
'tmail-signature-blocked',
24+
'tmail-signature-button',
25+
'tmail-signature-content',
26+
'tmail_signature_prefix',
27+
];
28+
29+
const StandardizeHtmlSanitizingTransformers();
30+
31+
@override
32+
String process(String text, HtmlEscape htmlEscape) =>
33+
SanitizeHtml().process(
34+
inputHtml: text,
35+
allowAttributes: mailAllowedHtmlAttributes,
36+
allowTags: mailAllowedHtmlTags,
37+
allowClassNames: mailAllowedHtmlClassNames,
38+
);
39+
}

core/lib/presentation/utils/html_transformer/transform_configuration.dart

+17-8
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import 'package:core/presentation/utils/html_transformer/dom/remove_tooltip_link
1515
import 'package:core/presentation/utils/html_transformer/dom/sanitize_hyper_link_tag_in_html_transformers.dart';
1616
import 'package:core/presentation/utils/html_transformer/dom/script_transformers.dart';
1717
import 'package:core/presentation/utils/html_transformer/dom/signature_transformers.dart';
18-
import 'package:core/presentation/utils/html_transformer/text/sanitize_autolink_html_transformers.dart';
18+
import 'package:core/presentation/utils/html_transformer/text/standardize_html_sanitizing_transformers.dart';
1919
import 'package:core/utils/platform_info.dart';
2020

2121
/// Contains the configuration for all transformations.
@@ -37,7 +37,9 @@ class TransformConfiguration {
3737

3838
factory TransformConfiguration.fromDomTransformers(List<DomTransformer> domTransformers) => TransformConfiguration(domTransformers, []);
3939

40-
factory TransformConfiguration.empty() => const TransformConfiguration([], []);
40+
factory TransformConfiguration.fromTextTransformers(
41+
List<TextTransformer> textTransformers
42+
) => TransformConfiguration([], textTransformers);
4143

4244
factory TransformConfiguration.forReplyForwardEmail() => TransformConfiguration.fromDomTransformers([
4345
if (PlatformInfo.isWeb)
@@ -46,10 +48,15 @@ class TransformConfiguration {
4648
const RemoveCollapsedSignatureButtonTransformer(),
4749
]);
4850

49-
factory TransformConfiguration.forDraftsEmail() => TransformConfiguration.fromDomTransformers([const ImageTransformer()]);
50-
factory TransformConfiguration.forEditDraftsEmail() => TransformConfiguration.fromDomTransformers([
51-
...TransformConfiguration.forDraftsEmail().domTransformers,
52-
const HideDraftSignatureTransformer()]);
51+
factory TransformConfiguration.forDraftsEmail() => TransformConfiguration.create(
52+
customDomTransformers: [const ImageTransformer()]
53+
);
54+
factory TransformConfiguration.forEditDraftsEmail() => TransformConfiguration.create(
55+
customDomTransformers: [
56+
...TransformConfiguration.forDraftsEmail().domTransformers,
57+
const HideDraftSignatureTransformer()
58+
]
59+
);
5360

5461
factory TransformConfiguration.forPreviewEmailOnWeb() => TransformConfiguration.create(
5562
customDomTransformers: [
@@ -65,7 +72,9 @@ class TransformConfiguration {
6572

6673
factory TransformConfiguration.forPreviewEmail() => TransformConfiguration.standardConfiguration;
6774

68-
factory TransformConfiguration.forRestoreEmail() => TransformConfiguration.fromDomTransformers([const ImageTransformer()]);
75+
factory TransformConfiguration.forRestoreEmail() => TransformConfiguration.create(
76+
customDomTransformers: [const ImageTransformer()]
77+
);
6978

7079
factory TransformConfiguration.forPrintEmail() => TransformConfiguration.fromDomTransformers([
7180
if (PlatformInfo.isWeb)
@@ -115,6 +124,6 @@ class TransformConfiguration {
115124
];
116125

117126
static const List<TextTransformer> standardTextTransformers = [
118-
SanitizeAutolinkHtmlTransformers()
127+
StandardizeHtmlSanitizingTransformers(),
119128
];
120129
}

core/pubspec.lock

+9
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,15 @@ packages:
945945
url: "https://pub.dev"
946946
source: hosted
947947
version: "3.0.1"
948+
sanitize_html:
949+
dependency: "direct main"
950+
description:
951+
path: sanitize_html
952+
ref: twake-supported
953+
resolved-ref: "5b9986c42cc86c7e565c941648f875f2e1d2f7bd"
954+
url: "https://github.com/dab246/dart-neats.git"
955+
source: git
956+
version: "2.1.0"
948957
shelf:
949958
dependency: transitive
950959
description:

core/pubspec.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ dependencies:
3434
url: https://github.com/dab246/languagetool_textfield.git
3535
ref: twake-supported
3636

37+
sanitize_html:
38+
git:
39+
url: https://github.com/dab246/dart-neats.git
40+
ref: twake-supported
41+
path: sanitize_html
42+
3743
### Dependencies from pub.dev ###
3844
cupertino_icons: 1.0.6
3945

lib/features/email/data/local/html_analyzer.dart

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:collection/collection.dart';
22
import 'package:core/data/constants/constant.dart';
33
import 'package:core/presentation/utils/html_transformer/html_transform.dart';
4+
import 'package:core/presentation/utils/html_transformer/text/sanitize_autolink_html_transformers.dart';
45
import 'package:core/presentation/utils/html_transformer/transform_configuration.dart';
56
import 'package:core/utils/app_logger.dart';
67
import 'package:dartz/dartz.dart';
@@ -35,7 +36,9 @@ class HtmlAnalyzer {
3536
case EmailContentType.textPlain:
3637
final message = _htmlTransform.transformToTextPlain(
3738
content: emailContent.content,
38-
transformConfiguration: transformConfiguration
39+
transformConfiguration: TransformConfiguration.fromTextTransformers([
40+
const SanitizeAutolinkHtmlTransformers()
41+
]),
3942
);
4043
return EmailContent(emailContent.type, message);
4144
default:

model/pubspec.lock

+9
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,15 @@ packages:
969969
url: "https://pub.dev"
970970
source: hosted
971971
version: "3.2.1"
972+
sanitize_html:
973+
dependency: transitive
974+
description:
975+
path: sanitize_html
976+
ref: twake-supported
977+
resolved-ref: "5b9986c42cc86c7e565c941648f875f2e1d2f7bd"
978+
url: "https://github.com/dab246/dart-neats.git"
979+
source: git
980+
version: "2.1.0"
972981
shelf:
973982
dependency: transitive
974983
description:

pubspec.lock

+9
Original file line numberDiff line numberDiff line change
@@ -1714,6 +1714,15 @@ packages:
17141714
url: "https://pub.dev"
17151715
source: hosted
17161716
version: "0.27.7"
1717+
sanitize_html:
1718+
dependency: transitive
1719+
description:
1720+
path: sanitize_html
1721+
ref: twake-supported
1722+
resolved-ref: "5b9986c42cc86c7e565c941648f875f2e1d2f7bd"
1723+
url: "https://github.com/dab246/dart-neats.git"
1724+
source: git
1725+
version: "2.1.0"
17171726
server_settings:
17181727
dependency: "direct main"
17191728
description:

0 commit comments

Comments
 (0)