diff --git a/index.php b/index.php index a954d9235..6f69a1855 100644 --- a/index.php +++ b/index.php @@ -20,33 +20,33 @@ die($data); } - + if (isset($_GET['zip'])) { + $dirArray = $lister->zipDirectory($_GET['zip']); - } else { - - - // Initialize the directory array - if (isset($_GET['dir'])) { - $dirArray = $lister->listDirectory($_GET['dir']); } else { - $dirArray = $lister->listDirectory('.'); - } - // Define theme path - if (!defined('THEMEPATH')) { - define('THEMEPATH', $lister->getThemePath()); - } + // Initialize the directory array + if (isset($_GET['dir'])) { + $dirArray = $lister->listDirectory($_GET['dir']); + } else { + $dirArray = $lister->listDirectory('.'); + } - // Set path to theme index - $themeIndex = $lister->getThemePath(true) . '/index.php'; + // Define theme path + if (!defined('THEMEPATH')) { + define('THEMEPATH', $lister->getThemePath()); + } + + // Set path to theme index + $themeIndex = $lister->getThemePath(true) . '/index.php'; + + // Initialize the theme + if (file_exists($themeIndex)) { + include($themeIndex); + } else { + die('ERROR: Failed to initialize theme'); + } - // Initialize the theme - if (file_exists($themeIndex)) { - include($themeIndex); - } else { - die('ERROR: Failed to initialize theme'); - } - } diff --git a/resources/DirectoryLister.php b/resources/DirectoryLister.php index 2200f2b2a..31bcacc02 100644 --- a/resources/DirectoryLister.php +++ b/resources/DirectoryLister.php @@ -61,7 +61,7 @@ public function __construct() { $this->_themeName = $this->_config['theme_name']; } - + /** * If it is allowed to zip whole directories * @@ -77,7 +77,7 @@ public function isZipEnabled() { } return $this->_config['zip_dirs']; } - + /** * Creates zipfile of directory * @@ -85,56 +85,67 @@ public function isZipEnabled() { * @access public */ public function zipDirectory($directory) { - if ($this->_config['zip_dirs']) - { + + if ($this->_config['zip_dirs']) { + // Cleanup directory path $directory = $this->setDirectoryPath($directory); - - if ($directory != '.' && $this->_isHidden($directory)){ + + if ($directory != '.' && $this->_isHidden($directory)) { echo "Access denied."; } - - $filename_no_ext = basename("$directory"); - if ( $directory == '.' ) - { - $filename_no_ext = "Home"; + + $filename_no_ext = basename($directory); + + if ($directory == '.') { + $filename_no_ext = 'Home'; } // We deliver a zip file - header("Content-Type: archive/zip"); + header('Content-Type: archive/zip'); + // Filename for the browser to save the zip file - header("Content-Disposition: attachment; filename=\"$filename_no_ext".".zip\""); + header("Content-Disposition: attachment; filename=\"$filename_no_ext.zip\""); + //change directory so the zip file doesnt have a tree structure in it. chdir($directory); - + // TODO: Probably we have to parse exclude list more carefully - $exclude_list = implode(" ", array_merge($this->_config['hidden_files'],array('index.php'))); + $exclude_list = implode(' ', array_merge($this->_config['hidden_files'], array('index.php'))); $exclude_list = str_replace("*", "\*", $exclude_list); - - if ($this->_config['zip_stream']) - { + + if ($this->_config['zip_stream']) { + // zip the stuff (dir and all in there) into the streamed zip file - $stream = popen( "/usr/bin/zip -".$this->_config['zip_compression_level']." -r -q - * -x ".$exclude_list, "r" ); - if( $stream ) - { - fpassthru( $stream ); - fclose( $stream ); + $stream = popen('/usr/bin/zip -' . $this->_config['zip_compression_level'] . ' -r -q - * -x ' . $exclude_list, 'r'); + + if ($stream) { + fpassthru($stream); + fclose($stream); } + } else { + // zip the stuff (dir and all in there) into the tmp_zip file - exec('zip -'.$this->_config['zip_compression_level'].' -r '.$tmp_zip.' * -x '.$exclude_list); + exec('zip -' . $this->_config['zip_compression_level'] . ' -r ' . $tmp_zip . ' * -x ' . $exclude_list); + // get a tmp name for the .zip - $tmp_zip = tempnam ("tmp", "tempzip") . ".zip"; + $tmp_zip = tempnam('tmp', 'tempzip') . '.zip'; + // calc the length of the zip. it is needed for the progress bar of the browser $filesize = filesize($tmp_zip); header("Content-Length: $filesize"); + // deliver the zip file - $fp = fopen("$tmp_zip","r"); + $fp = fopen($tmp_zip, 'r'); echo fpassthru($fp); + // clean up the tmp zip file unlink($tmp_zip); + } } + } @@ -416,7 +427,7 @@ public function setDirectoryPath($path = null) { return $this->_directory; } - + /** * Get directory path variable * @@ -425,7 +436,6 @@ public function setDirectoryPath($path = null) { */ public function getDirectoryPath() { return $this->_directory; - } diff --git a/resources/default.config.php b/resources/default.config.php index b6240cfde..4cf51d6bb 100644 --- a/resources/default.config.php +++ b/resources/default.config.php @@ -20,8 +20,8 @@ 'footer.php' ), - // Files that, if present in a directory, make the directory a direct link - // rather than a browse link. + // Files that, if present in a directory, make the directory + // a direct link rather than a browse link. 'index_files' => array( 'index.htm', 'index.html', @@ -35,15 +35,18 @@ 'reverse_sort' => array( // 'path/to/folder' ), - + // Allow to download directories as zip files - 'zip_dirs' => false, - // Stream zip file content directly to the client, without any temporary file - 'zip_stream' => true, - 'zip_compression_level' => 0, + 'zip_dirs' => false, + + // Stream zip file content directly to the client, + // without any temporary file + 'zip_stream' => true, + + 'zip_compression_level' => 0, + // Disable zip downloads for particular directories 'zip_disable' => array( - '.' // - disable for root directory by default // 'path/to/folder' ), diff --git a/resources/themes/bootstrap/index.php b/resources/themes/bootstrap/index.php index d7df61e3d..07ff1787f 100644 --- a/resources/themes/bootstrap/index.php +++ b/resources/themes/bootstrap/index.php @@ -47,14 +47,25 @@