[BUGFIX] Warnings in StringUtility
authorChristian Kuhn <lolli@schwarzbu.ch>
Sat, 8 Sep 2012 20:44:40 +0000 (22:44 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sat, 8 Sep 2012 20:51:58 +0000 (22:51 +0200)
StringUtility::isLastPartOfString does not sanitize the input arguments
enough and throws warnings if calling strlen() for example with arrays.
The patch changes the (new 6.0) method to sanitize the arguments and now
throws Exceptions if they can not be interpreted as string.
The tests are adapted to test for the exception and adds a test with
an object to the data provider.

Change-Id: I497a1478a7804c4bbeddc2d1e340e29d73efa200
Resolves: #40767
Releases: 6.0
Reviewed-on: http://review.typo3.org/14467
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
tests/Unit/t3lib/utility/class.t3lib_utility_stringTest.php
typo3/sysext/core/Classes/Utility/StringUtility.php

index 39e3511..6a30829 100644 (file)
@@ -63,30 +63,50 @@ class t3lib_utility_StringTest extends tx_phpunit_testcase {
                return array(
                        'no string match' => array('hello', 'bye'),
                        'no case sensitive string match' => array('hello world', 'World'),
+               );
+       }
+
+       /**
+        * @test
+        * @dataProvider isLastPartOfStringReturnsFalseForNotMatchingFirstPartDataProvider
+        */
+       public function isLastPartOfStringReturnsFalseForNotMatchingFirstPart($string, $part) {
+               $this->assertFalse(\TYPO3\CMS\Core\Utility\StringUtility::isLastPartOfString($string, $part));
+       }
+
+       /**
+        * Data provider for isLastPartOfStringReturnsThrowsExceptionWithInvalidArguments
+        *
+        * @return array
+        */
+       public function isLastPartOfStringReturnsInvalidArgumentDataProvider() {
+               return array(
                        'array is not part of string' => array('string', array()),
                        'string is not part of array' => array(array(), 'string'),
                        'NULL is not part of string' => array('string', NULL),
-                       'string is not part of array' => array(NULL, 'string'),
+                       'null is not part of array' => array(NULL, 'string'),
                        'NULL is not part of array' => array(array(), NULL),
-                       'array is not part of string' => array(NULL, array()),
+                       'array is not part of null' => array(NULL, array()),
                        'NULL is not part of empty string' => array('', NULL),
                        'false is not part of empty string' => array('', FALSE),
                        'empty string is not part of NULL' => array(NULL, ''),
                        'empty string is not part of false' => array(FALSE, ''),
                        'empty string is not part of zero integer' => array(0, ''),
                        'zero integer is not part of NULL' => array(NULL, 0),
-                       'zero integer is not part of empty string' => array('', 0)
+                       'zero integer is not part of empty string' => array('', 0),
+                       'string is not part of object' => array(new \stdClass(), 'foo'),
+                       'object is not part of string' => array('foo', new \stdClass()),
                );
        }
 
        /**
         * @test
-        * @dataProvider isLastPartOfStringReturnsFalseForNotMatchingFirstPartDataProvider
+        * @dataProvider isLastPartOfStringReturnsInvalidArgumentDataProvider
+        * @expectedException \InvalidArgumentException
         */
-       public function isLastPartOfStringReturnsFalseForNotMatchingFirstPart($string, $part) {
+       public function isLastPartOfStringReturnsThrowsExceptionWithInvalidArguments($string, $part) {
                $this->assertFalse(\TYPO3\CMS\Core\Utility\StringUtility::isLastPartOfString($string, $part));
        }
-
 }
 
 ?>
\ No newline at end of file
index ff05d22..f6f8244 100644 (file)
@@ -45,6 +45,19 @@ final class StringUtility {
         * @return boolean TRUE if $needle was found to be equal to the last part of $str
         */
        static public function isLastPartOfString($haystack, $needle) {
+                       // Sanitize $haystack and $needle
+               if (is_object($haystack) || (string)$haystack != $haystack || strlen($haystack) < 1) {
+                       throw new \InvalidArgumentException(
+                               '$haystack can not be interpreted as string or has no length',
+                               1347135544
+                       );
+               }
+               if (is_object($needle) || (string)$needle != $needle || strlen($needle) < 1) {
+                       throw new \InvalidArgumentException(
+                               '$needle can not be interpreted as string or has no length',
+                               1347135545
+                       );
+               }
                $stringLength = strlen($haystack);
                $needleLength = strlen($needle);
                return strrpos((string) $haystack, (string) $needle, 0) === $stringLength - $needleLength;