diff options
author | Roeland Jago Douma <rullzer@owncloud.com> | 2015-12-07 13:24:16 +0100 |
---|---|---|
committer | Roeland Jago Douma <rullzer@owncloud.com> | 2015-12-10 11:32:03 +0100 |
commit | 643778b028bef2ef4005236084b84a2d8a6d834e (patch) | |
tree | b57cd1810e228c6df56328fa1c3c83161b7a0f54 /apps | |
parent | c132f91f9dd0881f3cc44f8d50dbf6a883d1b576 (diff) | |
download | nextcloud-server-643778b028bef2ef4005236084b84a2d8a6d834e.tar.gz nextcloud-server-643778b028bef2ef4005236084b84a2d8a6d834e.zip |
Update parent when moving share into recieved share
Fixes #20769
When I receive a share and move a share of myself into that share (which
is allowed currently) I effectively hand over ownership of the files I
move. So we need to update the share I move to have as a parent the
share I move it into. Else our mounting system gets confused.
Diffstat (limited to 'apps')
-rw-r--r-- | apps/files_sharing/lib/updater.php | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php index 5a0326c4288..a581355e4ba 100644 --- a/apps/files_sharing/lib/updater.php +++ b/apps/files_sharing/lib/updater.php @@ -56,6 +56,44 @@ class Shared_Updater { */ static public function renameHook($params) { self::renameChildren($params['oldpath'], $params['newpath']); + self::moveShareToShare($params['newpath']); + } + + /** + * Fix for https://github.com/owncloud/core/issues/20769 + * + * The owner is allowed to move their files (if they are shared) into a receiving folder + * In this case we need to update the parent of the moved share. Since they are + * effectively handing over ownership of the file the rest of the code needs to know + * they need to build up the reshare tree. + * + * @param string $path + */ + static private function moveShareToShare($path) { + $userFolder = \OC::$server->getUserFolder(); + $src = $userFolder->get($path); + + $type = $src instanceof \OCP\Files\File ? 'file' : 'folder'; + $shares = \OCP\Share::getItemShared($type, $src->getId()); + + // If the path we move is not a share we don't care + if (empty($shares)) { + return; + } + + // Check if the destination is inside a share + $mountManager = \OC\Files\Filesystem::getMountManager(); + $dstMount = $mountManager->find($src->getPath()); + if (!($dstMount instanceof \OCA\Files_Sharing\SharedMount)) { + return; + } + + $parenShare = $dstMount->getShare(); + + foreach ($shares as $share) { + $query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `parent` = ? WHERE `id` = ?'); + $query->execute([$parenShare['id'], $share['id']]); + } } /** |