Fixed bug #13972: cropHTML uses faulty reg exp for HTML entities (thanks to Ralf...
authorJochen Rau <j.rau@web.de>
Thu, 22 Apr 2010 09:17:51 +0000 (09:17 +0000)
committerJochen Rau <j.rau@web.de>
Thu, 22 Apr 2010 09:17:51 +0000 (09:17 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@7423 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
typo3/sysext/cms/tests/tslib/tslib_cObj_testcase.php
typo3/sysext/cms/tslib/class.tslib_content.php

index f292c54..e2e584d 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2010-04-22 Jochen Rau <jochen.rau@typoplanet.de>
+
+       * Fixed bug #13972: cropHTML uses faulty reg exp for HTML entities (thanks to Ralf Hettinger)
+
 2010-04-22  Ernesto Baschny  <ernst@cron-it.de>
 
        * Fixed bug #14176: unit test for RemoveXSS triggers fatal error in phpunit extension (thanks to Jigal van Hemert)
index 9494b73..9ac5017 100644 (file)
@@ -69,8 +69,8 @@ class tslib_cObj_testcase extends tx_phpunit_testcase {
        public function providerForCrop() {
                $plainText = 'Kasper Skårhøj implemented the original version of the crop function.';
                $textWithMarkup = '<strong><a href="mailto:kasper@typo3.org">Kasper Skårhøj</a> implemented</strong> the original version of the crop function.';
-               $textWithEntities = 'Kasper Sk&aring;rh&oslash;j implemented the original version of the crop function.';
-
+               $textWithEntities = 'Kasper Sk&aring;rh&oslash;j implemented the; original version of the crop function.';
+               
                $charsets = array();
                $charsets[] = 'iso-8859-1';
                $charsets[] = 'utf-8';
@@ -104,9 +104,9 @@ class tslib_cObj_testcase extends tx_phpunit_testcase {
                                $charset . ' text with entities 14|...' => array('14|...', $textWithEntities, 'Kasper Sk&aring;rh&oslash;j...', $charset),
                                $charset . ' text with entities 15|...' => array('15|...', $textWithEntities, 'Kasper Sk&aring;rh&oslash;j ...', $charset),
                                $charset . ' text with entities 16|...' => array('16|...', $textWithEntities, 'Kasper Sk&aring;rh&oslash;j i...', $charset),
-                               $charset . ' text with entities -56|...' => array('-56|...', $textWithEntities, '...j implemented the original version of the crop function.', $charset),
-                               $charset . ' text with entities -57|...' => array('-57|...', $textWithEntities, '...&oslash;j implemented the original version of the crop function.', $charset),
-                               $charset . ' text with entities -58|...' => array('-58|...', $textWithEntities, '...h&oslash;j implemented the original version of the crop function.', $charset),
+                               $charset . ' text with entities -57|...' => array('-57|...', $textWithEntities, '...j implemented the; original version of the crop function.', $charset),
+                               $charset . ' text with entities -58|...' => array('-58|...', $textWithEntities, '...&oslash;j implemented the; original version of the crop function.', $charset),
+                               $charset . ' text with entities -59|...' => array('-59|...', $textWithEntities, '...h&oslash;j implemented the; original version of the crop function.', $charset),
                                $charset . ' text with entities 9|...|1' => array('9|...|1', $textWithEntities, 'Kasper...', $charset),
                                $charset . ' text with entities 10|...|1' => array('10|...|1', $textWithEntities, 'Kasper...', $charset),
                                $charset . ' text with entities 11|...|1' => array('11|...|1', $textWithEntities, 'Kasper...', $charset),
@@ -114,9 +114,9 @@ class tslib_cObj_testcase extends tx_phpunit_testcase {
                                $charset . ' text with entities 14|...|1' => array('14|...|1', $textWithEntities, 'Kasper Sk&aring;rh&oslash;j...', $charset),
                                $charset . ' text with entities 15|...|1' => array('15|...|1', $textWithEntities, 'Kasper Sk&aring;rh&oslash;j...', $charset),
                                $charset . ' text with entities 16|...|1' => array('16|...|1', $textWithEntities, 'Kasper Sk&aring;rh&oslash;j...', $charset),
-                               $charset . ' text with entities -56|...|1' => array('-56|...|1', $textWithEntities, '...implemented the original version of the crop function.', $charset),
-                               $charset . ' text with entities -57|...|1' => array('-57|...|1', $textWithEntities, '...implemented the original version of the crop function.', $charset),
-                               $charset . ' text with entities -58|...|1' => array('-58|...|1', $textWithEntities, '...implemented the original version of the crop function.', $charset)
+                               $charset . ' text with entities -57|...|1' => array('-57|...|1', $textWithEntities, '...implemented the; original version of the crop function.', $charset),
+                               $charset . ' text with entities -58|...|1' => array('-58|...|1', $textWithEntities, '...implemented the; original version of the crop function.', $charset),
+                               $charset . ' text with entities -59|...|1' => array('-59|...|1', $textWithEntities, '...implemented the; original version of the crop function.', $charset)
                                ));
                }
                return $data;
index b91cb81..bbd0f73 100644 (file)
@@ -4308,11 +4308,16 @@ class tslib_cObj {
                                if (($strLen + $thisStrLen > $absChars)) {
                                        $croppedOffset = $offset;
                                        $cropPosition = $absChars - $strLen;
+                                               // The snippet "&[^&\s;]{2,8};" in the RegEx below represents entities.
+                                       $patternMatchEntityAsSingleChar = '(&[^&\s;]{2,8};|.)';
                                        if ($crop2space) {
-                                               $cropRegEx = $chars < 0 ? '#(?<=\s)(.(?![^&\s]{2,7};)|(&[^&\s;]{2,7};)){0,' . $cropPosition . '}$#ui' : '#^(.(?![^&\s]{2,7};)|(&[^&\s;]{2,7};)){0,' . $cropPosition . '}(?=\s)#ui';
+                                               $cropRegEx = $chars < 0 ?
+                                                       '#(?<=\s)' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}$#ui' :
+                                                       '#^' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}(?=\s)#ui';
                                        } else {
-                                               // The snippets "&[^&\s;]{2,7};" in the RegEx below represents entities.
-                                               $cropRegEx = $chars < 0 ? '#(.(?![^&\s]{2,7};)|(&[^&\s;]{2,7};)){0,' . $cropPosition . '}$#ui' : '#^(.(?![^&\s]{2,7};)|(&[^&\s;]{2,7};)){0,' . $cropPosition . '}#ui';
+                                               $cropRegEx = $chars < 0 ?
+                                                       '#' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}$#ui' :
+                                                       '#^' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}#ui';
                                        }
                                        if (preg_match($cropRegEx, $tempContent, $croppedMatch)) {
                                                $tempContent = $croppedMatch[0];