}
+/**
+ * Unzip one zip file to a destination dir
+ * Both parameters must be FULL paths
+ * If destination isn't specified, it will be the
+ * SAME directory where the zip file resides.
+ */
+function unzip_file($zipfile, $destination = '', $showstatus_ignored = true) {
+ global $CFG;
+
+ //Extract everything from zipfile
+ $path_parts = pathinfo(cleardoubleslashes($zipfile));
+ $zippath = $path_parts["dirname"]; //The path of the zip file
+ $zipfilename = $path_parts["basename"]; //The name of the zip file
+ $extension = $path_parts["extension"]; //The extension of the file
+
+ //If no file, error
+ if (empty($zipfilename)) {
+ return false;
+ }
+
+ //If no extension, error
+ if (empty($extension)) {
+ return false;
+ }
+
+ //Clear $zipfile
+ $zipfile = cleardoubleslashes($zipfile);
+
+ //Check zipfile exists
+ if (!file_exists($zipfile)) {
+ return false;
+ }
+
+ //If no destination, passed let's go with the same directory
+ if (empty($destination)) {
+ $destination = $zippath;
+ }
+
+ //Clear $destination
+ $destpath = rtrim(cleardoubleslashes($destination), "/");
+
+ //Check destination path exists
+ if (!is_dir($destpath)) {
+ return false;
+ }
+
+ $result = get_file_packer()->unzip_files_to_pathname($zipfile, $destpath);
+
+ if ($result === false) {
+ return false;
+ }
+
+ foreach ($result as $status) {
+ if ($status !== true) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
/////////////////////////////////////////////////////////////
/// Old functions not used anymore - candidates for removal
/////////////////////////////////////////////////////////////
return true;
}
-/**
- * Unzip one zip file to a destination dir
- * Both parameters must be FULL paths
- * If destination isn't specified, it will be the
- * SAME directory where the zip file resides.
- */
-function unzip_file($zipfile, $destination = '', $showstatus = true) {
- global $CFG;
-
- //Extract everything from zipfile
- $path_parts = pathinfo(cleardoubleslashes($zipfile));
- $zippath = $path_parts["dirname"]; //The path of the zip file
- $zipfilename = $path_parts["basename"]; //The name of the zip file
- $extension = $path_parts["extension"]; //The extension of the file
-
- //If no file, error
- if (empty($zipfilename)) {
- return false;
- }
-
- //If no extension, error
- if (empty($extension)) {
- return false;
- }
-
- //Clear $zipfile
- $zipfile = cleardoubleslashes($zipfile);
-
- //Check zipfile exists
- if (!file_exists($zipfile)) {
- return false;
- }
-
- //If no destination, passed let's go with the same directory
- if (empty($destination)) {
- $destination = $zippath;
- }
-
- //Clear $destination
- $destpath = rtrim(cleardoubleslashes($destination), "/");
-
- //Check destination path exists
- if (!is_dir($destpath)) {
- return false;
- }
-
- //Check destination path is writable. TODO!!
-
- //Everything is ready:
- // -$zippath is the path where the zip file resides (dir)
- // -$zipfilename is the name of the zip file (without path)
- // -$destpath is the destination path where the zip file will uncompressed (dir)
-
- $list = null;
-
- if (empty($CFG->unzip)) { // Use built-in php-based unzip function
-
- include_once("$CFG->libdir/pclzip/pclzip.lib.php");
- $archive = new PclZip(cleardoubleslashes("$zippath/$zipfilename"));
- if (!$list = $archive->extract(PCLZIP_OPT_PATH, $destpath,
- PCLZIP_CB_PRE_EXTRACT, 'unzip_cleanfilename',
- PCLZIP_OPT_EXTRACT_DIR_RESTRICTION, $destpath)) {
- if (!empty($showstatus)) {
- notice($archive->errorInfo(true));
- }
- return false;
- }
-
- } else { // Use external unzip program
-
- $separator = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? ' &' : ' ;';
- $redirection = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? '' : ' 2>&1';
-
- $command = 'cd '.escapeshellarg($zippath).$separator.
- escapeshellarg($CFG->unzip).' -o '.
- escapeshellarg(cleardoubleslashes("$zippath/$zipfilename")).' -d '.
- escapeshellarg($destpath).$redirection;
- //All converted to backslashes in WIN
- if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
- $command = str_replace('/','\\',$command);
- }
- Exec($command,$list);
- }
-
- //Display some info about the unzip execution
- if ($showstatus) {
- unzip_show_status($list,$destpath);
- }
-
- return true;
-}
-
/**
* This function is used as callback in unzip_file() function
* to clean illegal characters for given platform and to prevent directory traversal.