]> source.dussan.org Git - nextcloud-server.git/commitdiff
if a folder gets deleted we unshare all shared files/folders below
authorBjoern Schiessle <schiessle@owncloud.com>
Wed, 2 Jul 2014 12:40:22 +0000 (14:40 +0200)
committerBjoern Schiessle <schiessle@owncloud.com>
Fri, 4 Jul 2014 08:34:54 +0000 (10:34 +0200)
apps/files_sharing/lib/proxy.php
apps/files_sharing/lib/sharedmount.php
apps/files_sharing/tests/proxy.php
apps/files_sharing/tests/updater.php

index f595328cc63f9797528b0d5400fa134eaa1027fe..92303d298b1d1e558e9f56b6473bf51dcf61e597 100644 (file)
  */
 
 namespace OCA\Files\Share;
+use OCA\Files_Sharing\Helper;
 
 class Proxy extends \OC_FileProxy {
 
        /**
-        * check if the deleted folder contains share mount points and move them
-        * up to the parent
+        * check if the deleted folder contains share mount points and unshare them
         *
         * @param string $path
         */
        public function preUnlink($path) {
-               $this->moveMountPointsUp($path);
+               $this->unshareChildren($path);
        }
 
        /**
-        * check if the deleted folder contains share mount points and move them
-        * up to the parent
+        * check if the deleted folder contains share mount points and unshare them
         *
         * @param string $path
         */
        public function preRmdir($path) {
-               $this->moveMountPointsUp($path);
+               $this->unshareChildren($path);
        }
 
        /**
-        * move share mount points up to the parent
+        * unshare shared items below the deleted folder
         *
         * @param string $path
         */
-       private function moveMountPointsUp($path) {
+       private function unshareChildren($path) {
                $view = new \OC\Files\View('/');
 
-               // find share mount points within $path and move them up to the parent folder
-               // before we delete $path
+               // find share mount points within $path and unmount them
                $mountManager = \OC\Files\Filesystem::getMountManager();
                $mountedShares = $mountManager->findIn($path);
                foreach ($mountedShares as $mount) {
-                       if ($mount->getStorage()->instanceOfStorage('\OC\Files\Storage\Shared')) {
+                       if ($mount->getStorage()->instanceOfStorage('OCA\Files_Sharing\ISharedStorage')) {
                                $mountPoint = $mount->getMountPoint();
-                               $mountPointName = $mount->getMountPointName();
-                               $target = \OCA\Files_Sharing\Helper::generateUniqueTarget(dirname($path) . '/' . $mountPointName, array(), $view);
-                               $view->rename($mountPoint, $target);
+                               $view->unlink($mountPoint);
                        }
                }
        }
index f8def2c6a82792ffb0df02e3ca5ef28c2b9ef4a8..564ac43ec74247fd78e498d0cb0489f54a717632 100644 (file)
@@ -143,8 +143,10 @@ class SharedMount extends Mount implements MoveableMount {
         * @return bool
         */
        public function removeMount() {
+               $mountManager = \OC\Files\Filesystem::getMountManager();
                $storage = $this->getStorage();
                $result =  \OCP\Share::unshareFromSelf($storage->getItemType(), $storage->getMountPoint());
+               $mountManager->removeMount($this->mountPoint);
 
                return $result;
        }
index 634ed86db54d41ada1382cd81dee499877f0a4e2..b6599a1b6466b8f6e585d778ce0054bd465e7559 100644 (file)
@@ -47,7 +47,6 @@ class Test_Files_Sharing_Proxy extends Test_Files_Sharing_Base {
                $this->filename = '/share-api-test';
 
                // save file with content
-               $this->view->file_put_contents($this->filename, $this->data);
                $this->view->mkdir($this->folder);
                $this->view->mkdir($this->folder . $this->subfolder);
                $this->view->mkdir($this->folder . $this->subfolder . $this->subsubfolder);
@@ -56,7 +55,6 @@ class Test_Files_Sharing_Proxy extends Test_Files_Sharing_Base {
        }
 
        function tearDown() {
-               $this->view->unlink($this->filename);
                $this->view->deleteAll($this->folder);
 
                self::$tempStorage = null;
@@ -69,30 +67,33 @@ class Test_Files_Sharing_Proxy extends Test_Files_Sharing_Base {
         */
        function testpreUnlink() {
 
-               $fileInfo1 = \OC\Files\Filesystem::getFileInfo($this->filename);
                $fileInfo2 = \OC\Files\Filesystem::getFileInfo($this->folder);
 
-               $result = \OCP\Share::shareItem('file', $fileInfo1->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31);
-               $this->assertTrue($result);
-
                $result = \OCP\Share::shareItem('folder', $fileInfo2->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31);
                $this->assertTrue($result);
 
                self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
 
-               // move shared folder to 'localDir' and rename it, so that it uses the same
-               // name as the shared file
+               // one folder should be shared with the user
+               $sharedFolders = \OCP\Share::getItemsSharedWith('folder');
+               $this->assertSame(1, count($sharedFolders));
+
+               // move shared folder to 'localDir'
                \OC\Files\Filesystem::mkdir('localDir');
-               $result = \OC\Files\Filesystem::rename($this->folder, '/localDir/' . $this->filename);
+               $result = \OC\Files\Filesystem::rename($this->folder, '/localDir/' . $this->folder);
                $this->assertTrue($result);
 
                \OC\Files\Filesystem::unlink('localDir');
 
                self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
 
-               // after we deleted 'localDir' the share should be moved up to the root and be
-               // renamed to "filename (2)"
-               $this->assertTrue(\OC\Files\Filesystem::file_exists($this->filename));
-               $this->assertTrue(\OC\Files\Filesystem::file_exists($this->filename . ' (2)' ));
+               // after the parent directory was deleted the share should be unshared
+               $sharedFolders = \OCP\Share::getItemsSharedWith('folder');
+               $this->assertTrue(empty($sharedFolders));
+
+               self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+               // the folder for the owner should still exists
+               $this->assertTrue(\OC\Files\Filesystem::file_exists($this->folder));
        }
 }
index 5ec534887023ca0e0e4207a46d8cca0da39b1d32..1f51b9a315c6a7552794f29959726744a8f1ecf8 100644 (file)
@@ -57,7 +57,7 @@ class Test_Files_Sharing_Updater extends Test_Files_Sharing_Base {
 
        /**
         * test deletion of a folder which contains share mount points. Share mount
-        * points should move up to the parent before the folder gets deleted so
+        * points should be unshared before the folder gets deleted so
         * that the mount point doesn't end up at the trash bin
         */
        function testDeleteParentFolder() {
@@ -78,6 +78,9 @@ class Test_Files_Sharing_Updater extends Test_Files_Sharing_Base {
                // check if user2 can see the shared folder
                $this->assertTrue($view->file_exists($this->folder));
 
+               $foldersShared = \OCP\Share::getItemsSharedWith('folder');
+               $this->assertSame(1, count($foldersShared));
+
                $view->mkdir("localFolder");
                $view->file_put_contents("localFolder/localFile.txt", "local file");
 
@@ -91,8 +94,9 @@ class Test_Files_Sharing_Updater extends Test_Files_Sharing_Base {
 
                $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
 
-               // mount point should move up again
-               $this->assertTrue($view->file_exists($this->folder));
+               // shared folder should be unshared
+               $foldersShared = \OCP\Share::getItemsSharedWith('folder');
+               $this->assertTrue(empty($foldersShared));
 
                // trashbin should contain the local file but not the mount point
                $rootView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2);
@@ -109,10 +113,6 @@ class Test_Files_Sharing_Updater extends Test_Files_Sharing_Base {
                if ($status === false) {
                        \OC_App::disable('files_trashbin');
                }
-               // cleanup
-               $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
-               $result = \OCP\Share::unshare('folder', $fileinfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2);
-               $this->assertTrue($result);
        }
 
        /**