mirror of
https://github.com/nextcloud/server.git
synced 2026-02-20 00:12:30 -05:00
Merge pull request #41119 from nextcloud/optmize-storage-wrappers
optimize builtin storage wrappers
This commit is contained in:
commit
b29bc59e8b
13 changed files with 123 additions and 33 deletions
|
|
@ -54,6 +54,7 @@ return array(
|
|||
'OCA\\Files_Sharing\\External\\Watcher' => $baseDir . '/../lib/External/Watcher.php',
|
||||
'OCA\\Files_Sharing\\Helper' => $baseDir . '/../lib/Helper.php',
|
||||
'OCA\\Files_Sharing\\Hooks' => $baseDir . '/../lib/Hooks.php',
|
||||
'OCA\\Files_Sharing\\ISharedMountPoint' => $baseDir . '/../lib/ISharedMountPoint.php',
|
||||
'OCA\\Files_Sharing\\ISharedStorage' => $baseDir . '/../lib/ISharedStorage.php',
|
||||
'OCA\\Files_Sharing\\Listener\\LoadAdditionalListener' => $baseDir . '/../lib/Listener/LoadAdditionalListener.php',
|
||||
'OCA\\Files_Sharing\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php',
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ class ComposerStaticInitFiles_Sharing
|
|||
'OCA\\Files_Sharing\\External\\Watcher' => __DIR__ . '/..' . '/../lib/External/Watcher.php',
|
||||
'OCA\\Files_Sharing\\Helper' => __DIR__ . '/..' . '/../lib/Helper.php',
|
||||
'OCA\\Files_Sharing\\Hooks' => __DIR__ . '/..' . '/../lib/Hooks.php',
|
||||
'OCA\\Files_Sharing\\ISharedMountPoint' => __DIR__ . '/..' . '/../lib/ISharedMountPoint.php',
|
||||
'OCA\\Files_Sharing\\ISharedStorage' => __DIR__ . '/..' . '/../lib/ISharedStorage.php',
|
||||
'OCA\\Files_Sharing\\Listener\\LoadAdditionalListener' => __DIR__ . '/..' . '/../lib/Listener/LoadAdditionalListener.php',
|
||||
'OCA\\Files_Sharing\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php',
|
||||
|
|
|
|||
3
apps/files_sharing/lib/External/Mount.php
vendored
3
apps/files_sharing/lib/External/Mount.php
vendored
|
|
@ -26,8 +26,9 @@ namespace OCA\Files_Sharing\External;
|
|||
|
||||
use OC\Files\Mount\MountPoint;
|
||||
use OC\Files\Mount\MoveableMount;
|
||||
use OCA\Files_Sharing\ISharedMountPoint;
|
||||
|
||||
class Mount extends MountPoint implements MoveableMount {
|
||||
class Mount extends MountPoint implements MoveableMount, ISharedMountPoint {
|
||||
|
||||
/**
|
||||
* @var \OCA\Files_Sharing\External\Manager
|
||||
|
|
|
|||
28
apps/files_sharing/lib/ISharedMountPoint.php
Normal file
28
apps/files_sharing/lib/ISharedMountPoint.php
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* 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
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Files_Sharing;
|
||||
|
||||
interface ISharedMountPoint {
|
||||
|
||||
}
|
||||
|
|
@ -44,7 +44,7 @@ use OCP\Share\Events\VerifyMountPointEvent;
|
|||
/**
|
||||
* Shared mount points can be moved by the user
|
||||
*/
|
||||
class SharedMount extends MountPoint implements MoveableMount {
|
||||
class SharedMount extends MountPoint implements MoveableMount, ISharedMountPoint {
|
||||
/**
|
||||
* @var \OCA\Files_Sharing\SharedStorage $storage
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1337,6 +1337,7 @@ return array(
|
|||
'OC\\Files\\Filesystem' => $baseDir . '/lib/private/Files/Filesystem.php',
|
||||
'OC\\Files\\Lock\\LockManager' => $baseDir . '/lib/private/Files/Lock/LockManager.php',
|
||||
'OC\\Files\\Mount\\CacheMountProvider' => $baseDir . '/lib/private/Files/Mount/CacheMountProvider.php',
|
||||
'OC\\Files\\Mount\\HomeMountPoint' => $baseDir . '/lib/private/Files/Mount/HomeMountPoint.php',
|
||||
'OC\\Files\\Mount\\LocalHomeMountProvider' => $baseDir . '/lib/private/Files/Mount/LocalHomeMountProvider.php',
|
||||
'OC\\Files\\Mount\\Manager' => $baseDir . '/lib/private/Files/Mount/Manager.php',
|
||||
'OC\\Files\\Mount\\MountPoint' => $baseDir . '/lib/private/Files/Mount/MountPoint.php',
|
||||
|
|
|
|||
|
|
@ -1370,6 +1370,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
|
|||
'OC\\Files\\Filesystem' => __DIR__ . '/../../..' . '/lib/private/Files/Filesystem.php',
|
||||
'OC\\Files\\Lock\\LockManager' => __DIR__ . '/../../..' . '/lib/private/Files/Lock/LockManager.php',
|
||||
'OC\\Files\\Mount\\CacheMountProvider' => __DIR__ . '/../../..' . '/lib/private/Files/Mount/CacheMountProvider.php',
|
||||
'OC\\Files\\Mount\\HomeMountPoint' => __DIR__ . '/../../..' . '/lib/private/Files/Mount/HomeMountPoint.php',
|
||||
'OC\\Files\\Mount\\LocalHomeMountProvider' => __DIR__ . '/../../..' . '/lib/private/Files/Mount/LocalHomeMountProvider.php',
|
||||
'OC\\Files\\Mount\\Manager' => __DIR__ . '/../../..' . '/lib/private/Files/Mount/Manager.php',
|
||||
'OC\\Files\\Mount\\MountPoint' => __DIR__ . '/../../..' . '/lib/private/Files/Mount/MountPoint.php',
|
||||
|
|
|
|||
|
|
@ -33,9 +33,10 @@
|
|||
*/
|
||||
namespace OC\Files;
|
||||
|
||||
use OCA\Files_Sharing\ISharedStorage;
|
||||
use OC\Files\Mount\HomeMountPoint;
|
||||
use OCA\Files_Sharing\External\Mount;
|
||||
use OCA\Files_Sharing\ISharedMountPoint;
|
||||
use OCP\Files\Cache\ICacheEntry;
|
||||
use OCP\Files\IHomeStorage;
|
||||
use OCP\Files\Mount\IMountPoint;
|
||||
use OCP\IUser;
|
||||
|
||||
|
|
@ -312,13 +313,12 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess {
|
|||
* @return bool
|
||||
*/
|
||||
public function isShared() {
|
||||
$storage = $this->getStorage();
|
||||
return $storage->instanceOfStorage(ISharedStorage::class);
|
||||
return $this->mount instanceof ISharedMountPoint;
|
||||
}
|
||||
|
||||
public function isMounted() {
|
||||
$storage = $this->getStorage();
|
||||
return !($storage->instanceOfStorage(IHomeStorage::class) || $storage->instanceOfStorage(ISharedStorage::class));
|
||||
$isHome = $this->mount instanceof HomeMountPoint;
|
||||
return !$isHome && !$this->isShared();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
49
lib/private/Files/Mount/HomeMountPoint.php
Normal file
49
lib/private/Files/Mount/HomeMountPoint.php
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* 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
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC\Files\Mount;
|
||||
|
||||
use OCP\Files\Storage\IStorageFactory;
|
||||
use OCP\IUser;
|
||||
|
||||
class HomeMountPoint extends MountPoint {
|
||||
private IUser $user;
|
||||
|
||||
public function __construct(
|
||||
IUser $user,
|
||||
$storage,
|
||||
string $mountpoint,
|
||||
array $arguments = null,
|
||||
IStorageFactory $loader = null,
|
||||
array $mountOptions = null,
|
||||
int $mountId = null,
|
||||
string $mountProvider = null
|
||||
) {
|
||||
parent::__construct($storage, $mountpoint, $arguments, $loader, $mountOptions, $mountId, $mountProvider);
|
||||
$this->user = $user;
|
||||
}
|
||||
|
||||
public function getUser(): IUser {
|
||||
return $this->user;
|
||||
}
|
||||
}
|
||||
|
|
@ -38,6 +38,6 @@ class LocalHomeMountProvider implements IHomeMountProvider {
|
|||
*/
|
||||
public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
|
||||
$arguments = ['user' => $user];
|
||||
return new MountPoint('\OC\Files\Storage\Home', '/' . $user->getUID(), $arguments, $loader, null, null, self::class);
|
||||
return new HomeMountPoint($user, '\OC\Files\Storage\Home', '/' . $user->getUID(), $arguments, $loader, null, null, self::class);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ class ObjectHomeMountProvider implements IHomeMountProvider {
|
|||
return null;
|
||||
}
|
||||
|
||||
return new MountPoint('\OC\Files\ObjectStore\HomeObjectStoreStorage', '/' . $user->getUID(), $config['arguments'], $loader, null, null, self::class);
|
||||
return new HomeMountPoint($user, '\OC\Files\ObjectStore\HomeObjectStoreStorage', '/' . $user->getUID(), $config['arguments'], $loader, null, null, self::class);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@ declare(strict_types=1);
|
|||
namespace OC\Files;
|
||||
|
||||
use OC\Files\Config\MountProviderCollection;
|
||||
use OC\Files\Mount\HomeMountPoint;
|
||||
use OC\Files\Mount\MountPoint;
|
||||
use OC\Files\ObjectStore\HomeObjectStoreStorage;
|
||||
use OC\Files\Storage\Common;
|
||||
use OC\Files\Storage\Home;
|
||||
use OC\Files\Storage\Storage;
|
||||
|
|
@ -39,7 +39,10 @@ use OC\Share20\ShareDisableChecker;
|
|||
use OC_App;
|
||||
use OC_Hook;
|
||||
use OC_Util;
|
||||
use OCA\Files_Sharing\ISharedStorage;
|
||||
use OCA\Files_External\Config\ConfigAdapter;
|
||||
use OCA\Files_Sharing\External\Mount;
|
||||
use OCA\Files_Sharing\ISharedMountPoint;
|
||||
use OCA\Files_Sharing\SharedMount;
|
||||
use OCP\Constants;
|
||||
use OCP\Diagnostics\IEventLogger;
|
||||
use OCP\EventDispatcher\IEventDispatcher;
|
||||
|
|
@ -117,7 +120,7 @@ class SetupManager {
|
|||
$prevLogging = Filesystem::logWarningWhenAddingStorageWrapper(false);
|
||||
|
||||
Filesystem::addStorageWrapper('mount_options', function ($mountPoint, IStorage $storage, IMountPoint $mount) {
|
||||
if ($storage->instanceOfStorage(Common::class)) {
|
||||
if ($mount->getOptions() && $storage->instanceOfStorage(Common::class)) {
|
||||
$storage->setMountOptions($mount->getOptions());
|
||||
}
|
||||
return $storage;
|
||||
|
|
@ -130,7 +133,7 @@ class SetupManager {
|
|||
'sharing_mask',
|
||||
function ($mountPoint, IStorage $storage, IMountPoint $mount) use ($reSharingEnabled, $sharingEnabledForUser) {
|
||||
$sharingEnabledForMount = $mount->getOption('enable_sharing', true);
|
||||
$isShared = $storage->instanceOfStorage(ISharedStorage::class);
|
||||
$isShared = $mount instanceof ISharedMountPoint;
|
||||
if (!$sharingEnabledForMount || !$sharingEnabledForUser || (!$reSharingEnabled && $isShared)) {
|
||||
return new PermissionsMask([
|
||||
'storage' => $storage,
|
||||
|
|
@ -142,35 +145,30 @@ class SetupManager {
|
|||
);
|
||||
|
||||
// install storage availability wrapper, before most other wrappers
|
||||
Filesystem::addStorageWrapper('oc_availability', function ($mountPoint, IStorage $storage) {
|
||||
if (!$storage->instanceOfStorage('\OCA\Files_Sharing\SharedStorage') && !$storage->isLocal()) {
|
||||
Filesystem::addStorageWrapper('oc_availability', function ($mountPoint, IStorage $storage, IMountPoint $mount) {
|
||||
$externalMount = $mount instanceof ConfigAdapter || $mount instanceof Mount;
|
||||
if ($externalMount && !$storage->isLocal()) {
|
||||
return new Availability(['storage' => $storage]);
|
||||
}
|
||||
return $storage;
|
||||
});
|
||||
|
||||
Filesystem::addStorageWrapper('oc_encoding', function ($mountPoint, IStorage $storage, IMountPoint $mount) {
|
||||
if ($mount->getOption('encoding_compatibility', false) && !$storage->instanceOfStorage('\OCA\Files_Sharing\SharedStorage')) {
|
||||
if ($mount->getOption('encoding_compatibility', false) && !$mount instanceof SharedMount) {
|
||||
return new Encoding(['storage' => $storage]);
|
||||
}
|
||||
return $storage;
|
||||
});
|
||||
|
||||
$quotaIncludeExternal = $this->config->getSystemValue('quota_include_external_storage', false);
|
||||
Filesystem::addStorageWrapper('oc_quota', function ($mountPoint, $storage) use ($quotaIncludeExternal) {
|
||||
Filesystem::addStorageWrapper('oc_quota', function ($mountPoint, $storage, IMountPoint $mount) use ($quotaIncludeExternal) {
|
||||
// set up quota for home storages, even for other users
|
||||
// which can happen when using sharing
|
||||
|
||||
/**
|
||||
* @var Storage $storage
|
||||
*/
|
||||
if ($storage->instanceOfStorage(HomeObjectStoreStorage::class) || $storage->instanceOfStorage(Home::class)) {
|
||||
if (is_object($storage->getUser())) {
|
||||
$user = $storage->getUser();
|
||||
return new Quota(['storage' => $storage, 'quotaCallback' => function () use ($user) {
|
||||
return OC_Util::getUserQuota($user);
|
||||
}, 'root' => 'files', 'include_external_storage' => $quotaIncludeExternal]);
|
||||
}
|
||||
if ($mount instanceof HomeMountPoint) {
|
||||
$user = $mount->getUser();
|
||||
return new Quota(['storage' => $storage, 'quotaCallback' => function () use ($user) {
|
||||
return OC_Util::getUserQuota($user);
|
||||
}, 'root' => 'files', 'include_external_storage' => $quotaIncludeExternal]);
|
||||
}
|
||||
|
||||
return $storage;
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@
|
|||
namespace Test\Files;
|
||||
|
||||
use OC\Files\FileInfo;
|
||||
use OC\Files\Mount\HomeMountPoint;
|
||||
use OC\Files\Mount\MountPoint;
|
||||
use OC\Files\Storage\Home;
|
||||
use OC\Files\Storage\Temporary;
|
||||
use OCP\IConfig;
|
||||
|
|
@ -33,19 +35,27 @@ class FileInfoTest extends TestCase {
|
|||
->willReturn('foo');
|
||||
$user->method('getHome')
|
||||
->willReturn('foo');
|
||||
$storage = new Home(['user' => $user]);
|
||||
|
||||
$fileInfo = new FileInfo(
|
||||
'',
|
||||
new Home(['user' => $user]),
|
||||
'', [], null);
|
||||
$storage,
|
||||
'',
|
||||
[],
|
||||
new HomeMountPoint($user, $storage, '/foo/files')
|
||||
);
|
||||
$this->assertFalse($fileInfo->isMounted());
|
||||
}
|
||||
|
||||
public function testIsMountedNonHomeStorage() {
|
||||
$storage = new Temporary();
|
||||
$fileInfo = new FileInfo(
|
||||
'',
|
||||
new Temporary(),
|
||||
'', [], null);
|
||||
$storage,
|
||||
'',
|
||||
[],
|
||||
new MountPoint($storage, '/foo/files/bar')
|
||||
);
|
||||
$this->assertTrue($fileInfo->isMounted());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue