diff options
Diffstat (limited to 'lib/private/files/config')
-rw-r--r-- | lib/private/files/config/cachedmountinfo.php | 107 | ||||
-rw-r--r-- | lib/private/files/config/mountprovidercollection.php | 108 | ||||
-rw-r--r-- | lib/private/files/config/usermountcache.php | 297 | ||||
-rw-r--r-- | lib/private/files/config/usermountcachelistener.php | 48 |
4 files changed, 0 insertions, 560 deletions
diff --git a/lib/private/files/config/cachedmountinfo.php b/lib/private/files/config/cachedmountinfo.php deleted file mode 100644 index 2993c979a7f..00000000000 --- a/lib/private/files/config/cachedmountinfo.php +++ /dev/null @@ -1,107 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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/> - * - */ - -namespace OC\Files\Config; - -use OC\Files\Filesystem; -use OCP\Files\Config\ICachedMountInfo; -use OCP\Files\Node; -use OCP\IUser; - -class CachedMountInfo implements ICachedMountInfo { - /** - * @var IUser - */ - private $user; - - /** - * @var int - */ - private $storageId; - - /** - * @var int - */ - private $rootId; - - /** - * @var string - */ - private $mountPoint; - - /** - * CachedMountInfo constructor. - * - * @param IUser $user - * @param int $storageId - * @param int $rootId - * @param string $mountPoint - */ - public function __construct(IUser $user, $storageId, $rootId, $mountPoint) { - $this->user = $user; - $this->storageId = $storageId; - $this->rootId = $rootId; - $this->mountPoint = $mountPoint; - } - - /** - * @return IUser - */ - public function getUser() { - return $this->user; - } - - /** - * @return int the numeric storage id of the mount - */ - public function getStorageId() { - return $this->storageId; - } - - /** - * @return int the fileid of the root of the mount - */ - public function getRootId() { - return $this->rootId; - } - - /** - * @return Node the root node of the mount - */ - public function getMountPointNode() { - // TODO injection etc - Filesystem::initMountPoints($this->user->getUID()); - $userNode = \OC::$server->getUserFolder($this->user->getUID()); - $nodes = $userNode->getById($this->rootId); - if (count($nodes) > 0) { - return $nodes[0]; - } else { - return null; - } - } - - /** - * @return string the mount point of the mount for the user - */ - public function getMountPoint() { - return $this->mountPoint; - } -} diff --git a/lib/private/files/config/mountprovidercollection.php b/lib/private/files/config/mountprovidercollection.php deleted file mode 100644 index 499fa576fbc..00000000000 --- a/lib/private/files/config/mountprovidercollection.php +++ /dev/null @@ -1,108 +0,0 @@ -<?php -/** - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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/> - * - */ - -namespace OC\Files\Config; - -use OC\Hooks\Emitter; -use OC\Hooks\EmitterTrait; -use OCP\Files\Config\IMountProviderCollection; -use OCP\Files\Config\IMountProvider; -use OCP\Files\Config\IUserMountCache; -use OCP\Files\Mount\IMountPoint; -use OCP\Files\Storage\IStorageFactory; -use OCP\IUser; - -class MountProviderCollection implements IMountProviderCollection, Emitter { - use EmitterTrait; - - /** - * @var \OCP\Files\Config\IMountProvider[] - */ - private $providers = array(); - - /** - * @var \OCP\Files\Storage\IStorageFactory - */ - private $loader; - - /** - * @var \OCP\Files\Config\IUserMountCache - */ - private $mountCache; - - /** - * @param \OCP\Files\Storage\IStorageFactory $loader - * @param IUserMountCache $mountCache - */ - public function __construct(IStorageFactory $loader, IUserMountCache $mountCache) { - $this->loader = $loader; - $this->mountCache = $mountCache; - } - - /** - * Get all configured mount points for the user - * - * @param \OCP\IUser $user - * @return \OCP\Files\Mount\IMountPoint[] - */ - public function getMountsForUser(IUser $user) { - $loader = $this->loader; - $mounts = array_map(function (IMountProvider $provider) use ($user, $loader) { - return $provider->getMountsForUser($user, $loader); - }, $this->providers); - $mounts = array_filter($mounts, function ($result) { - return is_array($result); - }); - return array_reduce($mounts, function (array $mounts, array $providerMounts) { - return array_merge($mounts, $providerMounts); - }, array()); - } - - /** - * Add a provider for mount points - * - * @param \OCP\Files\Config\IMountProvider $provider - */ - public function registerProvider(IMountProvider $provider) { - $this->providers[] = $provider; - $this->emit('\OC\Files\Config', 'registerMountProvider', [$provider]); - } - - /** - * Cache mounts for user - * - * @param IUser $user - * @param IMountPoint[] $mountPoints - */ - public function registerMounts(IUser $user, array $mountPoints) { - $this->mountCache->registerMounts($user, $mountPoints); - } - - /** - * Get the mount cache which can be used to search for mounts without setting up the filesystem - * - * @return IUserMountCache - */ - public function getMountCache() { - return $this->mountCache; - } -} diff --git a/lib/private/files/config/usermountcache.php b/lib/private/files/config/usermountcache.php deleted file mode 100644 index 78b19972787..00000000000 --- a/lib/private/files/config/usermountcache.php +++ /dev/null @@ -1,297 +0,0 @@ -<?php -/** - * @author Joas Schilling <nickvergessen@owncloud.com> - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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/> - * - */ - -namespace OC\Files\Config; - -use Doctrine\DBAL\Exception\UniqueConstraintViolationException; -use OC\Files\Filesystem; -use OCA\Files_Sharing\SharedMount; -use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\Files\Config\ICachedMountInfo; -use OCP\Files\Config\IUserMountCache; -use OCP\Files\Mount\IMountPoint; -use OCP\Files\NotFoundException; -use OCP\ICache; -use OCP\IDBConnection; -use OCP\ILogger; -use OCP\IUser; -use OCP\IUserManager; - -/** - * Cache mounts points per user in the cache so we can easilly look them up - */ -class UserMountCache implements IUserMountCache { - /** - * @var IDBConnection - */ - private $connection; - - /** - * @var IUserManager - */ - private $userManager; - - /** @var ICachedMountInfo[][] [$userId => [$cachedMountInfo, ....], ...] */ - private $mountsForUsers = []; - - /** - * @var ILogger - */ - private $logger; - - private $cacheInfoCache = []; - - /** - * UserMountCache constructor. - * - * @param IDBConnection $connection - * @param IUserManager $userManager - * @param ILogger $logger - */ - public function __construct(IDBConnection $connection, IUserManager $userManager, ILogger $logger) { - $this->connection = $connection; - $this->userManager = $userManager; - $this->logger = $logger; - } - - public function registerMounts(IUser $user, array $mounts) { - // filter out non-proper storages coming from unit tests - $mounts = array_filter($mounts, function (IMountPoint $mount) { - return $mount instanceof SharedMount || $mount->getStorage() && $mount->getStorage()->getCache(); - }); - /** @var ICachedMountInfo[] $newMounts */ - $newMounts = array_map(function (IMountPoint $mount) use ($user) { - $storage = $mount->getStorage(); - if ($storage->instanceOfStorage('\OC\Files\Storage\Shared')) { - $rootId = (int)$storage->getShare()['file_source']; - } else { - $rootId = (int)$storage->getCache()->getId(''); - } - $storageId = (int)$storage->getStorageCache()->getNumericId(); - // filter out any storages which aren't scanned yet since we aren't interested in files from those storages (yet) - if ($rootId === -1) { - return null; - } else { - return new CachedMountInfo($user, $storageId, $rootId, $mount->getMountPoint()); - } - }, $mounts); - $newMounts = array_values(array_filter($newMounts)); - - $cachedMounts = $this->getMountsForUser($user); - $mountDiff = function (ICachedMountInfo $mount1, ICachedMountInfo $mount2) { - // since we are only looking for mounts for a specific user comparing on root id is enough - return $mount1->getRootId() - $mount2->getRootId(); - }; - - /** @var ICachedMountInfo[] $addedMounts */ - $addedMounts = array_udiff($newMounts, $cachedMounts, $mountDiff); - /** @var ICachedMountInfo[] $removedMounts */ - $removedMounts = array_udiff($cachedMounts, $newMounts, $mountDiff); - - $changedMounts = array_uintersect($newMounts, $cachedMounts, function (ICachedMountInfo $mount1, ICachedMountInfo $mount2) { - // filter mounts with the same root id and different mountpoints - if ($mount1->getRootId() !== $mount2->getRootId()) { - return -1; - } - return ($mount1->getMountPoint() !== $mount2->getMountPoint()) ? 0 : 1; - }); - - foreach ($addedMounts as $mount) { - $this->addToCache($mount); - $this->mountsForUsers[$user->getUID()][] = $mount; - } - foreach ($removedMounts as $mount) { - $this->removeFromCache($mount); - $index = array_search($mount, $this->mountsForUsers[$user->getUID()]); - unset($this->mountsForUsers[$user->getUID()][$index]); - } - foreach ($changedMounts as $mount) { - $this->setMountPoint($mount); - } - } - - private function addToCache(ICachedMountInfo $mount) { - $this->connection->insertIfNotExist('*PREFIX*mounts', [ - 'storage_id' => $mount->getStorageId(), - 'root_id' => $mount->getRootId(), - 'user_id' => $mount->getUser()->getUID(), - 'mount_point' => $mount->getMountPoint() - ], ['root_id', 'user_id']); - } - - private function setMountPoint(ICachedMountInfo $mount) { - $builder = $this->connection->getQueryBuilder(); - - $query = $builder->update('mounts') - ->set('mount_point', $builder->createNamedParameter($mount->getMountPoint())) - ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($mount->getUser()->getUID()))) - ->andWhere($builder->expr()->eq('root_id', $builder->createNamedParameter($mount->getRootId(), IQueryBuilder::PARAM_INT))); - - $query->execute(); - } - - private function removeFromCache(ICachedMountInfo $mount) { - $builder = $this->connection->getQueryBuilder(); - - $query = $builder->delete('mounts') - ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($mount->getUser()->getUID()))) - ->andWhere($builder->expr()->eq('root_id', $builder->createNamedParameter($mount->getRootId(), IQueryBuilder::PARAM_INT))); - $query->execute(); - } - - private function dbRowToMountInfo(array $row) { - $user = $this->userManager->get($row['user_id']); - return new CachedMountInfo($user, (int)$row['storage_id'], (int)$row['root_id'], $row['mount_point']); - } - - /** - * @param IUser $user - * @return ICachedMountInfo[] - */ - public function getMountsForUser(IUser $user) { - if (!isset($this->mountsForUsers[$user->getUID()])) { - $builder = $this->connection->getQueryBuilder(); - $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point') - ->from('mounts') - ->where($builder->expr()->eq('user_id', $builder->createPositionalParameter($user->getUID()))); - - $rows = $query->execute()->fetchAll(); - - $this->mountsForUsers[$user->getUID()] = array_map([$this, 'dbRowToMountInfo'], $rows); - } - return $this->mountsForUsers[$user->getUID()]; - } - - /** - * @param int $numericStorageId - * @return CachedMountInfo[] - */ - public function getMountsForStorageId($numericStorageId) { - $builder = $this->connection->getQueryBuilder(); - $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point') - ->from('mounts') - ->where($builder->expr()->eq('storage_id', $builder->createPositionalParameter($numericStorageId, IQueryBuilder::PARAM_INT))); - - $rows = $query->execute()->fetchAll(); - - return array_map([$this, 'dbRowToMountInfo'], $rows); - } - - /** - * @param int $rootFileId - * @return CachedMountInfo[] - */ - public function getMountsForRootId($rootFileId) { - $builder = $this->connection->getQueryBuilder(); - $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point') - ->from('mounts') - ->where($builder->expr()->eq('root_id', $builder->createPositionalParameter($rootFileId, IQueryBuilder::PARAM_INT))); - - $rows = $query->execute()->fetchAll(); - - return array_map([$this, 'dbRowToMountInfo'], $rows); - } - - /** - * @param $fileId - * @return array - * @throws \OCP\Files\NotFoundException - */ - private function getCacheInfoFromFileId($fileId) { - if (!isset($this->cacheInfoCache[$fileId])) { - $builder = $this->connection->getQueryBuilder(); - $query = $builder->select('storage', 'path') - ->from('filecache') - ->where($builder->expr()->eq('fileid', $builder->createNamedParameter($fileId, IQueryBuilder::PARAM_INT))); - - $row = $query->execute()->fetch(); - if (is_array($row)) { - $this->cacheInfoCache[$fileId] = [ - (int)$row['storage'], - $row['path'] - ]; - } else { - throw new NotFoundException('File with id "' . $fileId . '" not found'); - } - } - return $this->cacheInfoCache[$fileId]; - } - - /** - * @param int $fileId - * @return ICachedMountInfo[] - * @since 9.0.0 - */ - public function getMountsForFileId($fileId) { - try { - list($storageId, $internalPath) = $this->getCacheInfoFromFileId($fileId); - } catch (NotFoundException $e) { - return []; - } - $mountsForStorage = $this->getMountsForStorageId($storageId); - - // filter mounts that are from the same storage but a different directory - return array_filter($mountsForStorage, function (ICachedMountInfo $mount) use ($internalPath, $fileId) { - if ($fileId === $mount->getRootId()) { - return true; - } - try { - list(, $internalMountPath) = $this->getCacheInfoFromFileId($mount->getRootId()); - } catch (NotFoundException $e) { - return false; - } - - return $internalMountPath === '' || substr($internalPath, 0, strlen($internalMountPath) + 1) === $internalMountPath . '/'; - }); - - } - - /** - * Remove all cached mounts for a user - * - * @param IUser $user - */ - public function removeUserMounts(IUser $user) { - $builder = $this->connection->getQueryBuilder(); - - $query = $builder->delete('mounts') - ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($user->getUID()))); - $query->execute(); - } - - public function removeUserStorageMount($storageId, $userId) { - $builder = $this->connection->getQueryBuilder(); - - $query = $builder->delete('mounts') - ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($userId))) - ->andWhere($builder->expr()->eq('storage_id', $builder->createNamedParameter($storageId, IQueryBuilder::PARAM_INT))); - $query->execute(); - } - - public function remoteStorageMounts($storageId) { - $builder = $this->connection->getQueryBuilder(); - - $query = $builder->delete('mounts') - ->where($builder->expr()->eq('storage_id', $builder->createNamedParameter($storageId, IQueryBuilder::PARAM_INT))); - $query->execute(); - } -} diff --git a/lib/private/files/config/usermountcachelistener.php b/lib/private/files/config/usermountcachelistener.php deleted file mode 100644 index 99673cf6285..00000000000 --- a/lib/private/files/config/usermountcachelistener.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php -/** - * @author Robin Appelman <icewind@owncloud.com> - * - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @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/> - * - */ - -namespace OC\Files\Config; - -use OC\User\Manager; -use OCP\Files\Config\IUserMountCache; - -/** - * Listen to hooks and update the mount cache as needed - */ -class UserMountCacheListener { - /** - * @var IUserMountCache - */ - private $userMountCache; - - /** - * UserMountCacheListener constructor. - * - * @param IUserMountCache $userMountCache - */ - public function __construct(IUserMountCache $userMountCache) { - $this->userMountCache = $userMountCache; - } - - public function listen(Manager $manager) { - $manager->listen('\OC\User', 'postDelete', [$this->userMountCache, 'removeUserMounts']); - } -} |