From cbe701ac4ac574f91b6217f8d1a5692beb5d73e2 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 18 Nov 2015 13:27:00 +0100 Subject: [PATCH] Fix rcube_utils::words_match() to work with mixed/invalid/binary content (T844) --- program/lib/Roundcube/rcube_utils.php | 14 ++++++++++---- tests/Framework/Utils.php | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index 60a1ccccf..06f4314b7 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -947,12 +947,18 @@ class rcube_utils */ public static function words_match($haystack, $needle) { - $a_needle = self::tokenize_string($needle, 1); - $haystack = join(" ", self::tokenize_string($haystack, 1)); + $a_needle = self::tokenize_string($needle, 1); + $_haystack = join(" ", self::tokenize_string($haystack, 1)); + $valid = strlen($_haystack) > 0; + $hits = 0; - $hits = 0; foreach ($a_needle as $w) { - if (stripos($haystack, $w) !== false) { + if ($valid) { + if (stripos($_haystack, $w) !== false) { + $hits++; + } + } + else if (stripos($haystack, $w) !== false) { $hits++; } } diff --git a/tests/Framework/Utils.php b/tests/Framework/Utils.php index b0bfeefa5..08e641440 100644 --- a/tests/Framework/Utils.php +++ b/tests/Framework/Utils.php @@ -399,6 +399,29 @@ class Framework_Utils extends PHPUnit_Framework_TestCase } } + /** + * rcube:utils::words_match() + */ + function test_words_match() + { + $test = array( + array('', 'test', false), + array('test', 'test', true), + array('test', 'none', false), + array('test', 'test xyz', false), + array('test xyz', 'test xyz', true), + array('this is test', 'test', true), + // try some binary content + array('this is test ' . base64_decode('R0lGODlhDwAPAIAAAMDAwAAAACH5BAEAAAAALAAAAAAPAA8AQAINhI+py+0Po5y02otnAQA7'), 'test', true), + array('this is test ' . base64_decode('R0lGODlhDwAPAIAAAMDAwAAAACH5BAEAAAAALAAAAAAPAA8AQAINhI+py+0Po5y02otnAQA7'), 'none', false), + ); + + foreach ($test as $idx => $params) { + $result = rcube_utils::words_match($params[0], $params[1]); + $this->assertSame($params[2], $result, "words_match() at index $idx"); + } + } + /** * rcube:utils::is_absolute_path() */