From f10894fe471bd8a59e61000685cbd0bb76da3795 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Thu, 16 Oct 2025 15:24:12 -0600 Subject: [PATCH] fixes for permission retention Signed-off-by: Andy Miller --- system/src/Grav/Common/Filesystem/Folder.php | 34 +++++++++++++++++-- .../Common/Upgrade/SafeUpgradeService.php | 8 ++--- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/system/src/Grav/Common/Filesystem/Folder.php b/system/src/Grav/Common/Filesystem/Folder.php index 019342f9e..c01ab36bb 100644 --- a/system/src/Grav/Common/Filesystem/Folder.php +++ b/system/src/Grav/Common/Filesystem/Folder.php @@ -478,12 +478,22 @@ abstract class Folder * @return bool * @throws RuntimeException */ - public static function rcopy($src, $dest) + public static function rcopy($src, $dest, $preservePermissions = false) { // If the src is not a directory do a simple file copy if (!is_dir($src)) { copy($src, $dest); + if ($preservePermissions) { + $perm = @fileperms($src); + if ($perm !== false) { + @chmod($dest, $perm & 0777); + } + $mtime = @filemtime($src); + if ($mtime !== false) { + @touch($dest, $mtime); + } + } return true; } @@ -492,14 +502,32 @@ abstract class Folder static::create($dest); } + if ($preservePermissions) { + $perm = @fileperms($src); + if ($perm !== false) { + @chmod($dest, $perm & 0777); + } + } + // Open the source directory to read in files $i = new DirectoryIterator($src); foreach ($i as $f) { if ($f->isFile()) { - copy($f->getRealPath(), "{$dest}/" . $f->getFilename()); + $target = "{$dest}/" . $f->getFilename(); + copy($f->getRealPath(), $target); + if ($preservePermissions) { + $perm = @fileperms($f->getRealPath()); + if ($perm !== false) { + @chmod($target, $perm & 0777); + } + $mtime = @filemtime($f->getRealPath()); + if ($mtime !== false) { + @touch($target, $mtime); + } + } } else { if (!$f->isDot() && $f->isDir()) { - static::rcopy($f->getRealPath(), "{$dest}/{$f}"); + static::rcopy($f->getRealPath(), "{$dest}/{$f}", $preservePermissions); } } } diff --git a/system/src/Grav/Common/Upgrade/SafeUpgradeService.php b/system/src/Grav/Common/Upgrade/SafeUpgradeService.php index a7385ac29..8f9098763 100644 --- a/system/src/Grav/Common/Upgrade/SafeUpgradeService.php +++ b/system/src/Grav/Common/Upgrade/SafeUpgradeService.php @@ -165,7 +165,7 @@ class SafeUpgradeService Folder::create($packagePath); // Copy extracted package into staging area. - Folder::rcopy($extractedPath, $packagePath); + Folder::rcopy($extractedPath, $packagePath, true); $this->carryOverRootDotfiles($packagePath); @@ -375,7 +375,7 @@ class SafeUpgradeService } Folder::create(dirname($stage)); - Folder::rcopy($live, $stage); + Folder::rcopy($live, $stage, true); } } @@ -414,7 +414,7 @@ class SafeUpgradeService $source = $entry->getPathname(); if ($entry->isDir()) { - Folder::rcopy($source, $target); + Folder::rcopy($source, $target, true); } elseif ($entry->isFile()) { Folder::create(dirname($target)); copy($source, $target); @@ -550,7 +550,7 @@ class SafeUpgradeService Folder::delete($destinationGit); } - Folder::rcopy($sourceGit, $destinationGit); + Folder::rcopy($sourceGit, $destinationGit, true); } /**