Skip to content

Commit

Permalink
Merge pull request #40482 from nextcloud/fix/workflowengine_fileaccess
Browse files Browse the repository at this point in the history
  • Loading branch information
juliushaertl committed Oct 23, 2023
2 parents 8a1546c + 7441ce2 commit 45d7612
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 10 deletions.
36 changes: 28 additions & 8 deletions apps/workflowengine/lib/Entity/File.php
Expand Up @@ -7,6 +7,7 @@
*
* @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
*
Expand All @@ -26,18 +27,19 @@
*/
namespace OCA\WorkflowEngine\Entity;

use OC\Files\Config\UserMountCache;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\GenericEvent;
use OCP\Files\InvalidPathException;
use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountManager;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\IL10N;
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;
Expand All @@ -62,8 +64,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 */
Expand All @@ -74,23 +74,29 @@ class File implements IEntity, IDisplayText, IUrl, IIcon, IContextPortation {
private $actingUser = null;
/** @var IUserManager */
private $userManager;
/** @var UserMountCache */
private $userMountCache;
/** @var IMountManager */
private $mountManager;

public function __construct(
IL10N $l10n,
IURLGenerator $urlGenerator,
IRootFolder $root,
ShareManager $shareManager,
IUserSession $userSession,
ISystemTagManager $tagManager,
IUserManager $userManager
IUserManager $userManager,
UserMountCache $userMountCache,
IMountManager $mountManager
) {
$this->l10n = $l10n;
$this->urlGenerator = $urlGenerator;
$this->root = $root;
$this->shareManager = $shareManager;
$this->userSession = $userSession;
$this->tagManager = $tagManager;
$this->userManager = $userManager;
$this->userMountCache = $userMountCache;
$this->mountManager = $mountManager;
}

public function getName(): string {
Expand Down Expand Up @@ -135,8 +141,22 @@ public function isLegitimatedForUserId(string $uid): bool {
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->getParentId();
} 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;
}
Expand Down
5 changes: 4 additions & 1 deletion apps/workflowengine/tests/ManagerTest.php
Expand Up @@ -26,6 +26,7 @@
*/
namespace OCA\WorkflowEngine\Tests;

use OC\Files\Config\UserMountCache;
use OC\L10N\L10N;
use OCA\WorkflowEngine\Entity\File;
use OCA\WorkflowEngine\Helper\ScopeContext;
Expand All @@ -34,6 +35,7 @@
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\Events\Node\NodeCreatedEvent;
use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountManager;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IConfig;
Expand Down Expand Up @@ -403,10 +405,11 @@ public function testUpdateOperation() {
$this->l,
$this->createMock(IURLGenerator::class),
$this->createMock(IRootFolder::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(IMountManager::class),
])
->setMethodsExcept(['getEvents'])
->getMock();
Expand Down
2 changes: 1 addition & 1 deletion lib/private/Files/Config/UserMountCache.php
Expand Up @@ -463,7 +463,7 @@ public function getMountForPath(IUser $user, string $path): ICachedMountInfo {
}, $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) {
Expand Down
19 changes: 19 additions & 0 deletions lib/private/Files/Mount/Manager.php
Expand Up @@ -10,6 +10,7 @@
* @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
*
Expand All @@ -33,6 +34,7 @@
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;
Expand Down Expand Up @@ -226,4 +228,21 @@ public function getMountsByMountProvider(string $path, array $mountProviders) {
});
}
}

/**
* 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;
}
}
12 changes: 12 additions & 0 deletions lib/public/Files/Mount/IMountManager.php
Expand Up @@ -26,6 +26,8 @@
*/
namespace OCP\Files\Mount;

use OCP\Files\Config\ICachedMountInfo;

/**
* Interface IMountManager
*
Expand Down Expand Up @@ -106,4 +108,14 @@ public function getAll(): array;
* @since 8.2.0
*/
public function findByNumericId(int $id): array;

/**
* Return the mount matching a cached mount info (or mount file info)
*
* @param ICachedMountInfo $info
*
* @return IMountPoint|null
* @since 28.0.0
*/
public function getMountFromMountInfo(ICachedMountInfo $info): ?IMountPoint;
}

0 comments on commit 45d7612

Please sign in to comment.