Documentation TYPO3 par Ameos

class.t3lib_extfilefunc.php

00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2005 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 
00143 
00144 
00151         function start($fileCmds)       {
00152 
00153                         // Configure settings from TYPO3_CONF_VARS:
00154                 if (TYPO3_OS=='WIN' || $GLOBALS['TYPO3_CONF_VARS']['BE']['disable_exec_function'])      {
00155                         $this->PHPFileFunctions = 1;
00156                         $this->dont_use_exec_commands = 1;
00157                 } else {
00158                         $this->PHPFileFunctions = $GLOBALS['TYPO3_CONF_VARS']['BE']['usePHPFileFunctions'];
00159                 }
00160 
00161                 $this->unzipPath = $GLOBALS['TYPO3_CONF_VARS']['BE']['unzip_path'];
00162 
00163                 $maxFileSize = intval($GLOBALS['TYPO3_CONF_VARS']['BE']['maxFileSize']);
00164                 if ($maxFileSize>0)     {
00165                         $this->maxCopyFileSize = $maxFileSize;
00166                         $this->maxMoveFileSize = $maxFileSize;
00167                         $this->maxUploadFileSize = $maxFileSize;
00168                 }
00169 
00170                         // Initializing file processing commands:
00171                 $this->fileCmdMap = $fileCmds;
00172         }
00173 
00181         function init_actionPerms($setup)       {
00182                 if (($setup&1)==1)      {               // Files: Upload,Copy,Move,Delete,Rename
00183                         $this->actionPerms['uploadFile']=1;
00184                         $this->actionPerms['copyFile']=1;
00185                         $this->actionPerms['moveFile']=1;
00186                         $this->actionPerms['deleteFile']=1;
00187                         $this->actionPerms['renameFile']=1;
00188                         $this->actionPerms['editFile']=1;
00189                         $this->actionPerms['newFile']=1;
00190                 }
00191                 if (($setup&2)==2)      {               // Files: Unzip
00192                         $this->actionPerms['unzipFile']=1;
00193                 }
00194                 if (($setup&4)==4)      {               // Directory: Move,Delete,Rename,New
00195                         $this->actionPerms['moveFolder']=1;
00196                         $this->actionPerms['deleteFolder']=1;
00197                         $this->actionPerms['renameFolder']=1;
00198                         $this->actionPerms['newFolder']=1;
00199                 }
00200                 if (($setup&8)==8)      {               // Directory: Copy
00201                         $this->actionPerms['copyFolder']=1;
00202                 }
00203                 if (($setup&16)==16)    {               // Directory: Delete recursively (rm -Rf)
00204                         $this->actionPerms['deleteFolderRecursively']=1;
00205                 }
00206         }
00207 
00213         function processData()  {
00214                 if (!$this->isInit) return FALSE;
00215 
00216                 if (is_array($this->fileCmdMap))        {
00217 
00218                                 // Traverse each set of actions
00219                         foreach($this->fileCmdMap as $action => $actionData)    {
00220 
00221                                         // Traverse all action data. More than one file might be affected at the same time.
00222                                 if (is_array($actionData))      {
00223                                         foreach($actionData as $cmdArr) {
00224 
00225                                                         // Clear file stats
00226                                                 clearstatcache();
00227 
00228                                                         // Branch out based on command:
00229                                                 switch ($action)        {
00230                                                         case 'delete':
00231                                                                 $this->func_delete($cmdArr);
00232                                                         break;
00233                                                         case 'copy':
00234                                                                 $this->func_copy($cmdArr);
00235                                                         break;
00236                                                         case 'move':
00237                                                                 $this->func_move($cmdArr);
00238                                                         break;
00239                                                         case 'rename':
00240                                                                 $this->func_rename($cmdArr);
00241                                                         break;
00242                                                         case 'newfolder':
00243                                                                 $this->func_newfolder($cmdArr);
00244                                                         break;
00245                                                         case 'newfile':
00246                                                                 $this->func_newfile($cmdArr);
00247                                                         break;
00248                                                         case 'editfile':
00249                                                                 $this->func_edit($cmdArr);
00250                                                         break;
00251                                                         case 'upload':
00252                                                                 $this->func_upload($cmdArr);
00253                                                         break;
00254                                                         case 'unzip':
00255                                                                 $this->func_unzip($cmdArr);
00256                                                         break;
00257                                                 }
00258                                         }
00259                                 }
00260                         }
00261                 }
00262         }
00263 
00270         function printLogErrorMessages($redirect='')    {
00271 
00272                 $res_log = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00273                                         '*',
00274                                         'sys_log',
00275                                         'type=2 AND userid='.intval($GLOBALS['BE_USER']->user['uid']).' AND tstamp='.intval($GLOBALS['EXEC_TIME']).'    AND error!=0'
00276                                 );
00277                 $errorJS = array();
00278                 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res_log)) {
00279                         $log_data = unserialize($row['log_data']);
00280                         $errorJS[] = $row[error].': '.sprintf($row['details'], $log_data[0],$log_data[1],$log_data[2],$log_data[3],$log_data[4]);
00281                 }
00282 
00283                 if (count($errorJS))    {
00284                         $error_doc = t3lib_div::makeInstance('template');
00285                         $error_doc->backPath = '';
00286 
00287                         $content.= $error_doc->startPage('tce_db.php Error output');
00288 
00289                         $lines[] = '
00290                                         <tr class="bgColor5">
00291                                                 <td colspan="2" align="center"><strong>Errors:</strong></td>
00292                                         </tr>';
00293 
00294                         foreach($errorJS as $line)      {
00295                                 $lines[] = '
00296                                         <tr class="bgColor4">
00297                                                 <td valign="top"><img'.t3lib_iconWorks::skinImg('','gfx/icon_fatalerror.gif','width="18" height="16"').' alt="" /></td>
00298                                                 <td>'.htmlspecialchars($line).'</td>
00299                                         </tr>';
00300                         }
00301 
00302                         $lines[] = '
00303                                         <tr>
00304                                                 <td colspan="2" align="center"><br />'.
00305                                                 '<form action=""><input type="submit" value="Continue" onclick="'.htmlspecialchars('document.location=\''.$redirect.'\';return false;').'" /></form>'.
00306                                                 '</td>
00307                                         </tr>';
00308 
00309                         $content.= '
00310                                 <br /><br />
00311                                 <table border="0" cellpadding="1" cellspacing="1" width="300" align="center">
00312                                         '.implode('',$lines).'
00313                                 </table>';
00314 
00315                         $content.= $error_doc->endPage();
00316                         echo $content;
00317                         exit;
00318                 }
00319         }
00320 
00328         function findRecycler($theFile) {
00329                 if ($this->isPathValid($theFile))       {
00330                         $theFile = $this->cleanDirectoryName($theFile);
00331                         $fI = t3lib_div::split_fileref($theFile);
00332                         $c = 0;
00333                         while($this->checkPathAgainstMounts($fI['path']) && $c<20)      {
00334                                 $rDir = $fI['path'].$this->recyclerFN;
00335                                 if (@is_dir($rDir) && $this->recyclerFN!=$fI['file'])   {
00336                                         return $rDir;
00337                                 }
00338                                 $theFile = $fI['path'];
00339                                 $theFile = $this->cleanDirectoryName($theFile);
00340                                 $fI = t3lib_div::split_fileref($theFile);
00341                                 $c++;
00342                         }
00343                 }
00344         }
00345 
00357         function writeLog($action,$error,$details_nr,$details,$data)    {
00358                 $type = 2;      // Type value for tce_file.php
00359                 if (is_object($GLOBALS['BE_USER']))     {
00360                         $GLOBALS['BE_USER']->writelog($type,$action,$error,$details_nr,$details,$data);
00361                 }
00362         }
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370 
00371 
00372         /*************************************
00373          *
00374          * File operation functions
00375          *
00376          **************************************/
00377 
00384         function func_delete($cmds)     {
00385                 if (!$this->isInit) return FALSE;
00386 
00387                         // Checking path:
00388                 $theFile = $cmds['data'];
00389                 if (!$this->isPathValid($theFile))      {
00390                         $this->writelog(4,2,101,'Target "%s" had invalid path (".." and "//" is not allowed in path).',Array($theFile));
00391                         return FALSE;
00392                 }
00393 
00394                         // Recycler moving or not?
00395                 if ($this->useRecycler && $recyclerPath=$this->findRecycler($theFile))  {
00396                                 // If a recycler is found, the deleted items is moved to the recycler and not just deleted.
00397                         $newCmds=Array();
00398                         $newCmds['data']=$theFile;
00399                         $newCmds['target']=$recyclerPath;
00400                         $newCmds['altName']=1;
00401                         $this->func_move($newCmds);
00402                         $this->writelog(4,0,4,'Item "%s" moved to recycler at "%s"',Array($theFile,$recyclerPath));
00403                         return TRUE;
00404                 } elseif ($this->useRecycler != 2) {    // if $this->useRecycler==2 then we cannot delete for real!!
00405                         if (@is_file($theFile)) {       // If we are deleting a file...
00406                                 if ($this->actionPerms['deleteFile'])   {
00407                                         if ($this->checkPathAgainstMounts($theFile))    {
00408                                                 if (@unlink($theFile))  {
00409                                                         $this->writelog(4,0,1,'File "%s" deleted',Array($theFile));
00410                                                         return TRUE;
00411                                                 } else $this->writelog(4,1,110,'Could not delete file "%s". Write-permission problem?', Array($theFile));
00412                                         } else $this->writelog(4,1,111,'Target was not within your mountpoints! T="%s"',Array($theFile));
00413                                 } else $this->writelog(4,1,112,'You are not allowed to delete files','');
00414                                 // FINISHED deleting file
00415 
00416                         } elseif (@is_dir($theFile)) {  // if we're deleting a folder
00417                                 if ($this->actionPerms['deleteFolder']) {
00418                                         $theFile = $this->is_directory($theFile);
00419                                         if ($theFile)   {
00420                                                 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...)
00421                                                         if ($this->actionPerms['deleteFolderRecursively'] && !$this->dont_use_exec_commands)    {
00422                                                                         // No way to do this under windows
00423                                                                 $cmd = 'rm -Rf "'.$theFile.'"';
00424                                                                 exec($cmd);             // This is a quite critical command...
00425                                                                 clearstatcache();
00426                                                                 if (!@file_exists($theFile))    {
00427                                                                         $this->writelog(4,0,2,'Directory "%s" deleted recursively!',Array($theFile));
00428                                                                         return TRUE;
00429                                                                 } else $this->writelog(4,2,119,'Directory "%s" WAS NOT deleted recursively! Write-permission problem?',Array($theFile));
00430                                                         } else {
00431                                                                 if (@rmdir($theFile))   {
00432                                                                         $this->writelog(4,0,3,'Directory "%s" deleted',Array($theFile));
00433                                                                         return TRUE;
00434                                                                 } 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));
00435                                                         }
00436                                                 } else $this->writelog(4,1,121,'Target was not within your mountpoints! T="%s"',Array($theFile));
00437                                         } else $this->writelog(4,2,122,'Target seemed not to be a directory! (Shouldn\'t happen here!)','');
00438                                 } else $this->writelog(4,1,123,'You are not allowed to delete directories','');
00439                                 // FINISHED copying directory
00440 
00441                         } else $this->writelog(4,2,130,'The item was not a file or directory! "%s"',Array($theFile));
00442                 } else $this->writelog(4,1,131,'No recycler found!','');
00443         }
00444 
00451         function func_copy($cmds)       {
00452                 if (!$this->isInit) return FALSE;
00453 
00454                         // Initialize and check basic conditions:
00455                 $theFile = $cmds['data'];
00456                 $theDest = $this->is_directory($cmds['target']);        // Clean up destination directory
00457                 $altName = $cmds['altName'];
00458                 if (!$theDest)  {
00459                         $this->writelog(2,2,100,'Destination "%s" was not a directory',Array($cmds['target']));
00460                         return FALSE;
00461                 }
00462                 if (!$this->isPathValid($theFile) || !$this->isPathValid($theDest))     {
00463                         $this->writelog(2,2,101,'Target or destination had invalid path (".." and "//" is not allowed in path). T="%s", D="%s"',Array($theFile,$theDest));
00464                         return FALSE;
00465                 }
00466 
00467                         // Processing of file or directory.
00468                 if (@is_file($theFile)) {       // If we are copying a file...
00469                         if ($this->actionPerms['copyFile'])     {
00470                                 if (filesize($theFile) < ($this->maxCopyFileSize*1024)) {
00471                                         $fI = t3lib_div::split_fileref($theFile);
00472                                         if ($altName)   {       // If altName is set, we're allowed to create a new filename if the file already existed
00473                                                 $theDestFile = $this->getUniqueName($fI['file'], $theDest);
00474                                                 $fI = t3lib_div::split_fileref($theDestFile);
00475                                         } else {
00476                                                 $theDestFile = $theDest.'/'.$fI['file'];
00477                                         }
00478                                         if ($theDestFile && !@file_exists($theDestFile))        {
00479                                                 if ($this->checkIfAllowed($fI['fileext'], $theDest, $fI['file'])) {
00480                                                         if ($this->checkPathAgainstMounts($theDestFile) && $this->checkPathAgainstMounts($theFile))     {
00481                                                                 if ($this->PHPFileFunctions)    {
00482                                                                         copy ($theFile,$theDestFile);
00483                                                                 } else {
00484                                                                         $cmd = 'cp "'.$theFile.'" "'.$theDestFile.'"';
00485                                                                         exec($cmd);
00486                                                                 }
00487                                                                 clearstatcache();
00488                                                                 if (@is_file($theDestFile))     {
00489                                                                         $this->writelog(2,0,1,'File "%s" copied to "%s"',Array($theFile,$theDestFile));
00490                                                                         return $theDestFile;
00491                                                                 } else $this->writelog(2,2,109,'File "%s" WAS NOT copied to "%s"! Write-permission problem?',Array($theFile,$theDestFile));
00492                                                         } else  $this->writelog(2,1,110,'Target or destination was not within your mountpoints! T="%s", D="%s"',Array($theFile,$theDestFile));
00493                                                 } else $this->writelog(2,1,111,'Fileextension "%s" is not allowed in "%s"!',Array($fI['fileext'],$theDest.'/'));
00494                                         } else $this->writelog(2,1,112,'File "%s" already exists!',Array($theDestFile));
00495                                 } else $this->writelog(2,1,113,'File "%s" exceeds the size-limit of %s bytes',Array($theFile,$this->maxCopyFileSize*1024));
00496                         } else $this->writelog(2,1,114,'You are not allowed to copy files','');
00497                         // FINISHED copying file
00498 
00499                 } elseif (@is_dir($theFile) && !$this->dont_use_exec_commands) {                // if we're copying a folder
00500                         if ($this->actionPerms['copyFolder'])   {
00501                                 $theFile = $this->is_directory($theFile);
00502                                 if ($theFile)   {
00503                                         $fI = t3lib_div::split_fileref($theFile);
00504                                         if ($altName)   {       // If altName is set, we're allowed to create a new filename if the file already existed
00505                                                 $theDestFile = $this->getUniqueName($fI['file'], $theDest);
00506                                                 $fI = t3lib_div::split_fileref($theDestFile);
00507                                         } else {
00508                                                 $theDestFile = $theDest.'/'.$fI['file'];
00509                                         }
00510                                         if ($theDestFile && !@file_exists($theDestFile))        {
00511                                                 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?
00512                                                         if ($this->checkIfFullAccess($theDest) || $this->is_webPath($theDestFile)==$this->is_webPath($theFile)) {       // no copy of folders between spaces
00513                                                                 if ($this->checkPathAgainstMounts($theDestFile) && $this->checkPathAgainstMounts($theFile))     {
00514                                                                                 // No way to do this under windows!
00515                                                                         $cmd = 'cp -R "'.$theFile.'" "'.$theDestFile.'"';
00516                                                                         exec($cmd);
00517                                                                         clearstatcache();
00518                                                                         if (@is_dir($theDestFile))      {
00519                                                                                 $this->writelog(2,0,2,'Directory "%s" copied to "%s"',Array($theFile,$theDestFile));
00520                                                                                 return $theDestFile;
00521                                                                         } else $this->writelog(2,2,119,'Directory "%s" WAS NOT copied to "%s"! Write-permission problem?',Array($theFile,$theDestFile));
00522                                                                 } else $this->writelog(2,1,120,'Target or destination was not within your mountpoints! T="%s", D="%s"',Array($theFile,$theDestFile));
00523                                                         } else $this->writelog(2,1,121,'You don\'t have full access to the destination directory "%s"!',Array($theDest.'/'));
00524                                                 } else $this->writelog(2,1,122,'Destination cannot be inside the target! D="%s", T="%s"',Array($theDestFile.'/',$theFile.'/'));
00525                                         } else $this->writelog(2,1,123,'Target "%s" already exists!',Array($theDestFile));
00526                                 } else $this->writelog(2,2,124,'Target seemed not to be a directory! (Shouldn\'t happen here!)','');
00527                         } else $this->writelog(2,1,125,'You are not allowed to copy directories','');
00528                         // FINISHED copying directory
00529 
00530                 } else {
00531                         $this->writelog(2,2,130,'The item "%s" was not a file or directory!',Array($theFile));
00532                 }
00533         }
00534 
00541         function func_move($cmds)       {
00542                 if (!$this->isInit) return FALSE;
00543 
00544                         // Initialize and check basic conditions:
00545                 $theFile = $cmds['data'];
00546                 $theDest = $this->is_directory($cmds['target']);        // Clean up destination directory
00547                 $altName = $cmds['altName'];
00548                 if (!$theDest)  {
00549                         $this->writelog(3,2,100,'Destination "%s" was not a directory',Array($cmds['target']));
00550                         return FALSE;
00551                 }
00552                 if (!$this->isPathValid($theFile) || !$this->isPathValid($theDest))     {
00553                         $this->writelog(3,2,101,'Target or destination had invalid path (".." and "//" is not allowed in path). T="%s", D="%s"',Array($theFile,$theDest));
00554                         return FALSE;
00555                 }
00556 
00557                         // Processing of file or directory:
00558                 if (@is_file($theFile)) {       // If we are moving a file...
00559                         if ($this->actionPerms['moveFile'])     {
00560                                 if (filesize($theFile) < ($this->maxMoveFileSize*1024)) {
00561                                         $fI = t3lib_div::split_fileref($theFile);
00562                                         if ($altName)   {       // If altName is set, we're allowed to create a new filename if the file already existed
00563                                                 $theDestFile = $this->getUniqueName($fI['file'], $theDest);
00564                                                 $fI = t3lib_div::split_fileref($theDestFile);
00565                                         } else {
00566                                                 $theDestFile = $theDest.'/'.$fI['file'];
00567                                         }
00568                                         if ($theDestFile && !@file_exists($theDestFile))        {
00569                                                 if ($this->checkIfAllowed($fI['fileext'], $theDest, $fI['file'])) {
00570                                                         if ($this->checkPathAgainstMounts($theDestFile) && $this->checkPathAgainstMounts($theFile))     {
00571                                                                 if ($this->PHPFileFunctions)    {
00572                                                                         rename($theFile, $theDestFile);
00573                                                                 } else {
00574                                                                         $cmd = 'mv "'.$theFile.'" "'.$theDestFile.'"';
00575                                                                         exec($cmd);
00576                                                                 }
00577                                                                 clearstatcache();
00578                                                                 if (@is_file($theDestFile))     {
00579                                                                         $this->writelog(3,0,1,'File "%s" moved to "%s"',Array($theFile,$theDestFile));
00580                                                                         return $theDestFile;
00581                                                                 } else $this->writelog(3,2,109,'File "%s" WAS NOT moved to "%s"! Write-permission problem?',Array($theFile,$theDestFile));
00582                                                         } else $this->writelog(3,1,110,'Target or destination was not within your mountpoints! T="%s", D="%s"',Array($theFile,$theDestFile));
00583                                                 } else $this->writelog(3,1,111,'Fileextension "%s" is not allowed in "%s"!',Array($fI['fileext'],$theDest.'/'));
00584                                         } else $this->writelog(3,1,112,'File "%s" already exists!',Array($theDestFile));
00585                                 } else $this->writelog(3,1,113,'File "%s" exceeds the size-limit of %s bytes',Array($theFile,$this->maxMoveFileSize*1024));
00586                         } else $this->writelog(3,1,114,'You are not allowed to move files','');
00587                         // FINISHED moving file
00588 
00589                 } elseif (@is_dir($theFile)) {  // if we're moving a folder
00590                         if ($this->actionPerms['moveFolder'])   {
00591                                 $theFile = $this->is_directory($theFile);
00592                                 if ($theFile)   {
00593                                         $fI = t3lib_div::split_fileref($theFile);
00594                                         if ($altName)   {       // If altName is set, we're allowed to create a new filename if the file already existed
00595                                                 $theDestFile = $this->getUniqueName($fI['file'], $theDest);
00596                                                 $fI = t3lib_div::split_fileref($theDestFile);
00597                                         } else {
00598                                                 $theDestFile = $theDest.'/'.$fI['file'];
00599                                         }
00600                                         if ($theDestFile && !@file_exists($theDestFile))        {
00601                                                 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?
00602                                                         if ($this->checkIfFullAccess($theDest) || $this->is_webPath($theDestFile)==$this->is_webPath($theFile)) {       // // no moving of folders between spaces
00603                                                                 if ($this->checkPathAgainstMounts($theDestFile) && $this->checkPathAgainstMounts($theFile))     {
00604                                                                         if ($this->PHPFileFunctions)    {
00605                                                                                 rename($theFile, $theDestFile);
00606                                                                         } else {
00607                                                                                 $cmd = 'mv "'.$theFile.'" "'.$theDestFile.'"';
00608                                                                                 exec($cmd,$errArr,$retVar);
00609                                                                         }
00610                                                                         clearstatcache();
00611                                                                         if (@is_dir($theDestFile))      {
00612                                                                                 $this->writelog(3,0,2,'Directory "%s" moved to "%s"',Array($theFile,$theDestFile));
00613                                                                                 return $theDestFile;
00614                                                                         } else $this->writelog(3,2,119,'Directory "%s" WAS NOT moved to "%s"! Write-permission problem?',Array($theFile,$theDestFile));
00615                                                                 } else $this->writelog(3,1,120,'Target or destination was not within your mountpoints! T="%s", D="%s"',Array($theFile,$theDestFile));
00616                                                         } else $this->writelog(3,1,121,'You don\'t have full access to the destination directory "%s"!',Array($theDest.'/'));
00617                                                 } else $this->writelog(3,1,122,'Destination cannot be inside the target! D="%s", T="%s"',Array($theDestFile.'/',$theFile.'/'));
00618                                         } else $this->writelog(3,1,123,'Target "%s" already exists!',Array($theDestFile));
00619                                 } else $this->writelog(3,2,124,'Target seemed not to be a directory! (Shouldn\'t happen here!)','');
00620                         } else $this->writelog(3,1,125,'You are not allowed to move directories','');
00621                         // FINISHED moving directory
00622 
00623                 } else {
00624                         $this->writelog(3,2,130,'The item "%s" was not a file or directory!',Array($theFile));
00625                 }
00626         }
00627 
00634         function func_rename($cmds)     {
00635                 if (!$this->isInit) return FALSE;
00636 
00637                 $theNewName = $this->cleanFileName($cmds['data']);
00638                 if ($theNewName)        {
00639                         if ($this->checkFileNameLen($theNewName))       {
00640                                 $theTarget = $cmds['target'];
00641                                 $type = filetype($theTarget);
00642                                 if ($type=='file' || $type=='dir')      {               // $type MUST BE file or dir
00643                                         $fileInfo = t3lib_div::split_fileref($theTarget);               // Fetches info about path, name, extention of $theTarget
00644                                         if ($fileInfo['file']!=$theNewName)     {       // The name should be different from the current. And the filetype must be allowed
00645                                                 $theRenameName = $fileInfo['path'].$theNewName;
00646                                                 if ($this->checkPathAgainstMounts($fileInfo['path']))   {
00647                                                         if (!@file_exists($theRenameName))      {
00648                                                                 if ($type=='file')      {
00649                                                                         if ($this->actionPerms['renameFile'])   {
00650                                                                                 $fI = t3lib_div::split_fileref($theRenameName);
00651                                                                                 if ($this->checkIfAllowed($fI['fileext'], $fileInfo['path'], $fI['file'])) {
00652                                                                                         if (@rename($theTarget, $theRenameName))        {
00653                                                                                                 $this->writelog(5,0,1,'File renamed from "%s" to "%s"',Array($fileInfo['file'],$theNewName));
00654                                                                                                 return $theRenameName;
00655                                                                                         } else $this->writelog(5,1,100,'File "%s" was not renamed! Write-permission problem in "%s"?',Array($theTarget,$fileInfo['path']));
00656                                                                                 } else $this->writelog(5,1,101,'Fileextension "%s" was not allowed!',Array($fI['fileext']));
00657                                                                         } else $this->writelog(5,1,102,'You are not allowed to rename files!','');
00658                                                                 } elseif ($type=='dir') {
00659                                                                         if ($this->actionPerms['renameFolder']) {
00660                                                                                 if (@rename($theTarget, $theRenameName))        {
00661                                                                                         $this->writelog(5,0,2,'Directory renamed from "%s" to "%s"',Array($fileInfo['file'],$theNewName));
00662                                                                                         return $theRenameName;
00663                                                                                 } else $this->writelog(5,1,110,'Directory "%s" was not renamed! Write-permission problem in "%s"?',Array($theTarget,$fileInfo['path']));
00664                                                                         } else $this->writelog(5,1,111,'You are not allowed to rename directories!','');
00665                                                                 }
00666                                                         } else $this->writelog(5,1,120,'Destination "%s" existed already!',Array($theRenameName));
00667                                                 } else $this->writelog(5,1,121,'Destination path "%s" was not within your mountpoints!',Array($fileInfo['path']));
00668                                         } else $this->writelog(5,1,122,'Old and new name is the same (%s)',Array($theNewName));
00669                                 } else $this->writelog(5,2,123,'Target "%s" was neither a directory nor a file!',Array($theTarget));
00670                         } else $this->writelog(5,1,124,'New name "%s" was too long (max %s characters)',Array($theNewName,$this->maxInputNameLen));
00671                 }
00672         }
00673 
00680         function func_newfolder($cmds)  {
00681                 if (!$this->isInit) return FALSE;
00682 
00683                 $theFolder = $this->cleanFileName($cmds['data']);
00684                 if ($theFolder) {
00685                         if ($this->checkFileNameLen($theFolder))        {
00686                                 $theTarget = $this->is_directory($cmds['target']);      // Check the target dir
00687                                 if ($theTarget) {
00688                                         if ($this->actionPerms['newFolder'])    {
00689                                                 $theNewFolder = $theTarget.'/'.$theFolder;
00690                                                 if ($this->checkPathAgainstMounts($theNewFolder))       {
00691                                                         if (!@file_exists($theNewFolder))       {
00692                                                                 if (t3lib_div::mkdir($theNewFolder)){
00693                                                                         $this->writelog(6,0,1,'Directory "%s" created in "%s"',Array($theFolder,$theTarget.'/'));
00694                                                                         return $theNewFolder;
00695                                                                 } else $this->writelog(6,1,100,'Directory "%s" not created. Write-permission problem in "%s"?',Array($theFolder,$theTarget.'/'));
00696                                                         } else $this->writelog(6,1,101,'File or directory "%s" existed already!',Array($theNewFolder));
00697                                                 } else $this->writelog(6,1,102,'Destination path "%s" was not within your mountpoints!',Array($theTarget.'/'));
00698                                         } else $this->writelog(6,1,103,'You are not allowed to create directories!','');
00699                                 } else $this->writelog(6,2,104,'Destination "%s" was not a directory',Array($cmds['target']));
00700                         } else $this->writelog(6,1,105,'New name "%s" was too long (max %s characters)',Array($theFolder,$this->maxInputNameLen));
00701                 }
00702         }
00703 
00710         function func_newfile($cmds)    {
00711                 $extList = $GLOBALS['TYPO3_CONF_VARS']['SYS']['textfile_ext'];
00712                 if (!$this->isInit) return FALSE;
00713                 $newName = $this->cleanFileName($cmds['data']);
00714                 if ($newName)   {
00715                         if ($this->checkFileNameLen($newName))  {
00716                                 $theTarget = $this->is_directory($cmds['target']);      // Check the target dir
00717                                 $fileInfo = t3lib_div::split_fileref($theTarget);               // Fetches info about path, name, extention of $theTarget
00718                                 if ($theTarget) {
00719                                         if ($this->actionPerms['newFile'])      {
00720                                                 $theNewFile = $theTarget.'/'.$newName;
00721                                                 if ($this->checkPathAgainstMounts($theNewFile)) {
00722                                                         if (!@file_exists($theNewFile)) {
00723                                                                 $fI = t3lib_div::split_fileref($theNewFile);
00724                                                                 if ($this->checkIfAllowed($fI['fileext'], $fileInfo['path'], $fI['file'])) {
00725                                                                         if (t3lib_div::inList($extList, $fI['fileext']))        {
00726                                                                                 if (t3lib_div::writeFile($theNewFile,''))       {
00727                                                                                         clearstatcache();
00728                                                                                         $this->writelog(8,0,1,'File created: "%s"',Array($fI['file']));
00729                                                                                         return $theNewFile;
00730                                                                                 } else $this->writelog(8,1,100,'File "%s" was not created! Write-permission problem in "%s"?',Array($fI['file'], $theTarget));
00731                                                                         } else $this->writelog(8,1,107,'Fileextension "%s" is not a textfile format! (%s)',Array($fI['fileext'], $extList));
00732                                                                 } else $this->writelog(8,1,106,'Fileextension "%s" was not allowed!',Array($fI['fileext']));
00733                                                         } else $this->writelog(8,1,101,'File "%s" existed already!',Array($theNewFile));
00734                                                 } else $this->writelog(8,1,102,'Destination path "%s" was not within your mountpoints!',Array($theTarget.'/'));
00735                                         } else $this->writelog(8,1,103,'You are not allowed to create files!','');
00736                                 } else $this->writelog(8,2,104,'Destination "%s" was not a directory',Array($cmds['target']));
00737                         } else $this->writelog(8,1,105,'New name "%s" was too long (max %s characters)',Array($newName,$this->maxInputNameLen));
00738                 }
00739         }
00740 
00747         function func_edit($cmds)       {
00748                 if (!$this->isInit) return FALSE;
00749                 $theTarget = $cmds['target'];
00750                 $content = $cmds['data'];
00751                 $extList = $GLOBALS['TYPO3_CONF_VARS']['SYS']['textfile_ext'];
00752                 $type = filetype($theTarget);
00753                 if ($type=='file')      {               // $type MUST BE file
00754                         $fileInfo = t3lib_div::split_fileref($theTarget);               // Fetches info about path, name, extention of $theTarget
00755                         $fI =$fileInfo;
00756                         if ($this->checkPathAgainstMounts($fileInfo['path']))   {
00757                                 if ($this->actionPerms['editFile'])     {
00758                                         $fI = t3lib_div::split_fileref($theTarget);
00759                                         if ($this->checkIfAllowed($fI['fileext'], $fileInfo['path'], $fI['file'])) {
00760                                                 if (t3lib_div::inList($extList, $fileInfo['fileext']))  {
00761                                                         if (t3lib_div::writeFile($theTarget,$content))  {
00762                                                                 clearstatcache();
00763                                                                 $this->writelog(9,0,1,'File saved to "%s", bytes: %s, MD5: %s ',Array($fileInfo['file'],@filesize($theTarget),md5($content)));
00764                                                                 return TRUE;
00765                                                         } else $this->writelog(9,1,100,'File "%s" was not saved! Write-permission problem in "%s"?',Array($theTarget,$fileInfo['path']));
00766                                                 } else $this->writelog(9,1,102,'Fileextension "%s" is not a textfile format! (%s)',Array($fI['fileext'], $extList));
00767                                         } else $this->writelog(9,1,103,'Fileextension "%s" was not allowed!',Array($fI['fileext']));
00768                                 } else $this->writelog(9,1,104,'You are not allowed to edit files!','');
00769                         } else $this->writelog(9,1,121,'Destination path "%s" was not within your mountpoints!',Array($fileInfo['path']));
00770                 } else $this->writelog(9,2,123,'Target "%s" was not a file!',Array($theTarget));
00771         }
00772 
00779         function func_upload($cmds)     {
00780                 if (!$this->isInit) return FALSE;
00781                 $id = $cmds['data'];
00782                 if ($_FILES['upload_'.$id]['name'])     {
00783                         $theFile = $_FILES['upload_'.$id]['tmp_name'];                          // filename of the uploaded file
00784                         $theFileSize = $_FILES['upload_'.$id]['size'];                          // filesize of the uploaded file
00785                         $theName = $this->cleanFileName(stripslashes($_FILES['upload_'.$id]['name']));  // The original filename
00786                         if (is_uploaded_file($theFile) && $theName)     {       // Check the file
00787                                 if ($this->actionPerms['uploadFile'])   {
00788                                         if ($theFileSize<($this->maxUploadFileSize*1024))       {
00789                                                 $fI = t3lib_div::split_fileref($theName);
00790                                                 $theTarget = $this->is_directory($cmds['target']);      // Check the target dir
00791                                                 if ($theTarget && $this->checkPathAgainstMounts($theTarget.'/'))        {
00792                                                         if ($this->checkIfAllowed($fI['fileext'], $theTarget, $fI['file'])) {
00793                                                                 $theNewFile = $this->getUniqueName($theName, $theTarget, $this->dontCheckForUnique);
00794                                                                 if ($theNewFile)        {
00795                                                                         t3lib_div::upload_copy_move($theFile,$theNewFile);
00796                                                                         clearstatcache();
00797                                                                         if (@is_file($theNewFile))      {
00798                                                                                 $this->internalUploadMap[$id] = $theNewFile;
00799                                                                                 $this->writelog(1,0,1,'Uploading file "%s" to "%s"',Array($theName,$theNewFile, $id));
00800                                                                                 return $theNewFile;
00801                                                                         } else $this->writelog(1,1,100,'Uploaded file could not be moved! Write-permission problem in "%s"?',Array($theTarget.'/'));
00802                                                                 } else $this->writelog(1,1,101,'No unique filename available in "%s"!',Array($theTarget.'/'));
00803                                                         } else $this->writelog(1,1,102,'Fileextension "%s" is not allowed in "%s"!',Array($fI['fileext'],$theTarget.'/'));
00804                                                 } else $this->writelog(1,1,103,'Destination path "%s" was not within your mountpoints!',Array($theTarget.'/'));
00805                                         } else $this->writelog(1,1,104,'The uploaded file exceeds the size-limit of %s bytes',Array($this->maxUploadFileSize*1024));
00806                                 } else $this->writelog(1,1,105,'You are not allowed to upload files!','');
00807                         } else $this->writelog(1,2,106,'The uploaded file did not exist!','');
00808                 }
00809         }
00810 
00818         function func_unzip($cmds)      {
00819                 if (!$this->isInit || $this->dont_use_exec_commands) return FALSE;
00820 
00821                 $theFile = $cmds['data'];
00822                 if (@is_file($theFile)) {
00823                         $fI = t3lib_div::split_fileref($theFile);
00824                         if (!isset($cmds['target']))    {
00825                                 $cmds['target'] = $fI['path'];
00826                         }
00827                         $theDest = $this->is_directory($cmds['target']);        // Clean up destination directory
00828                         if ($theDest)   {
00829                                 if ($this->actionPerms['unzipFile'])    {
00830                                         if ($fI['fileext']=='zip')      {
00831                                                 if ($this->checkIfFullAccess($theDest)) {
00832                                                         if ($this->checkPathAgainstMounts($theFile) && $this->checkPathAgainstMounts($theDest.'/'))     {
00833                                                                         // No way to do this under windows.
00834                                                                 $cmd = $this->unzipPath.'unzip -qq "'.$theFile.'" -d "'.$theDest.'"';
00835                                                                 exec($cmd);
00836                                                                 $this->writelog(7,0,1,'Unzipping file "%s" in "%s"',Array($theFile,$theDest));
00837                                                                 return TRUE;
00838                                                         } else $this->writelog(7,1,100,'File "%s" or destination "%s" was not within your mountpoints!',Array($theFile,$theDest));
00839                                                 } else $this->writelog(7,1,101,'You don\'t have full access to the destination directory "%s"!',Array($theDest));
00840                                         } else $this->writelog(7,1,102,'Fileextension is not "zip"','');
00841                                 } else $this->writelog(7,1,103,'You are not allowed to unzip files','');
00842                         } else $this->writelog(7,2,104,'Destination "%s" was not a directory',Array($cmds['target']));
00843                 } else $this->writelog(7,2,105,'The file "%s" did not exist!',Array($theFile));
00844         }
00845 }
00846 
00847 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_extfilefunc.php'])       {
00848         include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_extfilefunc.php']);
00849 }
00850 ?>


Généré par Les experts TYPO3 avec  doxygen 1.4.6