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