Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Schwan <carl@carlschwan.eu>2021-10-07 12:50:33 +0300
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>2021-10-28 15:55:53 +0300
commit00a9b0c1dbbbff5d0895ef1192e321add2519781 (patch)
tree773d17fc6cc6f43e0b7e39a13b792b495991866d /lib/private
parente4e35107b03d876cc35eba7025c30b7533d8d3fc (diff)
Fix permissions when copying from ObjectStorage
Make sure that when a user copy a file from a directory they don't have all permissions to a directory where they have more permissions, the permissions are correctly set to the one from the parent taget folder. This was caused by the ObjectStoreStorage::copyFromStorage using the jailed storage and cache entry instead of the unjailed one like other storages (the local one). Steps to reproduce + Use object storage + Create a groupfolder with one group having full permission and another one who can just read files. + With an user who is in the second group, copy a file from the groupfolder to the home folder of this user. + The file in the home folder of the user will be read only and can't be deleted even though it is in their home folder and they are the owner. In oc_filecache, the permissions stored for this file are 1 (READ) Signed-off-by: Carl Schwan <carl@carlschwan.eu>
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/Files/Cache/Cache.php2
-rw-r--r--lib/private/Files/ObjectStore/ObjectStoreStorage.php8
2 files changed, 9 insertions, 1 deletions
diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php
index ae707fb5b54..3ede9fac618 100644
--- a/lib/private/Files/Cache/Cache.php
+++ b/lib/private/Files/Cache/Cache.php
@@ -1097,7 +1097,7 @@ class Cache implements ICache {
* @param ICache $sourceCache
* @param ICacheEntry $sourceEntry
* @param string $targetPath
- * @return int fileid of copied entry
+ * @return int fileId of copied entry
*/
public function copyFromCache(ICache $sourceCache, ICacheEntry $sourceEntry, string $targetPath): int {
if ($sourceEntry->getId() < 0) {
diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
index a6654a7e9a4..94b9da66553 100644
--- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php
+++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
@@ -540,7 +540,15 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common {
if ($sourceStorage->instanceOfStorage(ObjectStoreStorage::class)) {
/** @var ObjectStoreStorage $sourceStorage */
if ($sourceStorage->getObjectStore()->getStorageId() === $this->getObjectStore()->getStorageId()) {
+ /** @var CacheEntry $sourceEntry */
$sourceEntry = $sourceStorage->getCache()->get($sourceInternalPath);
+ $sourceEntryData = $sourceEntry->getData();
+ // $sourceEntry['permissions'] here is the permissions from the jailed storage for the current
+ // user. Instead we use $sourceEntryData['scan_permissions'] that are the permissions from the
+ // unjailed storage.
+ if (is_array($sourceEntryData) && array_key_exists('scan_permissions', $sourceEntryData)) {
+ $sourceEntry['permissions'] = $sourceEntryData['scan_permissions'];
+ }
$this->copyInner($sourceEntry, $targetInternalPath);
return true;
}