From ea31ab7b5c0f50075d15e69b6f2f1940fe2ac00f Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Wed, 2 Jul 2014 15:35:15 +0200 Subject: [PATCH] rename mount point of children if parent was renamed --- apps/files_sharing/lib/updater.php | 23 ++++++++++++++++++ apps/files_sharing/tests/updater.php | 36 ++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php index e114c3ba0a..aac4ed196d 100644 --- a/apps/files_sharing/lib/updater.php +++ b/apps/files_sharing/lib/updater.php @@ -109,6 +109,7 @@ class Shared_Updater { static public function renameHook($params) { self::correctFolders($params['newpath']); self::correctFolders(pathinfo($params['oldpath'], PATHINFO_DIRNAME)); + self::renameChildren($params['oldpath'], $params['newpath']); } /** @@ -209,4 +210,26 @@ class Shared_Updater { $findAndRemoveShares->execute(array()); } + /** + * rename mount point from the children if the parent was renamed + * + * @param string $oldPath old path relative to data/user/files + * @param string $newPath new path relative to data/user/files + */ + static private function renameChildren($oldPath, $newPath) { + + $absNewPath = \OC\Files\Filesystem::normalizePath('/' . \OCP\User::getUser() . '/files/' . $newPath); + $absOldPath = \OC\Files\Filesystem::normalizePath('/' . \OCP\User::getUser() . '/files/' . $oldPath); + + $mountManager = \OC\Files\Filesystem::getMountManager(); + $mountedShares = $mountManager->findIn('/' . \OCP\User::getUser() . '/files/' . $oldPath); + foreach ($mountedShares as $mount) { + if ($mount->getStorage()->instanceOfStorage('OCA\Files_Sharing\ISharedStorage')) { + $mountPoint = $mount->getMountPoint(); + $target = str_replace($absOldPath, $absNewPath, $mountPoint); + $mount->moveMount($target); + } + } + } + } diff --git a/apps/files_sharing/tests/updater.php b/apps/files_sharing/tests/updater.php index cdb4406825..5ec5348870 100644 --- a/apps/files_sharing/tests/updater.php +++ b/apps/files_sharing/tests/updater.php @@ -217,4 +217,40 @@ class Test_Files_Sharing_Updater extends Test_Files_Sharing_Base { } + /** + * if a folder gets renamed all children mount points should be renamed too + */ + function testRename() { + + $fileinfo = \OC\Files\Filesystem::getFileInfo($this->folder); + $result = \OCP\Share::shareItem('folder', $fileinfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31); + $this->assertTrue($result); + + $this->loginHelper(self::TEST_FILES_SHARING_API_USER2); + + // make sure that the shared folder exists + $this->assertTrue(\OC\Files\Filesystem::file_exists($this->folder)); + + \OC\Files\Filesystem::mkdir('oldTarget'); + \OC\Files\Filesystem::mkdir('oldTarget/subfolder'); + \OC\Files\Filesystem::mkdir('newTarget'); + + \OC\Files\Filesystem::rename($this->folder, 'oldTarget/subfolder/' . $this->folder); + + // re-login to make sure that the new mount points are initialized + $this->loginHelper(self::TEST_FILES_SHARING_API_USER2); + + \OC\Files\Filesystem::rename('/oldTarget', '/newTarget/oldTarget'); + + // re-login to make sure that the new mount points are initialized + $this->loginHelper(self::TEST_FILES_SHARING_API_USER2); + + $this->assertTrue(\OC\Files\Filesystem::file_exists('/newTarget/oldTarget/subfolder/' . $this->folder)); + + // 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); + } + }