Fix rcube_utils::words_match() to work with mixed/invalid/binary content (T844)
| | |
| | | public static function words_match($haystack, $needle) |
| | | { |
| | | $a_needle = self::tokenize_string($needle, 1); |
| | | $haystack = join(" ", self::tokenize_string($haystack, 1)); |
| | | |
| | | $_haystack = join(" ", self::tokenize_string($haystack, 1)); |
| | | $valid = strlen($_haystack) > 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++; |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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() |
| | | */ |
| | | function test_is_absolute_path() |