/src/typo3_src-4.2.0alpha1/t3lib/class.t3lib_extfilefunc.php

00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2006 Kasper Skaarhoj (kasperYYYY@typo3.com)
00006 *  All rights reserved
00007 *
00008 *  This script is part of the TYPO3 project. The TYPO3 project is
00009 *  free software; you can redistribute it and/or modify
00010 *  it under the terms of the GNU General Public License as published by
00011 *  the Free Software Foundation; either version 2 of the License, or
00012 *  (at your option) any later version.
00013 *
00014 *  The GNU General Public License can be found at
00015 *  http://www.gnu.org/copyleft/gpl.html.
00016 *  A copy is found in the textfile GPL.txt and important notices to the license
00017 *  from the author is found in LICENSE.txt distributed with these scripts.
00018 *
00019 *
00020 *  This script is distributed in the hope that it will be useful,
00021 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00022 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023 *  GNU General Public License for more details.
00024 *
00025 *  This copyright notice MUST APPEAR in all copies of the script!
00026 ***************************************************************/
00105 class t3lib_extFileFunctions extends t3lib_basicFileFunctions   {
00106 
00107                 // External static variables:
00108                 // Notice; some of these are overridden in the start() method with values from $GLOBALS['TYPO3_CONF_VARS']['BE']
00109         var $maxCopyFileSize = 10000;           // max copy size (kb) for files
00110         var $maxMoveFileSize = 10000;           // max move size (kb) for files
00111         var $maxUploadFileSize = 10000;         // max upload size (kb) for files. Remember that PHP has an inner limit often set to 2 MB
00112         var $unzipPath = '';                            // Path to unzip-program (with trailing '/')
00113         var $dontCheckForUnique = 0;            // If set, the uploaded files will overwrite existing files.
00114 
00115         var $actionPerms = Array(                               // This array is self-explaning (look in the class below). It grants access to the functions. This could be set from outside in order to enabled functions to users. See also the function init_actionPerms() which takes input directly from the user-record
00116                 'deleteFile' => 0,                                      // Deleting files physically
00117                 'deleteFolder' => 0,                            // Deleting foldes physically
00118                 'deleteFolderRecursively' => 0,         // normally folders are deleted by the PHP-function rmdir(), but with this option a user deletes with 'rm -Rf ....' which is pretty wild!
00119                 'moveFile' => 0,
00120                 'moveFolder' => 0,
00121                 'copyFile' => 0,
00122                 'copyFolder' => 0,
00123                 'newFolder' => 0,
00124                 'newFile' => 0,
00125                 'editFile' => 0,
00126                 'unzipFile' => 0,
00127                 'uploadFile' => 0,
00128                 'renameFile' => 0,
00129                 'renameFolder' => 0
00130         );
00131 
00132         var $recyclerFN = '_recycler_';         // This is regarded to be the recycler folder
00133         var $useRecycler = 1;                           // 0 = no, 1 = if available, 2 = always
00134 
00135                 // Internal, static:
00136         var $PHPFileFunctions = 0;                      // If set, all fileoperations are done by the default PHP-functions. This is necessary under windows! On UNIX the system commands by exec() can be used unless safe_mode is enabled
00137         var $dont_use_exec_commands = 0;        // This is necessary under windows!
00138 
00139                 // Internal, dynamic:
00140         var $internalUploadMap = array();       // Will contain map between upload ID and the final filename
00141 
00142         var $lastError = '';
00143 
00144 
00145 
00146 
00153         function start($fileCmds)       {
00154 
00155                         // Configure settings from TYPO3_CONF_VARS:
00156                 if (TYPO3_OS=='WIN' || $GLOBALS['TYPO3_CONF_VARS']['BE']['disable_exec_function'])      {
00157                         $this->PHPFileFunctions = 1;
00158                         $this->dont_use_exec_commands = 1;
00159                 } else {
00160                         $this->PHPFileFunctions = $GLOBALS['TYPO3_CONF_VARS']['BE']['usePHPFileFunctions'];
00161                 }
00162 
00163                 $this->unzipPath = $GLOBALS['TYPO3_CONF_VARS']['BE']['unzip_path'];
00164 
00165                 $maxFileSize = intval($GLOBALS['TYPO3_CONF_VARS']['BE']['maxFileSize']);
00166                 if ($maxFileSize>0)     {
00167                         $this->maxCopyFileSize = $maxFileSize;
00168                         $this->maxMoveFileSize = $maxFileSize;
00169                         $this->maxUploadFileSize = $maxFileSize;
00170                 }
00171 
00172                         // Initializing file processing commands:
00173                 $this->fileCmdMap = $fileCmds;
00174         }
00175 
00183         function init_actionPerms($setup)       {
00184                 if (($setup&1)==1)      {               // Files: Upload,Copy,Move,Delete,Rename
00185                         $this->actionPerms['uploadFile']=1;
00186                         $this->actionPerms['copyFile']=1;
00187                         $this->actionPerms['moveFile']=1;
00188                         $this->actionPerms['deleteFile']=1;
00189                         $this->actionPerms['renameFile']=1;
00190                         $this->actionPerms['editFile']=1;
00191                         $this->actionPerms['newFile']=1;
00192                 }
00193                 if (($setup&2)==2)      {               // Files: Unzip
00194                         $this->actionPerms['unzipFile']=1;
00195                 }
00196                 if (($setup&4)==4)      {               // Directory: Move,Delete,Rename,New
00197                         $this->actionPerms['moveFolder']=1;
00198                         $this->actionPerms['deleteFolder']=1;
00199                         $this->actionPerms['renameFolder']=1;
00200                         $this->actionPerms['newFolder']=1;
00201                 }
00202                 if (($setup&8)==8)      {               // Directory: Copy
00203                         $this->actionPerms['copyFolder']=1;
00204                 }
00205                 if (($setup&16)==16)    {               // Directory: Delete recursively (rm -Rf)
00206                         $this->actionPerms['deleteFolderRecursively']=1;
00207                 }
00208         }
00209 
00215         function processData()  {
00216                 if (!$this->isInit) return FALSE;
00217 
00218                 if (is_array($this->fileCmdMap))        {
00219 
00220                                 // Check if there were uploads expected, but no one made
00221                         if ($this->fileCmdMap['upload'])        {
00222                                 $uploads = $this->fileCmdMap['upload'];
00223                                 foreach ($uploads as $arr)      {
00224                                         if (!$_FILES['upload_'.$arr['data']]['name'])   {
00225                                                 unset($this->fileCmdMap['upload'][$arr['data']]);
00226                                         }
00227                                 }
00228                                 if (count($this->fileCmdMap['upload']) == 0) {
00229                                         $this->writelog(1,1,108,'No file was uploaded!','');
00230                                 }
00231                         }
00232                                 
00233                                 // Traverse each set of actions
00234                         foreach($this->fileCmdMap as $action => $actionData)    {
00235 
00236                                         // Traverse all action data. More than one file might be affected at the same time.
00237                                 if (is_array($actionData))      {
00238                                         foreach($actionData as $cmdArr) {
00239 
00240                                                         // Clear file stats
00241                                                 clearstatcache();
00242 
00243                                                         // Branch out based on command:
00244                                                 switch ($action)        {
00245                                                         case 'delete':
00246                                                                 $this->func_delete($cmdArr);
00247                                                         break;
00248                                                         case 'copy':
00249                                                                 $this->func_copy($cmdArr);
00250                                                         break;
00251                                                         case 'move':
00252                                                                 $this->func_move($cmdArr);
00253                                                         break;
00254                                                         case 'rename':
00255                                                                 $this->func_rename($cmdArr);
00256                                                         break;
00257                                                         case 'newfolder':
00258                                                                 $this->func_newfolder($cmdArr);
00259                                                         break;
00260                                                         case 'newfile':
00261                                                                 $this->func_newfile($cmdArr);
00262                                                         break;
00263                                                         case 'editfile':
00264                                                                 $this->func_edit($cmdArr);
00265                                                         break;
00266                                                         case 'upload':
00267                                                                 $this->func_upload($cmdArr);
00268                                                         break;
00269                                                         case 'unzip':
00270                                                                 $this->func_unzip($cmdArr);
00271                                                         break;
00272                                                 }
00273                                         }
00274                                 }
00275                         }
00276                 }
00277         }
00278 
00285         function printLogErrorMessages($redirect='')    {
00286 
00287                 $res_log = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00288                                         '*',
00289                                         'sys_log',
00290                                         'type=2 AND userid='.intval($GLOBALS['BE_USER']->user['uid']).' AND tstamp='.intval($GLOBALS['EXEC_TIME']).'    AND error!=0'
00291                                 );
00292                 $errorJS = array();
00293                 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_log)) {
00294                         $log_data = unserialize($row['log_data']);
00295                         $errorJS[] = $row[error].': '.sprintf($row['details'], $log_data[0],$log_data[1],$log_data[2],$log_data[3],$log_data[4]);
00296                 }
00297 
00298                 if (count($errorJS))    {
00299                         $error_doc = t3lib_div::makeInstance('template');
00300                         $error_doc->backPath = '';
00301 
00302                         $content.= $error_doc->startPage('tce_db.php Error output');
00303 
00304                         $lines[] = '
00305                                         <tr class="bgColor5">
00306                                                 <td colspan="2" align="center"><strong>Errors:</strong></td>
00307                                         </tr>';
00308 
00309                         foreach($errorJS as $line)      {
00310                                 $lines[] = '
00311                                         <tr class="bgColor4">
00312                                                 <td valign="top"><img'.t3lib_iconWorks::skinImg('','gfx/icon_fatalerror.gif','width="18" height="16"').' alt="" /></td>
00313                                                 <td>'.htmlspecialchars($line).'</td>
00314                                         </tr>';
00315                         }
00316 
00317                         $lines[] = '
00318                                         <tr>
00319                                                 <td colspan="2" align="center"><br />'.
00320                                                 '<form action=""><input type="submit" value="Continue" onclick="'.htmlspecialchars('window.location.href=\''.$redirect.'\';return false;').'" /></form>'.
00321                                                 '</td>
00322                                         </tr>';
00323 
00324                         $content.= '
00325                                 <br /><br />
00326                                 <table border="0" cellpadding="1" cellspacing="1" width="300" align="center">
00327                                         '.implode('',$lines).'
00328                                 </table>';
00329 
00330                         $content.= $error_doc->endPage();
00331                         echo $content;
00332                         exit;
00333                 }
00334         }
00335 
00343         function findRecycler($theFile) {
00344                 if ($this->isPathValid($theFile))       {
00345                         $theFile = $this->cleanDirectoryName($theFile);
00346                         $fI = t3lib_div::split_fileref($theFile);
00347                         $c = 0;
00348                         while($this->checkPathAgainstMounts($fI['path']) && $c<20)      {
00349                                 $rDir = $fI['path'].$this->recyclerFN;
00350                                 if (@is_dir($rDir) && $this->recyclerFN!=$fI['file'])   {
00351                                         return $rDir;
00352                                 }
00353                                 $theFile = $fI['path'];
00354                                 $theFile = $this->cleanDirectoryName($theFile);
00355                                 $fI = t3lib_div::split_fileref($theFile);
00356                                 $c++;
00357                         }
00358                 }
00359         }
00360 
00372         function writeLog($action,$error,$details_nr,$details,$data)    {
00373                 $type = 2;      // Type value for tce_file.php
00374                 if (is_object($GLOBALS['BE_USER']))     {
00375                         $GLOBALS['BE_USER']->writelog($type,$action,$error,$details_nr,$details,$data);
00376                 }
00377                 $this->lastError = vsprintf($details, $data);
00378         }
00379 
00380 
00381 
00382 
00383 
00384 
00385 
00386 
00387 
00388         /*************************************
00389          *
00390          * File operation functions
00391          *
00392          **************************************/
00393 
00400         function func_delete($cmds)     {
00401                 if (!$this->isInit) return FALSE;
00402 
00403                         // Checking path:
00404                 $theFile = $cmds['data'];
00405                 if (!$this->isPathValid($theFile))      {
00406                         $this->writelog(4,2,101,'Target "%s" had invalid path (".." and "//" is not allowed in path).',Array($theFile));
00407                         return FALSE;
00408                 }
00409 
00410                         // Recycler moving or not?
00411                 if ($this->useRecycler && $recyclerPath=$this->findRecycler($theFile))  {
00412                                 // If a recycler is found, the deleted items is moved to the recycler and not just deleted.
00413                         $newCmds=Array();
00414                         $newCmds['data']=$theFile;
00415                         $newCmds['target']=$recyclerPath;
00416                         $newCmds['altName']=1;
00417                         $this->func_move($newCmds);
00418                         $this->writelog(4,0,4,'Item "%s" moved to recycler at "%s"',Array($theFile,$recyclerPath));
00419                         return TRUE;
00420                 } elseif ($this->useRecycler != 2) {    // if $this->useRecycler==2 then we cannot delete for real!!
00421                         if (@is_file($theFile)) {       // If we are deleting a file...
00422                                 if ($this->actionPerms['deleteFile'])   {
00423                                         if ($this->checkPathAgainstMounts($theFile))    {
00424                                                 if (@unlink($theFile))  {
00425                                                         $this->writelog(4,0,1,'File "%s" deleted',Array($theFile));
00426                                                         return TRUE;
00427                                                 } else $this->writelog(4,1,110,'Could not delete file "%s". Write-permission problem?', Array($theFile));
00428                                         } else $this->writelog(4,1,111,'Target was not within your mountpoints! T="%s"',Array($theFile));
00429                                 } else $this->writelog(4,1,112,'You are not allowed to delete files','');
00430                                 // FINISHED deleting file
00431 
00432                         } elseif (@is_dir($theFile)) {  // if we're deleting a folder
00433                                 if ($this->actionPerms['deleteFolder']) {
00434                                         $theFile = $this->is_directory($theFile);
00435                                         if ($theFile)   {
00436                                                 if ($this->checkPathAgainstMounts($theFile))    {       // I choose not to append '/' to $theFile here as this will prevent us from deleting mounts!! (which makes sense to me...)
00437                                                         if ($this->actionPerms['deleteFolderRecursively'] && !$this->dont_use_exec_commands)    {
00438                                                                 if (t3lib_div::rmdir($theFile,true))    {
00439                                                                         $this->writelog(4,0,2,'Directory "%s" deleted recursively!',Array($theFile));
00440                                                                         return TRUE;
00441                                                                 } else $this->writelog(4,2,119,'Directory "%s" WAS NOT deleted recursively! Write-permission problem?',Array($theFile));
00442                                                         } else {
00443                                                                 if (@rmdir($theFile))   {
00444                                                                         $this->writelog(4,0,3,'Directory "%s" deleted',Array($theFile));
00445                                                                         return TRUE;
00446                                                                 } else $this->writelog(4,1,120,'Could not delete directory! Write-permission problem? Is directory "%s" empty? (You are not allowed to delete directories recursively).',Array($theFile));
00447                                                         }
00448                                                 } else $this->writelog(4,1,121,'Target was not within your mountpoints! T="%s"',Array($theFile));
00449                                         } else $this->writelog(4,2,122,'Target seemed not to be a directory! (Shouldn\'t happen here!)','');
00450                                 } else $this->writelog(4,1,123,'You are not allowed to delete directories','');
00451                                 // FINISHED copying directory
00452 
00453                         } else $this->writelog(4,2,130,'The item was not a file or directory! "%s"',Array($theFile));
00454                 } else $this->writelog(4,1,131,'No recycler found!','');
00455         }
00456 
00463         function func_copy($cmds)       {
00464                 if (!$this->isInit) return FALSE;
00465 
00466                         // Initialize and check basic conditions:
00467                 $theFile = $cmds['data'];
00468                 $theDest = $this->is_directory($cmds['target']);        // Clean up destination directory
00469                 $altName = $cmds['altName'];
00470                 if (!$theDest)  {
00471                         $this->writelog(2,2,100,'Destination "%s" was not a directory',Array($cmds['target']));
00472                         return FALSE;
00473                 }
00474                 if (!$this->isPathValid($theFile) || !$this->isPathValid($theDest))     {
00475                         $this->writelog(2,2,101,'Target or destination had invalid path (".." and "//" is not allowed in path). T="%s", D="%s"',Array($theFile,$theDest));
00476                         return FALSE;
00477                 }
00478 
00479                         // Processing of file or directory.
00480                 if (@is_file($theFile)) {       // If we are copying a file...
00481                         if ($this->actionPerms['copyFile'])     {
00482                                 if (filesize($theFile) < ($this->maxCopyFileSize*1024)) {
00483                                         $fI = t3lib_div::split_fileref($theFile);
00484                                         if ($altName)   {       // If altName is set, we're allowed to create a new filename if the file already existed
00485                                                 $theDestFile = $this->getUniqueName($fI['file'], $theDest);
00486                                                 $fI = t3lib_div::split_fileref($theDestFile);
00487                                         } else {
00488                                                 $theDestFile = $theDest.'/'.$fI['file'];
00489                                         }
00490                                         if ($theDestFile && !@file_exists($theDestFile))        {
00491                                                 if ($this->checkIfAllowed($fI['fileext'], $theDest, $fI['file'])) {
00492                                                         if ($this->checkPathAgainstMounts($theDestFile) && $this->checkPathAgainstMounts($theFile))     {
00493                                                                 if ($this->PHPFileFunctions)    {
00494                                                                         copy ($theFile,$theDestFile);
00495                                                                 } else {
00496                                                                         $cmd = 'cp "'.$theFile.'" "'.$theDestFile.'"';
00497                                                                         exec($cmd);
00498                                                                 }
00499                                                                 t3lib_div::fixPermissions($theDestFile);
00500                                                                 clearstatcache();
00501                                                                 if (@is_file($theDestFile))     {
00502                                                                         $this->writelog(2,0,1,'File "%s" copied to "%s"',Array($theFile,$theDestFile));
00503                                                                         return $theDestFile;
00504                                                                 } else $this->writelog(2,2,109,'File "%s" WAS NOT copied to "%s"! Write-permission problem?',Array($theFile,$theDestFile));
00505                                                         } else  $this->writelog(2,1,110,'Target or destination was not within your mountpoints! T="%s", D="%s"',Array($theFile,$theDestFile));
00506                                                 } else $this->writelog(2,1,111,'Fileextension "%s" is not allowed in "%s"!',Array($fI['fileext'],$theDest.'/'));
00507                                         } else $this->writelog(2,1,112,'File "%s" already exists!',Array($theDestFile));
00508                                 } else $this->writelog(2,1,113,'File "%s" exceeds the size-limit of %s bytes',Array($theFile,$this->maxCopyFileSize*1024));
00509                         } else $this->writelog(2,1,114,'You are not allowed to copy files','');
00510                         // FINISHED copying file
00511 
00512                 } elseif (@is_dir($theFile) && !$this->dont_use_exec_commands) {                // if we're copying a folder
00513                         if ($this->actionPerms['copyFolder'])   {
00514                                 $theFile = $this->is_directory($theFile);
00515                                 if ($theFile)   {
00516                                         $fI = t3lib_div::split_fileref($theFile);
00517                                         if ($altName)   {       // If altName is set, we're allowed to create a new filename if the file already existed
00518                                                 $theDestFile = $this->getUniqueName($fI['file'], $theDest);
00519                                                 $fI = t3lib_div::split_fileref($theDestFile);
00520                                         } else {
00521                                                 $theDestFile = $theDest.'/'.$fI['file'];
00522                                         }
00523                                         if ($theDestFile && !@file_exists($theDestFile))        {
00524                                                 if (!t3lib_div::isFirstPartOfStr($theDestFile.'/',$theFile.'/'))        {                       // Check if the one folder is inside the other or on the same level... to target/dest is the same?
00525                                                         if ($this->checkIfFullAccess($theDest) || $this->is_webPath($theDestFile)==$this->is_webPath($theFile)) {       // no copy of folders between spaces
00526                                                                 if ($this->checkPathAgainstMounts($theDestFile) && $this->checkPathAgainstMounts($theFile))     {
00527                                                                                 // No way to do this under windows!
00528                                                                         $cmd = 'cp -R "'.$theFile.'" "'.$theDestFile.'"';
00529                                                                         exec($cmd);
00530                                                                         clearstatcache();
00531                                                                         if (@is_dir($theDestFile))      {
00532                                                                                 $this->writelog(2,0,2,'Directory "%s" copied to "%s"',Array($theFile,$theDestFile));
00533                                                                                 return $theDestFile;
00534                                                                         } else $this->writelog(2,2,119,'Directory "%s" WAS NOT copied to "%s"! Write-permission problem?',Array($theFile,$theDestFile));
00535                                                                 } else $this->writelog(2,1,120,'Target or destination was not within your mountpoints! T="%s", D="%s"',Array($theFile,$theDestFile));
00536                                                         } else $this->writelog(2,1,121,'You don\'t have full access to the destination directory "%s"!',Array($theDest.'/'));
00537                                                 } else $this->writelog(2,1,122,'Destination cannot be inside the target! D="%s", T="%s"',Array($theDestFile.'/',$theFile.'/'));
00538                                         } else $this->writelog(2,1,123,'Target "%s" already exists!',Array($theDestFile));
00539                                 } else $this->writelog(2,2,124,'Target seemed not to be a directory! (Shouldn\'t happen here!)','');
00540                         } else $this->writelog(2,1,125,'You are not allowed to copy directories','');
00541                         // FINISHED copying directory
00542 
00543                 } else {
00544                         $this->writelog(2,2,130,'The item "%s" was not a file or directory!',Array($theFile));
00545                 }
00546         }
00547 
00554         function func_move($cmds)       {
00555                 if (!$this->isInit) return FALSE;
00556 
00557                         // Initialize and check basic conditions:
00558                 $theFile = $cmds['data'];
00559                 $theDest = $this->is_directory($cmds['target']);        // Clean up destination directory
00560                 $altName = $cmds['altName'];
00561                 if (!$theDest)  {
00562                         $this->writelog(3,2,100,'Destination "%s" was not a directory',Array($cmds['target']));
00563                         return FALSE;
00564                 }
00565                 if (!$this->isPathValid($theFile) || !$this->isPathValid($theDest))     {
00566                         $this->writelog(3,2,101,'Target or destination had invalid path (".." and "//" is not allowed in path). T="%s", D="%s"',Array($theFile,$theDest));
00567                         return FALSE;
00568                 }
00569 
00570                         // Processing of file or directory:
00571                 if (@is_file($theFile)) {       // If we are moving a file...
00572                         if ($this->actionPerms['moveFile'])     {
00573                                 if (filesize($theFile) < ($this->maxMoveFileSize*1024)) {
00574                                         $fI = t3lib_div::split_fileref($theFile);
00575                                         if ($altName)   {       // If altName is set, we're allowed to create a new filename if the file already existed
00576                                                 $theDestFile = $this->getUniqueName($fI['file'], $theDest);
00577                                                 $fI = t3lib_div::split_fileref($theDestFile);
00578                                         } else {
00579                                                 $theDestFile = $theDest.'/'.$fI['file'];
00580                                         }
00581                                         if ($theDestFile && !@file_exists($theDestFile))        {
00582                                                 if ($this->checkIfAllowed($fI['fileext'], $theDest, $fI['file'])) {
00583                                                         if ($this->checkPathAgainstMounts($theDestFile) && $this->checkPathAgainstMounts($theFile))     {
00584                                                                 if ($this->PHPFileFunctions)    {
00585                                                                         rename($theFile, $theDestFile);
00586                                                                 } else {
00587                                                                         $cmd = 'mv "'.$theFile.'" "'.$theDestFile.'"';
00588                                                                         exec($cmd);
00589                                                                 }
00590                                                                 clearstatcache();
00591                                                                 if (@is_file($theDestFile))     {
00592                                                                         $this->writelog(3,0,1,'File "%s" moved to "%s"',Array($theFile,$theDestFile));
00593                                                                         return $theDestFile;
00594                                                                 } else $this->writelog(3,2,109,'File "%s" WAS NOT moved to "%s"! Write-permission problem?',Array($theFile,$theDestFile));
00595                                                         } else $this->writelog(3,1,110,'Target or destination was not within your mountpoints! T="%s", D="%s"',Array($theFile,$theDestFile));
00596                                                 } else $this->writelog(3,1,111,'Fileextension "%s" is not allowed in "%s"!',Array($fI['fileext'],$theDest.'/'));
00597                                         } else $this->writelog(3,1,112,'File "%s" already exists!',Array($theDestFile));
00598                                 } else $this->writelog(3,1,113,'File "%s" exceeds the size-limit of %s bytes',Array($theFile,$this->maxMoveFileSize*1024));
00599                         } else $this->writelog(3,1,114,'You are not allowed to move files','');
00600                         // FINISHED moving file
00601 
00602                 } elseif (@is_dir($theFile)) {  // if we're moving a folder
00603                         if ($this->actionPerms['moveFolder'])   {
00604                                 $theFile = $this->is_directory($theFile);
00605                                 if ($theFile)   {
00606                                         $fI = t3lib_div::split_fileref($theFile);
00607                                         if ($altName)   {       // If altName is set, we're allowed to create a new filename if the file already existed
00608                                                 $theDestFile = $this->getUniqueName($fI['file'], $theDest);
00609                                                 $fI = t3lib_div::split_fileref($theDestFile);
00610                                         } else {
00611                                                 $theDestFile = $theDest.'/'.$fI['file'];
00612                                         }
00613                                         if ($theDestFile && !@file_exists($theDestFile))        {
00614                                                 if (!t3lib_div::isFirstPartOfStr($theDestFile.'/',$theFile.'/'))        {                       // Check if the one folder is inside the other or on the same level... to target/dest is the same?
00615                                                         if ($this->checkIfFullAccess($theDest) || $this->is_webPath($theDestFile)==$this->is_webPath($theFile)) {       // // no moving of folders between spaces
00616                                                                 if ($this->checkPathAgainstMounts($theDestFile) && $this->checkPathAgainstMounts($theFile))     {
00617                                                                         if ($this->PHPFileFunctions)    {
00618                                                                                 rename($theFile, $theDestFile);
00619                                                                         } else {
00620                                                                                 $cmd = 'mv "'.$theFile.'" "'.$theDestFile.'"';
00621                                                                                 $errArr = array();
00622                                                                                 $retVar = 0;
00623                                                                                 exec($cmd,$errArr,$retVar);
00624                                                                         }
00625                                                                         clearstatcache();
00626                                                                         if (@is_dir($theDestFile))      {
00627                                                                                 $this->writelog(3,0,2,'Directory "%s" moved to "%s"',Array($theFile,$theDestFile));
00628                                                                                 return $theDestFile;
00629                                                                         } else $this->writelog(3,2,119,'Directory "%s" WAS NOT moved to "%s"! Write-permission problem?',Array($theFile,$theDestFile));
00630                                                                 } else $this->writelog(3,1,120,'Target or destination was not within your mountpoints! T="%s", D="%s"',Array($theFile,$theDestFile));
00631                                                         } else $this->writelog(3,1,121,'You don\'t have full access to the destination directory "%s"!',Array($theDest.'/'));
00632                                                 } else $this->writelog(3,1,122,'Destination cannot be inside the target! D="%s", T="%s"',Array($theDestFile.'/',$theFile.'/'));
00633                                         } else $this->writelog(3,1,123,'Target "%s" already exists!',Array($theDestFile));
00634                                 } else $this->writelog(3,2,124,'Target seemed not to be a directory! (Shouldn\'t happen here!)','');
00635                         } else $this->writelog(3,1,125,'You are not allowed to move directories','');
00636                         // FINISHED moving directory
00637 
00638                 } else {
00639                         $this->writelog(3,2,130,'The item "%s" was not a file or directory!',Array($theFile));
00640                 }
00641         }
00642 
00649         function func_rename($cmds)     {
00650                 if (!$this->isInit) return FALSE;
00651 
00652                 $theNewName = $this->cleanFileName($cmds['data']);
00653                 if ($theNewName)        {
00654                         if ($this->checkFileNameLen($theNewName))       {
00655                                 $theTarget = $cmds['target'];
00656                                 $type = filetype($theTarget);
00657                                 if ($type=='file' || $type=='dir')      {               // $type MUST BE file or dir
00658                                         $fileInfo = t3lib_div::split_fileref($theTarget);               // Fetches info about path, name, extention of $theTarget
00659                                         if ($fileInfo['file']!=$theNewName)     {       // The name should be different from the current. And the filetype must be allowed
00660                                                 $theRenameName = $fileInfo['path'].$theNewName;
00661                                                 if ($this->checkPathAgainstMounts($fileInfo['path']))   {
00662                                                         if (!@file_exists($theRenameName))      {
00663                                                                 if ($type=='file')      {
00664                                                                         if ($this->actionPerms['renameFile'])   {
00665                                                                                 $fI = t3lib_div::split_fileref($theRenameName);
00666                                                                                 if ($this->checkIfAllowed($fI['fileext'], $fileInfo['path'], $fI['file'])) {
00667                                                                                         if (@rename($theTarget, $theRenameName))        {
00668                                                                                                 $this->writelog(5,0,1,'File renamed from "%s" to "%s"',Array($fileInfo['file'],$theNewName));
00669                                                                                                 return $theRenameName;
00670                                                                                         } else $this->writelog(5,1,100,'File "%s" was not renamed! Write-permission problem in "%s"?',Array($theTarget,$fileInfo['path']));
00671                                                                                 } else $this->writelog(5,1,101,'Fileextension "%s" was not allowed!',Array($fI['fileext']));
00672                                                                         } else $this->writelog(5,1,102,'You are not allowed to rename files!','');
00673                                                                 } elseif ($type=='dir') {
00674                                                                         if ($this->actionPerms['renameFolder']) {
00675                                                                                 if (@rename($theTarget, $theRenameName))        {
00676                                                                                         $this->writelog(5,0,2,'Directory renamed from "%s" to "%s"',Array($fileInfo['file'],$theNewName));
00677                                                                                         return $theRenameName;
00678                                                                                 } else $this->writelog(5,1,110,'Directory "%s" was not renamed! Write-permission problem in "%s"?',Array($theTarget,$fileInfo['path']));
00679                                                                         } else $this->writelog(5,1,111,'You are not allowed to rename directories!','');
00680                                                                 }
00681                                                         } else $this->writelog(5,1,120,'Destination "%s" existed already!',Array($theRenameName));
00682                                                 } else $this->writelog(5,1,121,'Destination path "%s" was not within your mountpoints!',Array($fileInfo['path']));
00683                                         } else $this->writelog(5,1,122,'Old and new name is the same (%s)',Array($theNewName));
00684                                 } else $this->writelog(5,2,123,'Target "%s" was neither a directory nor a file!',Array($theTarget));
00685                         } else $this->writelog(5,1,124,'New name "%s" was too long (max %s characters)',Array($theNewName,$this->maxInputNameLen));
00686                 }
00687         }
00688 
00695         function func_newfolder($cmds)  {
00696                 if (!$this->isInit) return FALSE;
00697 
00698                 $theFolder = $this->cleanFileName($cmds['data']);
00699                 if ($theFolder) {
00700                         if ($this->checkFileNameLen($theFolder))        {
00701                                 $theTarget = $this->is_directory($cmds['target']);      // Check the target dir
00702                                 if ($theTarget) {
00703                                         if ($this->actionPerms['newFolder'])    {
00704                                                 $theNewFolder = $theTarget.'/'.$theFolder;
00705                                                 if ($this->checkPathAgainstMounts($theNewFolder))       {
00706                                                         if (!@file_exists($theNewFolder))       {
00707                                                                 if (t3lib_div::mkdir($theNewFolder)){
00708                                                                         $this->writelog(6,0,1,'Directory "%s" created in "%s"',Array($theFolder,$theTarget.'/'));
00709                                                                         return $theNewFolder;
00710                                                                 } else $this->writelog(6,1,100,'Directory "%s" not created. Write-permission problem in "%s"?',Array($theFolder,$theTarget.'/'));
00711                                                         } else $this->writelog(6,1,101,'File or directory "%s" existed already!',Array($theNewFolder));
00712                                                 } else $this->writelog(6,1,102,'Destination path "%s" was not within your mountpoints!',Array($theTarget.'/'));
00713                                         } else $this->writelog(6,1,103,'You are not allowed to create directories!','');
00714                                 } else $this->writelog(6,2,104,'Destination "%s" was not a directory',Array($cmds['target']));
00715                         } else $this->writelog(6,1,105,'New name "%s" was too long (max %s characters)',Array($theFolder,$this->maxInputNameLen));
00716                 }
00717         }
00718 
00725         function func_newfile($cmds)    {
00726                 $extList = $GLOBALS['TYPO3_CONF_VARS']['SYS']['textfile_ext'];
00727                 if (!$this->isInit) return FALSE;
00728                 $newName = $this->cleanFileName($cmds['data']);
00729                 if ($newName)   {
00730                         if ($this->checkFileNameLen($newName))  {
00731                                 $theTarget = $this->is_directory($cmds['target']);      // Check the target dir
00732                                 $fileInfo = t3lib_div::split_fileref($theTarget);               // Fetches info about path, name, extention of $theTarget
00733                                 if ($theTarget) {
00734                                         if ($this->actionPerms['newFile'])      {
00735                                                 $theNewFile = $theTarget.'/'.$newName;
00736                                                 if ($this->checkPathAgainstMounts($theNewFile)) {
00737                                                         if (!@file_exists($theNewFile)) {
00738                                                                 $fI = t3lib_div::split_fileref($theNewFile);
00739                                                                 if ($this->checkIfAllowed($fI['fileext'], $fileInfo['path'], $fI['file'])) {
00740                                                                         if (t3lib_div::inList($extList, $fI['fileext']))        {
00741                                                                                 if (t3lib_div::writeFile($theNewFile,''))       {
00742                                                                                         clearstatcache();
00743                                                                                         $this->writelog(8,0,1,'File created: "%s"',Array($fI['file']));
00744                                                                                         return $theNewFile;
00745                                                                                 } else $this->writelog(8,1,100,'File "%s" was not created! Write-permission problem in "%s"?',Array($fI['file'], $theTarget));
00746                                                                         } else $this->writelog(8,1,107,'Fileextension "%s" is not a textfile format! (%s)',Array($fI['fileext'], $extList));
00747                                                                 } else $this->writelog(8,1,106,'Fileextension "%s" was not allowed!',Array($fI['fileext']));
00748                                                         } else $this->writelog(8,1,101,'File "%s" existed already!',Array($theNewFile));
00749                                                 } else $this->writelog(8,1,102,'Destination path "%s" was not within your mountpoints!',Array($theTarget.'/'));
00750                                         } else $this->writelog(8,1,103,'You are not allowed to create files!','');
00751                                 } else $this->writelog(8,2,104,'Destination "%s" was not a directory',Array($cmds['target']));
00752                         } else $this->writelog(8,1,105,'New name "%s" was too long (max %s characters)',Array($newName,$this->maxInputNameLen));
00753                 }
00754         }
00755 
00762         function func_edit($cmds)       {
00763                 if (!$this->isInit) return FALSE;
00764                 $theTarget = $cmds['target'];
00765                 $content = $cmds['data'];
00766                 $extList = $GLOBALS['TYPO3_CONF_VARS']['SYS']['textfile_ext'];
00767                 $type = filetype($theTarget);
00768                 if ($type=='file')      {               // $type MUST BE file
00769                         $fileInfo = t3lib_div::split_fileref($theTarget);               // Fetches info about path, name, extention of $theTarget
00770                         $fI =$fileInfo;
00771                         if ($this->checkPathAgainstMounts($fileInfo['path']))   {
00772                                 if ($this->actionPerms['editFile'])     {
00773                                         $fI = t3lib_div::split_fileref($theTarget);
00774                                         if ($this->checkIfAllowed($fI['fileext'], $fileInfo['path'], $fI['file'])) {
00775                                                 if (t3lib_div::inList($extList, $fileInfo['fileext']))  {
00776                                                         if (t3lib_div::writeFile($theTarget,$content))  {
00777                                                                 clearstatcache();
00778                                                                 $this->writelog(9,0,1,'File saved to "%s", bytes: %s, MD5: %s ',Array($fileInfo['file'],@filesize($theTarget),md5($content)));
00779                                                                 return TRUE;
00780                                                         } else $this->writelog(9,1,100,'File "%s" was not saved! Write-permission problem in "%s"?',Array($theTarget,$fileInfo['path']));
00781                                                 } else $this->writelog(9,1,102,'Fileextension "%s" is not a textfile format! (%s)',Array($fI['fileext'], $extList));
00782                                         } else $this->writelog(9,1,103,'Fileextension "%s" was not allowed!',Array($fI['fileext']));
00783                                 } else $this->writelog(9,1,104,'You are not allowed to edit files!','');
00784                         } else $this->writelog(9,1,121,'Destination path "%s" was not within your mountpoints!',Array($fileInfo['path']));
00785                 } else $this->writelog(9,2,123,'Target "%s" was not a file!',Array($theTarget));
00786         }
00787 
00794         function func_upload($cmds)     {
00795                 if (!$this->isInit) return FALSE;
00796                 $id = $cmds['data'];
00797                 if ($_FILES['upload_'.$id]['name'])     {
00798                         $theFile = $_FILES['upload_'.$id]['tmp_name'];                          // filename of the uploaded file
00799                         $theFileSize = $_FILES['upload_'.$id]['size'];                          // filesize of the uploaded file
00800                         $theName = $this->cleanFileName(stripslashes($_FILES['upload_'.$id]['name']));  // The original filename
00801                         if (is_uploaded_file($theFile) && $theName)     {       // Check the file
00802                                 if ($this->actionPerms['uploadFile'])   {
00803                                         if ($theFileSize<($this->maxUploadFileSize*1024))       {
00804                                                 $fI = t3lib_div::split_fileref($theName);
00805                                                 $theTarget = $this->is_directory($cmds['target']);      // Check the target dir
00806                                                 if ($theTarget && $this->checkPathAgainstMounts($theTarget.'/'))        {
00807                                                         if ($this->checkIfAllowed($fI['fileext'], $theTarget, $fI['file'])) {
00808                                                                 $theNewFile = $this->getUniqueName($theName, $theTarget, $this->dontCheckForUnique);
00809                                                                 if ($theNewFile)        {
00810                                                                         t3lib_div::upload_copy_move($theFile,$theNewFile);
00811                                                                         clearstatcache();
00812                                                                         if (@is_file($theNewFile))      {
00813                                                                                 $this->internalUploadMap[$id] = $theNewFile;
00814                                                                                 $this->writelog(1,0,1,'Uploading file "%s" to "%s"',Array($theName,$theNewFile, $id));
00815                                                                                 return $theNewFile;
00816                                                                         } else $this->writelog(1,1,100,'Uploaded file could not be moved! Write-permission problem in "%s"?',Array($theTarget.'/'));
00817                                                                 } else $this->writelog(1,1,101,'No unique filename available in "%s"!',Array($theTarget.'/'));
00818                                                         } else $this->writelog(1,1,102,'Fileextension "%s" is not allowed in "%s"!',Array($fI['fileext'],$theTarget.'/'));
00819                                                 } else $this->writelog(1,1,103,'Destination path "%s" was not within your mountpoints!',Array($theTarget.'/'));
00820                                         } else $this->writelog(1,1,104,'The uploaded file exceeds the size-limit of %s bytes',Array($this->maxUploadFileSize*1024));
00821                                 } else $this->writelog(1,1,105,'You are not allowed to upload files!','');
00822                         } else $this->writelog(1,2,106,'The upload has failed, no uploaded file found!','');
00823                 } else $this->writelog(1,2,108,'No file was uploaded!','');
00824         }
00825 
00833         function func_unzip($cmds)      {
00834                 if (!$this->isInit || $this->dont_use_exec_commands) return FALSE;
00835 
00836                 $theFile = $cmds['data'];
00837                 if (@is_file($theFile)) {
00838                         $fI = t3lib_div::split_fileref($theFile);
00839                         if (!isset($cmds['target']))    {
00840                                 $cmds['target'] = $fI['path'];
00841                         }
00842                         $theDest = $this->is_directory($cmds['target']);        // Clean up destination directory
00843                         if ($theDest)   {
00844                                 if ($this->actionPerms['unzipFile'])    {
00845                                         if ($fI['fileext']=='zip')      {
00846                                                 if ($this->checkIfFullAccess($theDest)) {
00847                                                         if ($this->checkPathAgainstMounts($theFile) && $this->checkPathAgainstMounts($theDest.'/'))     {
00848                                                                         // No way to do this under windows.
00849                                                                 $cmd = $this->unzipPath.'unzip -qq "'.$theFile.'" -d "'.$theDest.'"';
00850                                                                 exec($cmd);
00851                                                                 $this->writelog(7,0,1,'Unzipping file "%s" in "%s"',Array($theFile,$theDest));
00852                                                                 return TRUE;
00853                                                         } else $this->writelog(7,1,100,'File "%s" or destination "%s" was not within your mountpoints!',Array($theFile,$theDest));
00854                                                 } else $this->writelog(7,1,101,'You don\'t have full access to the destination directory "%s"!',Array($theDest));
00855                                         } else $this->writelog(7,1,102,'Fileextension is not "zip"','');
00856                                 } else $this->writelog(7,1,103,'You are not allowed to unzip files','');
00857                         } else $this->writelog(7,2,104,'Destination "%s" was not a directory',Array($cmds['target']));
00858                 } else $this->writelog(7,2,105,'The file "%s" did not exist!',Array($theFile));
00859         }
00860 }
00861 
00862 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_extfilefunc.php'])       {
00863         include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_extfilefunc.php']);
00864 }
00865 ?>

This documentation has been generated automatically from TYPO3 source code using Doxygen and is provided as is by Cast Iron Coding as a courtesy to other TYPO3 developers and users. Please consider Cast Iron Coding — a full-service web development agency in Portland, Oregon specializing in TYPO3 extension development — for all of your TYPO3 development and consulting needs!