Viewing file: class.fsAccessDriver.php (46.09 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php /** * @package info.ajaxplorer.plugins * * Copyright 2007-2009 Charles du Jeu * This file is part of AjaXplorer. * The latest code can be found at http://www.ajaxplorer.info/ * * This program is published under the LGPL Gnu Lesser General Public License. * You should have received a copy of the license along with AjaXplorer. * * The main conditions are as follow : * You must conspicuously and appropriately publish on each copy distributed * an appropriate copyright notice and disclaimer of warranty and keep intact * all the notices that refer to this License and to the absence of any warranty; * and give any other recipients of the Program a copy of the GNU Lesser General * Public License along with the Program. * * If you modify your copy or copies of the library or any portion of it, you may * distribute the resulting library provided you do so under the GNU Lesser * General Public License. However, programs that link to the library may be * licensed under terms of your choice, so long as the library itself can be changed. * Any translation of the GNU Lesser General Public License must be accompanied by the * GNU Lesser General Public License. * * If you copy or distribute the program, you must accompany it with the complete * corresponding machine-readable source code or with a written offer, valid for at * least three years, to furnish the complete corresponding machine-readable source code. * * Any of the above conditions can be waived if you get permission from the copyright holder. * AjaXplorer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * Description : The most used and standard plugin : FileSystem access */ class fsAccessDriver extends AbstractAccessDriver { /** * @var Repository */ var $repository; function fsAccessDriver($driverName, $filePath, $repository, $optOptions = NULL){ parent::AbstractAccessDriver($driverName, $filePath, $repository); } function initRepository(){ $create = $this->repository->getOption("CREATE"); $path = $this->repository->getOption("PATH"); $recycle = $this->repository->getOption("RECYCLE_BIN"); if($create == true){ if(!is_dir($path)) @mkdir($path); if(!is_dir($path)){ return new AJXP_Exception("Cannot create root path for repository. Please check repository configuration or that your folder is writeable!"); } if($recycle!= "" && !is_dir($path."/".$recycle)){ @mkdir($path."/".$recycle); if(!is_dir($path."/".$recycle)){ return new AJXP_Exception("Cannot create recycle bin folder. Please check repository configuration or that your folder is writeable!"); } } }else{ if(!is_dir($path)){ return new AJXP_Exception("Cannot find base path for your repository! Please check the configuration!"); } } } function switchAction($action, $httpVars, $fileVars){ if(!isSet($this->actions[$action])) return; $xmlBuffer = ""; foreach($httpVars as $getName=>$getValue){ $$getName = Utils::securePath(SystemTextEncoding::magicDequote($getValue)); } $selection = new UserSelection();
$selection->initFromHttpVars($httpVars); if(isSet($dir) && $action != "upload") { $safeDir = $dir; $dir = SystemTextEncoding::fromUTF8($dir); } if(isSet($dest)) $dest = SystemTextEncoding::fromUTF8($dest); $mess = ConfService::getMessages(); $recycleBinOption = $this->repository->getOption("RECYCLE_BIN"); // FILTER ACTION FOR DELETE if($recycleBinOption!="" && $action == "delete" && $dir != "/".$recycleBinOption) { $action = "move"; $dest = "/".$recycleBinOption; $dest_node = "AJAXPLORER_RECYCLE_NODE"; } // FILTER ACTION FOR RESTORE if($recycleBinOption!="" && $action == "restore" && $dir == "/".$recycleBinOption) { $originalRep = RecycleBinManager::getFileOrigin($selection->getUniqueFile()); if($originalRep != "") { $action = "move"; $dest = $originalRep; } } // FILTER DIR PAGINATION ANCHOR if(isSet($dir) && strstr($dir, "#")!==false){ $parts = split("#", $dir); $dir = $parts[0]; $page = $parts[1]; } switch($action) { //------------------------------------ // DOWNLOAD, IMAGE & MP3 PROXYS //------------------------------------ case "download": AJXP_Logger::logAction("Download", array("files"=>$selection)); set_error_handler(array("HTMLWriter", "javascriptErrorHandler"), E_ALL & ~ E_NOTICE); register_shutdown_function("restore_error_handler"); if($selection->inZip){ $tmpDir = dirname($selection->getZipPath())."/.tmpExtractDownload"; @mkdir($this->getPath()."/".$tmpDir); $this->convertSelectionToTmpFiles($tmpDir, $selection); } $zip = false; if($selection->isUnique()){ if(is_dir($this->getPath()."/".$selection->getUniqueFile())) { $zip = true; $dir .= "/".basename($selection->getUniqueFile()); } }else{ $zip = true; } if($zip){ // Make a temp zip and send it as download $loggedUser = AuthService::getLoggedUser(); $file = USERS_DIR."/".($loggedUser?$loggedUser->getId():"shared")."/".time()."tmpDownload.zip"; $zipFile = $this->makeZip($selection->getFiles(), $file, $dir); if(!$zipFile) AJXP_Exception::errorToXml("Error while compressing"); $localName = (basename($dir)==""?"Files":basename($dir)).".zip"; $this->readFile($file, "force-download", $localName, false, false); register_shutdown_function("unlink", $file); }else{ $this->readFile($this->getPath()."/".$selection->getUniqueFile(), "force-download"); } if(isSet($tmpDir)){ //$this->deldir($this->getPath()."/".$tmpDir); $delDir = $this->getPath()."/".$tmpDir; register_shutdown_function(array($this, "deldir"), $delDir); } exit(0); break; case "image_proxy": if($split = UserSelection::detectZip(SystemTextEncoding::fromUTF8($file))){ require_once("server/classes/pclzip.lib.php"); $zip = new PclZip($this->getPath().$split[0]); $data = $zip->extract(PCLZIP_OPT_BY_NAME, substr($split[1], 1), PCLZIP_OPT_EXTRACT_AS_STRING); header("Content-Type: ".Utils::getImageMimeType(basename($split[1]))."; name=\"".basename($split[1])."\""); header("Content-Length: ".strlen($data[0]["content"])); header('Cache-Control: public'); print($data[0]["content"]); }else{ if(isSet($get_thumb) && $get_thumb == "true" && $this->driverConf["GENERATE_THUMBNAIL"]){ require_once("server/classes/PThumb.lib.php"); $pThumb = new PThumb($this->driverConf["THUMBNAIL_QUALITY"]); if(!$pThumb->isError()){ $pThumb->use_cache = $this->driverConf["USE_THUMBNAIL_CACHE"]; $pThumb->cache_dir = INSTALL_PATH."/".$this->driverConf["THUMBNAIL_CACHE_DIR"]; $pThumb->fit_thumbnail($this->getPath()."/".SystemTextEncoding::fromUTF8($file), 200); if($pThumb->isError()){ print_r($pThumb->error_array); } exit(0); } } $this->readFile($this->getPath()."/".SystemTextEncoding::fromUTF8($file), "image"); } exit(0); break; case "mp3_proxy": if($split = UserSelection::detectZip(SystemTextEncoding::fromUTF8($file))){ require_once("server/classes/pclzip.lib.php"); $zip = new PclZip($this->getPath().$split[0]); $data = $zip->extract(PCLZIP_OPT_BY_NAME, substr($split[1], 1), PCLZIP_OPT_EXTRACT_AS_STRING); header("Content-Type: audio/mp3; name=\"".basename($split[1])."\""); header("Content-Length: ".strlen($data[0]["content"])); print($data[0]["content"]); }else{ $this->readFile($this->getPath()."/".SystemTextEncoding::fromUTF8($file), "mp3"); } exit(0); break; //------------------------------------ // ONLINE EDIT //------------------------------------ case "edit"; if(isset($save) && $save==1 && isSet($code)) { // Reload "code" variable directly from POST array, do not "securePath"... $code = $_POST["code"]; AJXP_Logger::logAction("Online Edition", array("file"=>SystemTextEncoding::fromUTF8($file))); $code=stripslashes($code); $code=str_replace("<","<",$code); $fp=fopen($this->getPath().SystemTextEncoding::fromUTF8("/$file"),"w"); fputs ($fp,$code); fclose($fp); echo $mess[115]; } else { $this->readFile($this->getPath()."/".SystemTextEncoding::fromUTF8($file), "plain"); } exit(0); break; //------------------------------------ // COPY / MOVE //------------------------------------ case "copy"; case "move"; if($selection->isEmpty()) { $errorMessage = $mess[113]; break; } if($selection->inZip()){ $tmpDir = dirname($selection->getZipPath())."/.tmpExtractDownload"; @mkdir($this->getPath()."/".$tmpDir); $this->convertSelectionToTmpFiles($tmpDir, $selection); if(is_dir($tmpDir)) $this->deldir($this->getPath()."/".$tmpDir); } $success = $error = array(); $this->copyOrMove($dest, $selection->getFiles(), $error, $success, ($action=="move"?true:false)); if(count($error)){ $errorMessage = join("\n", $error); } else { $logMessage = join("\n", $success); AJXP_Logger::logAction(($action=="move"?"Move":"Copy"), array("files"=>$selection, "destination"=>$dest)); } $reload_current_node = true; if(isSet($dest_node)) $reload_dest_node = $dest_node; $reload_file_list = true; break; //------------------------------------ // SUPPRIMER / DELETE //------------------------------------ case "delete"; if($selection->isEmpty()) { $errorMessage = $mess[113]; break; } $logMessages = array(); $errorMessage = $this->delete($selection->getFiles(), $logMessages); if(count($logMessages)) { $logMessage = join("\n", $logMessages); } AJXP_Logger::logAction("Delete", array("files"=>$selection)); $reload_current_node = true; $reload_file_list = true; break; //------------------------------------ // RENOMMER / RENAME //------------------------------------ case "rename"; $file = SystemTextEncoding::fromUTF8($file); $filename_new = SystemTextEncoding::fromUTF8($filename_new); $error = $this->rename($file, $filename_new); if($error != null) { $errorMessage = $error; break; } $logMessage= SystemTextEncoding::toUTF8($file)." $mess[41] ".SystemTextEncoding::toUTF8($filename_new); $reload_current_node = true; $reload_file_list = basename($filename_new); AJXP_Logger::logAction("Rename", array("original"=>$file, "new"=>$filename_new)); break; //------------------------------------ // CREER UN REPERTOIRE / CREATE DIR //------------------------------------ case "mkdir"; $messtmp=""; $dirname=Utils::processFileName(SystemTextEncoding::fromUTF8($dirname)); $error = $this->mkDir($dir, $dirname); if(isSet($error)){ $errorMessage = $error; break; } $reload_file_list = $dirname; $messtmp.="$mess[38] ".SystemTextEncoding::toUTF8($dirname)." $mess[39] "; if($dir=="") {$messtmp.="/";} else {$messtmp.= SystemTextEncoding::toUTF8($dir);} $logMessage = $messtmp; $reload_current_node = true; AJXP_Logger::logAction("Create Dir", array("dir"=>$dir."/".$dirname)); break; //------------------------------------ // CREER UN FICHIER / CREATE FILE //------------------------------------ case "mkfile"; $messtmp=""; $filename=Utils::processFileName(SystemTextEncoding::fromUTF8($filename)); $error = $this->createEmptyFile($dir, $filename); if(isSet($error)){ $errorMessage = $error; break; } $messtmp.="$mess[34] ".SystemTextEncoding::toUTF8($filename)." $mess[39] "; if($dir=="") {$messtmp.="/";} else {$messtmp.=SystemTextEncoding::toUTF8($dir);} $logMessage = $messtmp; $reload_file_list = $filename; AJXP_Logger::logAction("Create File", array("file"=>$dir."/".$filename)); break; //------------------------------------ // CHANGE FILE PERMISSION //------------------------------------ case "chmod"; $messtmp=""; $files = $selection->getFiles(); $changedFiles = array(); foreach ($files as $fileName){ $error = $this->chmod($this->getPath().$fileName, $chmod_value, ($recursive=="on"), ($recursive=="on"?$recur_apply_to:"both"), $changedFiles); } if(isSet($error)){ $errorMessage = $error; break; } //$messtmp.="$mess[34] ".SystemTextEncoding::toUTF8($filename)." $mess[39] "; $logMessage="Successfully changed permission to ".$chmod_value." for ".count($changedFiles)." files or folders"; $reload_file_list = $dir; AJXP_Logger::logAction("Chmod", array("dir"=>$dir, "filesCount"=>count($changedFiles))); break; //------------------------------------ // UPLOAD //------------------------------------ case "upload":
$fancyLoader = false; if(isSet($fileVars["Filedata"])){ $fancyLoader = true; if($dir!="") $dir = "/".base64_decode($dir); } if($dir!=""){$rep_source="/$dir";} else $rep_source = ""; $destination=SystemTextEncoding::fromUTF8($this->getPath().$rep_source); if(!$this->isWriteable($destination)) { $errorMessage = "$mess[38] ".SystemTextEncoding::toUTF8($dir)." $mess[99]."; if($fancyLoader){ header('HTTP/1.0 412 '.$errorMessage); die('Error 412 '.$errorMessage); }else{ print("\n if(parent.ajaxplorer.actionBar.multi_selector)parent.ajaxplorer.actionBar.multi_selector.submitNext('".str_replace("'", "\'", $errorMessage)."');"); break; } } $logMessage = ""; foreach ($fileVars as $boxName => $boxData) { if($boxName != "Filedata" && substr($boxName, 0, 9) != "userfile_") continue; if($boxName == "Filedata") $fancyLoader = true; $err = Utils::parseFileDataErrors($boxData, $fancyLoader); if($err != null) { $errorMessage = $err; break; } $userfile_name = $boxData["name"]; if($fancyLoader) $userfile_name = SystemTextEncoding::fromUTF8($userfile_name); $userfile_name=Utils::processFileName($userfile_name); if(isSet($auto_rename)){ $userfile_name = fsDriver::autoRenameForDest($destination, $userfile_name); } if (!move_uploaded_file($boxData["tmp_name"], "$destination/".$userfile_name)) { $errorMessage=($fancyLoader?"411 ":"")."$mess[33] ".$userfile_name; break; } $this->changeMode($destination."/".$userfile_name); $logMessage.="$mess[34] ".SystemTextEncoding::toUTF8($userfile_name)." $mess[35] $dir"; AJXP_Logger::logAction("Upload File", array("file"=>SystemTextEncoding::fromUTF8($dir)."/".$userfile_name)); } if($fancyLoader) { if(isSet($errorMessage)){ header('HTTP/1.0 '.$errorMessage); die('Error '.$errorMessage); }else{ header('HTTP/1.0 200 OK'); die("200 OK"); } } else { print("<html><script language=\"javascript\">\n"); if(isSet($errorMessage)){ print("\n if(parent.ajaxplorer.actionBar.multi_selector)parent.ajaxplorer.actionBar.multi_selector.submitNext('".str_replace("'", "\'", $errorMessage)."');"); }else{ print("\n if(parent.ajaxplorer.actionBar.multi_selector)parent.ajaxplorer.actionBar.multi_selector.submitNext();"); } print("</script></html>"); } exit; break; //------------------------------------ // Public URL //------------------------------------ case "public_url": $file = SystemTextEncoding::fromUTF8($file); $url = $this->makePubliclet($file, $password, $expiration); header("Content-type:text/plain"); echo $url; exit(1); break; //------------------------------------ // XML LISTING //------------------------------------ case "ls": if(!isSet($dir) || $dir == "/") $dir = ""; $searchMode = $fileListMode = $completeMode = false; if(isSet($mode)){ if($mode == "search") $searchMode = true; else if($mode == "file_list") $fileListMode = true; else if($mode == "complete") $completeMode = true; } if(isSet($skipZip) && $skipZip == "true"){ $skipZip = true; }else{ $skipZip = false; } if($test = UserSelection::detectZip($dir)){ $liste = array(); $zip = $this->zipListing($test[0], $test[1], $liste); AJXP_XMLWriter::header(); $tmpDir = $this->getPath().dirname($test[0]).".tmpZipExtract"; foreach ($liste as $zipEntry){ $atts = array(); if(!$fileListMode && !$zipEntry["folder"]) continue; $atts[] = "is_file=\"".($zipEntry["folder"]?"false":"true")."\""; $atts[] = "text=\"".Utils::xmlEntities( basename(SystemTextEncoding::toUTF8($zipEntry["stored_filename"])))."\""; $atts[] = "filename=\"".Utils::xmlEntities( SystemTextEncoding::toUTF8($zipEntry["filename"]))."\""; if($fileListMode){ $atts[] = "filesize=\"".Utils::roundSize($zipEntry["size"])."\""; $atts[] = "bytesize=\"".$zipEntry["size"]."\""; $atts[] = "ajxp_modiftime=\"".$zipEntry["mtime"]."\""; $atts[] = "mimestring=\"".Utils::mimetype($zipEntry["stored_filename"], "mime", $zipEntry["folder"])."\""; $atts[] = "icon=\"".Utils::mimetype($zipEntry["stored_filename"], "image", $zipEntry["folder"])."\""; $is_image = Utils::is_image(basename($zipEntry["stored_filename"])); $atts[] = "is_image=\"".$is_image."\""; if($is_image){ if(!is_dir($tmpDir)) mkdir($tmpDir); $currentFile = $tmpDir."/".basename($zipEntry["stored_filename"]); $data = $zip->extract(PCLZIP_OPT_BY_NAME, $zipEntry["stored_filename"], PCLZIP_OPT_REMOVE_ALL_PATH, PCLZIP_OPT_PATH, $tmpDir); list($width, $height, $type, $attr) = @getimagesize($currentFile); $atts[] = "image_type=\"".image_type_to_mime_type($type)."\""; $atts[] = "image_width=\"$width\""; $atts[] = "image_height=\"$height\""; unlink($currentFile); } }else{ $atts[] = "icon=\"client/images/foldericon.png\""; $atts[] = "openicon=\"client/images/foldericon.png\""; $atts[] = "src=\"content.php?dir=".urlencode(SystemTextEncoding::toUTF8($zipEntry["filename"]))."\""; } print("<tree ".join(" ", $atts)."/>"); if(is_dir($tmpDir)){ rmdir($tmpDir); } } AJXP_XMLWriter::close(); exit(0); } $nom_rep = $this->initName($dir); AJXP_Exception::errorToXml($nom_rep); if($fileListMode){ $countFiles = $this->countFiles($nom_rep); $threshold = $this->repository->getOption("PAGINATION_THRESHOLD"); if(!isSet($threshold) || intval($threshold) == 0) $threshold = 500; if($countFiles > $threshold){ $limitPerPage = $this->repository->getOption("PAGINATION_NUMBER"); if(!isset($limitPerPage) || intval($limitPerPage) == 0) $limitPerPage = 200; $offset = 0; $crtPage = 1; if(isSet($page)){ $offset = (intval($page)-1)*$limitPerPage; $crtPage = $page; } $totalPages = floor($countFiles / $limitPerPage) + 1; $reps = $this->listing($nom_rep, false, $offset, $limitPerPage); }else{ $reps = $this->listing($nom_rep, $searchMode); } }else{ $reps = $this->listing($nom_rep, !$searchMode); } //$reps = $result[0]; AJXP_XMLWriter::header(); if(isSet($totalPages) && isSet($crtPage)){ print '<columns switchDisplayMode="list" switchGridMode="filelist"/>'; print '<pagination count="'.$countFiles.'" total="'.$totalPages.'" current="'.$crtPage.'"/>'; } foreach ($reps as $repIndex => $repName) { if((eregi("\.zip$",$repName) && $skipZip)) continue; $attributes = ""; if($searchMode) { if(is_file($nom_rep."/".$repIndex)) {$attributes = "is_file=\"true\" icon=\"$repName\""; $repName = $repIndex;} } else if($fileListMode) { $currentFile = $nom_rep."/".$repIndex; $atts = array(); $atts[] = "is_file=\"".(is_file($currentFile)?"1":"0")."\""; $atts[] = "is_image=\"".Utils::is_image($currentFile)."\""; $atts[] = "file_group=\"".filegroup($currentFile)."\""; $atts[] = "file_owner=\"".fileowner($currentFile)."\""; $atts[] = "file_perms=\"".substr(decoct( fileperms($currentFile) ), (is_file($currentFile)?2:1))."\""; if(Utils::is_image($currentFile)) { list($width, $height, $type, $attr) = @getimagesize($currentFile); $atts[] = "image_type=\"".image_type_to_mime_type($type)."\""; $atts[] = "image_width=\"$width\""; $atts[] = "image_height=\"$height\""; } $atts[] = "mimestring=\"".Utils::mimetype($currentFile, "type", is_dir($currentFile))."\""; $datemodif = $this->date_modif($currentFile); $atts[] = "ajxp_modiftime=\"".($datemodif ? $datemodif : "0")."\""; $bytesize = @filesize($currentFile) or 0; if($bytesize < 0) $bytesize = sprintf("%u", $bytesize); $atts[] = "filesize=\"".Utils::roundSize($bytesize)."\""; $atts[] = "bytesize=\"".$bytesize."\""; $atts[] = "filename=\"".Utils::xmlEntities( SystemTextEncoding::toUTF8($dir."/".$repIndex))."\""; $atts[] = "icon=\"".(is_file($currentFile)?SystemTextEncoding::toUTF8($repName):(is_dir($currentFile) ? "folder.png" : "mime-empty.png"))."\""; /* if (!is_dir($currentFile)) $atts[] = "onclick=\"alert(opener.CKEDITOR.tools.callFunction(1,'http://12','');window.top.close() ;window.top.opener.focus() ;"."\"";*/ $attributes = join(" ", $atts); $repName = $repIndex; } else { $folderBaseName = Utils::xmlEntities( $repName); $link = SystemTextEncoding::toUTF8(SERVER_ACCESS."?dir=".$dir."/".$folderBaseName); $link = urlencode($link); $folderFullName = Utils::xmlEntities( $dir)."/".$folderBaseName; $parentFolderName = $dir; if(!$completeMode){ $icon = CLIENT_RESOURCES_FOLDER."/images/foldericon.png"; $openicon = CLIENT_RESOURCES_FOLDER."/images/openfoldericon.png"; if(eregi("\.zip$",$repName)){ $icon = $openicon = CLIENT_RESOURCES_FOLDER."/images/crystal/actions/16/accessories-archiver.png"; } $attributes = "icon=\"$icon\" openicon=\"$openicon\" filename=\"".SystemTextEncoding::toUTF8($folderFullName)."\" src=\"$link\""; } } print("<tree text=\"".Utils::xmlEntities( SystemTextEncoding::toUTF8($repName))."\" $attributes>"); print("</tree>"); } // ADD RECYCLE BIN TO THE LIST if($nom_rep == $this->repository->getOption("PATH") && $recycleBinOption!="" && !$completeMode && !$skipZip) { if($fileListMode) { print("<tree text=\"".Utils::xmlEntities($mess[122])."\" filesize=\"-\" is_file=\"0\" is_recycle=\"1\" mimestring=\"Trashcan\" ajxp_modiftime=\"".$this->date_modif($this->repository->getOption("PATH")."/".$recycleBinOption)."\" filename=\"/".$recycleBinOption."\" icon=\"trashcan.png\"></tree>"); } else { print("<tree text=\"$mess[122]\" is_recycle=\"true\" icon=\"".CLIENT_RESOURCES_FOLDER."/images/crystal/mimes/16/trashcan.png\" openIcon=\"".CLIENT_RESOURCES_FOLDER."/images/crystal/mimes/16/trashcan.png\" filename=\"/".$recycleBinOption."\"/>"); } } AJXP_XMLWriter::close(); exit(1); break; }
if(isset($logMessage) || isset($errorMessage)) { $xmlBuffer .= AJXP_XMLWriter::sendMessage((isSet($logMessage)?$logMessage:null), (isSet($errorMessage)?$errorMessage:null), false); } if(isset($requireAuth)) { $xmlBuffer .= AJXP_XMLWriter::requireAuth(false); } if(isset($reload_current_node) && $reload_current_node == "true") { $xmlBuffer .= AJXP_XMLWriter::reloadCurrentNode(false); } if(isset($reload_dest_node) && $reload_dest_node != "") { $xmlBuffer .= AJXP_XMLWriter::reloadNode($reload_dest_node, false); } if(isset($reload_file_list)) { $xmlBuffer .= AJXP_XMLWriter::reloadFileList($reload_file_list, false); } return $xmlBuffer; } function getPath(){ return $this->repository->getOption("PATH"); } function zipListing($zipPath, $localPath, &$filteredList){ require_once("server/classes/pclzip.lib.php"); $crtZip = new PclZip($this->getPath()."/".$zipPath); $liste = $crtZip->listContent(); $files = array(); if($localPath[strlen($localPath)-1] != "/") $localPath.="/"; foreach ($liste as $item){ $stored = $item["stored_filename"]; if($stored[0] != "/") $stored = "/".$stored; $pathPos = strpos($stored, $localPath); if($pathPos !== false){ $afterPath = substr($stored, $pathPos+strlen($localPath)); if($afterPath != "" && strpos($afterPath, "/")=== false || strpos($afterPath, "/") == strlen($afterPath)-1){ $item["filename"] = $zipPath.$localPath.$afterPath; if($item["folder"]){ $filteredList[] = $item; }else{ $files[] = $item; } } } } $filteredList = array_merge($filteredList, $files); return $crtZip; } function filterFile($fileName){ $pathParts = pathinfo($fileName); if(array_key_exists("HIDE_FILENAMES", $this->driverConf) && is_array($this->driverConf["HIDE_FILENAMES"])){ foreach ($this->driverConf["HIDE_FILENAMES"] as $search){ if(strcasecmp($search, $pathParts["basename"]) == 0) return true; } } if(array_key_exists("HIDE_EXTENSIONS", $this->driverConf) && is_array($this->driverConf["HIDE_EXTENSIONS"])){ foreach ($this->driverConf["HIDE_EXTENSIONS"] as $search){ if(strcasecmp($search, $pathParts["extension"]) == 0) return true; } } return false; } function filterFolder($folderName){ if(array_key_exists("HIDE_FOLDERS", $this->driverConf) && is_array($this->driverConf["HIDE_FOLDERS"])){ foreach ($this->driverConf["HIDE_FOLDERS"] as $search){ if(strcasecmp($search, $folderName) == 0) return true; } } return false; } function initName($dir) { $racine = $this->getPath(); $mess = ConfService::getMessages(); if(!isset($dir) || $dir=="" || $dir == "/") { $nom_rep=$racine; } else { $nom_rep="$racine/$dir"; } if(!file_exists($racine)) { return new AJXP_Exception(72); } if(!is_dir($nom_rep)) { return new AJXP_Exception(100); } return $nom_rep; }
function getTrueSize($file) { if (!(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')){ $cmd = "stat -L -c%s \"".$file."\""; $val = trim(`$cmd`); if (strlen($val) == 0 || floatval($val) == 0) { // No stat on system $cmd = "ls -1s --block-size=1 \"".$file."\""; $val = trim(`$cmd`); } if (strlen($val) == 0 || floatval($val) == 0) { // No block-size on system (probably busybox), try long output $cmd = "ls -l \"".$file."\"";
$arr = preg_split("/[\s]+/", `$cmd`); $val = trim($arr[4]); } if (strlen($val) == 0 || floatval($val) == 0){ // Still not working, get a value at least, not 0... $val = sprintf("%u", filesize($file)); } return floatval($val); }else if (extension_loaded("COM")){ $fsobj = new COM("Scripting.FileSystemObject"); $f = $fsobj->GetFile($file); return floatval($file->Size); } else if (is_file($file)){ return exec('FOR %A IN ("'.$file.'") DO @ECHO %~zA'); } else return sprintf("%u", filesize($file)); }
function readFile($filePathOrData, $headerType="plain", $localName="", $data=false, $gzip=GZIP_DOWNLOAD) { session_write_close(); if(!$data){ $test = fopen($filePathOrData, "r"); if($test) fclose($test); } $isFile = !$data && !$gzip; $size = ($data ? strlen($filePathOrData) : floatval(trim($this->getTrueSize($filePathOrData)))); if($gzip && ($size > GZIP_LIMIT || !function_exists("gzencode") || @strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') === FALSE)){ $gzip = false; // disable gzip } $localName = ($localName=="" ? basename($filePathOrData) : $localName); if($headerType == "plain") { header("Content-type:text/plain"); } else if($headerType == "image") { header("Content-Type: ".Utils::getImageMimeType(basename($filePathOrData))."; name=\"".$localName."\""); header("Content-Length: ".$size); header('Cache-Control: public'); } else if($headerType == "mp3") { header("Content-Type: audio/mp3; name=\"".$localName."\""); header("Content-Length: ".$size); } else { if(preg_match('/ MSIE /',$_SERVER['HTTP_USER_AGENT']) || preg_match('/ WebKit /',$_SERVER['HTTP_USER_AGENT'])){ $localName = str_replace("+", " ", urlencode(SystemTextEncoding::toUTF8($localName))); }
if ($isFile) header("Accept-Ranges: bytes"); // Check if we have a range header (we are resuming a transfer) if ( isset($_SERVER['HTTP_RANGE']) && $isFile && $size != 0 ) { // multiple ranges, which can become pretty complex, so ignore it for now $ranges = explode('=', $_SERVER['HTTP_RANGE']); $offsets = explode('-', $ranges[1]); $offset = floatval($offsets[0]);
$length = floatval($offsets[1]) - $offset; if (!$length) $length = $size - $offset; if ($length + $offset > $size || $length < 0) $length = $size - $offset; header('HTTP/1.1 206 Partial Content');
header('Content-Range: bytes ' . $offset . '-' . ($offset + $length - 1) . '/' . $size); header("Content-Length: ". $length); $file = fopen($filePathOrData, 'rb'); fseek($file, 0); $relOffset = $offset; while ($relOffset > 2.0E9) { // seek to the requested offset, this is 0 if it's not a partial content request fseek($file, 2000000000, SEEK_CUR); $relOffset -= 2000000000; // This works because we never overcome the PHP 32 bit limit } fseek($file, $relOffset, SEEK_CUR);
$readSize = 0.0; while (!feof($file) && $readSize < $length && connection_status() == 0) { echo fread($file, 2048); $readSize += 2048.0; flush(); } fclose($file); return; } else { header("Content-Type: application/force-download; name=\"".$localName."\""); header("Content-Transfer-Encoding: binary"); if($gzip){ header("Content-Encoding: gzip"); // If gzip, recompute data size! $gzippedData = ($data?gzencode($filePathOrData,9):gzencode(file_get_contents($filePathOrData), 9)); $size = strlen($gzippedData); } header("Content-Length: ".$size); if ($isFile && ($size != 0)) header("Content-Range: bytes 0-" . ($size - 1) . "/" . $size . ";"); header("Content-Disposition: attachment; filename=\"".$localName."\""); header("Expires: 0"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); if (preg_match('/ MSIE 6/',$_SERVER['HTTP_USER_AGENT'])){ header("Cache-Control: max_age=0"); header("Pragma: public"); }
// For SSL websites there is a bug with IE see article KB 323308 // therefore we must reset the Cache-Control and Pragma Header if (ConfService::getConf("USE_HTTPS")==1 && preg_match('/ MSIE /',$_SERVER['HTTP_USER_AGENT'])) { header("Cache-Control:"); header("Pragma:"); } if($gzip){ print $gzippedData; return; } } }
if($data){ print($filePathOrData); }else{ readfile($filePathOrData); } }
function countFiles($dirName){ $handle=opendir($dirName); $count = 0; while ($file = readdir($handle)) { if($file != "." && $file !=".." && !(Utils::isHidden($file) && !$this->driverConf["SHOW_HIDDEN_FILES"])){ $count++; } } closedir($handle); return $count; } function listing($nom_rep, $dir_only = false, $offset=0, $limit=0) { $mess = ConfService::getMessages(); $size_unit = $mess["byte_unit_symbol"]; $orderDir = 0; $orderBy = "filename"; $handle=opendir($nom_rep); $recycle = $this->repository->getOption("RECYCLE_BIN"); $cursor = 0; while ($file = readdir($handle)) { if($file!="." && $file!=".." && !(Utils::isHidden($file) && !$this->driverConf["SHOW_HIDDEN_FILES"])) { if($offset > 0 && $cursor < $offset){ $cursor ++; continue; } if($limit > 0 && ($cursor - $offset) >= $limit) { break; } $cursor ++; if($recycle != "" && $nom_rep == $this->repository->getOption("PATH")."/".$recycle && $file == RecycleBinManager::getCacheFileName()){ continue; } $poidsfic=@filesize("$nom_rep/$file") or 0; if(is_dir("$nom_rep/$file")) { if($this->filterFolder($file)) continue; if($recycle != "" && $this->getPath()."/".$recycle == "$nom_rep/$file") { continue; } if($orderBy=="mod") {$liste_rep[$file]=filemtime("$nom_rep/$file");} else {$liste_rep[$file]=$file;} } else { if($this->filterFile($file)) continue; if(!$dir_only) { if($orderBy=="filename") {$liste_fic[$file]=Utils::mimetype("$nom_rep/$file","image", is_dir("$nom_rep/$file"));} else if($orderBy=="filesize") {$liste_fic[$file]=$poidsfic;} else if($orderBy=="mod") {$liste_fic[$file]=filemtime("$nom_rep/$file");} else if($orderBy=="filetype") {$liste_fic[$file]=Utils::mimetype("$nom_rep/$file","type",is_dir("$nom_rep/$file"));} else {$liste_fic[$file]=Utils::mimetype("$nom_rep/$file","image", is_dir("$nom_rep/$file"));} } else if(eregi("\.zip$",$file) && ConfService::zipEnabled()){ if(!isSet($liste_zip)) $liste_zip = array(); $liste_zip[$file] = $file; } } } } closedir($handle); if(isset($liste_fic) && is_array($liste_fic)) { if($orderBy=="filename") {if($orderDir==0){ksort($liste_fic);}else{krsort($liste_fic);}} else if($orderBy=="mod") {if($orderDir==0){arsort($liste_fic);}else{asort($liste_fic);}} else if($orderBy=="filesize"||$orderBy=="filetype") {if($orderDir==0){asort($liste_fic);}else{arsort($liste_fic);}} else {if($orderDir==0){ksort($liste_fic);}else{krsort($liste_fic);}}
if($orderBy != "filename"){ foreach ($liste_fic as $index=>$value){ $liste_fic[$index] = Utils::mimetype($index, "image", false); } } } else { $liste_fic = array(); } if(isset($liste_rep) && is_array($liste_rep)) { if($orderBy=="mod") {if($orderDir==0){arsort($liste_rep);}else{asort($liste_rep);}} else {if($orderDir==0){ksort($liste_rep);}else{krsort($liste_rep);}} if($orderBy != "filename"){ foreach ($liste_rep as $index=>$value){ $liste_rep[$index] = $index; } } } else ($liste_rep = array());
$liste = Utils::mergeArrays($liste_rep,$liste_fic); if(isSet($liste_zip)){ $liste = Utils::mergeArrays($liste,$liste_zip); } return $liste; } function date_modif($file) { $tmp = @filemtime($file) or 0; return $tmp;// date("d,m L Y H:i:s",$tmp); } function changeMode($filePath) { $chmodValue = $this->repository->getOption("CHMOD_VALUE"); if(isSet($chmodValue) && $chmodValue != "") { chmod($filePath, octdec(ltrim($chmodValue, "0"))); } } function copyOrMove($destDir, $selectedFiles, &$error, &$success, $move = false) { $mess = ConfService::getMessages(); if(!is_writable($this->getPath()."/".$destDir)) { $error[] = $mess[38]." ".$destDir." ".$mess[99]; return ; } foreach ($selectedFiles as $selectedFile) { if($move && !is_writable(dirname($this->getPath()."/".$selectedFile))) { $error[] = "\n".$mess[38]." ".dirname($selectedFile)." ".$mess[99]; continue; } $this->copyOrMoveFile($destDir, $selectedFile, $error, $success, $move); } } function renameAction($actionName, $httpVars) { $filePath = SystemTextEncoding::fromUTF8($httpVars["file"]); $newFilename = SystemTextEncoding::fromUTF8($httpVars["filename_new"]); return $this->rename($filePath, $newFilename); } function rename($filePath, $filename_new) { $nom_fic=basename($filePath); $mess = ConfService::getMessages(); $filename_new=Utils::processFileName($filename_new); $old=$this->getPath()."/$filePath"; if(!is_writable($old)) { return $mess[34]." ".$nom_fic." ".$mess[99]; } $new=dirname($old)."/".$filename_new; if($filename_new=="") { return "$mess[37]"; } if(file_exists($new)) { return "$filename_new $mess[43]"; } if(!file_exists($old)) { return $mess[100]." $nom_fic"; } rename($old,$new); return null; } function autoRenameForDest($destination, $fileName){ if(!is_file($destination."/".$fileName)) return $fileName; $i = 1; $ext = ""; $name = ""; $split = split("\.", $fileName); if(count($split) > 1){ $ext = ".".$split[count($split)-1]; array_pop($split); $name = join("\.", $split); }else{ $name = $fileName; } while (is_file($destination."/".$name."-$i".$ext)) { $i++; // increment i until finding a non existing file. } return $name."-$i".$ext; } function mkDir($crtDir, $newDirName) { $mess = ConfService::getMessages(); if($newDirName=="") { return "$mess[37]"; } if(file_exists($this->getPath()."/$crtDir/$newDirName")) { return "$mess[40]"; } if(!is_writable($this->getPath()."/$crtDir")) { return $mess[38]." $crtDir ".$mess[99]; }
$dirMode = 0775; $chmodValue = $this->repository->getOption("CHMOD_VALUE"); if(isSet($chmodValue) && $chmodValue != "") { $dirMode = octdec(ltrim($chmodValue, "0")); if ($dirMode & 0400) $dirMode |= 0100; // User is allowed to read, allow to list the directory if ($dirMode & 0040) $dirMode |= 0010; // Group is allowed to read, allow to list the directory if ($dirMode & 0004) $dirMode |= 0001; // Other are allowed to read, allow to list the directory } mkdir($this->getPath()."/$crtDir/$newDirName", $dirMode); return null; } function createEmptyFile($crtDir, $newFileName) { $mess = ConfService::getMessages(); if($newFileName=="") { return "$mess[37]"; } if(file_exists($this->getPath()."/$crtDir/$newFileName")) { return "$mess[71]"; } if(!is_writable($this->getPath()."/$crtDir")) { return "$mess[38] $crtDir $mess[99]"; } $fp=fopen($this->getPath()."/$crtDir/$newFileName","w"); if($fp) { if(eregi("\.html$",$newFileName)||eregi("\.htm$",$newFileName)) { fputs($fp,"<html>\n<head>\n<title>New Document - Created By AjaXplorer</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\n</head>\n<body bgcolor=\"#FFFFFF\" text=\"#000000\">\n\n</body>\n</html>\n"); } fclose($fp); $this->changeMode($this->getPath()."/$crtDir/$newFileName"); return null; } else { return "$mess[102] $crtDir/$newFileName (".$fp.")"; } } function delete($selectedFiles, &$logMessages) { $mess = ConfService::getMessages(); foreach ($selectedFiles as $selectedFile) { if($selectedFile == "" || $selectedFile == DIRECTORY_SEPARATOR) { return $mess[120]; } $fileToDelete=$this->getPath().$selectedFile; if(!file_exists($fileToDelete)) { $logMessages[]=$mess[100]." ".SystemTextEncoding::toUTF8($selectedFile); continue; } $this->deldir($fileToDelete); if(is_dir($fileToDelete)) { $logMessages[]="$mess[38] ".SystemTextEncoding::toUTF8($selectedFile)." $mess[44]."; } else { $logMessages[]="$mess[34] ".SystemTextEncoding::toUTF8($selectedFile)." $mess[44]."; } } return null; } function copyOrMoveFile($destDir, $srcFile, &$error, &$success, $move = false) { $mess = ConfService::getMessages(); $destFile = $this->repository->getOption("PATH").$destDir."/".basename($srcFile); $realSrcFile = $this->repository->getOption("PATH")."/$srcFile"; $recycle = $this->repository->getOption("RECYCLE_BIN"); if(!file_exists($realSrcFile)) { $error[] = $mess[100].$srcFile; return ; } if($realSrcFile==$destFile) { $error[] = $mess[101]; return ; } if(is_dir($realSrcFile)) { $errors = array(); $succFiles = array(); if($move){ if(is_file($destFile)) unlink($destFile); $res = rename($realSrcFile, $destFile); }else{ $dirRes = $this->dircopy($realSrcFile, $destFile, $errors, $succFiles); } if(count($errors) || (isSet($res) && $res!==true)) { $error[] = $mess[114]; return ; } } else { if($move){ if(is_file($destFile)) unlink($destFile); $res = rename($realSrcFile, $destFile); }else{ $res = copy($realSrcFile,$destFile); } if($res != 1) { $error[] = $mess[114]; return ; } } if($move) { // Now delete original // $this->deldir($realSrcFile); // both file and dir $messagePart = $mess[74]." ".SystemTextEncoding::toUTF8($destDir); if($destDir == "/".$recycle) { RecycleBinManager::fileToRecycle($srcFile); $messagePart = $mess[123]." ".$mess[122]; } if(isset($dirRes)) { $success[] = $mess[117]." ".SystemTextEncoding::toUTF8(basename($srcFile))." ".$messagePart." (".SystemTextEncoding::toUTF8($dirRes)." ".$mess[116].") "; } else { $success[] = $mess[34]." ".SystemTextEncoding::toUTF8(basename($srcFile))." ".$messagePart; } } else { if($destDir == "/".$this->repository->getOption("RECYCLE_BIN")) { RecycleBinManager::fileToRecycle($srcFile); } if(isSet($dirRes)) { $success[] = $mess[117]." ".SystemTextEncoding::toUTF8(basename($srcFile))." ".$mess[73]." ".SystemTextEncoding::toUTF8($destDir)." (".SystemTextEncoding::toUTF8($dirRes)." ".$mess[116].")"; } else { $success[] = $mess[34]." ".SystemTextEncoding::toUTF8(basename($srcFile))." ".$mess[73]." ".SystemTextEncoding::toUTF8($destDir); } } }
// A function to copy files from one directory to another one, including subdirectories and // nonexisting or newer files. Function returns number of files copied. // This function is PHP implementation of Windows xcopy A:\dir1\* B:\dir2 /D /E /F /H /R /Y // Syntaxis: [$number =] dircopy($sourcedirectory, $destinationdirectory [, $verbose]); // Example: $num = dircopy('A:\dir1', 'B:\dir2', 1);
function dircopy($srcdir, $dstdir, &$errors, &$success, $verbose = false) { $num = 0; if(!is_dir($dstdir)) mkdir($dstdir); if($curdir = opendir($srcdir)) { while($file = readdir($curdir)) { if($file != '.' && $file != '..') { $srcfile = $srcdir . DIRECTORY_SEPARATOR . $file; $dstfile = $dstdir . DIRECTORY_SEPARATOR . $file; if(is_file($srcfile)) { if(is_file($dstfile)) $ow = filemtime($srcfile) - filemtime($dstfile); else $ow = 1; if($ow > 0) { if($verbose) echo "Copying '$srcfile' to '$dstfile'..."; if(copy($srcfile, $dstfile)) { touch($dstfile, filemtime($srcfile)); $num++; if($verbose) echo "OK\n"; $success[] = $srcfile; } else { $errors[] = $srcfile; } } } else if(is_dir($srcfile)) { $num += $this->dircopy($srcfile, $dstfile, $errors, $success, $verbose); } } } closedir($curdir); } return $num; } function simpleCopy($origFile, $destFile) { return copy($origFile, $destFile); } function isWriteable($dir) { return is_writable($dir); } function deldir($location) { if(is_dir($location)) { $all=opendir($location); while ($file=readdir($all)) { if (is_dir("$location/$file") && $file !=".." && $file!=".") { $this->deldir("$location/$file"); if(file_exists("$location/$file")){ rmdir("$location/$file"); } unset($file); } elseif (!is_dir("$location/$file")) { if(file_exists("$location/$file")){ unlink("$location/$file"); } unset($file); } } closedir($all); rmdir($location); } else { if(file_exists("$location")) { $test = @unlink("$location"); if(!$test) throw new Exception("Cannot delete file ".$location); } } if(basename(dirname($location)) == $this->repository->getOption("RECYCLE_BIN")) { // DELETING FROM RECYCLE RecycleBinManager::deleteFromRecycle($location); } } /** * Change file permissions * * @param String $path * @param String $chmodValue * @param Boolean $recursive * @param String $nodeType "both", "file", "dir" */ function chmod($path, $chmodValue, $recursive=false, $nodeType="both", &$changedFiles) { $chmodValue = octdec(ltrim($chmodValue, "0")); if(is_file($path) && ($nodeType=="both" || $nodeType=="file")){ chmod($path, $chmodValue); $changedFiles[] = $path; }else if(is_dir($path)){ if($nodeType=="both" || $nodeType=="dir"){ chmod($path, $chmodValue); $changedFiles[] = $path; } if($recursive){ $handler = opendir($path); while ($child=readdir($handler)) { if($child == "." || $child == "..") continue; $this->chmod($path."/".$child, $chmodValue, $recursive, $nodeType, $changedFiles); } closedir($handler); } } } /** * @return zipfile */ function makeZip ($src, $dest, $basedir) { $safeMode = (@ini_get("safe_mode") == 'On' || @ini_get("safe_mode") === 1) ? TRUE : FALSE; if(!$safeMode){ set_time_limit(60); } require_once(SERVER_RESOURCES_FOLDER."/pclzip.lib.php"); $filePaths = array(); $totalSize = 0; foreach ($src as $item){ $filePaths[] = array(PCLZIP_ATT_FILE_NAME => $this->getPath().$item, PCLZIP_ATT_FILE_NEW_SHORT_NAME => basename($item)); } $archive = new PclZip($dest); $vList = $archive->create($filePaths, PCLZIP_OPT_REMOVE_PATH, $this->getPath().$basedir, PCLZIP_OPT_NO_COMPRESSION); if($vList == 0) return false; } /** * @param $selection UserSelection */ function convertSelectionToTmpFiles($tmpDir, &$selection){ $zipPath = $selection->getZipPath(); $localDir = $selection->getZipLocalPath(); $files = $selection->getFiles(); foreach ($files as $key => $item){// Remove path $item = substr($item, strlen($zipPath)); if($item[0] == "/") $item = substr($item, 1); $files[$key] = $item; } require_once("server/classes/pclzip.lib.php"); $zip = new PclZip($this->getPath().$zipPath); $err = $zip->extract(PCLZIP_OPT_BY_NAME, $files, PCLZIP_OPT_PATH, $this->getPath()."/".$tmpDir); foreach ($files as $key => $item){// Remove path $files[$key] = $tmpDir."/".$item; } $selection->setFiles($files); } /** The publiclet URL making */ function makePubliclet($filePath, $password, $expire) { $data = array("DRIVER"=>"fs", "OPTIONS"=>NULL, "FILE_PATH"=>$filePath, "ACTION"=>"download", "EXPIRE_TIME"=>$expire ? (time() + $expire * 86400) : 0, "PASSWORD"=>$password); return $this->writePubliclet($data); } }
?>
|