/** * Extract files from archive to target directory * * @param string $pathExtracted Absolute path of target directory * @return mixed Array of filenames if successful; or 0 if an error occurred */ public function extract($pathExtracted) { if (substr($pathExtracted, -1) !== '/') { $pathExtracted .= '/'; } $fileselector = array(); $list = array(); $count = $this->ziparchive->numFiles; if ($count === 0) { return 0; } for ($i = 0; $i < $count; $i++) { $entry = $this->ziparchive->statIndex($i); $filename = str_replace('\\', '/', $entry['name']); $parts = explode('/', $filename); if (!strncmp($filename, '/', 1) || array_search('..', $parts) !== false || strpos($filename, ':') !== false) { return 0; } $fileselector[] = $entry['name']; $list[] = array('filename' => $pathExtracted . $entry['name'], 'stored_filename' => $entry['name'], 'size' => $entry['size'], 'compressed_size' => $entry['comp_size'], 'mtime' => $entry['mtime'], 'index' => $i, 'crc' => $entry['crc']); } $res = $this->ziparchive->extractTo($pathExtracted, $fileselector); if ($res === false) { return 0; } return $list; }
/** * @group Core */ public function testUnzipEmptyFile() { clearstatcache(); $filename = dirname(__FILE__) . '/Unzip/empty.zip'; $extractDir = PIWIK_USER_PATH . '/tmp/latest/'; $unzip = new ZipArchive($filename); $res = $unzip->extract($extractDir); $this->assertEquals(0, $res); }