Update parent when moving share into recieved share

Fixes #20769

When I receive a share and move a share of myself into that share (which
is allowed currently) I effectively hand over ownership of the files I
move. So we need to update the share I move to have as a parent the
share I move it into. Else our mounting system gets confused.
This commit is contained in:
Roeland Jago Douma 2015-12-07 13:24:16 +01:00
parent e44b164f40
commit d38949f423

View file

@ -58,6 +58,47 @@ class Shared_Updater {
*/
static public function renameHook($params) {
self::renameChildren($params['oldpath'], $params['newpath']);
self::moveShareToShare($params['newpath']);
}
/**
* Fix for https://github.com/owncloud/core/issues/20769
*
* The owner is allowed to move their files (if they are shared) into a receiving folder
* In this case we need to update the parent of the moved share. Since they are
* effectively handing over ownership of the file the rest of the code needs to know
* they need to build up the reshare tree.
*
* @param string $path
*/
static private function moveShareToShare($path) {
$userFolder = \OC::$server->getUserFolder();
$src = $userFolder->get($path);
$type = $src instanceof \OCP\Files\File ? 'file' : 'folder';
$shares = \OCP\Share::getItemShared($type, $src->getId());
// If the path we move is not a share we don't care
if (empty($shares)) {
return;
}
// Check if the destination is inside a share
$mountManager = \OC::$server->getMountManager();
$dstMount = $mountManager->find($src->getPath());
if (!($dstMount instanceof \OCA\Files_Sharing\SharedMount)) {
return;
}
$parenShare = $dstMount->getShare();
foreach ($shares as $share) {
$qb = \OC::$server->getDatabaseConnection()->getQueryBuilder();
$qb->update('share')
->set('parent', $qb->createNamedParameter($parenShare['id']))
->where($qb->expr()->eq('id', $qb->createNamedParameter($share['id'])))
->execute();
}
}
/**