aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/files_sharing/lib/helper.php31
-rw-r--r--apps/files_sharing/lib/sharedstorage.php27
-rw-r--r--lib/private/files/view.php8
3 files changed, 49 insertions, 17 deletions
diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php
index e2780e98935..cc1f7d9ffdf 100644
--- a/apps/files_sharing/lib/helper.php
+++ b/apps/files_sharing/lib/helper.php
@@ -145,4 +145,35 @@ class Helper {
return $result;
}
+
+ public static function getUidAndFilename($filename) {
+ $uid = \OC\Files\Filesystem::getOwner($filename);
+ \OC\Files\Filesystem::initMountPoints($uid);
+ if ( $uid != \OCP\User::getUser() ) {
+ $info = \OC\Files\Filesystem::getFileInfo($filename);
+ $ownerView = new \OC\Files\View('/'.$uid.'/files');
+ $filename = $ownerView->getPath($info['fileid']);
+ }
+ return array($uid, $filename);
+ }
+
+ /**
+ * @brief Format a path to be relative to the /user/files/ directory
+ * @param string $path the absolute path
+ * @return string e.g. turns '/admin/files/test.txt' into 'test.txt'
+ */
+ public static function stripUserFilesPath($path) {
+ $trimmed = ltrim($path, '/');
+ $split = explode('/', $trimmed);
+
+ // it is not a file relative to data/user/files
+ if (count($split) < 3 || $split[1] !== 'files') {
+ return false;
+ }
+
+ $sliced = array_slice($split, 2);
+ $relPath = implode('/', $sliced);
+
+ return $relPath;
+ }
}
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index b8a799f720d..5e478d5ead8 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -362,6 +362,9 @@ class Shared extends \OC\Files\Storage\Common {
public function rename($path1, $path2) {
$sourceMountPoint = \OC\Files\Filesystem::getMountPoint($path1);
+ $targetMountPoint = \OC\Files\Filesystem::getMountPoint($path2);
+ $relPath1 = \OCA\Files_Sharing\Helper::stripUserFilesPath($path1);
+ $relPath2 = \OCA\Files_Sharing\Helper::stripUserFilesPath($path2);
// if we renamed the mount point we need to adjust the file_target in the
// database
@@ -369,21 +372,19 @@ class Shared extends \OC\Files\Storage\Common {
return $this->renameMountPoint($path1, $path2);
}
- // Renaming/moving is only allowed within shared folders
- $oldSource = $this->getSourcePath($path1);
- if ($oldSource) {
- $newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2);
- // Within the same folder, we only need UPDATE permissions
- if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) {
- list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource);
- list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource);
- return $storage->rename($oldInternalPath, $newInternalPath);
+
+ if ( // Within the same mount point, we only need UPDATE permissions
+ ($sourceMountPoint === $targetMountPoint && $this->isUpdatable($sourceMountPoint)) ||
// otherwise DELETE and CREATE permissions required
- } elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) {
- $rootView = new \OC\Files\View('');
- return $rootView->rename($oldSource, $newSource);
- }
+ ($this->isDeletable($path1) && $this->isCreatable(dirname($path2)))) {
+
+ list($user1, $path1) = \OCA\Files_Sharing\Helper::getUidAndFilename($relPath1);
+ $targetFilename = basename($relPath2);
+ list($user2, $path2) = \OCA\Files_Sharing\Helper::getUidAndFilename(dirname($relPath2));
+ $rootView = new \OC\Files\View('');
+ return $rootView->rename('/' . $user1 . '/files/' . $path1, '/' . $user2 . '/files/' . $path2 . '/' . $targetFilename);
}
+
return false;
}
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index a61d58aaf24..58dfc73dcf3 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -410,16 +410,16 @@ class View {
// if source and target are on the same storage we can call the rename operation from the
// storage. If it is a "Shared" file/folder we call always the rename operation of the
// shared storage to handle mount point renaming, etc correctly
- if ($mp1 == $mp2) {
+ if ($storage1 instanceof \OC\Files\Storage\Shared) {
if ($storage1) {
- $result = $storage1->rename($internalPath1, $internalPath2);
+ $result = $storage1->rename($absolutePath1, $absolutePath2);
\OC_FileProxy::runPostProxies('rename', $absolutePath1, $absolutePath2);
} else {
$result = false;
}
- } elseif ($storage1 instanceof \OC\Files\Storage\Shared) {
+ } elseif ($mp1 == $mp2) {
if ($storage1) {
- $result = $storage1->rename($absolutePath1, $absolutePath2);
+ $result = $storage1->rename($internalPath1, $internalPath2);
\OC_FileProxy::runPostProxies('rename', $absolutePath1, $absolutePath2);
} else {
$result = false;