From 238afd37cf852740f466d6484816e3da9b6ed9da Mon Sep 17 00:00:00 2001 From: angel Date: Sun, 19 Apr 2020 15:29:16 +0200 Subject: [PATCH] FileManager: Replicate permissions on directory copy (#1437) When copying files, the original file permissions are applied to the copy. However, this was not done with directories. This should do it. --- Applications/FileManager/FileUtils.cpp | 11 +++++++++-- Applications/FileManager/FileUtils.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Applications/FileManager/FileUtils.cpp b/Applications/FileManager/FileUtils.cpp index 9db2f3f199..82580e1d2b 100644 --- a/Applications/FileManager/FileUtils.cpp +++ b/Applications/FileManager/FileUtils.cpp @@ -93,12 +93,12 @@ bool copy_file_or_directory(const String& src_path, const String& dst_path) } if (S_ISDIR(src_stat.st_mode)) { - return copy_directory(src_path, dst_path); + return copy_directory(src_path, dst_path, src_stat); } return copy_file(src_path, dst_path, src_stat, src_fd); } -bool copy_directory(const String& src_path, const String& dst_path) +bool copy_directory(const String& src_path, const String& dst_path, const struct stat& src_stat) { int rc = mkdir(dst_path.characters(), 0755); if (rc < 0) { @@ -117,6 +117,13 @@ bool copy_directory(const String& src_path, const String& dst_path) return false; } } + + auto my_umask = umask(0); + umask(my_umask); + rc = chmod(dst_path.characters(), src_stat.st_mode & ~my_umask); + if (rc < 0) { + return false; + } return true; } diff --git a/Applications/FileManager/FileUtils.h b/Applications/FileManager/FileUtils.h index d2aa28e050..a177900ee1 100644 --- a/Applications/FileManager/FileUtils.h +++ b/Applications/FileManager/FileUtils.h @@ -34,6 +34,6 @@ int delete_directory(String directory, String& file_that_caused_error); bool copy_file_or_directory(const String& src_path, const String& dst_path); String get_duplicate_name(const String& path, int duplicate_count); bool copy_file(const String& src_path, const String& dst_path, const struct stat& src_stat, int src_fd); -bool copy_directory(const String& src_path, const String& dst_path); +bool copy_directory(const String& src_path, const String& dst_path, const struct stat& src_stat); }