aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_sharing/lib/Updater.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_sharing/lib/Updater.php')
-rw-r--r--apps/files_sharing/lib/Updater.php85
1 files changed, 47 insertions, 38 deletions
diff --git a/apps/files_sharing/lib/Updater.php b/apps/files_sharing/lib/Updater.php
index 95a5c9d9166..24e82330d43 100644
--- a/apps/files_sharing/lib/Updater.php
+++ b/apps/files_sharing/lib/Updater.php
@@ -1,34 +1,19 @@
<?php
+
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Björn Schießle <bjoern@schiessle.org>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Michael Gapczynski <GapczynskiM@gmail.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
+ * SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files_Sharing;
+use OC\Files\Cache\FileAccess;
+use OC\Files\Filesystem;
use OC\Files\Mount\MountPoint;
use OCP\Constants;
use OCP\Files\Folder;
+use OCP\Files\Mount\IMountManager;
+use OCP\Server;
use OCP\Share\IShare;
class Updater {
@@ -58,20 +43,44 @@ class Updater {
if ($userFolder === null) {
return;
}
+ $user = $userFolder->getOwner();
+ if (!$user) {
+ throw new \Exception('user folder has no owner');
+ }
$src = $userFolder->get($path);
- $shareManager = \OC::$server->getShareManager();
+ $shareManager = Server::get(\OCP\Share\IManager::class);
+
+ // We intentionally include invalid shares, as they have been automatically invalidated due to the node no longer
+ // being accessible for the user. Only in this case where we adjust the share after it was moved we want to ignore
+ // this to be able to still adjust it.
// FIXME: should CIRCLES be included here ??
- $shares = $shareManager->getSharesBy($userFolder->getOwner()->getUID(), IShare::TYPE_USER, $src, false, -1);
- $shares = array_merge($shares, $shareManager->getSharesBy($userFolder->getOwner()->getUID(), IShare::TYPE_GROUP, $src, false, -1));
- $shares = array_merge($shares, $shareManager->getSharesBy($userFolder->getOwner()->getUID(), IShare::TYPE_ROOM, $src, false, -1));
+ $shares = $shareManager->getSharesBy($user->getUID(), IShare::TYPE_USER, $src, false, -1, onlyValid: false);
+ $shares = array_merge($shares, $shareManager->getSharesBy($user->getUID(), IShare::TYPE_GROUP, $src, false, -1, onlyValid: false));
+ $shares = array_merge($shares, $shareManager->getSharesBy($user->getUID(), IShare::TYPE_ROOM, $src, false, -1, onlyValid: false));
if ($src instanceof Folder) {
- $subShares = $shareManager->getSharesInFolder($userFolder->getOwner()->getUID(), $src, false, false);
+ $cacheAccess = Server::get(FileAccess::class);
+
+ $sourceStorageId = $src->getStorage()->getCache()->getNumericStorageId();
+ $sourceInternalPath = $src->getInternalPath();
+ $subShares = array_merge(
+ $shareManager->getSharesBy($user->getUID(), IShare::TYPE_USER, onlyValid: false),
+ $shareManager->getSharesBy($user->getUID(), IShare::TYPE_GROUP, onlyValid: false),
+ $shareManager->getSharesBy($user->getUID(), IShare::TYPE_ROOM, onlyValid: false),
+ );
+ $shareSourceIds = array_map(fn (IShare $share) => $share->getNodeId(), $subShares);
+ $shareSources = $cacheAccess->getByFileIdsInStorage($shareSourceIds, $sourceStorageId);
foreach ($subShares as $subShare) {
- $shares = array_merge($shares, array_values($subShare));
+ $shareCacheEntry = $shareSources[$subShare->getNodeId()] ?? null;
+ if (
+ $shareCacheEntry
+ && str_starts_with($shareCacheEntry->getPath(), $sourceInternalPath . '/')
+ ) {
+ $shares[] = $subShare;
+ }
}
}
@@ -81,20 +90,20 @@ class Updater {
}
// Check if the destination is inside a share
- $mountManager = \OC::$server->getMountManager();
+ $mountManager = Server::get(IMountManager::class);
$dstMount = $mountManager->find($src->getPath());
//Ownership is moved over
foreach ($shares as $share) {
if (
- $share->getShareType() !== IShare::TYPE_USER &&
- $share->getShareType() !== IShare::TYPE_GROUP &&
- $share->getShareType() !== IShare::TYPE_ROOM
+ $share->getShareType() !== IShare::TYPE_USER
+ && $share->getShareType() !== IShare::TYPE_GROUP
+ && $share->getShareType() !== IShare::TYPE_ROOM
) {
continue;
}
- if ($dstMount instanceof \OCA\Files_Sharing\SharedMount) {
+ if ($dstMount instanceof SharedMount) {
if (!($dstMount->getShare()->getPermissions() & Constants::PERMISSION_SHARE)) {
$shareManager->deleteShare($share);
continue;
@@ -108,7 +117,7 @@ class Updater {
$share->setShareOwner($newOwner);
$share->setPermissions($newPermissions);
- $shareManager->updateShare($share);
+ $shareManager->updateShare($share, onlyValid: false);
}
}
@@ -119,10 +128,10 @@ class Updater {
* @param string $newPath new path relative to data/user/files
*/
private static function renameChildren($oldPath, $newPath) {
- $absNewPath = \OC\Files\Filesystem::normalizePath('/' . \OC_User::getUser() . '/files/' . $newPath);
- $absOldPath = \OC\Files\Filesystem::normalizePath('/' . \OC_User::getUser() . '/files/' . $oldPath);
+ $absNewPath = Filesystem::normalizePath('/' . \OC_User::getUser() . '/files/' . $newPath);
+ $absOldPath = Filesystem::normalizePath('/' . \OC_User::getUser() . '/files/' . $oldPath);
- $mountManager = \OC\Files\Filesystem::getMountManager();
+ $mountManager = Filesystem::getMountManager();
$mountedShares = $mountManager->findIn('/' . \OC_User::getUser() . '/files/' . $oldPath);
foreach ($mountedShares as $mount) {
/** @var MountPoint $mount */