MDL-41903 import typo3 4.7.15

This commit is contained in:
Petr Škoda 2013-09-19 22:02:45 +02:00
parent 7f3836d15a
commit 687c88785c
5 changed files with 441 additions and 34 deletions

View file

@ -193,7 +193,7 @@
<location>typo3</location> <location>typo3</location>
<name>Typo3</name> <name>Typo3</name>
<license>GPL</license> <license>GPL</license>
<version>4.7.4</version> <version>4.7.15</version>
<licenseversion>2.0+</licenseversion> <licenseversion>2.0+</licenseversion>
</library> </library>
<library> <library>

View file

@ -815,8 +815,16 @@ class t3lib_cs {
* @return string Output string * @return string Output string
*/ */
function entities_to_utf8($str, $alsoStdHtmlEnt = FALSE) { function entities_to_utf8($str, $alsoStdHtmlEnt = FALSE) {
// Workaround for #39287: 3rd parameter for get_html_translation_table() was only added in PHP 5.3.4 and later
// see http://php.net/manual/en/function.get-html-translation-table.php
$applyPhpCompatibilityFix = version_compare(phpversion(), '5.3.4', '<');
if ($alsoStdHtmlEnt) { if ($alsoStdHtmlEnt) {
$trans_tbl = array_flip(get_html_translation_table(HTML_ENTITIES, ENT_COMPAT, 'UTF-8')); if ($applyPhpCompatibilityFix === TRUE) {
$trans_tbl = array_flip(get_html_translation_table(HTML_ENTITIES, ENT_COMPAT));
} else {
$trans_tbl = array_flip(get_html_translation_table(HTML_ENTITIES, ENT_COMPAT, 'UTF-8'));
}
} }
$token = md5(microtime()); $token = md5(microtime());
@ -837,7 +845,11 @@ class t3lib_cs {
} }
$parts[$k] = $this->UnumberToChar($v); $parts[$k] = $this->UnumberToChar($v);
} elseif ($alsoStdHtmlEnt && isset($trans_tbl['&' . $v . ';'])) { // Other entities: } elseif ($alsoStdHtmlEnt && isset($trans_tbl['&' . $v . ';'])) { // Other entities:
$parts[$k] = $trans_tbl['&' . $v . ';']; $v = $trans_tbl['&' . $v . ';'];
if ($applyPhpCompatibilityFix === TRUE) {
$v = $this->utf8_encode($v, 'iso-8859-1');
}
$parts[$k] = $v;
} else { // No conversion: } else { // No conversion:
$parts[$k] = '&' . $v . ';'; $parts[$k] = '&' . $v . ';';
} }

View file

@ -933,26 +933,27 @@ final class t3lib_div {
* Returns a proper HMAC on a given input string and secret TYPO3 encryption key. * Returns a proper HMAC on a given input string and secret TYPO3 encryption key.
* *
* @param string $input Input string to create HMAC from * @param string $input Input string to create HMAC from
* @param string $additionalSecret additionalSecret to prevent hmac beeing used in a different context
* @return string resulting (hexadecimal) HMAC currently with a length of 40 (HMAC-SHA-1) * @return string resulting (hexadecimal) HMAC currently with a length of 40 (HMAC-SHA-1)
*/ */
public static function hmac($input) { public static function hmac($input, $additionalSecret = '') {
$hashAlgorithm = 'sha1'; $hashAlgorithm = 'sha1';
$hashBlocksize = 64; $hashBlocksize = 64;
$hmac = ''; $hmac = '';
$secret = $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] . $additionalSecret;
if (extension_loaded('hash') && function_exists('hash_hmac') && function_exists('hash_algos') && in_array($hashAlgorithm, hash_algos())) { if (extension_loaded('hash') && function_exists('hash_hmac') && function_exists('hash_algos') && in_array($hashAlgorithm, hash_algos())) {
$hmac = hash_hmac($hashAlgorithm, $input, $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']); $hmac = hash_hmac($hashAlgorithm, $input, $secret);
} else { } else {
// outer padding // outer padding
$opad = str_repeat(chr(0x5C), $hashBlocksize); $opad = str_repeat(chr(0x5C), $hashBlocksize);
// inner padding // inner padding
$ipad = str_repeat(chr(0x36), $hashBlocksize); $ipad = str_repeat(chr(0x36), $hashBlocksize);
if (strlen($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']) > $hashBlocksize) { if (strlen($secret) > $hashBlocksize) {
// keys longer than block size are shorten // keys longer than block size are shorten
$key = str_pad(pack('H*', call_user_func($hashAlgorithm, $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'])), $hashBlocksize, chr(0x00)); $key = str_pad(pack('H*', call_user_func($hashAlgorithm, $secret)), $hashBlocksize, chr(0));
} else { } else {
// keys shorter than block size are zero-padded // keys shorter than block size are zero-padded
$key = str_pad($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'], $hashBlocksize, chr(0x00)); $key = str_pad($secret, $hashBlocksize, chr(0));
} }
$hmac = call_user_func($hashAlgorithm, ($key ^ $opad) . pack('H*', call_user_func($hashAlgorithm, ($key ^ $ipad) . $input))); $hmac = call_user_func($hashAlgorithm, ($key ^ $opad) . pack('H*', call_user_func($hashAlgorithm, ($key ^ $ipad) . $input)));
} }
@ -1860,6 +1861,10 @@ final class t3lib_div {
*/ */
public static function array_merge_recursive_overrule(array $arr0, array $arr1, $notAddKeys = FALSE, $includeEmptyValues = TRUE, $enableUnsetFeature = TRUE) { public static function array_merge_recursive_overrule(array $arr0, array $arr1, $notAddKeys = FALSE, $includeEmptyValues = TRUE, $enableUnsetFeature = TRUE) {
foreach ($arr1 as $key => $val) { foreach ($arr1 as $key => $val) {
if ($enableUnsetFeature && $val === '__UNSET') {
unset($arr0[$key]);
continue;
}
if (is_array($arr0[$key])) { if (is_array($arr0[$key])) {
if (is_array($arr1[$key])) { if (is_array($arr1[$key])) {
$arr0[$key] = self::array_merge_recursive_overrule( $arr0[$key] = self::array_merge_recursive_overrule(
@ -1870,12 +1875,11 @@ final class t3lib_div {
$enableUnsetFeature $enableUnsetFeature
); );
} }
} elseif (!$notAddKeys || isset($arr0[$key])) { } elseif (
if ($enableUnsetFeature && $val === '__UNSET') { (!$notAddKeys || isset($arr0[$key])) &&
unset($arr0[$key]); ($includeEmptyValues || $val)
} elseif ($includeEmptyValues || $val) { ) {
$arr0[$key] = $val; $arr0[$key] = $val;
}
} }
} }
@ -4014,9 +4018,12 @@ final class t3lib_div {
* @see upload_to_tempfile(), tempnam() * @see upload_to_tempfile(), tempnam()
*/ */
public static function unlink_tempfile($uploadedTempFileName) { public static function unlink_tempfile($uploadedTempFileName) {
if ($uploadedTempFileName && self::validPathStr($uploadedTempFileName) && self::isFirstPartOfStr($uploadedTempFileName, PATH_site . 'typo3temp/') && @is_file($uploadedTempFileName)) { if ($uploadedTempFileName) {
if (unlink($uploadedTempFileName)) { $uploadedTempFileName = self::fixWindowsFilePath($uploadedTempFileName);
return TRUE; if (self::validPathStr($uploadedTempFileName) && self::isFirstPartOfStr($uploadedTempFileName, PATH_site . 'typo3temp/') && @is_file($uploadedTempFileName)) {
if (unlink($uploadedTempFileName)) {
return TRUE;
}
} }
} }
} }
@ -5564,6 +5571,12 @@ final class t3lib_div {
return; return;
} }
// This require_once is needed for deprecation calls
// thrown early during bootstrap, if the autoloader is
// not instantiated yet. This can happen for example if
// ext_localconf triggers a deprecation.
require_once __DIR__.'/class.t3lib_utility_debug.php';
$trail = debug_backtrace(); $trail = debug_backtrace();
if ($trail[1]['type']) { if ($trail[1]['type']) {
@ -5700,8 +5713,8 @@ final class t3lib_div {
public static function flushOutputBuffers() { public static function flushOutputBuffers() {
$obContent = ''; $obContent = '';
while ($obContent .= ob_get_clean()) { while ($content = ob_get_clean()) {
; $obContent .= $content;
} }
// if previously a "Content-Encoding: whatever" has been set, we have to unset it // if previously a "Content-Encoding: whatever" has been set, we have to unset it

View file

@ -0,0 +1,387 @@
<?php
/***************************************************************
* Copyright notice
*
* (c) 2010-2011 Steffen Kamper <steffen@typo3.org>
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* The GNU General Public License can be found at
* http://www.gnu.org/copyleft/gpl.html.
* A copy is found in the textfile GPL.txt and important notices to the license
* from the author is found in LICENSE.txt distributed with these scripts.
*
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
* Class to handle debug
*
*
* @author Steffen Kamper <steffen@typo3.org>
* @package TYPO3
* @subpackage t3lib
*/
final class t3lib_utility_Debug {
/**
* Template for debug output
*
* @var string
*/
const DEBUG_TABLE_TEMPLATE = '
<table class="typo3-debug" border="0" cellpadding="0" cellspacing="0" bgcolor="white" style="border:0px; margin-top:3px; margin-bottom:3px;">
<tr>
<td style="background-color:#bbbbbb; font-family: verdana,arial; font-weight: bold; font-size: 10px;">%s</td>
</tr>
<tr>
<td>
%s
</td>
</tr>
</table>
';
public static function debug($var = '', $header = '', $group = 'Debug') {
// buffer the output of debug if no buffering started before
if (ob_get_level() == 0) {
ob_start();
}
$debug = self::convertVariableToString($var);
if ($header) {
$debug = sprintf(self::DEBUG_TABLE_TEMPLATE, htmlspecialchars((string) $header), $debug);
}
if (TYPO3_MODE === 'BE') {
$debugString = self::prepareVariableForJavascript($debug, is_object($var));
$group = htmlspecialchars($group);
if ($header !== '') {
$tabHeader = htmlspecialchars($header);
} else {
$tabHeader = 'Debug';
}
$script = '
(function debug() {
var debugMessage = "' . $debugString . '";
var header = "' . $tabHeader . '";
var group = "' . $group . '";
if (typeof Ext !== "object" && (top && typeof top.Ext !== "object")) {
document.write(debugMessage);
return;
}
if (top && typeof Ext !== "object") {
Ext = top.Ext;
}
Ext.onReady(function() {
var TYPO3ViewportInstance = null;
if (top && top.TYPO3 && typeof top.TYPO3.Backend === "object") {
TYPO3ViewportInstance = top.TYPO3.Backend;
} else if (typeof TYPO3 === "object" && typeof TYPO3.Backend === "object") {
TYPO3ViewportInstance = TYPO3.Backend;
}
if (TYPO3ViewportInstance !== null) {
TYPO3ViewportInstance.DebugConsole.addTab(debugMessage, header, group);
} else {
document.write(debugMessage);
}
});
})();
';
echo t3lib_div::wrapJS($script);
} else {
echo $debug;
}
}
/**
* Replaces special characters for the usage inside javascript
*
* @param string $string
* @param boolean $asObject
* @return string
*/
public static function prepareVariableForJavascript($string, $asObject) {
if ($asObject) {
$string = str_replace(array(
'"', '/', '<', "\n", "\r"
), array(
'\"', '\/', '\<', '<br />', ''
), $string);
} else {
$string = str_replace(array(
'"', '/', '<', "\n", "\r"
), array(
'\"', '\/', '\<', '', ''
), $string);
}
return $string;
}
/**
* Converts a variable to a string
*
* @param mixed $variable
* @return string
*/
public static function convertVariableToString($variable) {
$string = '';
if (is_array($variable)) {
$string = self::viewArray($variable);
} elseif (is_object($variable)) {
$string = '<strong>|Object:<pre>';
$string .= print_r($variable, TRUE);
$string .= '</pre>|</strong>';
} elseif ((string) $variable !== '') {
$string = '<strong>|' . htmlspecialchars((string) $variable) . '|</strong>';
} else {
$string = '<strong>| debug |</strong>';
}
return $string;
}
/**
* Opens a debug message inside a popup window
*
* @param mixed $debugVariable
* @param string $header
* @param string $group
*/
public static function debugInPopUpWindow($debugVariable, $header = 'Debug', $group = 'Debug') {
$debugString = self::prepareVariableForJavascript(
self::convertVariableToString($debugVariable),
is_object($debugVariable)
);
$script = '
(function debug() {
var debugMessage = "' . $debugString . '",
header = "' . htmlspecialchars($header) . '",
group = "' . htmlspecialchars($group) . '",
browserWindow = function(debug, header, group) {
var newWindow = window.open("", "TYPO3DebugWindow_" + group,
"width=600,height=400,menubar=0,toolbar=1,status=0,scrollbars=1,resizable=1"
);
if (newWindow.document.body.innerHTML) {
newWindow.document.body.innerHTML = newWindow.document.body.innerHTML +
"<hr />" + debugMessage;
} else {
newWindow.document.writeln(
"<html><head><title>Debug: " + header + "(" + group + ")</title></head>"
+ "<body onload=\"self.focus()\">"
+ debugMessage
+ "</body></html>"
);
}
}
if (!top.Ext) {
browserWindow(debugMessage, header, group);
} else {
top.Ext.onReady(function() {
if (top && top.TYPO3 && top.TYPO3.Backend) {
top.TYPO3.Backend.DebugConsole.openBrowserWindow(header, debugMessage, group);
} else {
browserWindow(debugMessage, header, group);
}
});
}
})();
';
echo t3lib_div::wrapJS($script);
}
/**
* Displays the "path" of the function call stack in a string, using debug_backtrace
*
* @return string
*/
public static function debugTrail() {
$trail = debug_backtrace();
$trail = array_reverse($trail);
array_pop($trail);
$path = array();
foreach ($trail as $dat) {
$pathFragment = $dat['class'] . $dat['type'] . $dat['function'];
// add the path of the included file
if (in_array($dat['function'], array('require', 'include', 'require_once', 'include_once'))) {
$pathFragment .= '(' . substr($dat['args'][0], strlen(PATH_site)) . '),' . substr($dat['file'], strlen(PATH_site));
}
$path[] = $pathFragment . '#' . $dat['line'];
}
return implode(' // ', $path);
}
/**
* Displays an array as rows in a table. Useful to debug output like an array of database records.
*
* @param mixed Array of arrays with similar keys
* @param string Table header
* @param boolean If TRUE, will return content instead of echo'ing out.
* @return void Outputs to browser.
*/
public static function debugRows($rows, $header = '', $returnHTML = FALSE) {
if (is_array($rows)) {
$firstEl = reset($rows);
if (is_array($firstEl)) {
$headerColumns = array_keys($firstEl);
$tRows = array();
// Header:
$tRows[] = '<tr><td colspan="' . count($headerColumns) .
'" style="background-color:#bbbbbb; font-family: verdana,arial; font-weight: bold; font-size: 10px;"><strong>' .
htmlspecialchars($header) . '</strong></td></tr>';
$tCells = array();
foreach ($headerColumns as $key) {
$tCells[] = '
<td><font face="Verdana,Arial" size="1"><strong>' . htmlspecialchars($key) . '</strong></font></td>';
}
$tRows[] = '
<tr>' . implode('', $tCells) . '
</tr>';
// Rows:
foreach ($rows as $singleRow) {
$tCells = array();
foreach ($headerColumns as $key) {
$tCells[] = '
<td><font face="Verdana,Arial" size="1">' .
(is_array($singleRow[$key]) ? self::debugRows($singleRow[$key], '', TRUE) : htmlspecialchars($singleRow[$key])) .
'</font></td>';
}
$tRows[] = '
<tr>' . implode('', $tCells) . '
</tr>';
}
$table = '
<table border="1" cellpadding="1" cellspacing="0" bgcolor="white">' . implode('', $tRows) . '
</table>';
if ($returnHTML) {
return $table;
}
else
{
echo $table;
}
} else
{
debug('Empty array of rows', $header);
}
} else {
debug('No array of rows', $header);
}
}
/**
* Returns a string with a list of ascii-values for the first $characters characters in $string
*
* @param string String to show ASCII value for
* @param integer Number of characters to show
* @return string The string with ASCII values in separated by a space char.
*/
public static function ordinalValue($string, $characters = 100) {
if (strlen($string) < $characters) {
$characters = strlen($string);
}
for ($i = 0; $i < $characters; $i++) {
$valuestring .= ' ' . ord(substr($string, $i, 1));
}
return trim($valuestring);
}
/**
* Returns HTML-code, which is a visual representation of a multidimensional array
* use t3lib_div::print_array() in order to print an array
* Returns FALSE if $array_in is not an array
*
* @param mixed Array to view
* @return string HTML output
*/
public static function viewArray($array_in) {
if (is_array($array_in)) {
$result = '
<table border="1" cellpadding="1" cellspacing="0" bgcolor="white">';
if (count($array_in) == 0) {
$result .= '<tr><td><font face="Verdana,Arial" size="1"><strong>EMPTY!</strong></font></td></tr>';
} else {
foreach ($array_in as $key => $val) {
$result .= '<tr>
<td valign="top"><font face="Verdana,Arial" size="1">' . htmlspecialchars((string) $key) . '</font></td>
<td>';
if (is_array($val)) {
$result .= self::viewArray($val);
} elseif (is_object($val)) {
$string = '';
if (method_exists($val, '__toString')) {
$string .= get_class($val) . ': ' . (string) $val;
} else {
$string .= print_r($val, TRUE);
}
$result .= '<font face="Verdana,Arial" size="1" color="red">' .
nl2br(htmlspecialchars($string)) .
'<br /></font>';
} else {
if (gettype($val) == 'object') {
$string = 'Unknown object';
} else {
$string = (string) $val;
}
$result .= '<font face="Verdana,Arial" size="1" color="red">' .
nl2br(htmlspecialchars($string)) .
'<br /></font>';
}
$result .= '</td>
</tr>';
}
}
$result .= '</table>';
} else {
$result = '<table border="1" cellpadding="1" cellspacing="0" bgcolor="white">
<tr>
<td><font face="Verdana,Arial" size="1" color="red">' .
nl2br(htmlspecialchars((string) $array_in)) .
'<br /></font></td>
</tr>
</table>'; // Output it as a string.
}
return $result;
}
/**
* Prints an array
*
* @param mixed Array to print visually (in a table).
* @return void
* @see viewArray()
*/
public static function printArray($array_in) {
echo self::viewArray($array_in);
}
}
?>

View file

@ -1,16 +1,11 @@
Description of Typo3 libraries (v 4.7.4) import into Moodle Description of Typo3 libraries (v 4.7.15) import into Moodle
Changes: none Changes:
1/ hacked relative include of class.t3lib_utility_debug.php
skodak, stronk7 Procedure:
1/ download latest version form http://typo3.org/download/
2/ copy csconvtbl/*, unidata/* and all other necessary files we use
3/ run our phpunit tests with and without mbstring PHP extension
skodak, stronk7, moodler
Previous changes:
25 June 2010 - Martin D (4.3.0RC1)
I renamed getURL to getUrl since it was being called that way everywhere.
I added a check to avoid notices on lib/typo3/class.t3lib_cs.php line 976
22 October 2011 - Petr Skoda (4.5.0)
reapplied getURL --> getUrl in class.t3lib_div.php line 2992
reintroduced check to avoid notices on class.t3lib_cs.php line 1031