diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php index 97d6f464f3..0e2f19ef33 100644 --- a/apps/files_sharing/lib/sharedmount.php +++ b/apps/files_sharing/lib/sharedmount.php @@ -23,9 +23,9 @@ class SharedMount extends Mount implements MoveableMount { protected $storage = null; public function __construct($storage, $mountpoint, $arguments = null, $loader = null) { - parent::__construct($storage, $mountpoint, $arguments, $loader); - + // first update the mount point before creating the parent self::verifyMountPoint($arguments['share']); + parent::__construct($storage, $mountpoint, $arguments, $loader); } /** @@ -79,7 +79,9 @@ class SharedMount extends Mount implements MoveableMount { $arguments = array($newPath, $share['id']); } - return $query->execute($arguments); + $result = $query->execute($arguments); + + return $result === 1 ? true : false; } /** diff --git a/apps/files_sharing/tests/sharedmount.php b/apps/files_sharing/tests/sharedmount.php new file mode 100644 index 0000000000..2bdaf0a72f --- /dev/null +++ b/apps/files_sharing/tests/sharedmount.php @@ -0,0 +1,139 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see . + * + */ + +require_once __DIR__ . '/base.php'; + +/** + * Class Test_Files_Sharing_Api + */ +class Test_Files_Sharing_Mount extends Test_Files_Sharing_Base { + + function setUp() { + parent::setUp(); + + $this->folder = '/folder_share_storage_test'; + + $this->filename = '/share-api-storage.txt'; + + + $this->view->mkdir($this->folder); + + // save file with content + $this->view->file_put_contents($this->filename, "root file"); + $this->view->file_put_contents($this->folder . $this->filename, "file in subfolder"); + } + + function tearDown() { + $this->view->unlink($this->folder); + $this->view->unlink($this->filename); + + parent::tearDown(); + } + + /** + * test if the mount point moves up if the parent folder no longer exists + */ + function testShareMountLoseParentFolder() { + + // share to user + $fileinfo = $this->view->getFileInfo($this->folder); + $result = \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, + self::TEST_FILES_SHARING_API_USER2, 31); + + $statement = "UPDATE `*PREFIX*share` SET `file_target` = ? where `share_with` = ?"; + $query = \OC_DB::prepare($statement); + $arguments = array('/foo/bar' . $this->folder, self::TEST_FILES_SHARING_API_USER2); + $query->execute($arguments); + + $query = \OC_DB::prepare('SELECT * FROM `*PREFIX*share`'); + $result = $query->execute(); + + $shares = $result->fetchAll(); + + $this->assertSame(1, count($shares)); + + $share = reset($shares); + $this->assertSame('/foo/bar' . $this->folder, $share['file_target']); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + + // share should have moved up + + $query = \OC_DB::prepare('SELECT * FROM `*PREFIX*share`'); + $result = $query->execute(); + + $shares = $result->fetchAll(); + + $this->assertSame(1, count($shares)); + + $share = reset($shares); + $this->assertSame($this->folder, $share['file_target']); + + //cleanup + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2); + $this->view->unlink($this->folder); + } + + /** + * @medium + */ + function testDeleteParentOfMountPoint() { + + // share to user + $fileinfo = $this->view->getFileInfo($this->folder); + $result = \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, + self::TEST_FILES_SHARING_API_USER2, 31); + + $this->assertTrue($result); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + $user2View = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files'); + $this->assertTrue($user2View->file_exists($this->folder)); + + // create a local folder + $result = $user2View->mkdir('localfolder'); + $this->assertTrue($result); + + // move mount point to local folder + $result = $user2View->rename($this->folder, '/localfolder/' . $this->folder); + $this->assertTrue($result); + + // mount point in the root folder should no longer exist + $this->assertFalse($user2View->is_dir($this->folder)); + + // delete the local folder + $result = $user2View->unlink('/localfolder'); + $this->assertTrue($result); + + //enforce reload of the mount points + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + + //mount point should be back at the root + $this->assertTrue($user2View->is_dir($this->folder)); + + //cleanup + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + $this->view->unlink($this->folder); + } + +}