Standardize HTML sanitizing when preview email (#3223)
This commit is contained in:
@@ -23,13 +23,12 @@ class MessageContentTransformer {
|
||||
Map<String, String>? mapUrlDownloadCID
|
||||
}) async {
|
||||
await Future.wait([
|
||||
if (_configuration.domTransformers.isNotEmpty)
|
||||
..._configuration.domTransformers.map((domTransformer) async =>
|
||||
domTransformer.process(
|
||||
document: document,
|
||||
dioClient: _dioClient,
|
||||
mapUrlDownloadCID: mapUrlDownloadCID,
|
||||
)
|
||||
..._configuration.domTransformers.map((domTransformer) async =>
|
||||
domTransformer.process(
|
||||
document: document,
|
||||
dioClient: _dioClient,
|
||||
mapUrlDownloadCID: mapUrlDownloadCID,
|
||||
)
|
||||
)
|
||||
]);
|
||||
}
|
||||
@@ -38,24 +37,32 @@ class MessageContentTransformer {
|
||||
required String message,
|
||||
Map<String, String>? mapUrlDownloadCID
|
||||
}) async {
|
||||
final document = parse(message);
|
||||
await _transformDocument(
|
||||
document: document,
|
||||
mapUrlDownloadCID: mapUrlDownloadCID,
|
||||
);
|
||||
final newMessage = _configuration.textTransformers.isNotEmpty
|
||||
? _transformMessage(message)
|
||||
: message;
|
||||
|
||||
final document = parse(newMessage);
|
||||
|
||||
if (_configuration.domTransformers.isNotEmpty) {
|
||||
await _transformDocument(
|
||||
document: document,
|
||||
mapUrlDownloadCID: mapUrlDownloadCID,
|
||||
);
|
||||
}
|
||||
|
||||
return document;
|
||||
}
|
||||
|
||||
String _transformMessage(String message) {
|
||||
if (_configuration.textTransformers.isNotEmpty) {
|
||||
for (var transformer in _configuration.textTransformers) {
|
||||
message = transformer.process(message, _htmlEscape);
|
||||
}
|
||||
for (var transformer in _configuration.textTransformers) {
|
||||
message = transformer.process(message, _htmlEscape);
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
String toMessage(String message) {
|
||||
return _transformMessage(message);
|
||||
return _configuration.textTransformers.isNotEmpty
|
||||
? _transformMessage(message)
|
||||
: message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import 'package:sanitize_html/sanitize_html.dart';
|
||||
|
||||
class SanitizeHtml {
|
||||
String process({
|
||||
required String inputHtml,
|
||||
List<String>? allowAttributes,
|
||||
List<String>? allowTags,
|
||||
}) {
|
||||
final outputHtml = sanitizeHtml(
|
||||
inputHtml,
|
||||
allowAttributes: allowAttributes,
|
||||
allowTags: allowTags,
|
||||
);
|
||||
return outputHtml;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class SanitizeUrl {
|
||||
@@ -24,7 +23,6 @@ class SanitizeUrl {
|
||||
} else {
|
||||
originalUrl = '';
|
||||
}
|
||||
log('SanitizeUrl::process:originalUrl = $originalUrl');
|
||||
return originalUrl;
|
||||
}
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
import 'dart:convert';
|
||||
import 'package:core/presentation/utils/html_transformer/base/text_transformer.dart';
|
||||
import 'package:core/presentation/utils/html_transformer/sanitize_html.dart';
|
||||
|
||||
class StandardizeHtmlSanitizingTransformers extends TextTransformer {
|
||||
|
||||
static const List<String> mailAllowedHtmlAttributes = [
|
||||
'style',
|
||||
'public-asset-id',
|
||||
'data-filename',
|
||||
'bgcolor',
|
||||
'id',
|
||||
'class',
|
||||
];
|
||||
|
||||
static const List<String> mailAllowedHtmlTags = [
|
||||
'font',
|
||||
'u',
|
||||
'center',
|
||||
'style',
|
||||
'body',
|
||||
];
|
||||
|
||||
const StandardizeHtmlSanitizingTransformers();
|
||||
|
||||
@override
|
||||
String process(String text, HtmlEscape htmlEscape) =>
|
||||
SanitizeHtml().process(
|
||||
inputHtml: text,
|
||||
allowAttributes: mailAllowedHtmlAttributes,
|
||||
allowTags: mailAllowedHtmlTags,
|
||||
);
|
||||
}
|
||||
@@ -15,7 +15,7 @@ import 'package:core/presentation/utils/html_transformer/dom/remove_tooltip_link
|
||||
import 'package:core/presentation/utils/html_transformer/dom/sanitize_hyper_link_tag_in_html_transformers.dart';
|
||||
import 'package:core/presentation/utils/html_transformer/dom/script_transformers.dart';
|
||||
import 'package:core/presentation/utils/html_transformer/dom/signature_transformers.dart';
|
||||
import 'package:core/presentation/utils/html_transformer/text/sanitize_autolink_html_transformers.dart';
|
||||
import 'package:core/presentation/utils/html_transformer/text/standardize_html_sanitizing_transformers.dart';
|
||||
import 'package:core/utils/platform_info.dart';
|
||||
|
||||
/// Contains the configuration for all transformations.
|
||||
@@ -37,7 +37,9 @@ class TransformConfiguration {
|
||||
|
||||
factory TransformConfiguration.fromDomTransformers(List<DomTransformer> domTransformers) => TransformConfiguration(domTransformers, []);
|
||||
|
||||
factory TransformConfiguration.empty() => const TransformConfiguration([], []);
|
||||
factory TransformConfiguration.fromTextTransformers(
|
||||
List<TextTransformer> textTransformers
|
||||
) => TransformConfiguration([], textTransformers);
|
||||
|
||||
factory TransformConfiguration.forReplyForwardEmail() => TransformConfiguration.fromDomTransformers([
|
||||
if (PlatformInfo.isWeb)
|
||||
@@ -46,10 +48,15 @@ class TransformConfiguration {
|
||||
const RemoveCollapsedSignatureButtonTransformer(),
|
||||
]);
|
||||
|
||||
factory TransformConfiguration.forDraftsEmail() => TransformConfiguration.fromDomTransformers([const ImageTransformer()]);
|
||||
factory TransformConfiguration.forEditDraftsEmail() => TransformConfiguration.fromDomTransformers([
|
||||
...TransformConfiguration.forDraftsEmail().domTransformers,
|
||||
const HideDraftSignatureTransformer()]);
|
||||
factory TransformConfiguration.forDraftsEmail() => TransformConfiguration.create(
|
||||
customDomTransformers: [const ImageTransformer()]
|
||||
);
|
||||
factory TransformConfiguration.forEditDraftsEmail() => TransformConfiguration.create(
|
||||
customDomTransformers: [
|
||||
...TransformConfiguration.forDraftsEmail().domTransformers,
|
||||
const HideDraftSignatureTransformer()
|
||||
]
|
||||
);
|
||||
|
||||
factory TransformConfiguration.forPreviewEmailOnWeb() => TransformConfiguration.create(
|
||||
customDomTransformers: [
|
||||
@@ -65,7 +72,9 @@ class TransformConfiguration {
|
||||
|
||||
factory TransformConfiguration.forPreviewEmail() => TransformConfiguration.standardConfiguration;
|
||||
|
||||
factory TransformConfiguration.forRestoreEmail() => TransformConfiguration.fromDomTransformers([const ImageTransformer()]);
|
||||
factory TransformConfiguration.forRestoreEmail() => TransformConfiguration.create(
|
||||
customDomTransformers: [const ImageTransformer()]
|
||||
);
|
||||
|
||||
factory TransformConfiguration.forPrintEmail() => TransformConfiguration.fromDomTransformers([
|
||||
if (PlatformInfo.isWeb)
|
||||
@@ -115,6 +124,6 @@ class TransformConfiguration {
|
||||
];
|
||||
|
||||
static const List<TextTransformer> standardTextTransformers = [
|
||||
SanitizeAutolinkHtmlTransformers()
|
||||
StandardizeHtmlSanitizingTransformers(),
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user