From b1471c2bbd370ec6b0cf524e1b45e59e66dfb3bb Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Tue, 31 Jan 2023 09:27:11 +0100 Subject: [PATCH] SnappyMail\TAR::extractTo support the $files and $overwrite parameters --- .../v/0.0.0/app/libraries/snappymail/tar.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/tar.php b/snappymail/v/0.0.0/app/libraries/snappymail/tar.php index 84d466e8a..49a037493 100644 --- a/snappymail/v/0.0.0/app/libraries/snappymail/tar.php +++ b/snappymail/v/0.0.0/app/libraries/snappymail/tar.php @@ -23,16 +23,15 @@ class TAR */ public function extractTo(string $directory, $files = null, bool $overwrite = false) : bool { - if ($files) { - \trigger_error('$files parameter not yet supported'); - return false; - } - $fp = \gzopen($this->filename, 'rb'); if (!$fp) { return false; } + if ($files) { + $files = '/^(' . \implode('|', \array_map('preg_quote', \is_array($files) ? $files : [$files])) . ')/u'; + } + \clearstatcache(false); \clearstatcache(true); while (!\gzeof($fp)) { @@ -65,7 +64,13 @@ class TAR if (\preg_match('#(^|/)PaxHeader/#', $header['filename'])) { } else if (\substr($header['filename'], -1) !== '/') { $filename = ($header['path'] ? $header['path'] . '/' : '') . $header['filename']; + if ($files && !\preg_match($files, $filename)) { + continue; + } $filename = $directory . '/' . $filename; + if (\is_file($filename) && !$overwrite) { + continue; + } $dir = \dirname($filename); if (!\is_dir($dir) && !\mkdir($dir, 0777, true)) { return false;