TF-3243 Fix email without content
This commit is contained in:
+8
@@ -1,5 +1,6 @@
|
|||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
class AddLazyLoadingForBackgroundImageTransformer extends DomTransformer {
|
class AddLazyLoadingForBackgroundImageTransformer extends DomTransformer {
|
||||||
@@ -11,7 +12,11 @@ class AddLazyLoadingForBackgroundImageTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final elements = document.querySelectorAll('[style*="background-image"]');
|
final elements = document.querySelectorAll('[style*="background-image"]');
|
||||||
|
|
||||||
|
if (elements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(elements.map((element) async {
|
await Future.wait(elements.map((element) async {
|
||||||
var exStyle = element.attributes['style'];
|
var exStyle = element.attributes['style'];
|
||||||
final imageUrls = findImageUrlFromStyleTag(exStyle!);
|
final imageUrls = findImageUrlFromStyleTag(exStyle!);
|
||||||
@@ -22,5 +27,8 @@ class AddLazyLoadingForBackgroundImageTransformer extends DomTransformer {
|
|||||||
element.attributes.addAll({'lazy': ''});
|
element.attributes.addAll({'lazy': ''});
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
class BlockCodeTransformer extends DomTransformer {
|
class BlockCodeTransformer extends DomTransformer {
|
||||||
@@ -13,7 +14,11 @@ class BlockCodeTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final codeElements = document.getElementsByTagName('pre');
|
final codeElements = document.getElementsByTagName('pre');
|
||||||
|
|
||||||
|
if (codeElements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(codeElements.map((element) async {
|
await Future.wait(codeElements.map((element) async {
|
||||||
element.attributes['style'] = '''
|
element.attributes['style'] = '''
|
||||||
display: block;
|
display: block;
|
||||||
@@ -30,5 +35,8 @@ class BlockCodeTransformer extends DomTransformer {
|
|||||||
overflow: auto;
|
overflow: auto;
|
||||||
''';
|
''';
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
class BlockQuotedTransformer extends DomTransformer {
|
class BlockQuotedTransformer extends DomTransformer {
|
||||||
@@ -13,7 +14,11 @@ class BlockQuotedTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final quotedElements = document.getElementsByTagName('blockquote');
|
final quotedElements = document.getElementsByTagName('blockquote');
|
||||||
|
|
||||||
|
if (quotedElements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(quotedElements.map((quotedElement) async {
|
await Future.wait(quotedElements.map((quotedElement) async {
|
||||||
quotedElement.attributes['style'] = '''
|
quotedElement.attributes['style'] = '''
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
@@ -23,5 +28,8 @@ class BlockQuotedTransformer extends DomTransformer {
|
|||||||
border-left: 2px solid #eee;
|
border-left: 2px solid #eee;
|
||||||
''';
|
''';
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
class HideDraftSignatureTransformer extends DomTransformer {
|
class HideDraftSignatureTransformer extends DomTransformer {
|
||||||
@@ -12,6 +13,7 @@ class HideDraftSignatureTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID
|
Map<String, String>? mapUrlDownloadCID
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final signature = document.querySelector('div.tmail-signature');
|
final signature = document.querySelector('div.tmail-signature');
|
||||||
if (signature == null) return;
|
if (signature == null) return;
|
||||||
final currentStyle = signature.attributes['style']?.trim();
|
final currentStyle = signature.attributes['style']?.trim();
|
||||||
@@ -22,5 +24,8 @@ class HideDraftSignatureTransformer extends DomTransformer {
|
|||||||
} else {
|
} else {
|
||||||
signature.attributes['style'] = '$currentStyle; display: none;';
|
signature.attributes['style'] = '$currentStyle; display: none;';
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,7 @@ import 'package:core/data/network/dio_client.dart';
|
|||||||
import 'package:core/data/utils/compress_file_utils.dart';
|
import 'package:core/data/utils/compress_file_utils.dart';
|
||||||
import 'package:core/presentation/extensions/html_extension.dart';
|
import 'package:core/presentation/extensions/html_extension.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:core/utils/platform_info.dart';
|
import 'package:core/utils/platform_info.dart';
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
@@ -20,7 +21,11 @@ class ImageTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final imageElements = document.querySelectorAll('img');
|
final imageElements = document.querySelectorAll('img');
|
||||||
|
|
||||||
|
if (imageElements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(imageElements.map((imageElement) async {
|
await Future.wait(imageElements.map((imageElement) async {
|
||||||
var exStyle = imageElement.attributes['style'];
|
var exStyle = imageElement.attributes['style'];
|
||||||
if (exStyle != null) {
|
if (exStyle != null) {
|
||||||
@@ -55,6 +60,9 @@ class ImageTransformer extends DomTransformer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String?> _convertCidToBase64Image({
|
Future<String?> _convertCidToBase64Image({
|
||||||
|
|||||||
+8
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
class RemoveCollapsedSignatureButtonTransformer extends DomTransformer {
|
class RemoveCollapsedSignatureButtonTransformer extends DomTransformer {
|
||||||
@@ -13,9 +14,16 @@ class RemoveCollapsedSignatureButtonTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final elements = document.querySelectorAll('.tmail-signature-button');
|
final elements = document.querySelectorAll('.tmail-signature-button');
|
||||||
|
|
||||||
|
if (elements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(elements.map((element) async {
|
await Future.wait(elements.map((element) async {
|
||||||
element.remove();
|
element.remove();
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+8
@@ -1,5 +1,6 @@
|
|||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
class RemoveLazyLoadingForBackgroundImageTransformer extends DomTransformer {
|
class RemoveLazyLoadingForBackgroundImageTransformer extends DomTransformer {
|
||||||
@@ -11,7 +12,11 @@ class RemoveLazyLoadingForBackgroundImageTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final elements = document.querySelectorAll('[lazy]');
|
final elements = document.querySelectorAll('[lazy]');
|
||||||
|
|
||||||
|
if (elements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(elements.map((element) async {
|
await Future.wait(elements.map((element) async {
|
||||||
var exStyle = element.attributes['style'];
|
var exStyle = element.attributes['style'];
|
||||||
final dataSrc = element.attributes['data-src'];
|
final dataSrc = element.attributes['data-src'];
|
||||||
@@ -25,5 +30,8 @@ class RemoveLazyLoadingForBackgroundImageTransformer extends DomTransformer {
|
|||||||
element.attributes.remove('data-src');
|
element.attributes.remove('data-src');
|
||||||
element.attributes.remove('lazy');
|
element.attributes.remove('lazy');
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
@@ -1,5 +1,6 @@
|
|||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
class RemoveLazyLoadingImageTransformer extends DomTransformer {
|
class RemoveLazyLoadingImageTransformer extends DomTransformer {
|
||||||
@@ -11,9 +12,16 @@ class RemoveLazyLoadingImageTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final elements = document.querySelectorAll('img[loading]');
|
final elements = document.querySelectorAll('img[loading]');
|
||||||
|
|
||||||
|
if (elements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(elements.map((element) async {
|
await Future.wait(elements.map((element) async {
|
||||||
element.attributes.remove('loading');
|
element.attributes.remove('loading');
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
@@ -1,5 +1,6 @@
|
|||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
class RemoveMaxWidthInImageStyleTransformer extends DomTransformer {
|
class RemoveMaxWidthInImageStyleTransformer extends DomTransformer {
|
||||||
@@ -12,7 +13,11 @@ class RemoveMaxWidthInImageStyleTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final imageElements = document.querySelectorAll('img[style*="max-width"]');
|
final imageElements = document.querySelectorAll('img[style*="max-width"]');
|
||||||
|
|
||||||
|
if (imageElements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(imageElements.map((imageElement) async {
|
await Future.wait(imageElements.map((imageElement) async {
|
||||||
var exStyle = imageElement.attributes['style'];
|
var exStyle = imageElement.attributes['style'];
|
||||||
if (exStyle != null) {
|
if (exStyle != null) {
|
||||||
@@ -20,5 +25,8 @@ class RemoveMaxWidthInImageStyleTransformer extends DomTransformer {
|
|||||||
imageElement.attributes['style'] = exStyle;
|
imageElement.attributes['style'] = exStyle;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+8
@@ -1,5 +1,6 @@
|
|||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
class RemoveStyleTagOutsideTransformer extends DomTransformer {
|
class RemoveStyleTagOutsideTransformer extends DomTransformer {
|
||||||
@@ -12,9 +13,16 @@ class RemoveStyleTagOutsideTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final styleElements = document.querySelectorAll('style');
|
final styleElements = document.querySelectorAll('style');
|
||||||
|
|
||||||
|
if (styleElements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(styleElements.map((element) async {
|
await Future.wait(styleElements.map((element) async {
|
||||||
element.remove();
|
element.remove();
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:core/utils/html/html_template.dart';
|
import 'package:core/utils/html/html_template.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
@@ -14,7 +15,11 @@ class RemoveTooltipLinkTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final linkElements = document.querySelectorAll('a.${HtmlTemplate.nameClassToolTip}');
|
final linkElements = document.querySelectorAll('a.${HtmlTemplate.nameClassToolTip}');
|
||||||
|
|
||||||
|
if (linkElements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(linkElements.map((linkElement) async {
|
await Future.wait(linkElements.map((linkElement) async {
|
||||||
final classAttribute = linkElement.attributes['class'];
|
final classAttribute = linkElement.attributes['class'];
|
||||||
if (classAttribute != null) {
|
if (classAttribute != null) {
|
||||||
@@ -28,6 +33,9 @@ class RemoveTooltipLinkTransformer extends DomTransformer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+8
@@ -1,6 +1,7 @@
|
|||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/sanitize_url.dart';
|
import 'package:core/presentation/utils/html_transformer/sanitize_url.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:core/utils/html/html_template.dart';
|
import 'package:core/utils/html/html_template.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
@@ -16,7 +17,11 @@ class SanitizeHyperLinkTagInHtmlTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final elements = document.querySelectorAll('a');
|
final elements = document.querySelectorAll('a');
|
||||||
|
|
||||||
|
if (elements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(elements.map((element) async {
|
await Future.wait(elements.map((element) async {
|
||||||
_sanitizeUrlResource(element);
|
_sanitizeUrlResource(element);
|
||||||
if (useTooltip) {
|
if (useTooltip) {
|
||||||
@@ -25,6 +30,9 @@ class SanitizeHyperLinkTagInHtmlTransformer extends DomTransformer {
|
|||||||
_addBlankForTargetProperty(element);
|
_addBlankForTargetProperty(element);
|
||||||
_addNoReferrerForRelProperty(element);
|
_addNoReferrerForRelProperty(element);
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _sanitizeUrlResource(Element element) {
|
void _sanitizeUrlResource(Element element) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
|
||||||
@@ -13,9 +14,16 @@ class RemoveScriptTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final scriptElements = document.getElementsByTagName('script');
|
final scriptElements = document.getElementsByTagName('script');
|
||||||
|
|
||||||
|
if (scriptElements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(scriptElements.map((scriptElement) async {
|
await Future.wait(scriptElements.map((scriptElement) async {
|
||||||
scriptElement.remove();
|
scriptElement.remove();
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
import 'package:core/data/network/dio_client.dart';
|
import 'package:core/data/network/dio_client.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
import 'package:core/presentation/utils/html_transformer/base/dom_transformer.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:html/dom.dart';
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
class SignatureTransformer extends DomTransformer {
|
class SignatureTransformer extends DomTransformer {
|
||||||
@@ -13,9 +14,16 @@ class SignatureTransformer extends DomTransformer {
|
|||||||
required DioClient dioClient,
|
required DioClient dioClient,
|
||||||
Map<String, String>? mapUrlDownloadCID,
|
Map<String, String>? mapUrlDownloadCID,
|
||||||
}) async {
|
}) async {
|
||||||
|
try {
|
||||||
final signatureElements = document.querySelectorAll('div.tmail-signature');
|
final signatureElements = document.querySelectorAll('div.tmail-signature');
|
||||||
|
|
||||||
|
if (signatureElements.isEmpty) return;
|
||||||
|
|
||||||
await Future.wait(signatureElements.map((element) async {
|
await Future.wait(signatureElements.map((element) async {
|
||||||
element.attributes['class'] = 'tmail-signature-blocked';
|
element.attributes['class'] = 'tmail-signature-blocked';
|
||||||
}));
|
}));
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,6 +21,7 @@ class SanitizeAutolinkFilter {
|
|||||||
SanitizeAutolinkFilter(this.htmlEscape);
|
SanitizeAutolinkFilter(this.htmlEscape);
|
||||||
|
|
||||||
String process(String inputText) {
|
String process(String inputText) {
|
||||||
|
try {
|
||||||
if (inputText.isEmpty) {
|
if (inputText.isEmpty) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
@@ -28,7 +29,7 @@ class SanitizeAutolinkFilter {
|
|||||||
final elements = linkify(
|
final elements = linkify(
|
||||||
inputText,
|
inputText,
|
||||||
options: _linkifyOption,
|
options: _linkifyOption,
|
||||||
linkifiers: _linkifier
|
linkifiers: _linkifier,
|
||||||
);
|
);
|
||||||
log('AutolinkFilter::process:elements: $elements');
|
log('AutolinkFilter::process:elements: $elements');
|
||||||
final htmlTextBuffer = StringBuffer();
|
final htmlTextBuffer = StringBuffer();
|
||||||
@@ -53,6 +54,10 @@ class SanitizeAutolinkFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return htmlTextBuffer.toString();
|
return htmlTextBuffer.toString();
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::process:Exception = $e');
|
||||||
|
return inputText;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String _buildUrlLinkTag({required String urlLink, required String value}) {
|
String _buildUrlLinkTag({required String urlLink, required String value}) {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
class SanitizeUrl {
|
class SanitizeUrl {
|
||||||
@@ -12,17 +13,20 @@ class SanitizeUrl {
|
|||||||
);
|
);
|
||||||
|
|
||||||
String process(String inputText) {
|
String process(String inputText) {
|
||||||
var originalUrl = inputText;
|
try {
|
||||||
|
log('SanitizeUrl::process:inputText = $inputText');
|
||||||
originalUrl = Uri.decodeFull(originalUrl);
|
var originalUrl = Uri.decodeFull(inputText);
|
||||||
|
|
||||||
if (GetUtils.isURL(originalUrl)) {
|
if (GetUtils.isURL(originalUrl)) {
|
||||||
if (!originalUrl.startsWith(_protocolIdentifierRegex)) {
|
originalUrl = !originalUrl.startsWith(_protocolIdentifierRegex)
|
||||||
originalUrl = (defaultToHttps ? "https://" : "http://") + originalUrl;
|
? (defaultToHttps ? "https://" : "http://") + originalUrl
|
||||||
}
|
: originalUrl;
|
||||||
} else {
|
} else {
|
||||||
originalUrl = '';
|
originalUrl = '';
|
||||||
}
|
}
|
||||||
return originalUrl;
|
return originalUrl;
|
||||||
|
} catch (e) {
|
||||||
|
logError('SanitizeUrl::process:Exception = $e');
|
||||||
|
return inputText;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,5 +108,17 @@ void main() {
|
|||||||
equals('http://linagora.com')
|
equals('http://linagora.com')
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('SHOULD returns original input WHEN get an exception', () {
|
||||||
|
// Arrange
|
||||||
|
const inputText = "%E0%A4%A";
|
||||||
|
const expectedOutput = inputText;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
final result = sanitizeUrl.process(inputText);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(result, expectedOutput);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user