summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas <jonas@freesources.org>2023-10-27 00:26:07 +0200
committerGitHub <noreply@github.com>2023-10-27 00:26:07 +0200
commitc7403d433a7a4121046ea12d640222e57480af76 (patch)
treebff10f194e89a0bdd19c661300f0b3c59f845862
parent565dc36226d08d071c30d8ad4fd54126dfa4be79 (diff)
parent9ed1bbee5c46272282e939855775507961209fe0 (diff)
downloadnextcloud-server-c7403d433a7a4121046ea12d640222e57480af76.tar.gz
nextcloud-server-c7403d433a7a4121046ea12d640222e57480af76.zip
Merge pull request #41082 from nextcloud/backport/40482/stable27
[stable27] fix(isLegitimatedForUserId): Setup mountpoints to check file access
-rw-r--r--apps/workflowengine/lib/Entity/File.php36
-rw-r--r--apps/workflowengine/tests/ManagerTest.php5
-rw-r--r--lib/private/Files/Config/UserMountCache.php2
-rw-r--r--lib/private/Files/Mount/Manager.php19
4 files changed, 52 insertions, 10 deletions
diff --git a/apps/workflowengine/lib/Entity/File.php b/apps/workflowengine/lib/Entity/File.php
index 3f09fcd24a1..7caaaf0e225 100644
--- a/apps/workflowengine/lib/Entity/File.php
+++ b/apps/workflowengine/lib/Entity/File.php
@@ -7,6 +7,7 @@ declare(strict_types=1);
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
+ * @author Jonas Meurer <jonas@freesources.org>
*
* @license GNU AGPL version 3 or any later version
*
@@ -26,6 +27,8 @@ declare(strict_types=1);
*/
namespace OCA\WorkflowEngine\Entity;
+use OC\Files\Config\UserMountCache;
+use OC\Files\Mount\Manager as MountManager;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\GenericEvent;
use OCP\Files\InvalidPathException;
@@ -38,7 +41,6 @@ use OCP\IURLGenerator;
use OCP\IUser;
use OCP\IUserManager;
use OCP\IUserSession;
-use OCP\Share\IManager as ShareManager;
use OCP\SystemTag\ISystemTag;
use OCP\SystemTag\ISystemTagManager;
use OCP\SystemTag\MapperEvent;
@@ -65,8 +67,6 @@ class File implements IEntity, IDisplayText, IUrl, IIcon, IContextPortation {
protected $eventName;
/** @var Event */
protected $event;
- /** @var ShareManager */
- private $shareManager;
/** @var IUserSession */
private $userSession;
/** @var ISystemTagManager */
@@ -77,25 +77,31 @@ class File implements IEntity, IDisplayText, IUrl, IIcon, IContextPortation {
private $actingUser = null;
/** @var IUserManager */
private $userManager;
+ /** @var UserMountCache */
+ private $userMountCache;
+ /** @var MountManager */
+ private $mountManager;
public function __construct(
IL10N $l10n,
IURLGenerator $urlGenerator,
IRootFolder $root,
ILogger $logger,
- ShareManager $shareManager,
IUserSession $userSession,
ISystemTagManager $tagManager,
- IUserManager $userManager
+ IUserManager $userManager,
+ UserMountCache $userMountCache,
+ MountManager $mountManager
) {
$this->l10n = $l10n;
$this->urlGenerator = $urlGenerator;
$this->root = $root;
$this->logger = $logger;
- $this->shareManager = $shareManager;
$this->userSession = $userSession;
$this->tagManager = $tagManager;
$this->userManager = $userManager;
+ $this->userMountCache = $userMountCache;
+ $this->mountManager = $mountManager;
}
public function getName(): string {
@@ -140,8 +146,22 @@ class File implements IEntity, IDisplayText, IUrl, IIcon, IContextPortation {
if ($node->getOwner()->getUID() === $uid) {
return true;
}
- $acl = $this->shareManager->getAccessList($node, true, true);
- return isset($acl['users']) && array_key_exists($uid, $acl['users']);
+
+ if ($this->eventName === self::EVENT_NAMESPACE . 'postDelete') {
+ // At postDelete, the file no longer exists. Check for parent folder instead.
+ $fileId = $node->getParent()->getId();
+ } else {
+ $fileId = $node->getId();
+ }
+
+ $mountInfos = $this->userMountCache->getMountsForFileId($fileId, $uid);
+ foreach ($mountInfos as $mountInfo) {
+ $mount = $this->mountManager->getMountFromMountInfo($mountInfo);
+ if ($mount && $mount->getStorage() && !empty($mount->getStorage()->getCache()->get($fileId))) {
+ return true;
+ }
+ }
+ return false;
} catch (NotFoundException $e) {
return false;
}
diff --git a/apps/workflowengine/tests/ManagerTest.php b/apps/workflowengine/tests/ManagerTest.php
index 543b4550ca6..b708d034df5 100644
--- a/apps/workflowengine/tests/ManagerTest.php
+++ b/apps/workflowengine/tests/ManagerTest.php
@@ -26,6 +26,8 @@
*/
namespace OCA\WorkflowEngine\Tests;
+use OC\Files\Config\UserMountCache;
+use OC\Files\Mount\Manager as MountManager;
use OC\L10N\L10N;
use OCA\WorkflowEngine\Entity\File;
use OCA\WorkflowEngine\Helper\ScopeContext;
@@ -408,10 +410,11 @@ class ManagerTest extends TestCase {
$this->createMock(IURLGenerator::class),
$this->createMock(IRootFolder::class),
$this->createMock(ILogger::class),
- $this->createMock(\OCP\Share\IManager::class),
$this->createMock(IUserSession::class),
$this->createMock(ISystemTagManager::class),
$this->createMock(IUserManager::class),
+ $this->createMock(UserMountCache::class),
+ $this->createMock(MountManager::class),
])
->setMethodsExcept(['getEvents'])
->getMock();
diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php
index 9838b0a213c..8f26dedae22 100644
--- a/lib/private/Files/Config/UserMountCache.php
+++ b/lib/private/Files/Config/UserMountCache.php
@@ -463,7 +463,7 @@ class UserMountCache implements IUserMountCache {
}, $mounts);
$mounts = array_combine($mountPoints, $mounts);
- $current = $path;
+ $current = rtrim($path, '/');
// walk up the directory tree until we find a path that has a mountpoint set
// the loop will return if a mountpoint is found or break if none are found
while (true) {
diff --git a/lib/private/Files/Mount/Manager.php b/lib/private/Files/Mount/Manager.php
index 805cce658a6..e623211cc7a 100644
--- a/lib/private/Files/Mount/Manager.php
+++ b/lib/private/Files/Mount/Manager.php
@@ -10,6 +10,7 @@ declare(strict_types=1);
* @author Robin Appelman <robin@icewind.nl>
* @author Robin McCorkell <robin@mccorkell.me.uk>
* @author Roeland Jago Douma <roeland@famdouma.nl>
+ * @author Jonas <jonas@freesources.org>
*
* @license AGPL-3.0
*
@@ -33,6 +34,7 @@ use OCP\Cache\CappedMemoryCache;
use OC\Files\Filesystem;
use OC\Files\SetupManager;
use OC\Files\SetupManagerFactory;
+use OCP\Files\Config\ICachedMountInfo;
use OCP\Files\Mount\IMountManager;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\NotFoundException;
@@ -226,4 +228,21 @@ class Manager implements IMountManager {
});
}
}
+
+ /**
+ * Return the mount matching a cached mount info (or mount file info)
+ *
+ * @param ICachedMountInfo $info
+ *
+ * @return IMountPoint|null
+ */
+ public function getMountFromMountInfo(ICachedMountInfo $info): ?IMountPoint {
+ $this->setupManager->setupForPath($info->getMountPoint());
+ foreach ($this->mounts as $mount) {
+ if ($mount->getMountPoint() === $info->getMountPoint()) {
+ return $mount;
+ }
+ }
+ return null;
+ }
}