Skip to content

Commit 28f38a0

Browse files
committed
fix: drop set up partial mounts on setupForUser
Signed-off-by: Salvatore Martire <[email protected]>
1 parent 147446b commit 28f38a0

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

lib/private/Files/SetupManager.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ public function setupForUser(IUser $user): void {
236236

237237
$this->eventLogger->start('fs:setup:user:full', 'Setup full filesystem for user');
238238

239+
$this->dropPartialMountsForUser($user);
240+
239241
$this->setupUserMountProviders[$user->getUID()] ??= [];
240242
$previouslySetupProviders = $this->setupUserMountProviders[$user->getUID()];
241243

@@ -656,6 +658,7 @@ public function setupForProvider(string $path, array $providers): void {
656658
$this->eventLogger->end('fs:setup:user:providers');
657659
return;
658660
} else {
661+
$this->dropPartialMountsForUser($user, $providers);
659662
$this->setupUserMountProviders[$user->getUID()] = array_merge($setupProviders, $providers);
660663
$mounts = $this->mountProviderCollection->getUserMountsForProviderClasses($user, $providers);
661664
}
@@ -739,4 +742,39 @@ private function registerMounts(IUser $user, array $mounts, ?array $mountProvide
739742
$this->userMountCache->registerMounts($user, $mounts, $mountProviderClasses);
740743
}
741744
}
745+
746+
/**
747+
* Drops partially set-up mounts for the given user
748+
* @param class-string<IMountProvider>[] $providers
749+
*/
750+
public function dropPartialMountsForUser(IUser $user, array $providers = []): void {
751+
// mounts are cached by mount-point
752+
$mounts = $this->mountManager->getAll();
753+
$partialMounts = array_filter($this->setupMountProviderPaths,
754+
static function (string $mountPoint) use (
755+
$providers,
756+
$user,
757+
$mounts
758+
) {
759+
$userMount = str_starts_with($mountPoint, '/' . $user->getUID() . '/files');
760+
761+
if (!$userMount) {
762+
return false;
763+
}
764+
765+
$mountProvider = ($mounts[$mountPoint] ?? null)?->getMountProvider();
766+
767+
return empty($providers)
768+
|| \in_array($mountProvider, $providers, true);
769+
},
770+
ARRAY_FILTER_USE_KEY);
771+
772+
if (!empty($partialMounts)) {
773+
// remove partially set up mounts
774+
foreach ($partialMounts as $mountPoint => $_mount) {
775+
$this->mountManager->removeMount($mountPoint);
776+
unset($this->setupMountProviderPaths[$mountPoint]);
777+
}
778+
}
779+
}
742780
}

0 commit comments

Comments
 (0)