]> source.dussan.org Git - nextcloud-server.git/commitdiff
Update parent when moving share into recieved share
authorRoeland Jago Douma <rullzer@owncloud.com>
Mon, 7 Dec 2015 12:24:16 +0000 (13:24 +0100)
committerRoeland Jago Douma <rullzer@owncloud.com>
Mon, 7 Dec 2015 15:28:33 +0000 (16:28 +0100)
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.

apps/files_sharing/lib/updater.php

index 26044cc1c8e508081781f9453431b23316af5f60..2d165a5df045c853ad15fa25bb53621d5d7d9a6b 100644 (file)
@@ -58,6 +58,47 @@ 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::$server->getMountManager();
+               $dstMount = $mountManager->find($src->getPath());
+               if (!($dstMount instanceof \OCA\Files_Sharing\SharedMount)) {
+                       return;
+               }
+
+               $parenShare = $dstMount->getShare();
+
+               foreach ($shares as $share) {
+                       $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder();
+                       $qb->update('share')
+                                       ->set('parent', $qb->createNamedParameter($parenShare['id']))
+                                       ->where($qb->expr()->eq('id', $qb->createNamedParameter($share['id'])))
+                                       ->execute();
+               }
        }
 
        /**