. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Core\Utils\File; use Espo\Core\Utils\Util; use RuntimeException; class ZipArchive { private Manager $fileManager; public function __construct(?Manager $fileManager = null) { if ($fileManager === null) { $fileManager = new Manager(); } $this->fileManager = $fileManager; } /** * Unzip archive. * * @param string $file A path to a zip file. * @param string $destination A destination. */ public function unzip(string $file, string $destination): bool { if (!class_exists('\ZipArchive')) { throw new RuntimeException("php-zip extension is not installed. Cannot unzip the file."); } $zip = new \ZipArchive; $res = $zip->open($file); if ($res !== true) { return false; } $this->fileManager->mkdir($destination); for ($i = 0; $i < $zip->numFiles; $i ++) { $filename = $zip->getNameIndex($i); if ($filename === false) { continue; } if ( str_contains($filename, '..') || str_starts_with($filename, '/') || str_starts_with($filename, '\\') ) { throw new RuntimeException("No allowed path."); } $zip->extractTo($destination, $filename); } $zip->close(); return true; } }