Index: t3lib/config_default.php =================================================================== --- t3lib/config_default.php (Revision 5203) +++ t3lib/config_default.php (Arbeitskopie) @@ -237,6 +237,7 @@ 'AJAX' => array( // array of key-value pairs for a unified use of AJAX calls in the TYPO3 backend. Keys are the unique ajaxIDs where the value will be resolved to call a method in an object. See ajax.php and the classes/class.typo3ajax.php for more information. 'SC_alt_db_navframe::expandCollapse' => 'typo3/alt_db_navframe.php:SC_alt_db_navframe->ajaxExpandCollapse', 'SC_alt_file_navframe::expandCollapse' => 'typo3/alt_file_navframe.php:SC_alt_file_navframe->ajaxExpandCollapse', + 'tcefile::process' => 'typo3/classes/class.typo3_tcefile.php:TYPO3_tcefile->processAjaxRequest', 't3lib_TCEforms_inline::createNewRecord' => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest', 't3lib_TCEforms_inline::synchronizeLocalizeRecords' => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest', 't3lib_TCEforms_inline::setExpandedCollapsedState' => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest', Index: t3lib/class.t3lib_extfilefunc.php =================================================================== --- t3lib/class.t3lib_extfilefunc.php (Revision 5203) +++ t3lib/class.t3lib_extfilefunc.php (Arbeitskopie) @@ -2,7 +2,7 @@ /*************************************************************** * Copyright notice * -* (c) 1999-2009 Kasper Skaarhoj (kasperYYYY@typo3.com) +* (c) 1999-2008 Kasper Skaarhoj (kasperYYYY@typo3.com) * All rights reserved * * This script is part of the TYPO3 project. The TYPO3 project is @@ -210,19 +210,24 @@ /** * Processing the command array in $this->fileCmdMap * - * @return void + * @return mixed false, if the file functions were not initialized + * otherwise returns an array of all the results that are returned + * from each command, separated in each action. */ - function processData() { - if (!$this->isInit) return FALSE; + function processData() { + $result = array(); + if (!$this->isInit) { + return false; + } - if (is_array($this->fileCmdMap)) { + if (is_array($this->fileCmdMap)) { // Check if there were uploads expected, but no one made - if ($this->fileCmdMap['upload']) { + if ($this->fileCmdMap['upload']) { $uploads = $this->fileCmdMap['upload']; - foreach ($uploads as $arr) { - if (!$_FILES['upload_'.$arr['data']]['name']) { - unset($this->fileCmdMap['upload'][$arr['data']]); + foreach ($uploads as $upload) { + if (!$_FILES['upload_' . $upload['data']]['name']) { + unset($this->fileCmdMap['upload'][$upload['data']]); } } if (count($this->fileCmdMap['upload']) == 0) { @@ -231,49 +236,51 @@ } // Traverse each set of actions - foreach($this->fileCmdMap as $action => $actionData) { + foreach ($this->fileCmdMap as $action => $actionData) { // Traverse all action data. More than one file might be affected at the same time. - if (is_array($actionData)) { - foreach($actionData as $cmdArr) { + if (is_array($actionData)) { + $result[$action] = array(); + foreach ($actionData as $cmdArr) { // Clear file stats clearstatcache(); // Branch out based on command: - switch ($action) { + switch ($action) { case 'delete': - $this->func_delete($cmdArr); + $result[$action][] = $this->func_delete($cmdArr); break; case 'copy': - $this->func_copy($cmdArr); + $result[$action][] = $this->func_copy($cmdArr); break; case 'move': - $this->func_move($cmdArr); + $result[$action][] = $this->func_move($cmdArr); break; case 'rename': - $this->func_rename($cmdArr); + $result[$action][] = $this->func_rename($cmdArr); break; case 'newfolder': - $this->func_newfolder($cmdArr); + $result[$action][] = $this->func_newfolder($cmdArr); break; case 'newfile': - $this->func_newfile($cmdArr); + $result[$action][] = $this->func_newfile($cmdArr); break; case 'editfile': - $this->func_edit($cmdArr); + $result[$action][] = $this->func_edit($cmdArr); break; case 'upload': - $this->func_upload($cmdArr); + $result[$action][] = $this->func_upload($cmdArr); break; case 'unzip': - $this->func_unzip($cmdArr); + $result[$action][] = $this->func_unzip($cmdArr); break; } } } } } + return $result; } /** @@ -282,58 +289,73 @@ * @param string Redirect URL (for creating link in message) * @return void (Will exit on error) */ - function printLogErrorMessages($redirect='') { + function printLogErrorMessages($redirect = '') { + // fetch the error messages from the DB + $errorMessages = $this->getErrorMessages(); - $res_log = $GLOBALS['TYPO3_DB']->exec_SELECTquery( - '*', - 'sys_log', - 'type=2 AND userid='.intval($GLOBALS['BE_USER']->user['uid']).' AND tstamp='.intval($GLOBALS['EXEC_TIME']).' AND error!=0' - ); - $errorJS = array(); - while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_log)) { - $log_data = unserialize($row['log_data']); - $errorJS[] = $row[error].': '.sprintf($row['details'], $log_data[0],$log_data[1],$log_data[2],$log_data[3],$log_data[4]); - } + // only print error messages if there is an error + if (count($errorMessages)) { + $errorDoc = t3lib_div::makeInstance('template'); + $errorDoc->backPath = ''; - if (count($errorJS)) { - $error_doc = t3lib_div::makeInstance('template'); - $error_doc->backPath = ''; + $content = $errorDoc->startPage('tce_db.php Error output'); - $content.= $error_doc->startPage('tce_db.php Error output'); - $lines[] = ' Errors: '; - foreach($errorJS as $line) { + foreach ($errorMessages as $line) { $lines[] = ' - - '.htmlspecialchars($line).' + + ' . htmlspecialchars($line) . ' '; } $lines[] = '
'. - '
'. + '
'. ' '; - $content.= ' + $content .= '

- '.implode('',$lines).' + ' . implode('', $lines) . '
'; - $content.= $error_doc->endPage(); - echo $content; - exit; + $content .= $errorDoc->endPage(); + die($content); } } + /** + * Returns log error messages from the previous file operations of this script instance + * + * @return array all errorMessages as a numerical array + */ + function getErrorMessages() { + $errorMessages = array(); + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( + '*', + 'sys_log', + 'type = 2 AND userid = ' . intval($GLOBALS['BE_USER']->user['uid']) + . ' AND tstamp=' . intval($GLOBALS['EXEC_TIME']) + . ' AND error != 0' + ); + while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { + $logData = unserialize($row['log_data']); + $errorMessages[] = $row['error'] . ': ' . sprintf($row['details'], $logData[0], $logData[1], $logData[2], $logData[3], $logData[4]); + } + return $errorMessages; + } + + + + /** * Goes back in the path and checks in each directory if a folder named $this->recyclerFN (usually '_recycler_') is present. * If a folder in the tree happens to be a _recycler_-folder (which means that we're deleting something inside a _recycler_-folder) this is ignored * @@ -788,7 +810,7 @@ /** * Upload of files (action=1) * - * @param array $cmds['data'] is the ID-number (points to the global var that holds the filename-ref ($_FILES['upload_'.$id]['name']). $cmds['target'] is the target directory + * @param array $cmds['data'] is the ID-number (points to the global var that holds the filename-ref ($_FILES['upload_'.$id]['name']). $cmds['target'] is the target directory, $cmds['charset'] is the the character set of the file name (utf-8 is needed for JS-interaction) * @return string Returns the new filename upon success */ function func_upload($cmds) { @@ -797,7 +819,7 @@ if ($_FILES['upload_'.$id]['name']) { $theFile = $_FILES['upload_'.$id]['tmp_name']; // filename of the uploaded file $theFileSize = $_FILES['upload_'.$id]['size']; // filesize of the uploaded file - $theName = $this->cleanFileName(stripslashes($_FILES['upload_'.$id]['name'])); // The original filename + $theName = $this->cleanFileName(stripslashes($_FILES['upload_'.$id]['name']), (isset($cmds['charset']) ? $cmds['charset'] : '')); // The original filename if (is_uploaded_file($theFile) && $theName) { // Check the file if ($this->actionPerms['uploadFile']) { if ($theFileSize<($this->maxUploadFileSize*1024)) { Index: typo3/tce_file.php =================================================================== --- typo3/tce_file.php (Revision 5203) +++ typo3/tce_file.php (Arbeitskopie) @@ -27,159 +27,26 @@ /** * Gateway for TCE (TYPO3 Core Engine) file-handling through POST forms. * This script serves as the fileadministration part of the TYPO3 Core Engine. - * Basically it includes two libraries which are used to manipulate files on the server. * * For syntax and API information, see the document 'TYPO3 Core APIs' + * + * For TYPO3 4.3 the class in this file was extracted to typo3/classes/class.typo3_tcefile.php + * in order to separate the actual script call from the core class, and to make use + * of the class in a separate context (mainly AJAX) * * $Id$ * Revised for TYPO3 3.6 July/2003 by Kasper Skaarhoj + * Revised for TYPO3 4.3 Mar/2009 by Benjamin Mack * * @author Kasper Skaarhoj */ -/** - * [CLASS/FUNCTION INDEX of SCRIPT] - * - * - * - * 77: class SC_tce_file - * 97: function init() - * 117: function initClipboard() - * 138: function main() - * 164: function finish() - * - * TOTAL FUNCTIONS: 4 - * (This index is automatically created/updated by the extension "extdeveval") - * - */ -require('init.php'); -require('template.php'); -require_once(PATH_t3lib . 'class.t3lib_basicfilefunc.php'); -require_once(PATH_t3lib . 'class.t3lib_extfilefunc.php'); +require_once('init.php'); +require_once('classes/class.typo3_tcefile.php'); - - -/** - * Script Class, handling the calling of methods in the file admin classes. - * - * @author Kasper Skaarhoj - * @package TYPO3 - * @subpackage core - */ -class SC_tce_file { - - // Internal, static: GPvar: - var $file; // Array of file-operations. - var $redirect; // Redirect URL - var $CB; // Clipboard operations array - var $overwriteExistingFiles; // If existing files should be overridden. - var $vC; // VeriCode - a hash of server specific value and other things which identifies if a submission is OK. (see $BE_USER->veriCode()) - - // Internal, dynamic: - var $include_once = array(); // Used to set the classes to include after the init() function is called. - var $fileProcessor; // File processor object - - - - /** - * Registering Incoming data - * - * @return void - */ - function init() { - // GPvars: - $this->file = t3lib_div::_GP('file'); - $this->redirect = t3lib_div::_GP('redirect'); - $this->CB = t3lib_div::_GP('CB'); - $this->overwriteExistingFiles = t3lib_div::_GP('overwriteExistingFiles'); - $this->vC = t3lib_div::_GP('vC'); - - // If clipboard is set, then include the clipboard class: - if (is_array($this->CB)) { - $this->include_once[] = PATH_t3lib . 'class.t3lib_clipboard.php'; - } - } - - /** - * Initialize the Clipboard. This will fetch the data about files to paste/delete if such an action has been sent. - * - * @return void - */ - function initClipboard() { - if (is_array($this->CB)) { - $clipObj = t3lib_div::makeInstance('t3lib_clipboard'); - $clipObj->initializeClipboard(); - if ($this->CB['paste']) { - $clipObj->setCurrentPad($this->CB['pad']); - $this->file = $clipObj->makePasteCmdArray_file($this->CB['paste'], $this->file); - } - if ($this->CB['delete']) { - $clipObj->setCurrentPad($this->CB['pad']); - $this->file = $clipObj->makeDeleteCmdArray_file($this->file); - } - } - } - - /** - * Performing the file admin action: - * Initializes the objects, setting permissions, sending data to object. - * - * @return void - */ - function main() { - global $FILEMOUNTS,$TYPO3_CONF_VARS,$BE_USER; - - // Initializing: - $this->fileProcessor = t3lib_div::makeInstance('t3lib_extFileFunctions'); - $this->fileProcessor->init($GLOBALS['FILEMOUNTS'], $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']); - $this->fileProcessor->init_actionPerms($GLOBALS['BE_USER']->getFileoperationPermissions()); - $this->fileProcessor->dontCheckForUnique = $this->overwriteExistingFiles ? 1 : 0; - - // Checking referer / executing: - $refInfo = parse_url(t3lib_div::getIndpEnv('HTTP_REFERER')); - $httpHost = t3lib_div::getIndpEnv('TYPO3_HOST_ONLY'); - if ($httpHost != $refInfo['host'] && $this->vC != $GLOBALS['BE_USER']->veriCode() && !$GLOBALS['TYPO3_CONF_VARS']['SYS']['doNotCheckReferer']) { - $this->fileProcessor->writeLog(0, 2, 1, 'Referer host "%s" and server host "%s" did not match!', array($refInfo['host'], $httpHost)); - } else { - $this->fileProcessor->start($this->file); - $this->fileProcessor->processData(); - } - } - - /** - * Redirecting the user after the processing has been done. - * Might also display error messages directly, if any. - * - * @return void - */ - function finish() { - // Prints errors, if... - $this->fileProcessor->printLogErrorMessages($this->redirect); - - t3lib_BEfunc::getSetUpdateSignal('updateFolderTree'); - if ($this->redirect) { - Header('Location: '.t3lib_div::locationHeaderUrl($this->redirect)); - } - } -} - - -if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/tce_file.php']) { - include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/tce_file.php']); -} - - - // Make instance: -$SOBE = t3lib_div::makeInstance('SC_tce_file'); +$SOBE = t3lib_div::makeInstance('TYPO3_tcefile'); $SOBE->init(); - -// Include files? -foreach ($SOBE->include_once as $INC_FILE) { - include_once($INC_FILE); -} - -$SOBE->initClipboard(); $SOBE->main(); $SOBE->finish(); Index: typo3/classes/class.typo3_tcefile.php =================================================================== --- typo3/classes/class.typo3_tcefile.php (Revision 0) +++ typo3/classes/class.typo3_tcefile.php (Revision 0) @@ -0,0 +1,188 @@ + + */ + +require_once(PATH_typo3 . 'template.php'); +require_once(PATH_t3lib . 'class.t3lib_basicfilefunc.php'); +require_once(PATH_t3lib . 'class.t3lib_extfilefunc.php'); +require_once(PATH_t3lib . 'class.t3lib_clipboard.php'); + +/** + * Script Class, handling the calling of methods in the file admin classes. + * + * @author Kasper Skaarhoj + * @package TYPO3 + * @subpackage core + */ +class TYPO3_tcefile { + + // Internal, static: GPvar: + // Array of file-operations. + protected $file; + // Clipboard operations array + protected $CB; + // If existing files should be overridden. + protected $overwriteExistingFiles; + // VeriCode - a hash of server specific value and other things which + // identifies if a submission is OK. (see $BE_USER->veriCode()) + protected $vC; + // the page where the user should be redirected after everything is done + protected $redirect; + + // Internal, dynamic: + // File processor object + protected $fileProcessor; + // the result array from the file processor + protected $fileData; + + + + /** + * Registering incoming data + * + * @return void + */ + public function init() { + // set the GPvars from outside + $this->file = t3lib_div::_GP('file'); + $this->CB = t3lib_div::_GP('CB'); + $this->overwriteExistingFiles = t3lib_div::_GP('overwriteExistingFiles'); + $this->vC = t3lib_div::_GP('vC'); + $this->redirect = t3lib_div::_GP('redirect'); + + $this->initClipboard(); + } + + /** + * Initialize the Clipboard. This will fetch the data about files to paste/delete if such an action has been sent. + * + * @return void + */ + public function initClipboard() { + if (is_array($this->CB)) { + $clipObj = t3lib_div::makeInstance('t3lib_clipboard'); + $clipObj->initializeClipboard(); + if ($this->CB['paste']) { + $clipObj->setCurrentPad($this->CB['pad']); + $this->file = $clipObj->makePasteCmdArray_file($this->CB['paste'], $this->file); + } + if ($this->CB['delete']) { + $clipObj->setCurrentPad($this->CB['pad']); + $this->file = $clipObj->makeDeleteCmdArray_file($this->file); + } + } + } + + /** + * Performing the file admin action: + * Initializes the objects, setting permissions, sending data to object. + * + * @return void + */ + public function main() { + // Initializing: + $this->fileProcessor = t3lib_div::makeInstance('t3lib_extFileFunctions'); + $this->fileProcessor->init($GLOBALS['FILEMOUNTS'], $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']); + $this->fileProcessor->init_actionPerms($GLOBALS['BE_USER']->getFileoperationPermissions()); + $this->fileProcessor->dontCheckForUnique = ($this->overwriteExistingFiles ? 1 : 0); + + // Checking referer / executing: + $refInfo = parse_url(t3lib_div::getIndpEnv('HTTP_REFERER')); + $httpHost = t3lib_div::getIndpEnv('TYPO3_HOST_ONLY'); + if ($httpHost != $refInfo['host'] + && $this->vC != $GLOBALS['BE_USER']->veriCode() + && !$GLOBALS['TYPO3_CONF_VARS']['SYS']['doNotCheckReferer'] + && $GLOBALS['CLIENT']['BROWSER'] != 'flash') { + $this->fileProcessor->writeLog(0, 2, 1, 'Referer host "%s" and server host "%s" did not match!', array($refInfo['host'], $httpHost)); + } else { + $this->fileProcessor->start($this->file); + $this->fileData = $this->fileProcessor->processData(); + } + } + + /** + * Redirecting the user after the processing has been done. + * Might also display error messages directly, if any. + * + * @return void + */ + public function finish() { + // Prints errors, if there are any + $this->fileProcessor->printLogErrorMessages($this->redirect); + t3lib_BEfunc::getSetUpdateSignal('updateFolderTree'); + if ($this->redirect) { + header('Location: ' . t3lib_div::locationHeaderUrl($this->redirect)); + } + } + + /** + * Handles the actual process from within the ajaxExec function + * therefore, it does exactly the same as the real typo3/tce_file.php + * but without calling the "finish" method, thus makes it simpler to deal with the + * actual return value + * + * + * @param string $params always empty. + * @param string $ajaxObj The Ajax object used to return content and set content types + * @return void + */ + public function processAjaxRequest($params = array(), TYPO3AJAX &$ajaxObj = null) { + $this->init(); + $this->main(); + $errors = $this->fileProcessor->getErrorMessages(); + if (count($errors)) { + $ajaxObj->setError(implode(',', $errors)); + } else { + $ajaxObj->addContent('result', $this->fileData); + if ($this->redirect) { + $ajaxObj->addContent('redirect', $this->redirect); + } + $ajaxObj->setContentFormat('json'); + } + } +} + +if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/classes/class.typo3_tcefile.php']) { + include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/classes/class.typo3_tcefile.php']); +} + +?> \ No newline at end of file Eigenschaftsänderungen: typo3/classes/class.typo3_tcefile.php ___________________________________________________________________ Hinzugefügt: svn:executable + *