From 5143c47e0feeff92ac3dabf9277e23c13a6379f0 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Wed, 18 Nov 2015 07:28:40 -0500
Subject: [PATCH] Fix rcube_utils::words_match() to work with mixed/invalid/binary content (T844)

---
 tests/Framework/Utils.php             |   23 +++++++++++++++++++++++
 program/lib/Roundcube/rcube_utils.php |   14 ++++++++++----
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php
index e1b9bdb..7b6e7ba 100644
--- a/program/lib/Roundcube/rcube_utils.php
+++ b/program/lib/Roundcube/rcube_utils.php
@@ -993,12 +993,18 @@
      */
     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 b9b99ff..572a19c 100644
--- a/tests/Framework/Utils.php
+++ b/tests/Framework/Utils.php
@@ -395,6 +395,29 @@
     }
 
     /**
+     * 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()

--
Gitblit v1.9.1