mirror of
https://github.com/nextcloud/server.git
synced 2026-05-28 04:32:30 -04:00
Merge pull request #40482 from nextcloud/fix/workflowengine_fileaccess
This commit is contained in:
commit
45d7612423
5 changed files with 64 additions and 10 deletions
|
|
@ -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,10 +27,12 @@ declare(strict_types=1);
|
|||
*/
|
||||
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;
|
||||
|
|
@ -37,7 +40,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;
|
||||
|
|
@ -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 */
|
||||
|
|
@ -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 {
|
||||
|
|
@ -135,8 +141,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->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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -34,6 +35,7 @@ use OCP\AppFramework\QueryException;
|
|||
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;
|
||||
|
|
@ -403,10 +405,11 @@ class ManagerTest extends TestCase {
|
|||
$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();
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,8 @@ declare(strict_types=1);
|
|||
*/
|
||||
namespace OCP\Files\Mount;
|
||||
|
||||
use OCP\Files\Config\ICachedMountInfo;
|
||||
|
||||
/**
|
||||
* Interface IMountManager
|
||||
*
|
||||
|
|
@ -106,4 +108,14 @@ interface IMountManager {
|
|||
* @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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue