From ed897e9b97dd1824f3bd1dc10e20ebf76e748938 Mon Sep 17 00:00:00 2001 From: Taras Machyshyn Date: Tue, 13 Aug 2019 11:56:15 +0300 Subject: [PATCH] Util changes --- application/Espo/Core/Utils/Util.php | 40 +++++++++++++++++++++ tests/unit/Espo/Core/Utils/UtilTest.php | 46 +++++++++++++++++++++++-- 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/application/Espo/Core/Utils/Util.php b/application/Espo/Core/Utils/Util.php index 78f241135d..08e967cd3a 100644 --- a/application/Espo/Core/Utils/Util.php +++ b/application/Espo/Core/Utils/Util.php @@ -757,4 +757,44 @@ class Util return $sanitized; } + + public static function urlAddParam($url, $paramName, $paramValue) + { + $urlQuery = parse_url($url, \PHP_URL_QUERY); + + if (!$urlQuery) { + $params = [ + $paramName => $paramValue + ]; + + return $url . '/?' . http_build_query($params); + } + + parse_str($urlQuery, $params); + + if (!isset($params[$paramName]) || $params[$paramName] != $paramValue) { + $params[$paramName] = $paramValue; + + return str_replace($urlQuery, http_build_query($params), $url); + } + + return $url; + } + + public static function urlRemoveParam($url, $paramName) + { + $urlQuery = parse_url($url, \PHP_URL_QUERY); + + if ($urlQuery) { + parse_str($urlQuery, $params); + + if (isset($params[$paramName])) { + unset($params[$paramName]); + + return str_replace($urlQuery, http_build_query($params), $url); + } + } + + return $url; + } } diff --git a/tests/unit/Espo/Core/Utils/UtilTest.php b/tests/unit/Espo/Core/Utils/UtilTest.php index 7ed350765b..d719925851 100644 --- a/tests/unit/Espo/Core/Utils/UtilTest.php +++ b/tests/unit/Espo/Core/Utils/UtilTest.php @@ -1586,11 +1586,11 @@ class UtilTest extends \PHPUnit\Framework\TestCase public function htmlList() { return [ - ['Test', 'Test<script>alert("test")</script>'], + ['Test<script>alert("test")</script>', 'Test'], ['

Test

', '

Test

'], ['

Test

', '

Test

'], ['
Test
', '
Test
'], - ['

Test test link

', '

Test <a href="#">test link</a>

'], + ['

Test <a href="#">test link</a>

', '

Test test link

'], ['Test', 'Test'], ]; } @@ -1598,8 +1598,48 @@ class UtilTest extends \PHPUnit\Framework\TestCase /** * @dataProvider htmlList */ - public function testSanitizeHtml($html, $expectedResult) + public function testSanitizeHtml($expectedResult, $html) { $this->assertEquals($expectedResult, Util::sanitizeHtml($html)); } + + public function urlAddParamList() + { + return [ + ['https://test.link/?param1=1111', 'https://test.link', 'param1', '1111'], + ['https://test.link/?param1=1111¶m2=2222', 'https://test.link/?param1=1111', 'param2', '2222'], + ['https://test.link/?param2=2222¶m1=1111', 'https://test.link/?param2=2222', 'param1', '1111'], + ['https://test.link/?param1=1111¶m2=2222', 'https://test.link/?param1=1111¶m2=2222', 'param1', '1111'], + ['https://test.link/?param1=3333¶m2=2222', 'https://test.link/?param1=1111¶m2=2222', 'param1', '3333'], + ['https://test.link/?param1=1111¶m2=2222&new-param3=85%7BXjKbrNe%40%5D8', 'https://test.link/?param1=1111¶m2=2222', 'new-param3', '85{XjKbrNe@]8'], + ]; + } + + /** + * @dataProvider urlAddParamList + */ + public function testUrlAddParam($expectedResult, $url, $paramName, $paramValue) + { + $this->assertEquals($expectedResult, Util::urlAddParam($url, $paramName, $paramValue)); + } + + public function urlRemoveParamList() + { + return [ + ['https://test.link', 'https://test.link', 'param1'], + ['https://test.link/', 'https://test.link/', 'param1'], + ['https://test.link/?param1=1111', 'https://test.link/?param1=1111', 'param2'], + ['https://test.link/?param2=2222', 'https://test.link/?param1=1111¶m2=2222', 'param1'], + ['https://test.link/?param1=1111', 'https://test.link/?param1=1111¶m2=2222', 'param2'], + ['https://test.link/?param1=1111¶m2=2222', 'https://test.link/?param1=1111¶m2=2222&new-param3=85%7BXjKbrNe%40%5D8', 'new-param3'], + ]; + } + + /** + * @dataProvider urlRemoveParamList + */ + public function testUrlRemoveParam($expectedResult, $url, $paramName) + { + $this->assertEquals($expectedResult, Util::urlRemoveParam($url, $paramName)); + } }