make it possible to move files out of a shared mount point
This commit is contained in:
parent
dd1e47b3b8
commit
93469ca468
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))) {
|
||||
($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($oldSource, $newSource);
|
||||
}
|
||||
return $rootView->rename('/' . $user1 . '/files/' . $path1, '/' . $user2 . '/files/' . $path2 . '/' . $targetFilename);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue