diff --git a/core/lib/presentation/utils/html_transformer/sanitize_url.dart b/core/lib/presentation/utils/html_transformer/sanitize_url.dart
new file mode 100644
index 000000000..3c835dc5e
--- /dev/null
+++ b/core/lib/presentation/utils/html_transformer/sanitize_url.dart
@@ -0,0 +1,30 @@
+import 'package:core/utils/app_logger.dart';
+import 'package:get/get.dart';
+
+class SanitizeUrl {
+
+ final bool defaultToHttps;
+
+ SanitizeUrl({this.defaultToHttps = true});
+
+ final _protocolIdentifierRegex = RegExp(
+ r'^(https?://)',
+ caseSensitive: false,
+ );
+
+ String process(String inputText) {
+ var originalUrl = inputText;
+
+ originalUrl = Uri.decodeFull(originalUrl);
+
+ if (GetUtils.isURL(originalUrl)) {
+ if (!originalUrl.startsWith(_protocolIdentifierRegex)) {
+ originalUrl = (defaultToHttps ? "https://" : "http://") + originalUrl;
+ }
+ } else {
+ originalUrl = '';
+ }
+ log('SanitizeUrl::process:originalUrl = $originalUrl');
+ return originalUrl;
+ }
+}
\ No newline at end of file
diff --git a/core/test/sanitize_url_test.dart b/core/test/sanitize_url_test.dart
new file mode 100644
index 000000000..f4df853fa
--- /dev/null
+++ b/core/test/sanitize_url_test.dart
@@ -0,0 +1,112 @@
+import 'package:core/presentation/utils/html_transformer/sanitize_url.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+void main() {
+ group('SanitizeUrl test', () {
+ final sanitizeUrl = SanitizeUrl();
+
+ test('SHOULD return valid url WHEN input text is valid url start with https', () {
+ final validUrl = sanitizeUrl.process('https://linagora.com');
+ expect(
+ validUrl,
+ equals('https://linagora.com')
+ );
+ });
+
+ test('SHOULD return valid url WHEN input text is valid url start with http', () {
+ final validUrl = sanitizeUrl.process('http://linagora.com');
+ expect(
+ validUrl,
+ equals('http://linagora.com')
+ );
+ });
+
+ test('SHOULD return valid url WHEN input text start with www', () {
+ final validUrl = sanitizeUrl.process('www.linagora.com');
+ expect(
+ validUrl,
+ equals('https://www.linagora.com')
+ );
+ });
+
+ test('SHOULD return valid url WHEN input text start with valid domain', () {
+ final validUrl = sanitizeUrl.process('linagora.com');
+ expect(
+ validUrl,
+ equals('https://linagora.com')
+ );
+ });
+
+ test('SHOULD return empty string text WHEN input text is empty', () {
+ final validUrl = sanitizeUrl.process('');
+ expect(
+ validUrl,
+ equals('')
+ );
+ });
+
+ test('SHOULD return empty string text WHEN input text not contain url', () {
+ final validUrl = sanitizeUrl.process('Linagora Company');
+ expect(
+ validUrl,
+ equals('')
+ );
+ });
+
+ test('SHOULD return empty string text WHEN input text is email address', () {
+ final validUrl = sanitizeUrl.process('example@linagora.com');
+ expect(
+ validUrl,
+ equals('')
+ );
+ });
+
+ test('SHOULD return empty string text WHEN input text is mailto link', () {
+ final validUrl = sanitizeUrl.process('mailto:example@linagora.com');
+ expect(
+ validUrl,
+ equals('')
+ );
+ });
+
+ test('SHOULD return empty string text WHEN input text is invalid url', () {
+ final validUrl = sanitizeUrl.process('linagora mail.com');
+ expect(
+ validUrl,
+ equals('')
+ );
+ });
+
+ test('SHOULD return empty string WHEN input text start with //', () {
+ final validUrl = sanitizeUrl.process('//linagora.com');
+ expect(
+ validUrl,
+ equals('')
+ );
+ });
+
+ test('SHOULD return empty string WHEN input text start with /', () {
+ final validUrl = sanitizeUrl.process('/linagora.com');
+ expect(
+ validUrl,
+ equals('')
+ );
+ });
+
+ test('SHOULD return valid url WHEN input text is url encoded start with https', () {
+ final validUrl = sanitizeUrl.process('https%3A%2F%2Flinagora.com');
+ expect(
+ validUrl,
+ equals('https://linagora.com')
+ );
+ });
+
+ test('SHOULD return valid url WHEN input text is url encoded start with http', () {
+ final validUrl = sanitizeUrl.process('http%3A%2F%2Flinagora.com');
+ expect(
+ validUrl,
+ equals('http://linagora.com')
+ );
+ });
+ });
+}
\ No newline at end of file