/** * Undo the last actions on the open zip file. * @param string $mixed * @return boolean @params mixed $mixed : undo changes to an archive by index(int), name(string), all ('all' | '*' | blank) usage : $this->Zip->undo(1); $this->Zip->undo('myText.txt'); $this->Zip->undo('*'); $this->Zip->undo('myText.txt, myText1.txt'); $this->Zip->undo(array(1, 'myText.txt')); */ function undo($mixed = '*') { if (is_array($mixed)) { foreach ($mixed as $value) { $constant = is_string($value) ? 'Name' : 'Index'; if (!$this->zip->{'unchange' . $constant}($value)) { return false; } } } else { $mixed = explode(',', $mixed); if (in_array($mixed[0], ['*', 'all'])) { if (!$this->zip->unchangeAll()) { return false; } } else { foreach ($mixed as $name) { if (!$this->zip->unchangeName($name)) { return false; } } } } return true; }
$input = fopen($url, 'r'); if (!file_put_contents($uploadfilename, $input)) { $smarty->assign("MODULEIMPORT_FAILED", "true"); $uploadfilename = null; } } } if ($uploadfilename) { // Check ZIP file contents for extra directory at the top $za = new ZipArchive(); $za->open($uploadfilename); for ($i = 0; $i < $za->numFiles; $i++) { $entryName = $za->getNameIndex($i); $firstSlash = strpos($entryName, '/'); if ($entryName === 'manifest.xml' || $entryName === './manifest.xml' || $firstSlash === false) { $za->unchangeAll(); break; } $newEntryName = substr($entryName, $firstSlash + 1); if ($newEntryName !== false) { $za->renameIndex($i, $newEntryName); } else { $za->deleteIndex($i); } } $za->close(); $package = new Vtiger_Package(); $moduleimport_name = $package->getModuleNameFromZip($uploadfilename); if ($moduleimport_name == null) { $smarty->assign("MODULEIMPORT_FAILED", "true"); $smarty->assign("MODULEIMPORT_FILE_INVALID", "true");
/** * @info is public for PHP 5.3 compatibility, should be private */ public function addEmptyDir(\ZipArchive $zip, $dir) { if (!$zip->addEmptyDir($dir)) { $zip->unchangeAll(); $zip->close(); throw new RuntimeException(sprintf('unable to add %s to the zip file', $dir)); } }
/** * Create a zip archive using the ZipArchive class * * You should not use this function directly. Use the 'zip' function above. * * @param array $sources List of paths to files and directories to be archived. * @param string $destination Destination file where the archive will be stored. * @param array $exclude Directories and/or files to exclude from archive, defaults to empty array. * @return mixed Returns TRUE on success or an instance of WP_Error on failure. */ function _zip_create_ziparchive($sources, $destination, $exclude = array()) { $zip = new ZipArchive(); if ($res = $zip->open($destination, ZIPARCHIVE::CREATE) != true) { return new WP_Error('ziparchive', $res); } foreach ($sources as $source) { if (!@is_readable($source)) { continue; } if (@is_dir($source)) { $files = directory_list($source, true, $exclude); if (is_wp_error($files)) { $zip->unchangeAll(); if (file_exists($destination)) { delete_path($destination); } return $files; } foreach ($files as $file) { if (!@is_readable($file)) { continue; } if (@is_dir($file)) { $zip->addEmptyDir(str_replace(parent_dir($source) . '/', '', $file . '/')); } elseif (@is_file($file)) { $zip->addFile($file, str_replace(parent_dir($source) . '/', '', $file)); } } } elseif (@is_file($source)) { $zip->addFile($source, basename($source)); } } $num_files = $zip->numFiles; $zip_result = $zip->close(); if (!$zip_result) { return new WP_Error('zip', "Could not properly close archive '" . $destination . "'."); } return $num_files; }