diff --git a/apps/files/lib/Command/Mount/ListMounts.php b/apps/files/lib/Command/Mount/ListMounts.php index 487e769ad2c94..b4abeac5ab8af 100644 --- a/apps/files/lib/Command/Mount/ListMounts.php +++ b/apps/files/lib/Command/Mount/ListMounts.php @@ -8,18 +8,17 @@ namespace OCA\Files\Command\Mount; -use OC\Core\Command\Base; use OCP\Files\Config\ICachedMountInfo; use OCP\Files\Config\IMountProviderCollection; use OCP\Files\Config\IUserMountCache; use OCP\Files\Mount\IMountPoint; use OCP\IUserManager; +use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; -class ListMounts extends Base { +class ListMounts extends Command { public function __construct( private readonly IUserManager $userManager, private readonly IUserMountCache $userMountCache, @@ -29,81 +28,52 @@ public function __construct( } protected function configure(): void { - parent::configure(); $this ->setName('files:mount:list') ->setDescription('List of mounts for a user') - ->addArgument('user', InputArgument::REQUIRED, 'User to list mounts for') - ->addOption('cached-only', null, InputOption::VALUE_NONE, 'Only return cached mounts, prevents filesystem setup'); + ->addArgument('user', InputArgument::REQUIRED, 'User to list mounts for'); } public function execute(InputInterface $input, OutputInterface $output): int { $userId = $input->getArgument('user'); - $cachedOnly = $input->getOption('cached-only'); $user = $this->userManager->get($userId); if (!$user) { $output->writeln("User $userId not found"); return 1; } - if ($cachedOnly) { - $mounts = []; - } else { - $mounts = $this->mountProviderCollection->getMountsForUser($user); - $mounts[] = $this->mountProviderCollection->getHomeMountForUser($user); - } - /** @var array $cachedByMountPoint */ - $mountsByMountPoint = array_combine(array_map(fn (IMountPoint $mount) => $mount->getMountPoint(), $mounts), $mounts); + $mounts = $this->mountProviderCollection->getMountsForUser($user); + $mounts[] = $this->mountProviderCollection->getHomeMountForUser($user); + /** @var array $cachedByMountpoint */ + $mountsByMountpoint = array_combine(array_map(fn (IMountPoint $mount) => $mount->getMountPoint(), $mounts), $mounts); usort($mounts, fn (IMountPoint $a, IMountPoint $b) => $a->getMountPoint() <=> $b->getMountPoint()); $cachedMounts = $this->userMountCache->getMountsForUser($user); usort($cachedMounts, fn (ICachedMountInfo $a, ICachedMountInfo $b) => $a->getMountPoint() <=> $b->getMountPoint()); /** @var array $cachedByMountpoint */ - $cachedByMountPoint = array_combine(array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $cachedMounts), $cachedMounts); - - $format = $input->getOption('output'); + $cachedByMountpoint = array_combine(array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $cachedMounts), $cachedMounts); - if ($format === self::OUTPUT_FORMAT_PLAIN) { - foreach ($mounts as $mount) { - $output->writeln('' . $mount->getMountPoint() . ': ' . $mount->getStorageId()); - if (isset($cachedByMountPoint[$mount->getMountPoint()])) { - $cached = $cachedByMountPoint[$mount->getMountPoint()]; - $output->writeln("\t- provider: " . $cached->getMountProvider()); - $output->writeln("\t- storage id: " . $cached->getStorageId()); - $output->writeln("\t- root id: " . $cached->getRootId()); - } else { - $output->writeln("\tnot registered"); - } + foreach ($mounts as $mount) { + $output->writeln('' . $mount->getMountPoint() . ': ' . $mount->getStorageId()); + if (isset($cachedByMountpoint[$mount->getMountPoint()])) { + $cached = $cachedByMountpoint[$mount->getMountPoint()]; + $output->writeln("\t- provider: " . $cached->getMountProvider()); + $output->writeln("\t- storage id: " . $cached->getStorageId()); + $output->writeln("\t- root id: " . $cached->getRootId()); + } else { + $output->writeln("\tnot registered"); } - foreach ($cachedMounts as $cachedMount) { - if ($cachedOnly || !isset($mountsByMountPoint[$cachedMount->getMountPoint()])) { - $output->writeln('' . $cachedMount->getMountPoint() . ':'); - if (!$cachedOnly) { - $output->writeln("\tregistered but no longer provided"); - } - $output->writeln("\t- provider: " . $cachedMount->getMountProvider()); - $output->writeln("\t- storage id: " . $cachedMount->getStorageId()); - $output->writeln("\t- root id: " . $cachedMount->getRootId()); - } + } + foreach ($cachedMounts as $cachedMount) { + if (!isset($mountsByMountpoint[$cachedMount->getMountPoint()])) { + $output->writeln('' . $cachedMount->getMountPoint() . ':'); + $output->writeln("\tregistered but no longer provided"); + $output->writeln("\t- provider: " . $cachedMount->getMountProvider()); + $output->writeln("\t- storage id: " . $cachedMount->getStorageId()); + $output->writeln("\t- root id: " . $cachedMount->getRootId()); } - } else { - $cached = array_map(fn (ICachedMountInfo $cachedMountInfo) => [ - 'mountpoint' => $cachedMountInfo->getMountPoint(), - 'provider' => $cachedMountInfo->getMountProvider(), - 'storage_id' => $cachedMountInfo->getStorageId(), - 'root_id' => $cachedMountInfo->getRootId(), - ], $cachedMounts); - $provided = array_map(fn (IMountPoint $cachedMountInfo) => [ - 'mountpoint' => $cachedMountInfo->getMountPoint(), - 'provider' => $cachedMountInfo->getMountProvider(), - 'storage_id' => $cachedMountInfo->getStorageId(), - 'root_id' => $cachedMountInfo->getStorageRootId(), - ], $mounts); - $this->writeArrayInOutputFormat($input, $output, array_filter([ - 'cached' => $cached, - 'provided' => $cachedOnly ? null : $provided, - ])); } + return 0; } diff --git a/apps/files/lib/Service/OwnershipTransferService.php b/apps/files/lib/Service/OwnershipTransferService.php index 3864710ba3d88..4df53d7d6c4d0 100644 --- a/apps/files/lib/Service/OwnershipTransferService.php +++ b/apps/files/lib/Service/OwnershipTransferService.php @@ -19,7 +19,6 @@ use OCA\Files_External\Config\ConfigAdapter; use OCA\GroupFolders\Mount\GroupMountPoint; use OCP\Encryption\IManager as IEncryptionManager; -use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Config\IHomeMountProvider; use OCP\Files\Config\IUserMountCache; use OCP\Files\File; @@ -32,7 +31,6 @@ use OCP\IUserManager; use OCP\L10N\IFactory; use OCP\Server; -use OCP\Share\Events\ShareTransferredEvent; use OCP\Share\IManager as IShareManager; use OCP\Share\IShare; use Symfony\Component\Console\Helper\ProgressBar; @@ -55,7 +53,6 @@ public function __construct( private IUserManager $userManager, private IFactory $l10nFactory, private IRootFolder $rootFolder, - private IEventDispatcher $eventDispatcher, ) { } @@ -570,23 +567,20 @@ private function restoreShares( } catch (\Throwable $e) { $output->writeln('Could not restore share with id ' . $share->getId() . ':' . $e->getMessage() . ' : ' . $e->getTraceAsString() . ''); } - $this->eventDispatcher->dispatchTyped(new ShareTransferredEvent($share)); $progress->advance(); } $progress->finish(); $output->writeln(''); } - private function transferIncomingShares( - string $sourceUid, + private function transferIncomingShares(string $sourceUid, string $destinationUid, array $sourceShares, array $destinationShares, OutputInterface $output, string $path, string $finalTarget, - bool $move, - ): void { + bool $move): void { $output->writeln('Restoring incoming shares ...'); $progress = new ProgressBar($output, count($sourceShares)); $prefix = "$destinationUid/files"; @@ -625,11 +619,8 @@ private function transferIncomingShares( if ($move) { continue; } - $oldMountPoint = $this->getShareMountPoint($destinationUid, $share->getTarget()); - $newMountPoint = $this->getShareMountPoint($destinationUid, $shareTarget); $share->setTarget($shareTarget); $this->shareManager->moveShare($share, $destinationUid); - $this->mountManager->moveMount($oldMountPoint, $newMountPoint); continue; } $this->shareManager->deleteShare($share); @@ -647,11 +638,8 @@ private function transferIncomingShares( if ($move) { continue; } - $oldMountPoint = $this->getShareMountPoint($destinationUid, $share->getTarget()); - $newMountPoint = $this->getShareMountPoint($destinationUid, $shareTarget); $share->setTarget($shareTarget); $this->shareManager->moveShare($share, $destinationUid); - $this->mountManager->moveMount($oldMountPoint, $newMountPoint); continue; } } catch (NotFoundException $e) { @@ -664,8 +652,4 @@ private function transferIncomingShares( $progress->finish(); $output->writeln(''); } - - private function getShareMountPoint(string $uid, string $target): string { - return '/' . $uid . '/files/' . trim($target, '/') . '/'; - } } diff --git a/apps/files_sharing/composer/composer/autoload_classmap.php b/apps/files_sharing/composer/composer/autoload_classmap.php index 138746aad8f83..6750f63164d97 100644 --- a/apps/files_sharing/composer/composer/autoload_classmap.php +++ b/apps/files_sharing/composer/composer/autoload_classmap.php @@ -70,9 +70,7 @@ 'OCA\\Files_Sharing\\Listener\\LoadPublicFileRequestAuthListener' => $baseDir . '/../lib/Listener/LoadPublicFileRequestAuthListener.php', 'OCA\\Files_Sharing\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php', 'OCA\\Files_Sharing\\Listener\\ShareInteractionListener' => $baseDir . '/../lib/Listener/ShareInteractionListener.php', - 'OCA\\Files_Sharing\\Listener\\SharesUpdatedListener' => $baseDir . '/../lib/Listener/SharesUpdatedListener.php', 'OCA\\Files_Sharing\\Listener\\UserAddedToGroupListener' => $baseDir . '/../lib/Listener/UserAddedToGroupListener.php', - 'OCA\\Files_Sharing\\Listener\\UserHomeSetupListener' => $baseDir . '/../lib/Listener/UserHomeSetupListener.php', 'OCA\\Files_Sharing\\Listener\\UserShareAcceptanceListener' => $baseDir . '/../lib/Listener/UserShareAcceptanceListener.php', 'OCA\\Files_Sharing\\Middleware\\OCSShareAPIMiddleware' => $baseDir . '/../lib/Middleware/OCSShareAPIMiddleware.php', 'OCA\\Files_Sharing\\Middleware\\ShareInfoMiddleware' => $baseDir . '/../lib/Middleware/ShareInfoMiddleware.php', @@ -99,7 +97,6 @@ 'OCA\\Files_Sharing\\Settings\\Personal' => $baseDir . '/../lib/Settings/Personal.php', 'OCA\\Files_Sharing\\ShareBackend\\File' => $baseDir . '/../lib/ShareBackend/File.php', 'OCA\\Files_Sharing\\ShareBackend\\Folder' => $baseDir . '/../lib/ShareBackend/Folder.php', - 'OCA\\Files_Sharing\\ShareRecipientUpdater' => $baseDir . '/../lib/ShareRecipientUpdater.php', 'OCA\\Files_Sharing\\ShareTargetValidator' => $baseDir . '/../lib/ShareTargetValidator.php', 'OCA\\Files_Sharing\\SharedMount' => $baseDir . '/../lib/SharedMount.php', 'OCA\\Files_Sharing\\SharedStorage' => $baseDir . '/../lib/SharedStorage.php', diff --git a/apps/files_sharing/composer/composer/autoload_static.php b/apps/files_sharing/composer/composer/autoload_static.php index 3decf0b9c1acc..922bc6d7fd3a3 100644 --- a/apps/files_sharing/composer/composer/autoload_static.php +++ b/apps/files_sharing/composer/composer/autoload_static.php @@ -85,9 +85,7 @@ class ComposerStaticInitFiles_Sharing 'OCA\\Files_Sharing\\Listener\\LoadPublicFileRequestAuthListener' => __DIR__ . '/..' . '/../lib/Listener/LoadPublicFileRequestAuthListener.php', 'OCA\\Files_Sharing\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php', 'OCA\\Files_Sharing\\Listener\\ShareInteractionListener' => __DIR__ . '/..' . '/../lib/Listener/ShareInteractionListener.php', - 'OCA\\Files_Sharing\\Listener\\SharesUpdatedListener' => __DIR__ . '/..' . '/../lib/Listener/SharesUpdatedListener.php', 'OCA\\Files_Sharing\\Listener\\UserAddedToGroupListener' => __DIR__ . '/..' . '/../lib/Listener/UserAddedToGroupListener.php', - 'OCA\\Files_Sharing\\Listener\\UserHomeSetupListener' => __DIR__ . '/..' . '/../lib/Listener/UserHomeSetupListener.php', 'OCA\\Files_Sharing\\Listener\\UserShareAcceptanceListener' => __DIR__ . '/..' . '/../lib/Listener/UserShareAcceptanceListener.php', 'OCA\\Files_Sharing\\Middleware\\OCSShareAPIMiddleware' => __DIR__ . '/..' . '/../lib/Middleware/OCSShareAPIMiddleware.php', 'OCA\\Files_Sharing\\Middleware\\ShareInfoMiddleware' => __DIR__ . '/..' . '/../lib/Middleware/ShareInfoMiddleware.php', @@ -114,7 +112,6 @@ class ComposerStaticInitFiles_Sharing 'OCA\\Files_Sharing\\Settings\\Personal' => __DIR__ . '/..' . '/../lib/Settings/Personal.php', 'OCA\\Files_Sharing\\ShareBackend\\File' => __DIR__ . '/..' . '/../lib/ShareBackend/File.php', 'OCA\\Files_Sharing\\ShareBackend\\Folder' => __DIR__ . '/..' . '/../lib/ShareBackend/Folder.php', - 'OCA\\Files_Sharing\\ShareRecipientUpdater' => __DIR__ . '/..' . '/../lib/ShareRecipientUpdater.php', 'OCA\\Files_Sharing\\ShareTargetValidator' => __DIR__ . '/..' . '/../lib/ShareTargetValidator.php', 'OCA\\Files_Sharing\\SharedMount' => __DIR__ . '/..' . '/../lib/SharedMount.php', 'OCA\\Files_Sharing\\SharedStorage' => __DIR__ . '/..' . '/../lib/SharedStorage.php', diff --git a/apps/files_sharing/lib/AppInfo/Application.php b/apps/files_sharing/lib/AppInfo/Application.php index d71bb7e3b034b..084c33b5fed42 100644 --- a/apps/files_sharing/lib/AppInfo/Application.php +++ b/apps/files_sharing/lib/AppInfo/Application.php @@ -14,7 +14,6 @@ use OCA\Files\Event\LoadSidebar; use OCA\Files_Sharing\Capabilities; use OCA\Files_Sharing\Config\ConfigLexicon; -use OCA\Files_Sharing\Event\UserShareAccessUpdatedEvent; use OCA\Files_Sharing\External\Manager; use OCA\Files_Sharing\External\MountProvider as ExternalMountProvider; use OCA\Files_Sharing\Helper; @@ -25,9 +24,7 @@ use OCA\Files_Sharing\Listener\LoadPublicFileRequestAuthListener; use OCA\Files_Sharing\Listener\LoadSidebarListener; use OCA\Files_Sharing\Listener\ShareInteractionListener; -use OCA\Files_Sharing\Listener\SharesUpdatedListener; use OCA\Files_Sharing\Listener\UserAddedToGroupListener; -use OCA\Files_Sharing\Listener\UserHomeSetupListener; use OCA\Files_Sharing\Listener\UserShareAcceptanceListener; use OCA\Files_Sharing\Middleware\OCSShareAPIMiddleware; use OCA\Files_Sharing\Middleware\ShareInfoMiddleware; @@ -49,19 +46,13 @@ use OCP\Files\Events\BeforeDirectFileDownloadEvent; use OCP\Files\Events\BeforeZipCreatedEvent; use OCP\Files\Events\Node\BeforeNodeReadEvent; -use OCP\Files\Events\UserHomeSetupEvent; -use OCP\Group\Events\BeforeGroupDeletedEvent; use OCP\Group\Events\GroupChangedEvent; use OCP\Group\Events\GroupDeletedEvent; use OCP\Group\Events\UserAddedEvent; -use OCP\Group\Events\UserRemovedEvent; use OCP\IConfig; use OCP\IDBConnection; use OCP\IGroup; -use OCP\Share\Events\BeforeShareDeletedEvent; use OCP\Share\Events\ShareCreatedEvent; -use OCP\Share\Events\ShareMovedEvent; -use OCP\Share\Events\ShareTransferredEvent; use OCP\User\Events\UserChangedEvent; use OCP\User\Events\UserDeletedEvent; use OCP\Util; @@ -120,18 +111,6 @@ function () use ($c) { // File request auth $context->registerEventListener(BeforeTemplateRenderedEvent::class, LoadPublicFileRequestAuthListener::class); - // Update mounts - $context->registerEventListener(ShareCreatedEvent::class, SharesUpdatedListener::class); - $context->registerEventListener(BeforeShareDeletedEvent::class, SharesUpdatedListener::class); - $context->registerEventListener(ShareTransferredEvent::class, SharesUpdatedListener::class); - $context->registerEventListener(UserAddedEvent::class, SharesUpdatedListener::class); - $context->registerEventListener(UserRemovedEvent::class, SharesUpdatedListener::class); - $context->registerEventListener(BeforeGroupDeletedEvent::class, SharesUpdatedListener::class); - $context->registerEventListener(GroupDeletedEvent::class, SharesUpdatedListener::class); - $context->registerEventListener(UserShareAccessUpdatedEvent::class, SharesUpdatedListener::class); - $context->registerEventListener(ShareMovedEvent::class, SharesUpdatedListener::class); - $context->registerEventListener(UserHomeSetupEvent::class, UserHomeSetupListener::class); - $context->registerConfigLexicon(ConfigLexicon::class); } diff --git a/apps/files_sharing/lib/Config/ConfigLexicon.php b/apps/files_sharing/lib/Config/ConfigLexicon.php index 623d1340f2617..c063153765e26 100644 --- a/apps/files_sharing/lib/Config/ConfigLexicon.php +++ b/apps/files_sharing/lib/Config/ConfigLexicon.php @@ -24,8 +24,6 @@ class ConfigLexicon implements ILexicon { public const SHOW_FEDERATED_AS_INTERNAL = 'show_federated_shares_as_internal'; public const SHOW_FEDERATED_TO_TRUSTED_AS_INTERNAL = 'show_federated_shares_to_trusted_servers_as_internal'; public const EXCLUDE_RESHARE_FROM_EDIT = 'shareapi_exclude_reshare_from_edit'; - public const UPDATE_CUTOFF_TIME = 'update_cutoff_time'; - public const USER_NEEDS_SHARE_REFRESH = 'user_needs_share_refresh'; public function getStrictness(): Strictness { return Strictness::IGNORE; @@ -36,14 +34,10 @@ public function getAppConfigs(): array { new Entry(self::SHOW_FEDERATED_AS_INTERNAL, ValueType::BOOL, false, 'shows federated shares as internal shares', true), new Entry(self::SHOW_FEDERATED_TO_TRUSTED_AS_INTERNAL, ValueType::BOOL, false, 'shows federated shares to trusted servers as internal shares', true), new Entry(self::EXCLUDE_RESHARE_FROM_EDIT, ValueType::BOOL, false, 'Exclude reshare permission from "Allow editing" bundled permissions'), - - new Entry(self::UPDATE_CUTOFF_TIME, ValueType::FLOAT, 3.0, 'For how how long do we update the share data immediately before switching to only marking the user'), ]; } public function getUserConfigs(): array { - return [ - new Entry(self::USER_NEEDS_SHARE_REFRESH, ValueType::BOOL, false, 'whether a user needs to have the receiving share data refreshed for possible changes'), - ]; + return []; } } diff --git a/apps/files_sharing/lib/Listener/SharesUpdatedListener.php b/apps/files_sharing/lib/Listener/SharesUpdatedListener.php deleted file mode 100644 index f8ac348878598..0000000000000 --- a/apps/files_sharing/lib/Listener/SharesUpdatedListener.php +++ /dev/null @@ -1,133 +0,0 @@ - - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -namespace OCA\Files_Sharing\Listener; - -use OCA\Files_Sharing\AppInfo\Application; -use OCA\Files_Sharing\Config\ConfigLexicon; -use OCA\Files_Sharing\Event\UserShareAccessUpdatedEvent; -use OCA\Files_Sharing\ShareRecipientUpdater; -use OCP\Config\IUserConfig; -use OCP\EventDispatcher\Event; -use OCP\EventDispatcher\IEventListener; -use OCP\Group\Events\BeforeGroupDeletedEvent; -use OCP\Group\Events\GroupDeletedEvent; -use OCP\Group\Events\UserAddedEvent; -use OCP\Group\Events\UserRemovedEvent; -use OCP\IAppConfig; -use OCP\IUser; -use OCP\Share\Events\BeforeShareDeletedEvent; -use OCP\Share\Events\ShareCreatedEvent; -use OCP\Share\Events\ShareMovedEvent; -use OCP\Share\Events\ShareTransferredEvent; -use OCP\Share\IManager; -use Psr\Clock\ClockInterface; - -/** - * Listen to various events that can change what shares a user has access to - * - * @psalm-type GroupEvents = UserAddedEvent|UserRemovedEvent|GroupDeletedEvent|BeforeGroupDeletedEvent - * @template-implements IEventListener - */ -class SharesUpdatedListener implements IEventListener { - /** - * for how long do we update the share date immediately, - * before just marking the other users - */ - private float $cutOffMarkTime; - - /** - * The total amount of time we've spent so far processing updates - */ - private float $updatedTime = 0.0; - - public function __construct( - private readonly IManager $shareManager, - private readonly ShareRecipientUpdater $shareUpdater, - private readonly IUserConfig $userConfig, - private readonly ClockInterface $clock, - IAppConfig $appConfig, - ) { - $this->cutOffMarkTime = $appConfig->getValueFloat(Application::APP_ID, ConfigLexicon::UPDATE_CUTOFF_TIME, 3.0); - } - - public function handle(Event $event): void { - if ($event instanceof UserShareAccessUpdatedEvent) { - foreach ($event->getUsers() as $user) { - $this->updateOrMarkUser($user); - } - } - if ($event instanceof BeforeGroupDeletedEvent) { - // ensure the group users are loaded before the group is deleted - $event->getGroup()->getUsers(); - } - if ($event instanceof GroupDeletedEvent) { - // so we can iterate them after the group is deleted - foreach ($event->getGroup()->getUsers() as $user) { - $this->updateOrMarkUser($user); - } - } - if ($event instanceof UserAddedEvent || $event instanceof UserRemovedEvent) { - $this->updateOrMarkUser($event->getUser()); - } - if ($event instanceof ShareCreatedEvent || $event instanceof ShareTransferredEvent) { - $share = $event->getShare(); - $shareTarget = $share->getTarget(); - foreach ($this->shareManager->getUsersForShare($share) as $user) { - if ($share->getSharedBy() !== $user->getUID()) { - $this->markOrRun($user, function () use ($user, $share) { - $this->shareUpdater->updateForAddedShare($user, $share); - }); - // Share target validation might have changed the target, restore it for the next user - $share->setTarget($shareTarget); - } - } - } - if ($event instanceof ShareMovedEvent) { - $share = $event->getShare(); - foreach ($this->shareManager->getUsersForShare($share) as $user) { - $this->markOrRun($user, function () use ($user, $share) { - $this->shareUpdater->updateForMovedShare($user, $share); - }); - } - } - if ($event instanceof BeforeShareDeletedEvent) { - $share = $event->getShare(); - foreach ($this->shareManager->getUsersForShare($share) as $user) { - $this->markOrRun($user, function () use ($user, $share) { - $this->shareUpdater->updateForDeletedShare($user, $share); - }); - } - } - } - - private function markOrRun(IUser $user, callable $callback): void { - $start = floatval($this->clock->now()->format('U.u')); - if ($this->cutOffMarkTime === -1.0 || $this->updatedTime < $this->cutOffMarkTime) { - $callback(); - } else { - $this->markUserForRefresh($user); - } - $end = floatval($this->clock->now()->format('U.u')); - $this->updatedTime += $end - $start; - } - - private function updateOrMarkUser(IUser $user): void { - $this->markOrRun($user, function () use ($user) { - $this->shareUpdater->updateForUser($user); - }); - } - - private function markUserForRefresh(IUser $user): void { - $this->userConfig->setValueBool($user->getUID(), Application::APP_ID, ConfigLexicon::USER_NEEDS_SHARE_REFRESH, true); - } - - public function setCutOffMarkTime(float|int $cutOffMarkTime): void { - $this->cutOffMarkTime = (float)$cutOffMarkTime; - } -} diff --git a/apps/files_sharing/lib/Listener/UserHomeSetupListener.php b/apps/files_sharing/lib/Listener/UserHomeSetupListener.php deleted file mode 100644 index 8886660879fa9..0000000000000 --- a/apps/files_sharing/lib/Listener/UserHomeSetupListener.php +++ /dev/null @@ -1,44 +0,0 @@ - - */ -class UserHomeSetupListener implements IEventListener { - public function __construct( - private readonly ShareRecipientUpdater $updater, - private readonly IUserConfig $userConfig, - ) { - } - - public function handle(Event $event): void { - if (!$event instanceof UserHomeSetupEvent) { - return; - } - - $user = $event->getUser(); - if ($this->userConfig->getValueBool($user->getUID(), Application::APP_ID, ConfigLexicon::USER_NEEDS_SHARE_REFRESH)) { - $this->updater->updateForUser($user); - $this->userConfig->setValueBool($user->getUID(), Application::APP_ID, ConfigLexicon::USER_NEEDS_SHARE_REFRESH, false); - } - } - -} diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index 68202483dbcd4..005bf9caf4212 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -12,7 +12,6 @@ use OC\Files\View; use OCA\Files_Sharing\Event\ShareMountedEvent; use OCP\EventDispatcher\IEventDispatcher; -use OCP\Files\Config\IAuthoritativeMountProvider; use OCP\Files\Config\IMountProvider; use OCP\Files\Config\IPartialMountProvider; use OCP\Files\Mount\IMountManager; @@ -28,7 +27,7 @@ use function count; -class MountProvider implements IMountProvider, IAuthoritativeMountProvider, IPartialMountProvider { +class MountProvider implements IMountProvider, IPartialMountProvider { /** * @param IConfig $config @@ -54,15 +53,6 @@ public function __construct( * @return IMountPoint[] */ public function getMountsForUser(IUser $user, IStorageFactory $loader) { - return array_values($this->getMountsFromSuperShares($user, $this->getSuperSharesForUser($user), $loader)); - } - - /** - * @param IUser $user - * @param list $excludeShares - * @return list}> Tuple of [superShare, groupedShares] - */ - public function getSuperSharesForUser(IUser $user, array $excludeShares = []): array { $userId = $user->getUID(); $shares = $this->mergeIterables( $this->shareManager->getSharedWith($userId, IShare::TYPE_USER, null, -1), @@ -72,9 +62,17 @@ public function getSuperSharesForUser(IUser $user, array $excludeShares = []): a $this->shareManager->getSharedWith($userId, IShare::TYPE_DECK, null, -1), ); - $excludeShareIds = array_map(fn (IShare $share) => $share->getFullId(), $excludeShares); - $shares = $this->filterShares($shares, $userId, $excludeShareIds); - return $this->buildSuperShares($shares, $user); + $shares = $this->filterShares($shares, $userId); + $superShares = $this->buildSuperShares($shares, $user); + + return array_values( + $this->getMountsFromSuperShares( + $userId, + $superShares, + $loader, + $user, + ), + ); } /** @@ -256,18 +254,18 @@ private function adjustTarget( } /** * @param string $userId - * @param list}> $superShares + * @param array $superShares * @param IStorageFactory $loader * @param IUser $user * @return array IMountPoint indexed by mount point * @throws Exception */ - public function getMountsFromSuperShares( - IUser $user, + private function getMountsFromSuperShares( + string $userId, array $superShares, IStorageFactory $loader, + IUser $user, ): array { - $userId = $user->getUID(); $allMounts = $this->mountManager->getAll(); $mounts = []; $view = new View('/' . $userId . '/files'); @@ -295,6 +293,12 @@ public function getMountsFromSuperShares( } $shareId = (int)$parentShare->getId(); + $absMountPoint = '/' . $user->getUID() . '/files/' . trim($parentShare->getTarget(), '/') . '/'; + + // after the mountpoint is verified for the first time, only new mountpoints (e.g. groupfolders can overwrite the target) + if ($shareId > $maxValidatedShare || isset($allMounts[$absMountPoint])) { + $this->shareTargetValidator->verifyMountPoint($user, $parentShare, $allMounts, $groupedShares); + } $mount = new SharedMount( '\OCA\Files_Sharing\SharedStorage', @@ -308,6 +312,7 @@ public function getMountsFromSuperShares( 'sharingDisabledForUser' => $sharingDisabledForUser ], $loader, + $view, $this->eventDispatcher, $user, ); @@ -344,16 +349,14 @@ public function getMountsFromSuperShares( * user has no permissions. * * @param iterable $shares - * @param list $excludeShareIds * @return iterable */ - private function filterShares(iterable $shares, string $userId, array $excludeShareIds = []): iterable { + private function filterShares(iterable $shares, string $userId): iterable { foreach ($shares as $share) { if ( $share->getPermissions() > 0 && $share->getShareOwner() !== $userId && $share->getSharedBy() !== $userId - && !in_array($share->getFullId(), $excludeShareIds) ) { yield $share; } @@ -396,7 +399,7 @@ public function getMountsForPath( $shares = $this->filterShares($shares, $userId); $superShares = $this->buildSuperShares($shares, $user); - return $this->getMountsFromSuperShares($user, $superShares, $loader); + return $this->getMountsFromSuperShares($userId, $superShares, $loader, $user); } /** diff --git a/apps/files_sharing/lib/Repair/CleanupShareTarget.php b/apps/files_sharing/lib/Repair/CleanupShareTarget.php index 845e24e036725..d32d5dc21d258 100644 --- a/apps/files_sharing/lib/Repair/CleanupShareTarget.php +++ b/apps/files_sharing/lib/Repair/CleanupShareTarget.php @@ -11,9 +11,8 @@ use OC\Files\SetupManager; use OCA\Files_Sharing\ShareTargetValidator; use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\Files\Config\ICachedMountInfo; -use OCP\Files\Config\IUserMountCache; use OCP\Files\IRootFolder; +use OCP\Files\Mount\IMountManager; use OCP\Files\NotFoundException; use OCP\ICacheFactory; use OCP\IDBConnection; @@ -43,7 +42,7 @@ public function __construct( private readonly ShareTargetValidator $shareTargetValidator, private readonly IUserManager $userManager, private readonly SetupManager $setupManager, - private readonly IUserMountCache $userMountCache, + private readonly IMountManager $mountManager, private readonly IRootFolder $rootFolder, private readonly LoggerInterface $logger, private readonly ICacheFactory $cacheFactory, @@ -86,9 +85,7 @@ public function run(IOutput $output) { $this->setupManager->tearDown(); $this->setupManager->setupForUser($recipient); - $mounts = $this->userMountCache->getMountsForUser($recipient); - $mountPoints = array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $mounts); - $userMounts = array_combine($mountPoints, $mounts); + $userMounts = $this->mountManager->getAll(); $userFolder = $this->rootFolder->getUserFolder($recipient->getUID()); } diff --git a/apps/files_sharing/lib/ShareRecipientUpdater.php b/apps/files_sharing/lib/ShareRecipientUpdater.php deleted file mode 100644 index 62033b7dd0ab2..0000000000000 --- a/apps/files_sharing/lib/ShareRecipientUpdater.php +++ /dev/null @@ -1,105 +0,0 @@ -inUpdate[$user->getUID()])) { - return; - } - $this->inUpdate[$user->getUID()] = true; - - $cachedMounts = $this->userMountCache->getMountsForUser($user); - $shareMounts = array_filter($cachedMounts, fn (ICachedMountInfo $mount) => $mount->getMountProvider() === MountProvider::class); - $mountPoints = array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $cachedMounts); - $mountsByPath = array_combine($mountPoints, $cachedMounts); - - $shares = $this->shareMountProvider->getSuperSharesForUser($user); - - // the share mounts have changed if either the number of shares doesn't matched the number of share mounts - // or there is a share for which we don't have a mount yet. - $mountsChanged = count($shares) !== count($shareMounts); - foreach ($shares as $share) { - [$parentShare, $groupedShares] = $share; - $mountPoint = $this->getMountPointFromTarget($user, $parentShare->getTarget()); - $mountKey = $parentShare->getNodeId() . '::' . $mountPoint; - if (!isset($cachedMounts[$mountKey])) { - $mountsChanged = true; - $this->shareTargetValidator->verifyMountPoint($user, $parentShare, $mountsByPath, $groupedShares); - } - } - - if ($mountsChanged) { - $newMounts = $this->shareMountProvider->getMountsFromSuperShares($user, $shares, $this->storageFactory); - $this->userMountCache->registerMounts($user, $newMounts, [MountProvider::class]); - } - - unset($this->inUpdate[$user->getUID()]); - } - - /** - * Validate a single received share for a user - */ - public function updateForAddedShare(IUser $user, IShare $share): void { - $cachedMounts = $this->userMountCache->getMountsForUser($user); - $mountPoints = array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $cachedMounts); - $mountsByPath = array_combine($mountPoints, $cachedMounts); - - $target = $this->shareTargetValidator->verifyMountPoint($user, $share, $mountsByPath, [$share]); - $mountPoint = $this->getMountPointFromTarget($user, $target); - - $this->userMountCache->addMount($user, $mountPoint, $share->getNode()->getData(), MountProvider::class); - } - - private function getMountPointFromTarget(IUser $user, string $target): string { - return '/' . $user->getUID() . '/files/' . trim($target, '/') . '/'; - } - - /** - * Process a single deleted share for a user - */ - public function updateForDeletedShare(IUser $user, IShare $share): void { - $this->userMountCache->removeMount($this->getMountPointFromTarget($user, $share->getTarget())); - } - - /** - * Process a single moved share for a user - */ - public function updateForMovedShare(IUser $user, IShare $share): void { - $originalTarget = $share->getOriginalTarget(); - if ($originalTarget != null) { - $newMountPoint = $this->getMountPointFromTarget($user, $share->getTarget()); - $oldMountPoint = $this->getMountPointFromTarget($user, $originalTarget); - $this->userMountCache->removeMount($oldMountPoint); - $this->userMountCache->addMount($user, $newMountPoint, $share->getNode()->getData(), MountProvider::class); - } else { - $this->updateForUser($user); - } - } -} diff --git a/apps/files_sharing/lib/ShareTargetValidator.php b/apps/files_sharing/lib/ShareTargetValidator.php index 7534cabc33a36..3dbd3877819c4 100644 --- a/apps/files_sharing/lib/ShareTargetValidator.php +++ b/apps/files_sharing/lib/ShareTargetValidator.php @@ -13,7 +13,6 @@ use OC\Files\View; use OCP\Cache\CappedMemoryCache; use OCP\EventDispatcher\IEventDispatcher; -use OCP\Files\Config\ICachedMountInfo; use OCP\Files\Mount\IMountManager; use OCP\Files\Mount\IMountPoint; use OCP\IUser; @@ -47,7 +46,7 @@ private function getViewForUser(IUser $user): View { /** * check if the parent folder exists otherwise move the mount point up * - * @param array $allCachedMounts Other mounts for the user, indexed by path + * @param array $allCachedMounts Other mounts for the user, indexed by path * @param IShare[] $childShares * @return string */ @@ -106,7 +105,7 @@ public function verifyMountPoint( /** - * @param ICachedMountInfo[] $allCachedMounts + * @param IMountPoint[] $allCachedMounts */ public function generateUniqueTarget( int $shareNodeId, @@ -132,7 +131,7 @@ public function generateUniqueTarget( } /** - * @param ICachedMountInfo[] $allCachedMounts + * @param IMountPoint[] $allCachedMounts */ private function hasConflictingMount(int $shareNodeId, array $allCachedMounts, string $absolutePath): bool { if (!isset($allCachedMounts[$absolutePath . '/'])) { @@ -140,7 +139,7 @@ private function hasConflictingMount(int $shareNodeId, array $allCachedMounts, s } $mount = $allCachedMounts[$absolutePath . '/']; - if ($mount->getMountProvider() === MountProvider::class && $mount->getRootId() === $shareNodeId) { + if ($mount instanceof SharedMount && $mount->getShare()->getNodeId() === $shareNodeId) { // "conflicting" mount is a mount for the current share return false; } diff --git a/apps/files_sharing/lib/SharedMount.php b/apps/files_sharing/lib/SharedMount.php index 8759272eb60b5..4dff3bcf3b75b 100644 --- a/apps/files_sharing/lib/SharedMount.php +++ b/apps/files_sharing/lib/SharedMount.php @@ -11,6 +11,7 @@ use OC\Files\Filesystem; use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; +use OC\Files\View; use OCA\Files_Sharing\Exceptions\BrokenPath; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Events\InvalidateMountCacheEvent; @@ -40,6 +41,7 @@ public function __construct( $storage, $arguments, IStorageFactory $loader, + private View $recipientView, private IEventDispatcher $eventDispatcher, private IUser $user, ) { @@ -186,8 +188,4 @@ public function getNumericStorageId() { public function getMountType() { return 'shared'; } - - public function getUser(): IUser { - return $this->user; - } } diff --git a/apps/files_sharing/tests/ApiTest.php b/apps/files_sharing/tests/ApiTest.php index e0340b3ce0015..40f768ffab495 100644 --- a/apps/files_sharing/tests/ApiTest.php +++ b/apps/files_sharing/tests/ApiTest.php @@ -826,8 +826,6 @@ public function testGetShareMultipleSharedFolder(): void { $share3->setStatus(IShare::STATUS_ACCEPTED); $this->shareManager->updateShare($share3); - $this->logout(); - // $request = $this->createRequest(['path' => $this->subfolder]); $ocs = $this->createOCS(self::TEST_FILES_SHARING_API_USER2); $result1 = $ocs->getShares('false', 'false', 'false', $this->subfolder); diff --git a/apps/files_sharing/tests/Repair/CleanupShareTargetTest.php b/apps/files_sharing/tests/Repair/CleanupShareTargetTest.php index 3e3997d83bda6..8c752c52a0c25 100644 --- a/apps/files_sharing/tests/Repair/CleanupShareTargetTest.php +++ b/apps/files_sharing/tests/Repair/CleanupShareTargetTest.php @@ -6,7 +6,6 @@ */ namespace OCA\Files_Sharing\Tests\Repair; -use OC\Files\Filesystem; use OC\Migration\NullOutput; use OCA\Files_Sharing\Repair\CleanupShareTarget; use OCA\Files_Sharing\Tests\TestCase; @@ -50,7 +49,6 @@ private function createUserShare(string $by, string $target = self::TEST_FOLDER_ $share->setTarget($target); $this->shareManager->moveShare($share, self::TEST_FILES_SHARING_API_USER2); - Filesystem::getMountManager()->moveMount('/' . self::TEST_FILES_SHARING_API_USER2 . '/files' . self::TEST_FOLDER_NAME . '/', '/' . self::TEST_FILES_SHARING_API_USER2 . '/files' . $target . '/'); $share = $this->shareManager->getShareById($share->getFullId()); $this->assertEquals($target, $share->getTarget()); diff --git a/apps/files_sharing/tests/ShareRecipientUpdaterTest.php b/apps/files_sharing/tests/ShareRecipientUpdaterTest.php deleted file mode 100644 index 2316e6b8b7e56..0000000000000 --- a/apps/files_sharing/tests/ShareRecipientUpdaterTest.php +++ /dev/null @@ -1,206 +0,0 @@ -userMountCache = $this->createMock(IUserMountCache::class); - $this->shareMountProvider = $this->createMock(MountProvider::class); - $this->shareTargetValidator = $this->createMock(ShareTargetValidator::class); - $this->storageFactory = $this->createMock(IStorageFactory::class); - - $this->updater = new ShareRecipientUpdater( - $this->userMountCache, - $this->shareMountProvider, - $this->shareTargetValidator, - $this->storageFactory, - ); - } - - public function testUpdateForShare() { - $share = $this->createMock(IShare::class); - $node = $this->createMock(Node::class); - $cacheEntry = $this->createMock(ICacheEntry::class); - $share->method('getNode') - ->willReturn($node); - $node->method('getData') - ->willReturn($cacheEntry); - $user1 = $this->createUser('user1', ''); - - $this->userMountCache->method('getMountsForUser') - ->with($user1) - ->willReturn([]); - - $this->shareTargetValidator->method('verifyMountPoint') - ->with($user1, $share, [], [$share]) - ->willReturn('/new-target'); - - $this->userMountCache->expects($this->exactly(1)) - ->method('addMount') - ->with($user1, '/user1/files/new-target/', $cacheEntry, MountProvider::class); - - $this->updater->updateForAddedShare($user1, $share); - } - - /** - * @param IUser $user - * @param list $mounts - * @return void - */ - private function setCachedMounts(IUser $user, array $mounts) { - $cachedMounts = array_map(function (array $mount): ICachedMountInfo { - $cachedMount = $this->createMock(ICachedMountInfo::class); - $cachedMount->method('getRootId') - ->willReturn($mount['fileid']); - $cachedMount->method('getMountPoint') - ->willReturn($mount['mount_point']); - $cachedMount->method('getMountProvider') - ->willReturn($mount['provider']); - return $cachedMount; - }, $mounts); - $mountKeys = array_map(function (array $mount): string { - return $mount['fileid'] . '::' . $mount['mount_point']; - }, $mounts); - - $this->userMountCache->method('getMountsForUser') - ->with($user) - ->willReturn(array_combine($mountKeys, $cachedMounts)); - } - - public function testUpdateForUserAddedNoExisting() { - $share = $this->createMock(IShare::class); - $share->method('getTarget') - ->willReturn('/target'); - $share->method('getNodeId') - ->willReturn(111); - $user1 = $this->createUser('user1', ''); - $newMount = $this->createMock(IMountPoint::class); - - $this->shareMountProvider->method('getSuperSharesForUser') - ->with($user1, []) - ->willReturn([[ - $share, - [$share], - ]]); - - $this->shareMountProvider->method('getMountsFromSuperShares') - ->with($user1, [[ - $share, - [$share], - ]], $this->storageFactory) - ->willReturn([$newMount]); - - $this->setCachedMounts($user1, []); - - $this->shareTargetValidator->method('verifyMountPoint') - ->with($user1, $share, [], [$share]) - ->willReturn('/new-target'); - - $this->userMountCache->expects($this->exactly(1)) - ->method('registerMounts') - ->with($user1, [$newMount], [MountProvider::class]); - - $this->updater->updateForUser($user1); - } - - public function testUpdateForUserNoChanges() { - $share = $this->createMock(IShare::class); - $share->method('getTarget') - ->willReturn('/target'); - $share->method('getNodeId') - ->willReturn(111); - $user1 = $this->createUser('user1', ''); - - $this->shareMountProvider->method('getSuperSharesForUser') - ->with($user1, []) - ->willReturn([[ - $share, - [$share], - ]]); - - $this->setCachedMounts($user1, [ - ['fileid' => 111, 'mount_point' => '/user1/files/target/', 'provider' => MountProvider::class], - ]); - - $this->shareTargetValidator->expects($this->never()) - ->method('verifyMountPoint'); - - $this->userMountCache->expects($this->never()) - ->method('registerMounts'); - - $this->updater->updateForUser($user1); - } - - public function testUpdateForUserRemoved() { - $share = $this->createMock(IShare::class); - $share->method('getTarget') - ->willReturn('/target'); - $share->method('getNodeId') - ->willReturn(111); - $user1 = $this->createUser('user1', ''); - - $this->shareMountProvider->method('getSuperSharesForUser') - ->with($user1, []) - ->willReturn([]); - - $this->setCachedMounts($user1, [ - ['fileid' => 111, 'mount_point' => '/user1/files/target/', 'provider' => MountProvider::class], - ]); - - $this->shareTargetValidator->expects($this->never()) - ->method('verifyMountPoint'); - - $this->userMountCache->expects($this->exactly(1)) - ->method('registerMounts') - ->with($user1, [], [MountProvider::class]); - - $this->updater->updateForUser($user1); - } - - public function testDeletedShare() { - $share = $this->createMock(IShare::class); - $share->method('getTarget') - ->willReturn('/target'); - $share->method('getNodeId') - ->willReturn(111); - $user1 = $this->createUser('user1', ''); - - $this->shareTargetValidator->expects($this->never()) - ->method('verifyMountPoint'); - - $this->userMountCache->expects($this->exactly(1)) - ->method('removeMount') - ->with('/user1/files/target/'); - - $this->updater->updateForDeletedShare($user1, $share); - } -} diff --git a/apps/files_sharing/tests/ShareTargetValidatorTest.php b/apps/files_sharing/tests/ShareTargetValidatorTest.php deleted file mode 100644 index 18fcd35ed285c..0000000000000 --- a/apps/files_sharing/tests/ShareTargetValidatorTest.php +++ /dev/null @@ -1,141 +0,0 @@ - - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -namespace OCA\Files_Sharing\Tests; - -use OCA\Files_Sharing\ShareTargetValidator; -use OCP\Constants; -use OCP\Files\Config\ICachedMountInfo; -use OCP\Files\Folder; -use OCP\IUser; -use OCP\Server; -use OCP\Share\IShare; - -#[\PHPUnit\Framework\Attributes\Group('DB')] -class ShareTargetValidatorTest extends TestCase { - private ShareTargetValidator $targetValidator; - - private IUser $user2; - protected string $folder2; - - protected function setUp(): void { - parent::setUp(); - - $this->folder = '/folder_share_storage_test'; - $this->folder2 = '/folder_share_storage_test2'; - - $this->filename = '/share-api-storage.txt'; - - - $this->view->mkdir($this->folder); - $this->view->mkdir($this->folder2); - - // save file with content - $this->view->file_put_contents($this->filename, 'root file'); - $this->view->file_put_contents($this->folder . $this->filename, 'file in subfolder'); - $this->view->file_put_contents($this->folder2 . $this->filename, 'file in subfolder2'); - - $this->targetValidator = Server::get(ShareTargetValidator::class); - $this->user2 = $this->createMock(IUser::class); - $this->user2->method('getUID') - ->willReturn(self::TEST_FILES_SHARING_API_USER2); - } - - - /** - * test if the mount point moves up if the parent folder no longer exists - */ - public function testShareMountLoseParentFolder(): void { - // share to user - $share = $this->share( - IShare::TYPE_USER, - $this->folder, - self::TEST_FILES_SHARING_API_USER1, - self::TEST_FILES_SHARING_API_USER2, - Constants::PERMISSION_ALL); - $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2); - - $share->setTarget('/foo/bar' . $this->folder); - $this->shareManager->moveShare($share, self::TEST_FILES_SHARING_API_USER2); - - $share = $this->shareManager->getShareById($share->getFullId()); - $this->assertSame('/foo/bar' . $this->folder, $share->getTarget()); - - $this->targetValidator->verifyMountPoint($this->user2, $share, [], [$share]); - - $share = $this->shareManager->getShareById($share->getFullId()); - $this->assertSame($this->folder, $share->getTarget()); - - //cleanup - self::loginHelper(self::TEST_FILES_SHARING_API_USER1); - $this->shareManager->deleteShare($share); - $this->view->unlink($this->folder); - } - - /** - * test if the mount point gets renamed if a folder exists at the target - */ - public function testShareMountOverFolder(): void { - self::loginHelper(self::TEST_FILES_SHARING_API_USER2); - $this->view2->mkdir('bar'); - - self::loginHelper(self::TEST_FILES_SHARING_API_USER1); - - // share to user - $share = $this->share( - IShare::TYPE_USER, - $this->folder, - self::TEST_FILES_SHARING_API_USER1, - self::TEST_FILES_SHARING_API_USER2, - Constants::PERMISSION_ALL); - $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2); - - $share->setTarget('/bar'); - $this->shareManager->moveShare($share, self::TEST_FILES_SHARING_API_USER2); - - $share = $this->shareManager->getShareById($share->getFullId()); - - $this->targetValidator->verifyMountPoint($this->user2, $share, [], [$share]); - - $share = $this->shareManager->getShareById($share->getFullId()); - $this->assertSame('/bar (2)', $share->getTarget()); - - //cleanup - self::loginHelper(self::TEST_FILES_SHARING_API_USER1); - $this->shareManager->deleteShare($share); - $this->view->unlink($this->folder); - } - - /** - * test if the mount point gets renamed if another share exists at the target - */ - public function testShareMountOverShare(): void { - // share to user - $share2 = $this->share( - IShare::TYPE_USER, - $this->folder2, - self::TEST_FILES_SHARING_API_USER1, - self::TEST_FILES_SHARING_API_USER2, - Constants::PERMISSION_ALL); - $this->shareManager->acceptShare($share2, self::TEST_FILES_SHARING_API_USER2); - - $conflictingMount = $this->createMock(ICachedMountInfo::class); - $this->targetValidator->verifyMountPoint($this->user2, $share2, [ - '/' . $this->user2->getUID() . '/files' . $this->folder2 . '/' => $conflictingMount - ], [$share2]); - - $share2 = $this->shareManager->getShareById($share2->getFullId()); - - $this->assertSame("{$this->folder2} (2)", $share2->getTarget()); - - //cleanup - self::loginHelper(self::TEST_FILES_SHARING_API_USER1); - $this->shareManager->deleteShare($share2); - $this->view->unlink($this->folder); - } -} diff --git a/apps/files_sharing/tests/SharedMountTest.php b/apps/files_sharing/tests/SharedMountTest.php index 020b6ec41c5c8..48cd940bf50c5 100644 --- a/apps/files_sharing/tests/SharedMountTest.php +++ b/apps/files_sharing/tests/SharedMountTest.php @@ -8,8 +8,12 @@ namespace OCA\Files_Sharing\Tests; use OC\Files\Filesystem; +use OC\Files\View; +use OC\Memcache\ArrayCache; +use OCA\Files_Sharing\MountProvider; use OCA\Files_Sharing\SharedMount; use OCP\Constants; +use OCP\ICacheFactory; use OCP\IDBConnection; use OCP\IGroupManager; use OCP\IUserManager; @@ -21,10 +25,14 @@ */ #[\PHPUnit\Framework\Attributes\Group(name: 'SLOWDB')] class SharedMountTest extends TestCase { - private IGroupManager $groupManager; - private IUserManager $userManager; - private string $folder2; + /** @var IGroupManager */ + private $groupManager; + + /** @var IUserManager */ + private $userManager; + + private $folder2; protected function setUp(): void { parent::setUp(); @@ -60,6 +68,78 @@ protected function tearDown(): void { parent::tearDown(); } + /** + * test if the mount point moves up if the parent folder no longer exists + */ + public function testShareMountLoseParentFolder(): void { + + // share to user + $share = $this->share( + IShare::TYPE_USER, + $this->folder, + self::TEST_FILES_SHARING_API_USER1, + self::TEST_FILES_SHARING_API_USER2, + Constants::PERMISSION_ALL); + $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2); + + $share->setTarget('/foo/bar' . $this->folder); + $this->shareManager->moveShare($share, self::TEST_FILES_SHARING_API_USER2); + + $share = $this->shareManager->getShareById($share->getFullId()); + $this->assertSame('/foo/bar' . $this->folder, $share->getTarget()); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + // share should have moved up + + $share = $this->shareManager->getShareById($share->getFullId()); + $this->assertSame($this->folder, $share->getTarget()); + + //cleanup + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + $this->shareManager->deleteShare($share); + $this->view->unlink($this->folder); + } + + public function testDeleteParentOfMountPoint(): void { + // share to user + $share = $this->share( + IShare::TYPE_USER, + $this->folder, + self::TEST_FILES_SHARING_API_USER1, + self::TEST_FILES_SHARING_API_USER2, + Constants::PERMISSION_ALL + ); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + $user2View = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files'); + $this->assertTrue($user2View->file_exists($this->folder)); + + // create a local folder + $result = $user2View->mkdir('localfolder'); + $this->assertTrue($result); + + // move mount point to local folder + $result = $user2View->rename($this->folder, '/localfolder/' . $this->folder); + $this->assertTrue($result); + + // mount point in the root folder should no longer exist + $this->assertFalse($user2View->is_dir($this->folder)); + + // delete the local folder + $result = $user2View->unlink('/localfolder'); + $this->assertTrue($result); + + //enforce reload of the mount points + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + + //mount point should be back at the root + $this->assertTrue($user2View->is_dir($this->folder)); + + //cleanup + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + $this->view->unlink($this->folder); + } + public function testMoveSharedFile(): void { $share = $this->share( IShare::TYPE_USER, @@ -233,6 +313,111 @@ public function testPermissionUpgradeOnUserDeletedGroupShare(): void { $testGroup->removeUser($user2); $testGroup->removeUser($user3); } + + /** + * test if the mount point gets renamed if a folder exists at the target + */ + public function testShareMountOverFolder(): void { + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + $this->view2->mkdir('bar'); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + + // share to user + $share = $this->share( + IShare::TYPE_USER, + $this->folder, + self::TEST_FILES_SHARING_API_USER1, + self::TEST_FILES_SHARING_API_USER2, + Constants::PERMISSION_ALL); + $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2); + + $share->setTarget('/bar'); + $this->shareManager->moveShare($share, self::TEST_FILES_SHARING_API_USER2); + + $share = $this->shareManager->getShareById($share->getFullId()); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + // share should have been moved + + $share = $this->shareManager->getShareById($share->getFullId()); + $this->assertSame('/bar (2)', $share->getTarget()); + + //cleanup + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + $this->shareManager->deleteShare($share); + $this->view->unlink($this->folder); + } + + /** + * test if the mount point gets renamed if another share exists at the target + */ + public function testShareMountOverShare(): void { + // create a shared cache + $caches = []; + $cacheFactory = $this->createMock(ICacheFactory::class); + $cacheFactory->method('createLocal') + ->willReturnCallback(function (string $prefix) use (&$caches) { + if (!isset($caches[$prefix])) { + $caches[$prefix] = new ArrayCache($prefix); + } + return $caches[$prefix]; + }); + $cacheFactory->method('createDistributed') + ->willReturnCallback(function (string $prefix) use (&$caches) { + if (!isset($caches[$prefix])) { + $caches[$prefix] = new ArrayCache($prefix); + } + return $caches[$prefix]; + }); + + // hack to overwrite the cache factory, we can't use the proper "overwriteService" since the mount provider is created before this test is called + $mountProvider = Server::get(MountProvider::class); + $reflectionClass = new \ReflectionClass($mountProvider); + $reflectionCacheFactory = $reflectionClass->getProperty('cacheFactory'); + $reflectionCacheFactory->setValue($mountProvider, $cacheFactory); + + // share to user + $share = $this->share( + IShare::TYPE_USER, + $this->folder, + self::TEST_FILES_SHARING_API_USER1, + self::TEST_FILES_SHARING_API_USER2, + Constants::PERMISSION_ALL); + $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2); + + $share->setTarget('/foobar'); + $this->shareManager->moveShare($share, self::TEST_FILES_SHARING_API_USER2); + + + // share to user + $share2 = $this->share( + IShare::TYPE_USER, + $this->folder2, + self::TEST_FILES_SHARING_API_USER1, + self::TEST_FILES_SHARING_API_USER2, + Constants::PERMISSION_ALL); + $this->shareManager->acceptShare($share2, self::TEST_FILES_SHARING_API_USER2); + + $share2->setTarget('/foobar'); + $this->shareManager->moveShare($share2, self::TEST_FILES_SHARING_API_USER2); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + // one of the shares should have been moved + + $share = $this->shareManager->getShareById($share->getFullId()); + $share2 = $this->shareManager->getShareById($share2->getFullId()); + + // we don't know or care which share got the "(2)" just that one of them did + $this->assertNotEquals($share->getTarget(), $share2->getTarget()); + $this->assertSame('/foobar', min($share->getTarget(), $share2->getTarget())); + $this->assertSame('/foobar (2)', max($share->getTarget(), $share2->getTarget())); + + //cleanup + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + $this->shareManager->deleteShare($share); + $this->view->unlink($this->folder); + } } class DummyTestClassSharedMount extends SharedMount { diff --git a/apps/files_sharing/tests/SharedStorageTest.php b/apps/files_sharing/tests/SharedStorageTest.php index cd0a06f24363e..ada3d84734c7d 100644 --- a/apps/files_sharing/tests/SharedStorageTest.php +++ b/apps/files_sharing/tests/SharedStorageTest.php @@ -10,6 +10,7 @@ use OC\Files\Cache\FailedCache; use OC\Files\Filesystem; use OC\Files\Storage\FailedStorage; +use OC\Files\Storage\Storage; use OC\Files\Storage\Temporary; use OC\Files\View; use OCA\Files_Sharing\SharedStorage; @@ -59,6 +60,51 @@ protected function tearDown(): void { parent::tearDown(); } + /** + * if the parent of the mount point is gone then the mount point should move up + */ + public function testParentOfMountPointIsGone(): void { + + // share to user + $share = $this->share( + IShare::TYPE_USER, + $this->folder, + self::TEST_FILES_SHARING_API_USER1, + self::TEST_FILES_SHARING_API_USER2, + Constants::PERMISSION_ALL + ); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + $user2View = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files'); + $this->assertTrue($user2View->file_exists($this->folder)); + + // create a local folder + $result = $user2View->mkdir('localfolder'); + $this->assertTrue($result); + + // move mount point to local folder + $result = $user2View->rename($this->folder, '/localfolder/' . $this->folder); + $this->assertTrue($result); + + // mount point in the root folder should no longer exist + $this->assertFalse($user2View->is_dir($this->folder)); + + // delete the local folder + /** @var Storage $storage */ + [$storage, $internalPath] = Filesystem::resolvePath('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/localfolder'); + $storage->rmdir($internalPath); + + //enforce reload of the mount points + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + + //mount point should be back at the root + $this->assertTrue($user2View->is_dir($this->folder)); + + //cleanup + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + $this->view->unlink($this->folder); + } + public function testRenamePartFile(): void { // share to user @@ -420,6 +466,57 @@ public function testMoveFromStorage(): void { $this->shareManager->deleteShare($share); } + public function testNameConflict(): void { + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + $view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files'); + $view1->mkdir('foo'); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER3); + $view3 = new View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files'); + $view3->mkdir('foo'); + + // share a folder with the same name from two different users to the same user + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + + $share1 = $this->share( + IShare::TYPE_GROUP, + 'foo', + self::TEST_FILES_SHARING_API_USER1, + self::TEST_FILES_SHARING_API_GROUP1, + Constants::PERMISSION_ALL + ); + $this->shareManager->acceptShare($share1, self::TEST_FILES_SHARING_API_USER2); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER3); + + $share2 = $this->share( + IShare::TYPE_GROUP, + 'foo', + self::TEST_FILES_SHARING_API_USER3, + self::TEST_FILES_SHARING_API_GROUP1, + Constants::PERMISSION_ALL + ); + $this->shareManager->acceptShare($share2, self::TEST_FILES_SHARING_API_USER2); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + $view2 = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files'); + + $this->assertTrue($view2->file_exists('/foo')); + $this->assertTrue($view2->file_exists('/foo (2)')); + + $mount = $view2->getMount('/foo'); + $this->assertInstanceOf('\OCA\Files_Sharing\SharedMount', $mount); + /** @var SharedStorage $storage */ + $storage = $mount->getStorage(); + + $this->assertEquals(self::TEST_FILES_SHARING_API_USER1, $storage->getOwner('')); + + $this->shareManager->deleteShare($share1); + $this->shareManager->deleteShare($share2); + } + public function testOwnerPermissions(): void { self::loginHelper(self::TEST_FILES_SHARING_API_USER1); diff --git a/apps/files_sharing/tests/SharesUpdatedListenerTest.php b/apps/files_sharing/tests/SharesUpdatedListenerTest.php deleted file mode 100644 index a6ec4ace499bf..0000000000000 --- a/apps/files_sharing/tests/SharesUpdatedListenerTest.php +++ /dev/null @@ -1,183 +0,0 @@ -shareRecipientUpdater = $this->createMock(ShareRecipientUpdater::class); - $this->manager = $this->createMock(IManager::class); - $this->appConfig = new MockAppConfig([ - ConfigLexicon::UPDATE_CUTOFF_TIME => -1, - ]); - $this->userConfig = new MockUserConfig(); - $this->clock = $this->createMock(ClockInterface::class); - $this->clockFn = function () { - return new \DateTimeImmutable('@0'); - }; - $this->clock->method('now') - ->willReturnCallback(function () { - // extra wrapper so we can modify clockFn - return ($this->clockFn)(); - }); - $this->sharesUpdatedListener = new SharesUpdatedListener( - $this->manager, - $this->shareRecipientUpdater, - $this->userConfig, - $this->clock, - $this->appConfig, - ); - } - - public function testShareAdded() { - $share = $this->createMock(IShare::class); - $user1 = $this->createUser('user1', ''); - $user2 = $this->createUser('user2', ''); - - $this->manager->method('getUsersForShare') - ->willReturn([$user1, $user2]); - - $event = new ShareCreatedEvent($share); - - $this->shareRecipientUpdater - ->expects($this->exactly(2)) - ->method('updateForAddedShare') - ->willReturnCallback(function (IUser $user, IShare $eventShare) use ($user1, $user2, $share) { - $this->assertContains($user, [$user1, $user2]); - $this->assertEquals($share, $eventShare); - }); - - $this->sharesUpdatedListener->handle($event); - } - - public function testShareAddedFilterOwner() { - $share = $this->createMock(IShare::class); - $user1 = $this->createUser('user1', ''); - $user2 = $this->createUser('user2', ''); - $share->method('getSharedBy') - ->willReturn($user1->getUID()); - - $this->manager->method('getUsersForShare') - ->willReturn([$user1, $user2]); - - $event = new ShareCreatedEvent($share); - - $this->shareRecipientUpdater - ->expects($this->exactly(1)) - ->method('updateForAddedShare') - ->willReturnCallback(function (IUser $user, IShare $eventShare) use ($user2, $share) { - $this->assertEquals($user, $user2); - $this->assertEquals($share, $eventShare); - }); - - $this->sharesUpdatedListener->handle($event); - } - - public function testShareAccessUpdated() { - $user1 = $this->createUser('user1', ''); - $user2 = $this->createUser('user2', ''); - - $event = new UserShareAccessUpdatedEvent([$user1, $user2]); - - $this->shareRecipientUpdater - ->expects($this->exactly(2)) - ->method('updateForUser') - ->willReturnCallback(function (IUser $user) use ($user1, $user2) { - $this->assertContains($user, [$user1, $user2]); - }); - - $this->sharesUpdatedListener->handle($event); - } - - public function testShareDeleted() { - $share = $this->createMock(IShare::class); - $user1 = $this->createUser('user1', ''); - $user2 = $this->createUser('user2', ''); - - $this->manager->method('getUsersForShare') - ->willReturn([$user1, $user2]); - - $event = new BeforeShareDeletedEvent($share); - - $this->shareRecipientUpdater - ->expects($this->exactly(2)) - ->method('updateForDeletedShare') - ->willReturnCallback(function (IUser $user) use ($user1, $user2, $share) { - $this->assertContains($user, [$user1, $user2]); - }); - - $this->sharesUpdatedListener->handle($event); - } - - public static function shareMarkAfterTimeProvider(): array { - // note that each user will take exactly 1s in this test - return [ - [0, 0], - [0.9, 1], - [1.1, 2], - [-1, 2], - ]; - } - - #[DataProvider('shareMarkAfterTimeProvider')] - public function testShareMarkAfterTime(float $cutOff, int $expectedCount) { - $share = $this->createMock(IShare::class); - $user1 = $this->createUser('user1', ''); - $user2 = $this->createUser('user2', ''); - - $this->manager->method('getUsersForShare') - ->willReturn([$user1, $user2]); - - $event = new ShareCreatedEvent($share); - - $this->sharesUpdatedListener->setCutOffMarkTime($cutOff); - $time = 0; - $this->clockFn = function () use (&$time) { - $time++; - return new \DateTimeImmutable('@' . $time); - }; - - $this->shareRecipientUpdater - ->expects($this->exactly($expectedCount)) - ->method('updateForAddedShare'); - - $this->sharesUpdatedListener->handle($event); - - $this->assertEquals($expectedCount < 1, $this->userConfig->getValueBool($user1->getUID(), 'files_sharing', ConfigLexicon::USER_NEEDS_SHARE_REFRESH)); - $this->assertEquals($expectedCount < 2, $this->userConfig->getValueBool($user2->getUID(), 'files_sharing', ConfigLexicon::USER_NEEDS_SHARE_REFRESH)); - } -} diff --git a/apps/files_sharing/tests/TestCase.php b/apps/files_sharing/tests/TestCase.php index 02ee66d096118..6b72ecb259cab 100644 --- a/apps/files_sharing/tests/TestCase.php +++ b/apps/files_sharing/tests/TestCase.php @@ -15,7 +15,6 @@ use OC\User\DisplayNameCache; use OCA\Files_Sharing\AppInfo\Application; use OCA\Files_Sharing\External\MountProvider as ExternalMountProvider; -use OCA\Files_Sharing\Listener\SharesUpdatedListener; use OCA\Files_Sharing\MountProvider; use OCP\Files\Config\IMountProviderCollection; use OCP\Files\IRootFolder; @@ -100,8 +99,6 @@ public static function setUpBeforeClass(): void { $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER4, 'group3'); $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_GROUP1); Server::get(IGroupManager::class)->addBackend($groupBackend); - - Server::get(SharesUpdatedListener::class)->setCutOffMarkTime(-1); } protected function setUp(): void { diff --git a/apps/files_trashbin/lib/Trash/TrashItem.php b/apps/files_trashbin/lib/Trash/TrashItem.php index 2864a8cd942f4..70d5164747f0b 100644 --- a/apps/files_trashbin/lib/Trash/TrashItem.php +++ b/apps/files_trashbin/lib/Trash/TrashItem.php @@ -6,7 +6,6 @@ */ namespace OCA\Files_Trashbin\Trash; -use OCP\Files\Cache\ICacheEntry; use OCP\Files\FileInfo; use OCP\IUser; @@ -170,8 +169,4 @@ public function getDeletedBy(): ?IUser { public function getMetadata(): array { return $this->fileInfo->getMetadata(); } - - public function getData(): ICacheEntry { - return $this->fileInfo->getData(); - } } diff --git a/apps/files_versions/tests/VersioningTest.php b/apps/files_versions/tests/VersioningTest.php index fdc37016b5573..6faa324f9ca1b 100644 --- a/apps/files_versions/tests/VersioningTest.php +++ b/apps/files_versions/tests/VersioningTest.php @@ -104,8 +104,6 @@ protected function setUp(): void { \OC::registerShareHooks(Server::get(SystemConfig::class)); \OC::$server->boot(); - // ensure both users have an up-to-date state - self::loginHelper(self::TEST_VERSIONS_USER2); self::loginHelper(self::TEST_VERSIONS_USER); $this->rootView = new View(); if (!$this->rootView->file_exists(self::USERS_VERSIONS_ROOT)) { diff --git a/build/integration/features/bootstrap/Sharing.php b/build/integration/features/bootstrap/Sharing.php index 5fe98aff35d1e..72f6902af167e 100644 --- a/build/integration/features/bootstrap/Sharing.php +++ b/build/integration/features/bootstrap/Sharing.php @@ -5,7 +5,6 @@ * SPDX-FileCopyrightText: 2016 ownCloud, Inc. * SPDX-License-Identifier: AGPL-3.0-or-later */ - use Behat\Gherkin\Node\TableNode; use GuzzleHttp\Client; use PHPUnit\Framework\Assert; @@ -14,6 +13,7 @@ require __DIR__ . '/autoload.php'; + trait Sharing { use Provisioning; @@ -566,17 +566,17 @@ public function shareXIsReturnedWith(int $number, TableNode $body) { $expectedFields = array_merge($defaultExpectedFields, $body->getRowsHash()); if (!array_key_exists('uid_file_owner', $expectedFields) - && array_key_exists('uid_owner', $expectedFields)) { + && array_key_exists('uid_owner', $expectedFields)) { $expectedFields['uid_file_owner'] = $expectedFields['uid_owner']; } if (!array_key_exists('displayname_file_owner', $expectedFields) - && array_key_exists('displayname_owner', $expectedFields)) { + && array_key_exists('displayname_owner', $expectedFields)) { $expectedFields['displayname_file_owner'] = $expectedFields['displayname_owner']; } if (array_key_exists('share_type', $expectedFields) - && $expectedFields['share_type'] == 10 /* IShare::TYPE_ROOM */ - && array_key_exists('share_with', $expectedFields)) { + && $expectedFields['share_type'] == 10 /* IShare::TYPE_ROOM */ + && array_key_exists('share_with', $expectedFields)) { if ($expectedFields['share_with'] === 'private_conversation') { $expectedFields['share_with'] = 'REGEXP /^private_conversation_[0-9a-f]{6}$/'; } else { @@ -782,34 +782,4 @@ public function getArrayOfShareesResponded(ResponseInterface $response, $shareeT } return $sharees; } - - /** - * @Then /^Share mounts for "([^"]*)" match$/ - */ - public function checkShareMounts(string $user, ?TableNode $body) { - if ($body instanceof TableNode) { - $fd = $body->getRows(); - - $expected = []; - foreach ($fd as $row) { - $expected[] = $row[0]; - } - $this->runOcc(['files:mount:list', '--output', 'json', '--cached-only', $user]); - $mounts = json_decode($this->lastStdOut, true)['cached']; - $shareMounts = array_filter($mounts, fn (array $data) => $data['provider'] === \OCA\Files_Sharing\MountProvider::class); - $actual = array_values(array_map(fn (array $data) => $data['mountpoint'], $shareMounts)); - Assert::assertEquals($expected, $actual); - } - } - - /** - * @Then /^Share mounts for "([^"]*)" are empty$/ - */ - public function checkShareMountsEmpty(string $user) { - $this->runOcc(['files:mount:list', '--output', 'json', '--cached-only', $user]); - $mounts = json_decode($this->lastStdOut, true)['cached']; - $shareMounts = array_filter($mounts, fn (array $data) => $data['provider'] === \OCA\Files_Sharing\MountProvider::class); - $actual = array_values(array_map(fn (array $data) => $data['mountpoint'], $shareMounts)); - Assert::assertEquals([], $actual); - } } diff --git a/build/integration/features/bootstrap/SharingContext.php b/build/integration/features/bootstrap/SharingContext.php index 9f70382438467..c442317a32a38 100644 --- a/build/integration/features/bootstrap/SharingContext.php +++ b/build/integration/features/bootstrap/SharingContext.php @@ -32,7 +32,6 @@ protected function resetAppConfigs() { $this->deleteServerConfig('core', 'shareapi_allow_federation_on_public_shares'); $this->deleteServerConfig('files_sharing', 'outgoing_server2server_share_enabled'); $this->deleteServerConfig('core', 'shareapi_allow_view_without_download'); - $this->deleteServerConfig('files_sharing', 'update_cutoff_time'); $this->runOcc(['config:system:delete', 'share_folder']); } diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index fb2e441d93791..fb552ce785b75 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -1011,7 +1011,7 @@ public function checkIfETAGHasChanged($path, $user) { */ public function connectingToDavEndpoint() { try { - $this->response = $this->makeDavRequest($this->currentUser, 'PROPFIND', '', []); + $this->response = $this->makeDavRequest(null, 'PROPFIND', '', []); } catch (\GuzzleHttp\Exception\ClientException $e) { $this->response = $e->getResponse(); } diff --git a/build/integration/sharing_features/sharing-v1-part2.feature b/build/integration/sharing_features/sharing-v1-part2.feature index 36ddcba92d29a..a6e4c67165a0f 100644 --- a/build/integration/sharing_features/sharing-v1-part2.feature +++ b/build/integration/sharing_features/sharing-v1-part2.feature @@ -43,53 +43,10 @@ Feature: sharing | item_type | file | | mimetype | text/plain | | storage_id | shared::/textfile0 (2).txt | - | file_target | /textfile0 (2).txt | + | file_target | /textfile0.txt | | share_with | user2 | | share_with_displayname | user2 | -Scenario: getting all shares of a file with a received share after revoking the resharing rights with delayed share check - Given user "user0" exists - And parameter "update_cutoff_time" of app "files_sharing" is set to "0" - And user "user1" exists - And user "user2" exists - And file "textfile0.txt" of user "user1" is shared with user "user0" - And user "user0" accepts last share - And Updating last share with - | permissions | 1 | - And file "textfile0.txt" of user "user1" is shared with user "user2" - When As an "user0" - And sending "GET" to "/apps/files_sharing/api/v1/shares?reshares=true&path=/textfile0 (2).txt" - Then the list of returned shares has 1 shares - And share 0 is returned with - | share_type | 0 | - | uid_owner | user1 | - | displayname_owner | user1 | - | path | /textfile0 (2).txt | - | item_type | file | - | mimetype | text/plain | - | storage_id | shared::/textfile0 (2).txt | - | file_target | /textfile0.txt | - | share_with | user2 | - | share_with_displayname | user2 | - # After user2 does an FS setup the share is renamed - When As an "user2" - And Downloading file "/textfile0 (2).txt" with range "bytes=10-18" - Then Downloaded content should be "test text" - When As an "user0" - And sending "GET" to "/apps/files_sharing/api/v1/shares?reshares=true&path=/textfile0 (2).txt" - Then the list of returned shares has 1 shares - And share 0 is returned with - | share_type | 0 | - | uid_owner | user1 | - | displayname_owner | user1 | - | path | /textfile0 (2).txt | - | item_type | file | - | mimetype | text/plain | - | storage_id | shared::/textfile0 (2).txt | - | file_target | /textfile0 (2).txt | - | share_with | user2 | - | share_with_displayname | user2 | - Scenario: getting all shares of a file with a received share also reshared after revoking the resharing rights Given user "user0" exists And user "user1" exists @@ -127,7 +84,7 @@ Scenario: getting all shares of a file with a received share after revoking the | item_type | file | | mimetype | text/plain | | storage_id | shared::/textfile0 (2).txt | - | file_target | /textfile0 (2).txt | + | file_target | /textfile0.txt | | share_with | user2 | | share_with_displayname | user2 | @@ -163,7 +120,7 @@ Scenario: getting all shares of a file with a received share after revoking the | share_type | 0 | | share_with | user1 | | file_source | A_NUMBER | - | file_target | /textfile0 (2).txt | + | file_target | /textfile0.txt | | path | /textfile0.txt | | permissions | 19 | | stime | A_NUMBER | @@ -444,7 +401,7 @@ Scenario: getting all shares of a file with a received share after revoking the | item_type | file | | mimetype | text/plain | | storage_id | shared::/FOLDER/textfile0.txt | - | file_target | /textfile0 (2).txt | + | file_target | /textfile0.txt | | share_with | user2 | | share_with_displayname | user2 | @@ -483,7 +440,7 @@ Scenario: getting all shares of a file with a received share after revoking the | item_type | file | | mimetype | text/plain | | storage_id | shared::/FOLDER/textfile0 (2).txt | - | file_target | /textfile0 (2).txt | + | file_target | /textfile0.txt | | share_with | user2 | | share_with_displayname | user2 | @@ -930,7 +887,7 @@ Scenario: getting all shares of a file with a received share after revoking the | share_type | 0 | | share_with | user2 | | file_source | A_NUMBER | - | file_target | /textfile0 (2).txt | + | file_target | /textfile0.txt | | path | /textfile0 (2).txt | | permissions | 19 | | stime | A_NUMBER | diff --git a/build/integration/sharing_features/sharing-v1-part4.feature b/build/integration/sharing_features/sharing-v1-part4.feature index 5e710d7f28647..3b825aebd1813 100644 --- a/build/integration/sharing_features/sharing-v1-part4.feature +++ b/build/integration/sharing_features/sharing-v1-part4.feature @@ -315,114 +315,3 @@ Scenario: Can copy file between shares if share permissions And the OCS status code should be "100" When User "user1" copies file "/share/test.txt" to "/re-share/movetest.txt" Then the HTTP status code should be "201" - -Scenario: Group deletes removes mount without marking - Given As an "admin" - And user "user0" exists - And user "user1" exists - And group "group0" exists - And user "user0" belongs to group "group0" - And file "textfile0.txt" of user "user1" is shared with group "group0" - And As an "user0" - Then Share mounts for "user0" match - | /user0/files/textfile0 (2).txt/ | - And group "group0" does not exist - Then Share mounts for "user0" are empty - -Scenario: Group deletes removes mount with marking - Given As an "admin" - And parameter "update_cutoff_time" of app "files_sharing" is set to "0" - And user "user0" exists - And user "user1" exists - And group "group0" exists - And user "user0" belongs to group "group0" - And file "textfile0.txt" of user "user1" is shared with group "group0" - And As an "user0" - Then Share mounts for "user0" are empty - When Connecting to dav endpoint - Then Share mounts for "user0" match - | /user0/files/textfile0 (2).txt/ | - And group "group0" does not exist - Then Share mounts for "user0" match - | /user0/files/textfile0 (2).txt/ | - When Connecting to dav endpoint - Then Share mounts for "user0" are empty - -Scenario: User share mount without marking - Given As an "admin" - And user "user0" exists - And user "user1" exists - And file "textfile0.txt" of user "user1" is shared with user "user0" - And As an "user0" - Then Share mounts for "user0" match - | /user0/files/textfile0 (2).txt/ | - When Deleting last share - Then Share mounts for "user0" are empty - -Scenario: User share mount with marking - Given As an "admin" - And parameter "update_cutoff_time" of app "files_sharing" is set to "0" - And user "user0" exists - And user "user1" exists - And file "textfile0.txt" of user "user1" is shared with user "user0" - And As an "user0" - Then Share mounts for "user0" are empty - When Connecting to dav endpoint - Then Share mounts for "user0" match - | /user0/files/textfile0 (2).txt/ | - When Deleting last share - Then Share mounts for "user0" match - | /user0/files/textfile0 (2).txt/ | - When Connecting to dav endpoint - Then Share mounts for "user0" are empty - -Scenario: User added/removed to group share without marking - Given As an "admin" - And user "user0" exists - And user "user1" exists - And group "group0" exists - And file "textfile0.txt" of user "user1" is shared with group "group0" - And As an "user0" - Then Share mounts for "user0" are empty - When user "user0" belongs to group "group0" - Then Share mounts for "user0" match - | /user0/files/textfile0 (2).txt/ | - When As an "admin" - Then sending "DELETE" to "/cloud/users/user0/groups" with - | groupid | group0 | - Then As an "user0" - And Share mounts for "user0" are empty - -Scenario: User added/removed to group share with marking - Given As an "admin" - And parameter "update_cutoff_time" of app "files_sharing" is set to "0" - And user "user0" exists - And user "user1" exists - And group "group0" exists - And file "textfile0.txt" of user "user1" is shared with group "group0" - And As an "user0" - When user "user0" belongs to group "group0" - Then Share mounts for "user0" are empty - When Connecting to dav endpoint - Then Share mounts for "user0" match - | /user0/files/textfile0 (2).txt/ | - When As an "admin" - Then sending "DELETE" to "/cloud/users/user0/groups" with - | groupid | group0 | - Then As an "user0" - And Share mounts for "user0" match - | /user0/files/textfile0 (2).txt/ | - When Connecting to dav endpoint - Then Share mounts for "user0" are empty - - Scenario: Share moved without marking - Given As an "admin" - And user "user0" exists - And user "user1" exists - And file "textfile0.txt" of user "user1" is shared with user "user0" - And As an "user0" - Then Share mounts for "user0" match - | /user0/files/textfile0 (2).txt/ | - When User "user0" moves file "/textfile0 (2).txt" to "/target.txt" - Then Share mounts for "user0" match - | /user0/files/target.txt/ | diff --git a/build/integration/sharing_features/sharing-v1.feature b/build/integration/sharing_features/sharing-v1.feature index dad3d6ee6fd9a..25f168db2e7cb 100644 --- a/build/integration/sharing_features/sharing-v1.feature +++ b/build/integration/sharing_features/sharing-v1.feature @@ -559,8 +559,6 @@ Feature: sharing Scenario: getting all shares of a user using that user Given user "user0" exists And user "user1" exists - When User "user1" deletes file "/textfile0.txt" - And the HTTP status code should be "204" And file "textfile0.txt" of user "user0" is shared with user "user1" And As an "user0" When sending "GET" to "/apps/files_sharing/api/v1/shares" diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index df50cfbc096ad..ba1487488fda9 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -468,7 +468,6 @@ 'OCP\\Files\\Events\\Node\\NodeRenamedEvent' => $baseDir . '/lib/public/Files/Events/Node/NodeRenamedEvent.php', 'OCP\\Files\\Events\\Node\\NodeTouchedEvent' => $baseDir . '/lib/public/Files/Events/Node/NodeTouchedEvent.php', 'OCP\\Files\\Events\\Node\\NodeWrittenEvent' => $baseDir . '/lib/public/Files/Events/Node/NodeWrittenEvent.php', - 'OCP\\Files\\Events\\UserHomeSetupEvent' => $baseDir . '/lib/public/Files/Events/UserHomeSetupEvent.php', 'OCP\\Files\\File' => $baseDir . '/lib/public/Files/File.php', 'OCP\\Files\\FileInfo' => $baseDir . '/lib/public/Files/FileInfo.php', 'OCP\\Files\\FileNameTooLongException' => $baseDir . '/lib/public/Files/FileNameTooLongException.php', @@ -847,8 +846,6 @@ 'OCP\\Share\\Events\\ShareCreatedEvent' => $baseDir . '/lib/public/Share/Events/ShareCreatedEvent.php', 'OCP\\Share\\Events\\ShareDeletedEvent' => $baseDir . '/lib/public/Share/Events/ShareDeletedEvent.php', 'OCP\\Share\\Events\\ShareDeletedFromSelfEvent' => $baseDir . '/lib/public/Share/Events/ShareDeletedFromSelfEvent.php', - 'OCP\\Share\\Events\\ShareMovedEvent' => $baseDir . '/lib/public/Share/Events/ShareMovedEvent.php', - 'OCP\\Share\\Events\\ShareTransferredEvent' => $baseDir . '/lib/public/Share/Events/ShareTransferredEvent.php', 'OCP\\Share\\Events\\VerifyMountPointEvent' => $baseDir . '/lib/public/Share/Events/VerifyMountPointEvent.php', 'OCP\\Share\\Exceptions\\AlreadySharedException' => $baseDir . '/lib/public/Share/Exceptions/AlreadySharedException.php', 'OCP\\Share\\Exceptions\\GenericShareException' => $baseDir . '/lib/public/Share/Exceptions/GenericShareException.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 927f1d82bad0d..993dbfc52e930 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -509,7 +509,6 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\Files\\Events\\Node\\NodeRenamedEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/Node/NodeRenamedEvent.php', 'OCP\\Files\\Events\\Node\\NodeTouchedEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/Node/NodeTouchedEvent.php', 'OCP\\Files\\Events\\Node\\NodeWrittenEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/Node/NodeWrittenEvent.php', - 'OCP\\Files\\Events\\UserHomeSetupEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/UserHomeSetupEvent.php', 'OCP\\Files\\File' => __DIR__ . '/../../..' . '/lib/public/Files/File.php', 'OCP\\Files\\FileInfo' => __DIR__ . '/../../..' . '/lib/public/Files/FileInfo.php', 'OCP\\Files\\FileNameTooLongException' => __DIR__ . '/../../..' . '/lib/public/Files/FileNameTooLongException.php', @@ -888,8 +887,6 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\Share\\Events\\ShareCreatedEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/ShareCreatedEvent.php', 'OCP\\Share\\Events\\ShareDeletedEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/ShareDeletedEvent.php', 'OCP\\Share\\Events\\ShareDeletedFromSelfEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/ShareDeletedFromSelfEvent.php', - 'OCP\\Share\\Events\\ShareMovedEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/ShareMovedEvent.php', - 'OCP\\Share\\Events\\ShareTransferredEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/ShareTransferredEvent.php', 'OCP\\Share\\Events\\VerifyMountPointEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/VerifyMountPointEvent.php', 'OCP\\Share\\Exceptions\\AlreadySharedException' => __DIR__ . '/../../..' . '/lib/public/Share/Exceptions/AlreadySharedException.php', 'OCP\\Share\\Exceptions\\GenericShareException' => __DIR__ . '/../../..' . '/lib/public/Share/Exceptions/GenericShareException.php', diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index 4b58055f2cf05..3250ba371e8d2 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -524,12 +524,6 @@ public function removeMount(string $mountPoint): void { $query->delete('mounts') ->where($query->expr()->eq('mount_point', $query->createNamedParameter($mountPoint))); $query->executeStatement(); - - $parts = explode('/', $mountPoint); - if (count($parts) > 3) { - [, $userId] = $parts; - unset($this->mountsForUsers[$userId]); - } } public function addMount(IUser $user, string $mountPoint, ICacheEntry $rootCacheEntry, string $mountProvider, ?int $mountId = null): void { @@ -542,15 +536,5 @@ public function addMount(IUser $user, string $mountPoint, ICacheEntry $rootCache 'mount_id' => $mountId, 'mount_provider_class' => $mountProvider ]); - unset($this->mountsForUsers[$user->getUID()]); - } - - /** - * Clear the internal in-memory caches - */ - public function flush(): void { - $this->cacheInfoCache = new CappedMemoryCache(); - $this->internalPathCache = new CappedMemoryCache(); - $this->mountsForUsers = new CappedMemoryCache(); } } diff --git a/lib/private/Files/FileInfo.php b/lib/private/Files/FileInfo.php index cc01c8f6c79fc..967d404b8a4f0 100644 --- a/lib/private/Files/FileInfo.php +++ b/lib/private/Files/FileInfo.php @@ -7,8 +7,8 @@ */ namespace OC\Files; -use OC\Files\Cache\CacheEntry; use OC\Files\Mount\HomeMountPoint; +use OCA\Files_Sharing\External\Mount; use OCA\Files_Sharing\ISharedMountPoint; use OCP\Files\Cache\ICacheEntry; use OCP\Files\Mount\IMountPoint; @@ -223,12 +223,8 @@ public function getType() { return $this->data['type']; } - public function getData(): ICacheEntry { - if ($this->data instanceof ICacheEntry) { - return $this->data; - } else { - return new CacheEntry($this->data); - } + public function getData() { + return $this->data; } /** diff --git a/lib/private/Files/Mount/Manager.php b/lib/private/Files/Mount/Manager.php index 0d95a2e9917d3..3d586ba4c5911 100644 --- a/lib/private/Files/Mount/Manager.php +++ b/lib/private/Files/Mount/Manager.php @@ -59,14 +59,11 @@ public function removeMount(string $mountPoint): void { } public function moveMount(string $mountPoint, string $target): void { - if ($mountPoint !== $target && isset($this->mounts[$mountPoint])) { - $this->mounts[$target] = $this->mounts[$mountPoint]; - $this->mounts[$target]->setMountPoint($target); - unset($this->mounts[$mountPoint]); - $this->pathCache->clear(); - $this->inPathCache->clear(); - $this->areMountsSorted = false; - } + $this->mounts[$target] = $this->mounts[$mountPoint]; + unset($this->mounts[$mountPoint]); + $this->pathCache->clear(); + $this->inPathCache->clear(); + $this->areMountsSorted = false; } /** diff --git a/lib/private/Files/Node/LazyFolder.php b/lib/private/Files/Node/LazyFolder.php index 58f58c98660b2..c23a7d03ada9e 100644 --- a/lib/private/Files/Node/LazyFolder.php +++ b/lib/private/Files/Node/LazyFolder.php @@ -10,7 +10,6 @@ use OC\Files\Filesystem; use OC\Files\Utils\PathHelper; use OCP\Constants; -use OCP\Files\Cache\ICacheEntry; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\Files\Mount\IMountPoint; @@ -566,10 +565,6 @@ public function getMetadata(): array { return $this->data['metadata'] ?? $this->__call(__FUNCTION__, func_get_args()); } - public function getData(): ICacheEntry { - return $this->__call(__FUNCTION__, func_get_args()); - } - public function verifyPath($fileName, $readonly = false): void { $this->__call(__FUNCTION__, func_get_args()); } diff --git a/lib/private/Files/Node/Node.php b/lib/private/Files/Node/Node.php index 7a7867e6a4e7a..fd8d84883d964 100644 --- a/lib/private/Files/Node/Node.php +++ b/lib/private/Files/Node/Node.php @@ -12,7 +12,6 @@ use OC\Files\Utils\PathHelper; use OCP\EventDispatcher\GenericEvent; use OCP\EventDispatcher\IEventDispatcher; -use OCP\Files\Cache\ICacheEntry; use OCP\Files\FileInfo; use OCP\Files\InvalidPathException; use OCP\Files\IRootFolder; @@ -487,8 +486,4 @@ public function getParentId(): int { public function getMetadata(): array { return $this->fileInfo->getMetadata(); } - - public function getData(): ICacheEntry { - return $this->fileInfo->getData(); - } } diff --git a/lib/private/Files/SetupManager.php b/lib/private/Files/SetupManager.php index 4aab010f42357..06ec47d165489 100644 --- a/lib/private/Files/SetupManager.php +++ b/lib/private/Files/SetupManager.php @@ -43,7 +43,6 @@ use OCP\Files\Events\InvalidateMountCacheEvent; use OCP\Files\Events\Node\BeforeNodeRenamedEvent; use OCP\Files\Events\Node\FilesystemTornDownEvent; -use OCP\Files\Events\UserHomeSetupEvent; use OCP\Files\Mount\IMountManager; use OCP\Files\Mount\IMountPoint; use OCP\Files\NotFoundException; @@ -70,8 +69,6 @@ class SetupManager { private array $setupUsers = []; // List of users for which all mounts are setup private array $setupUsersComplete = []; - // List of users for which we've already refreshed the non-authoritative mounts - private array $usersMountsUpdated = []; /** * An array of provider classes that have been set up, indexed by UserUID. * @@ -236,10 +233,6 @@ function ($mountPoint, IStorage $storage, IMountPoint $mount) use ($reSharingEna * Update the cached mounts for all non-authoritative mount providers for a user. */ private function updateNonAuthoritativeProviders(IUser $user): void { - if (isset($this->usersMountsUpdated[$user->getUID()])) { - return; - } - // prevent recursion loop from when getting mounts from providers ends up setting up the filesystem static $updatingProviders = false; if ($updatingProviders) { @@ -260,7 +253,6 @@ private function updateNonAuthoritativeProviders(IUser $user): void { $mount = $this->mountProviderCollection->getUserMountsForProviderClasses($user, $providerNames); $this->userMountCache->registerMounts($user, $mount, $providerNames); - $this->usersMountsUpdated[$user->getUID()] = true; $updatingProviders = false; } @@ -333,9 +325,6 @@ private function oneTimeUserSetup(IUser $user) { $this->eventLogger->end('fs:setup:user:home:scan'); } $this->eventLogger->end('fs:setup:user:home'); - - $event = new UserHomeSetupEvent($user, $homeMount); - $this->eventDispatcher->dispatchTyped($event); } else { $this->mountManager->addMount(new MountPoint( new NullStorage([]), @@ -696,13 +685,8 @@ public function setupForProvider(string $path, array $providers): void { } if (!$providersAreAuthoritative && $this->fullSetupRequired($user)) { - if ($this->optimizeAuthoritativeProviders) { - $this->updateNonAuthoritativeProviders($user); - $this->markUserMountsCached($user); - } else { - $this->setupForUser($user); - return; - } + $this->setupForUser($user); + return; } $this->eventLogger->start('fs:setup:user:providers', 'Setup filesystem for ' . implode(', ', $providers)); @@ -746,7 +730,6 @@ public function tearDown() { $this->setupUserMountProviders = []; $this->setupMountProviderPaths = []; $this->fullSetupRequired = []; - $this->usersMountsUpdated = []; $this->rootSetup = false; $this->mountManager->clear(); $this->userMountCache->clear(); diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index edc906feef7bd..163526cdfbd1a 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -47,7 +47,6 @@ use OCP\Share\Events\ShareCreatedEvent; use OCP\Share\Events\ShareDeletedEvent; use OCP\Share\Events\ShareDeletedFromSelfEvent; -use OCP\Share\Events\ShareMovedEvent; use OCP\Share\Exceptions\AlreadySharedException; use OCP\Share\Exceptions\GenericShareException; use OCP\Share\Exceptions\ShareNotFound; @@ -1192,11 +1191,7 @@ public function moveShare(IShare $share, string $recipientId): IShare { [$providerId,] = $this->splitFullId($share->getFullId()); $provider = $this->factory->getProvider($providerId); - $result = $provider->move($share, $recipientId); - - $this->dispatchEvent(new ShareMovedEvent($share), 'share moved'); - - return $result; + return $provider->move($share, $recipientId); } #[Override] diff --git a/lib/private/Share20/Share.php b/lib/private/Share20/Share.php index 7593ff45636de..1069d0a706c1c 100644 --- a/lib/private/Share20/Share.php +++ b/lib/private/Share20/Share.php @@ -64,8 +64,6 @@ class Share implements IShare { private ?int $parent = null; /** @var string */ private $target; - /** @var string */ - private ?string $originalTarget = null; /** @var \DateTime */ private $shareTime; /** @var bool */ @@ -541,21 +539,10 @@ public function getParent(): ?int { * @inheritdoc */ public function setTarget($target) { - // if the target is changed, save the original target - if ($this->target && !$this->originalTarget) { - $this->originalTarget = $this->target; - } $this->target = $target; return $this; } - /** - * Return the original target, if this share was moved - */ - public function getOriginalTarget(): ?string { - return $this->originalTarget; - } - /** * @inheritdoc */ diff --git a/lib/public/Files/Events/UserHomeSetupEvent.php b/lib/public/Files/Events/UserHomeSetupEvent.php deleted file mode 100644 index 2b49f64a28b92..0000000000000 --- a/lib/public/Files/Events/UserHomeSetupEvent.php +++ /dev/null @@ -1,46 +0,0 @@ -user; - } - - /** - * @since 34.0.0 - */ - public function getHomeMount(): IMountPoint { - return $this->homeMount; - } -} diff --git a/lib/public/Files/FileInfo.php b/lib/public/Files/FileInfo.php index 117408f23bc63..95419d6354ac4 100644 --- a/lib/public/Files/FileInfo.php +++ b/lib/public/Files/FileInfo.php @@ -8,7 +8,6 @@ namespace OCP\Files; use OCP\AppFramework\Attribute\Consumable; -use OCP\Files\Cache\ICacheEntry; use OCP\Files\Storage\IStorage; /** @@ -299,12 +298,4 @@ public function getParentId(): int; * @since 28.0.0 */ public function getMetadata(): array; - - /** - * Get the filecache data for the file - * - * @return ICacheEntry - * @since 34.0.0 - */ - public function getData(): ICacheEntry; } diff --git a/lib/public/Share/Events/ShareMovedEvent.php b/lib/public/Share/Events/ShareMovedEvent.php deleted file mode 100644 index 36c020fc0c488..0000000000000 --- a/lib/public/Share/Events/ShareMovedEvent.php +++ /dev/null @@ -1,33 +0,0 @@ -share; - } -} diff --git a/lib/public/Share/Events/ShareTransferredEvent.php b/lib/public/Share/Events/ShareTransferredEvent.php deleted file mode 100644 index 06a7ac3759bae..0000000000000 --- a/lib/public/Share/Events/ShareTransferredEvent.php +++ /dev/null @@ -1,33 +0,0 @@ -share; - } -} diff --git a/lib/public/Share/IShare.php b/lib/public/Share/IShare.php index 0fc17958df10f..b268fd00758f3 100644 --- a/lib/public/Share/IShare.php +++ b/lib/public/Share/IShare.php @@ -553,13 +553,6 @@ public function getParent(): ?int; */ public function setTarget($target); - /** - * Return the original target, if this share was moved - * - * @since 33.0.0 - */ - public function getOriginalTarget(): ?string; - /** * Get the target path of this share relative to the recipients user folder. * diff --git a/tests/lib/Files/ViewTest.php b/tests/lib/Files/ViewTest.php index 72df3810f1909..5d431764a8cae 100644 --- a/tests/lib/Files/ViewTest.php +++ b/tests/lib/Files/ViewTest.php @@ -1550,9 +1550,6 @@ private function createTestMovableMountPoints($mountPoints) { $storage->method('getStorageCache')->willReturnCallback(function () use ($storage) { return new \OC\Files\Cache\Storage($storage, true, Server::get(IDBConnection::class)); }); - $storage->method('getCache')->willReturnCallback(function () use ($storage) { - return new \OC\Files\Cache\Cache($storage); - }); $mounts[] = $this->getMockBuilder(TestMoveableMountPoint::class) ->onlyMethods(['moveMount']) @@ -1653,10 +1650,7 @@ public function testMoveMountPointIntoSharedFolder(): void { $mount2->expects($this->once()) ->method('moveMount') - ->willReturnCallback(function ($target) use ($mount2) { - $mount2->setMountPoint($target); - return true; - }); + ->willReturn(true); $view = new View('/' . $this->user . '/files/'); $view->mkdir('shareddir'); diff --git a/tests/lib/Mock/Config/MockAppConfig.php b/tests/lib/Mock/Config/MockAppConfig.php deleted file mode 100644 index f601bf6dbc570..0000000000000 --- a/tests/lib/Mock/Config/MockAppConfig.php +++ /dev/null @@ -1,169 +0,0 @@ -config[$app][$key]); - } - - public function getValues($app, $key): array { - throw new \Exception('not implemented'); - } - - public function getFilteredValues($app): array { - throw new \Exception('not implemented'); - } - - public function getApps(): array { - return array_keys($this->config); - } - - public function getKeys(string $app): array { - return array_keys($this->config[$app] ?? []); - } - - public function isSensitive(string $app, string $key, ?bool $lazy = false): bool { - throw new \Exception('not implemented'); - } - - public function isLazy(string $app, string $key): bool { - throw new \Exception('not implemented'); - } - - public function getAllValues(string $app, string $prefix = '', bool $filtered = false): array { - throw new \Exception('not implemented'); - } - - public function searchValues(string $key, bool $lazy = false, ?int $typedAs = null): array { - throw new \Exception('not implemented'); - } - - public function getValueString(string $app, string $key, string $default = '', bool $lazy = false): string { - return (string)(($this->config[$app] ?? [])[$key] ?? $default); - } - - public function getValueInt(string $app, string $key, int $default = 0, bool $lazy = false): int { - return (int)(($this->config[$app] ?? [])[$key] ?? $default); - } - - public function getValueFloat(string $app, string $key, float $default = 0, bool $lazy = false): float { - return (float)(($this->config[$app] ?? [])[$key] ?? $default); - } - - public function getValueBool(string $app, string $key, bool $default = false, bool $lazy = false): bool { - return (bool)(($this->config[$app] ?? [])[$key] ?? $default); - } - - public function getValueArray(string $app, string $key, array $default = [], bool $lazy = false): array { - return ($this->config[$app] ?? [])[$key] ?? $default; - } - - public function getValueType(string $app, string $key, ?bool $lazy = null): int { - throw new \Exception('not implemented'); - } - - public function setValueString(string $app, string $key, string $value, bool $lazy = false, bool $sensitive = false): bool { - $this->config[$app][$key] = $value; - return true; - } - - public function setValueInt(string $app, string $key, int $value, bool $lazy = false, bool $sensitive = false): bool { - $this->config[$app][$key] = $value; - return true; - } - - public function setValueFloat(string $app, string $key, float $value, bool $lazy = false, bool $sensitive = false): bool { - $this->config[$app][$key] = $value; - return true; - } - - public function setValueBool(string $app, string $key, bool $value, bool $lazy = false): bool { - $this->config[$app][$key] = $value; - return true; - } - - public function setValueArray(string $app, string $key, array $value, bool $lazy = false, bool $sensitive = false): bool { - $this->config[$app][$key] = $value; - return true; - } - - public function updateSensitive(string $app, string $key, bool $sensitive): bool { - throw new \Exception('not implemented'); - } - - public function updateLazy(string $app, string $key, bool $lazy): bool { - throw new \Exception('not implemented'); - } - - public function getDetails(string $app, string $key): array { - throw new \Exception('not implemented'); - } - - public function convertTypeToInt(string $type): int { - return match (strtolower($type)) { - 'mixed' => IAppConfig::VALUE_MIXED, - 'string' => IAppConfig::VALUE_STRING, - 'integer' => IAppConfig::VALUE_INT, - 'float' => IAppConfig::VALUE_FLOAT, - 'boolean' => IAppConfig::VALUE_BOOL, - 'array' => IAppConfig::VALUE_ARRAY, - default => throw new AppConfigIncorrectTypeException('Unknown type ' . $type) - }; - } - - public function convertTypeToString(int $type): string { - $type &= ~self::VALUE_SENSITIVE; - - return match ($type) { - IAppConfig::VALUE_MIXED => 'mixed', - IAppConfig::VALUE_STRING => 'string', - IAppConfig::VALUE_INT => 'integer', - IAppConfig::VALUE_FLOAT => 'float', - IAppConfig::VALUE_BOOL => 'boolean', - IAppConfig::VALUE_ARRAY => 'array', - default => throw new AppConfigIncorrectTypeException('Unknown numeric type ' . $type) - }; - } - - public function deleteKey(string $app, string $key): void { - if ($this->hasKey($app, $key)) { - unset($this->config[$app][$key]); - } - } - - public function deleteApp(string $app): void { - if (isset($this->config[$app])) { - unset($this->config[$app]); - } - } - - public function clearCache(bool $reload = false): void { - } - - public function searchKeys(string $app, string $prefix = '', bool $lazy = false): array { - throw new \Exception('not implemented'); - } - - public function getKeyDetails(string $app, string $key): array { - throw new \Exception('not implemented'); - } - - public function getAppInstalledVersions(bool $onlyEnabled = false): array { - throw new \Exception('not implemented'); - } -} diff --git a/tests/lib/Mock/Config/MockUserConfig.php b/tests/lib/Mock/Config/MockUserConfig.php deleted file mode 100644 index cc4619ef191ef..0000000000000 --- a/tests/lib/Mock/Config/MockUserConfig.php +++ /dev/null @@ -1,209 +0,0 @@ -config); - } - - public function getApps(string $userId): array { - return array_keys($this->config[$userId] ?? []); - } - - public function getKeys(string $userId, string $app): array { - if (isset($this->config[$userId][$app])) { - return array_keys($this->config[$userId][$app]); - } else { - return []; - } - } - - public function hasKey(string $userId, string $app, string $key, ?bool $lazy = false): bool { - return isset($this->config[$userId][$app][$key]); - } - - public function isSensitive(string $userId, string $app, string $key, ?bool $lazy = false): bool { - throw new \Exception('not implemented'); - } - - public function isIndexed(string $userId, string $app, string $key, ?bool $lazy = false): bool { - throw new \Exception('not implemented'); - } - - public function isLazy(string $userId, string $app, string $key): bool { - throw new \Exception('not implemented'); - } - - public function getValues(string $userId, string $app, string $prefix = '', bool $filtered = false): array { - throw new \Exception('not implemented'); - } - - public function getAllValues(string $userId, bool $filtered = false): array { - throw new \Exception('not implemented'); - } - - public function getValuesByApps(string $userId, string $key, bool $lazy = false, ?ValueType $typedAs = null): array { - throw new \Exception('not implemented'); - } - - public function getValuesByUsers(string $app, string $key, ?ValueType $typedAs = null, ?array $userIds = null): array { - throw new \Exception('not implemented'); - } - - public function searchUsersByValueString(string $app, string $key, string $value, bool $caseInsensitive = false): Generator { - throw new \Exception('not implemented'); - } - - public function searchUsersByValueInt(string $app, string $key, int $value): Generator { - throw new \Exception('not implemented'); - } - - public function searchUsersByValues(string $app, string $key, array $values): Generator { - throw new \Exception('not implemented'); - } - - public function searchUsersByValueBool(string $app, string $key, bool $value): Generator { - throw new \Exception('not implemented'); - } - - public function getValueString(string $userId, string $app, string $key, string $default = '', bool $lazy = false): string { - if (isset($this->config[$userId][$app])) { - return (string)$this->config[$userId][$app][$key]; - } else { - return $default; - } - } - - public function getValueInt(string $userId, string $app, string $key, int $default = 0, bool $lazy = false): int { - if (isset($this->config[$userId][$app])) { - return (int)$this->config[$userId][$app][$key]; - } else { - return $default; - } - } - - public function getValueFloat(string $userId, string $app, string $key, float $default = 0, bool $lazy = false): float { - if (isset($this->config[$userId][$app])) { - return (float)$this->config[$userId][$app][$key]; - } else { - return $default; - } - } - - public function getValueBool(string $userId, string $app, string $key, bool $default = false, bool $lazy = false): bool { - if (isset($this->config[$userId][$app])) { - return (bool)$this->config[$userId][$app][$key]; - } else { - return $default; - } - } - - public function getValueArray(string $userId, string $app, string $key, array $default = [], bool $lazy = false): array { - if (isset($this->config[$userId][$app])) { - return $this->config[$userId][$app][$key]; - } else { - return $default; - } - } - - public function getValueType(string $userId, string $app, string $key, ?bool $lazy = null): ValueType { - throw new \Exception('not implemented'); - } - - public function getValueFlags(string $userId, string $app, string $key, bool $lazy = false): int { - throw new \Exception('not implemented'); - } - - public function setValueString(string $userId, string $app, string $key, string $value, bool $lazy = false, int $flags = 0): bool { - $this->config[$userId][$app][$key] = $value; - return true; - } - - public function setValueInt(string $userId, string $app, string $key, int $value, bool $lazy = false, int $flags = 0): bool { - $this->config[$userId][$app][$key] = $value; - return true; - } - - public function setValueFloat(string $userId, string $app, string $key, float $value, bool $lazy = false, int $flags = 0): bool { - $this->config[$userId][$app][$key] = $value; - return true; - } - - public function setValueBool(string $userId, string $app, string $key, bool $value, bool $lazy = false): bool { - $this->config[$userId][$app][$key] = $value; - return true; - } - - public function setValueArray(string $userId, string $app, string $key, array $value, bool $lazy = false, int $flags = 0): bool { - $this->config[$userId][$app][$key] = $value; - return true; - } - - public function updateSensitive(string $userId, string $app, string $key, bool $sensitive): bool { - throw new \Exception('not implemented'); - } - - public function updateGlobalSensitive(string $app, string $key, bool $sensitive): void { - throw new \Exception('not implemented'); - } - - public function updateIndexed(string $userId, string $app, string $key, bool $indexed): bool { - throw new \Exception('not implemented'); - } - - public function updateGlobalIndexed(string $app, string $key, bool $indexed): void { - throw new \Exception('not implemented'); - } - - public function updateLazy(string $userId, string $app, string $key, bool $lazy): bool { - throw new \Exception('not implemented'); - } - - public function updateGlobalLazy(string $app, string $key, bool $lazy): void { - throw new \Exception('not implemented'); - } - - public function getDetails(string $userId, string $app, string $key): array { - throw new \Exception('not implemented'); - } - - public function deleteUserConfig(string $userId, string $app, string $key): void { - unset($this->config[$userId][$app][$key]); - } - - public function deleteKey(string $app, string $key): void { - throw new \Exception('not implemented'); - } - - public function deleteApp(string $app): void { - throw new \Exception('not implemented'); - } - - public function deleteAllUserConfig(string $userId): void { - unset($this->config[$userId]); - } - - public function clearCache(string $userId, bool $reload = false): void { - throw new \Exception('not implemented'); - } - - public function clearCacheAll(): void { - throw new \Exception('not implemented'); - } -} diff --git a/tests/lib/TestCase.php b/tests/lib/TestCase.php index 551c1024e0bef..6fb5bc309ed9b 100644 --- a/tests/lib/TestCase.php +++ b/tests/lib/TestCase.php @@ -13,7 +13,6 @@ use OC\Files\AppData\Factory; use OC\Files\Cache\Storage; use OC\Files\Config\MountProviderCollection; -use OC\Files\Config\UserMountCache; use OC\Files\Filesystem; use OC\Files\Mount\CacheMountProvider; use OC\Files\Mount\LocalHomeMountProvider; @@ -181,8 +180,6 @@ protected function tearDown(): void { Storage::getGlobalCache()->clearCache(); } - Server::get(UserMountCache::class)->flush(); - // tearDown the traits $traits = $this->getTestTraits(); foreach ($traits as $trait) {