aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/files/config
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/files/config')
-rw-r--r--lib/private/files/config/cachedmountinfo.php107
-rw-r--r--lib/private/files/config/mountprovidercollection.php108
-rw-r--r--lib/private/files/config/usermountcache.php297
-rw-r--r--lib/private/files/config/usermountcachelistener.php48
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']);
- }
-}