Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 61 additions & 55 deletions lib/private/Files/Config/MountProviderCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,60 +24,43 @@ class MountProviderCollection implements IMountProviderCollection, Emitter {
use EmitterTrait;

/**
* @var \OCP\Files\Config\IHomeMountProvider[]
* @var list<IHomeMountProvider>
*/
private $homeProviders = [];
private array $homeProviders = [];

/**
* @var \OCP\Files\Config\IMountProvider[]
* @var list<IMountProvider>
*/
private $providers = [];
private array $providers = [];

/** @var \OCP\Files\Config\IRootMountProvider[] */
private $rootProviders = [];
/** @var list<IRootMountProvider> */
private array $rootProviders = [];

/**
* @var \OCP\Files\Storage\IStorageFactory
*/
private $loader;

/**
* @var \OCP\Files\Config\IUserMountCache
*/
private $mountCache;

/** @var callable[] */
private $mountFilters = [];
/** @var list<callable> */
private array $mountFilters = [];

private IEventLogger $eventLogger;

/**
* @param \OCP\Files\Storage\IStorageFactory $loader
* @param IUserMountCache $mountCache
*/
public function __construct(
IStorageFactory $loader,
IUserMountCache $mountCache,
IEventLogger $eventLogger
private IStorageFactory $loader,
private IUserMountCache $mountCache,
private IEventLogger $eventLogger,
) {
$this->loader = $loader;
$this->mountCache = $mountCache;
$this->eventLogger = $eventLogger;
}

/**
* @return list<IMountPoint>
*/
private function getMountsFromProvider(IMountProvider $provider, IUser $user, IStorageFactory $loader): array {
$class = str_replace('\\', '_', get_class($provider));
$uid = $user->getUID();
$this->eventLogger->start('fs:setup:provider:' . $class, "Getting mounts from $class for $uid");
$mounts = $provider->getMountsForUser($user, $loader) ?? [];
$this->eventLogger->end('fs:setup:provider:' . $class);
return $mounts;
return array_values($mounts);
}

/**
* @param IUser $user
* @param IMountProvider[] $providers
* @return IMountPoint[]
* @param list<IMountProvider> $providers
* @return list<IMountPoint>
*/
private function getUserMountsForProviders(IUser $user, array $providers): array {
$loader = $this->loader;
Expand All @@ -90,10 +73,16 @@ private function getUserMountsForProviders(IUser $user, array $providers): array
return $this->filterMounts($user, $mounts);
}

/**
* @return list<IMountPoint>
*/
public function getMountsForUser(IUser $user): array {
return $this->getUserMountsForProviders($user, $this->providers);
}

/**
* @return list<IMountPoint>
*/
public function getUserMountsForProviderClasses(IUser $user, array $mountProviderClasses): array {
$providers = array_filter(
$this->providers,
Expand All @@ -102,7 +91,10 @@ public function getUserMountsForProviderClasses(IUser $user, array $mountProvide
return $this->getUserMountsForProviders($user, $providers);
}

public function addMountForUser(IUser $user, IMountManager $mountManager, ?callable $providerFilter = null) {
/**
* @return list<IMountPoint>
*/
public function addMountForUser(IUser $user, IMountManager $mountManager, ?callable $providerFilter = null): array {
// shared mount provider gets to go last since it needs to know existing files
// to check for name collisions
$firstMounts = [];
Expand Down Expand Up @@ -135,18 +127,15 @@ public function addMountForUser(IUser $user, IMountManager $mountManager, ?calla
array_walk($lateMounts, [$mountManager, 'addMount']);
$this->eventLogger->end('fs:setup:add-mounts');

return array_merge($lateMounts, $firstMounts);
return array_values(array_merge($lateMounts, $firstMounts));
}

/**
* Get the configured home mount for this user
*
* @param \OCP\IUser $user
* @return \OCP\Files\Mount\IMountPoint
* @since 9.1.0
*/
public function getHomeMountForUser(IUser $user) {
/** @var \OCP\Files\Config\IHomeMountProvider[] $providers */
public function getHomeMountForUser(IUser $user): IMountPoint {
$providers = array_reverse($this->homeProviders); // call the latest registered provider first to give apps an opportunity to overwrite builtin
foreach ($providers as $homeProvider) {
if ($mount = $homeProvider->getHomeMountForUser($user, $this->loader)) {
Expand All @@ -159,34 +148,36 @@ public function getHomeMountForUser(IUser $user) {

/**
* Add a provider for mount points
*
* @param \OCP\Files\Config\IMountProvider $provider
*/
public function registerProvider(IMountProvider $provider) {
public function registerProvider(IMountProvider $provider): void {
$this->providers[] = $provider;

$this->emit('\OC\Files\Config', 'registerMountProvider', [$provider]);
}

public function registerMountFilter(callable $filter) {
public function registerMountFilter(callable $filter): void {
$this->mountFilters[] = $filter;
}

private function filterMounts(IUser $user, array $mountPoints) {
return array_filter($mountPoints, function (IMountPoint $mountPoint) use ($user) {
/**
* @param list<IMountPoint> $mountPoints
* @return list<IMountPoint>
*/
private function filterMounts(IUser $user, array $mountPoints): array {
return array_values(array_filter($mountPoints, function (IMountPoint $mountPoint) use ($user) {
foreach ($this->mountFilters as $filter) {
if ($filter($mountPoint, $user) === false) {
return false;
}
}
return true;
});
}));
}

/**
* Add a provider for home mount points
*
* @param \OCP\Files\Config\IHomeMountProvider $provider
* @param IHomeMountProvider $provider
* @since 9.1.0
*/
public function registerHomeProvider(IHomeMountProvider $provider) {
Expand All @@ -196,21 +187,19 @@ public function registerHomeProvider(IHomeMountProvider $provider) {

/**
* Get the mount cache which can be used to search for mounts without setting up the filesystem
*
* @return IUserMountCache
*/
public function getMountCache() {
public function getMountCache(): IUserMountCache {
return $this->mountCache;
}

public function registerRootProvider(IRootMountProvider $provider) {
public function registerRootProvider(IRootMountProvider $provider): void {
$this->rootProviders[] = $provider;
}

/**
* Get all root mountpoints
*
* @return \OCP\Files\Mount\IMountPoint[]
* @return list<IMountPoint>
* @since 20.0.0
*/
public function getRootMounts(): array {
Expand All @@ -226,16 +215,33 @@ public function getRootMounts(): array {
throw new \Exception('No root mounts provided by any provider');
}

return $mounts;
return array_values($mounts);
}

public function clearProviders() {
public function clearProviders(): void {
$this->providers = [];
$this->homeProviders = [];
$this->rootProviders = [];
}

/**
* @return list<IMountProvider>
*/
public function getProviders(): array {
return $this->providers;
}

/**
* @return list<IHomeMountProvider>
*/
public function getHomeProviders(): array {
return $this->homeProviders;
}

/**
* @return list<IRootMountProvider>
*/
public function getRootProviders(): array {
return $this->rootProviders;
}
}
9 changes: 7 additions & 2 deletions lib/private/Files/SetupManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
use OCP\Files\Config\ICachedMountInfo;
use OCP\Files\Config\IHomeMountProvider;
use OCP\Files\Config\IMountProvider;
use OCP\Files\Config\IRootMountProvider;
use OCP\Files\Config\IUserMountCache;
use OCP\Files\Events\InvalidateMountCacheEvent;
use OCP\Files\Events\Node\FilesystemTornDownEvent;
Expand Down Expand Up @@ -275,9 +276,13 @@ private function afterUserFullySetup(IUser $user, array $previouslySetupProvider
$mounts = array_filter($mounts, function (IMountPoint $mount) use ($userRoot) {
return str_starts_with($mount->getMountPoint(), $userRoot);
});
$allProviders = array_map(function (IMountProvider $provider) {
$allProviders = array_map(function (IMountProvider|IHomeMountProvider|IRootMountProvider $provider) {
return get_class($provider);
}, $this->mountProviderCollection->getProviders());
}, array_merge(
$this->mountProviderCollection->getProviders(),
$this->mountProviderCollection->getHomeProviders(),
$this->mountProviderCollection->getRootProviders(),
));
$newProviders = array_diff($allProviders, $previouslySetupProviders);
$mounts = array_filter($mounts, function (IMountPoint $mount) use ($previouslySetupProviders) {
return !in_array($mount->getMountProvider(), $previouslySetupProviders);
Expand Down
Loading