diff --git a/apps/files_sharing/composer/composer/autoload_classmap.php b/apps/files_sharing/composer/composer/autoload_classmap.php index e1abddb3a6450..85641e8f596cb 100644 --- a/apps/files_sharing/composer/composer/autoload_classmap.php +++ b/apps/files_sharing/composer/composer/autoload_classmap.php @@ -60,6 +60,7 @@ 'OCA\\Files_Sharing\\Listener\\BeforeZipCreatedListener' => $baseDir . '/../lib/Listener/BeforeZipCreatedListener.php', 'OCA\\Files_Sharing\\Listener\\LoadAdditionalListener' => $baseDir . '/../lib/Listener/LoadAdditionalListener.php', 'OCA\\Files_Sharing\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php', + 'OCA\\Files_Sharing\\Listener\\RegisterMountProviderListener' => $baseDir . '/../lib/Listener/RegisterMountProviderListener.php', 'OCA\\Files_Sharing\\Listener\\ShareInteractionListener' => $baseDir . '/../lib/Listener/ShareInteractionListener.php', 'OCA\\Files_Sharing\\Listener\\UserAddedToGroupListener' => $baseDir . '/../lib/Listener/UserAddedToGroupListener.php', 'OCA\\Files_Sharing\\Listener\\UserShareAcceptanceListener' => $baseDir . '/../lib/Listener/UserShareAcceptanceListener.php', diff --git a/apps/files_sharing/composer/composer/autoload_static.php b/apps/files_sharing/composer/composer/autoload_static.php index 5d2fb3bac2a47..56db499253ae2 100644 --- a/apps/files_sharing/composer/composer/autoload_static.php +++ b/apps/files_sharing/composer/composer/autoload_static.php @@ -75,6 +75,7 @@ class ComposerStaticInitFiles_Sharing 'OCA\\Files_Sharing\\Listener\\BeforeZipCreatedListener' => __DIR__ . '/..' . '/../lib/Listener/BeforeZipCreatedListener.php', 'OCA\\Files_Sharing\\Listener\\LoadAdditionalListener' => __DIR__ . '/..' . '/../lib/Listener/LoadAdditionalListener.php', 'OCA\\Files_Sharing\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php', + 'OCA\\Files_Sharing\\Listener\\RegisterMountProviderListener' => __DIR__ . '/..' . '/../lib/Listener/RegisterMountProviderListener.php', 'OCA\\Files_Sharing\\Listener\\ShareInteractionListener' => __DIR__ . '/..' . '/../lib/Listener/ShareInteractionListener.php', 'OCA\\Files_Sharing\\Listener\\UserAddedToGroupListener' => __DIR__ . '/..' . '/../lib/Listener/UserAddedToGroupListener.php', 'OCA\\Files_Sharing\\Listener\\UserShareAcceptanceListener' => __DIR__ . '/..' . '/../lib/Listener/UserShareAcceptanceListener.php', diff --git a/apps/files_sharing/lib/AppInfo/Application.php b/apps/files_sharing/lib/AppInfo/Application.php index 82a5981febf85..d08ef204fa6a2 100644 --- a/apps/files_sharing/lib/AppInfo/Application.php +++ b/apps/files_sharing/lib/AppInfo/Application.php @@ -19,13 +19,13 @@ use OCA\Files_Sharing\Listener\BeforeZipCreatedListener; use OCA\Files_Sharing\Listener\LoadAdditionalListener; use OCA\Files_Sharing\Listener\LoadSidebarListener; +use OCA\Files_Sharing\Listener\RegisterMountProviderListener; use OCA\Files_Sharing\Listener\ShareInteractionListener; use OCA\Files_Sharing\Listener\UserAddedToGroupListener; use OCA\Files_Sharing\Listener\UserShareAcceptanceListener; use OCA\Files_Sharing\Middleware\OCSShareAPIMiddleware; use OCA\Files_Sharing\Middleware\ShareInfoMiddleware; use OCA\Files_Sharing\Middleware\SharingCheckMiddleware; -use OCA\Files_Sharing\MountProvider; use OCA\Files_Sharing\Notification\Listener; use OCA\Files_Sharing\Notification\Notifier; use OCA\Files_Sharing\ShareBackend\File; @@ -37,9 +37,9 @@ use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent as ResourcesLoadAdditionalScriptsEvent; use OCP\EventDispatcher\IEventDispatcher; use OCP\Federation\ICloudIdManager; -use OCP\Files\Config\IMountProviderCollection; use OCP\Files\Events\BeforeDirectFileDownloadEvent; use OCP\Files\Events\BeforeZipCreatedEvent; +use OCP\Files\Events\RegisterMountProviderEvent; use OCP\Group\Events\GroupChangedEvent; use OCP\Group\Events\GroupDeletedEvent; use OCP\Group\Events\UserAddedEvent; @@ -95,10 +95,11 @@ function () use ($c) { // Handle download events for view only checks $context->registerEventListener(BeforeZipCreatedEvent::class, BeforeZipCreatedListener::class); $context->registerEventListener(BeforeDirectFileDownloadEvent::class, BeforeDirectFileDownloadListener::class); + + $context->registerEventListener(RegisterMountProviderEvent::class, RegisterMountProviderListener::class); } public function boot(IBootContext $context): void { - $context->injectFn([$this, 'registerMountProviders']); $context->injectFn([$this, 'registerEventsScripts']); Helper::registerHooks(); @@ -107,12 +108,6 @@ public function boot(IBootContext $context): void { Share::registerBackend('folder', Folder::class, 'file'); } - - public function registerMountProviders(IMountProviderCollection $mountProviderCollection, MountProvider $mountProvider, ExternalMountProvider $externalMountProvider): void { - $mountProviderCollection->registerProvider($mountProvider); - $mountProviderCollection->registerProvider($externalMountProvider); - } - public function registerEventsScripts(IEventDispatcher $dispatcher): void { $dispatcher->addListener(ResourcesLoadAdditionalScriptsEvent::class, function () { \OCP\Util::addScript('files_sharing', 'collaboration'); diff --git a/apps/files_sharing/lib/Listener/RegisterMountProviderListener.php b/apps/files_sharing/lib/Listener/RegisterMountProviderListener.php new file mode 100644 index 0000000000000..c4d932f4fb745 --- /dev/null +++ b/apps/files_sharing/lib/Listener/RegisterMountProviderListener.php @@ -0,0 +1,36 @@ + */ +class RegisterMountProviderListener implements IEventListener { + + public function __construct( + private MountProvider $mountProvider, + private ExternalMountProvider $externalMountProvider, + ) { + } + + public function handle(Event $event): void { + if (!($event instanceof RegisterMountProviderEvent)) { + return; + } + + $mountProviderCollection = $event->getProviderCollection(); + $mountProviderCollection->registerProvider($this->mountProvider); + $mountProviderCollection->registerProvider($this->externalMountProvider); + } +} diff --git a/apps/files_sharing/tests/TestCase.php b/apps/files_sharing/tests/TestCase.php index 4aaeec1f76587..3909a6b82cd60 100644 --- a/apps/files_sharing/tests/TestCase.php +++ b/apps/files_sharing/tests/TestCase.php @@ -9,9 +9,6 @@ use OC\Files\Filesystem; use OC\User\DisplayNameCache; use OCA\Files_Sharing\AppInfo\Application; -use OCA\Files_Sharing\External\MountProvider as ExternalMountProvider; -use OCA\Files_Sharing\MountProvider; -use OCP\Files\Config\IMountProviderCollection; use OCP\Share\IShare; use Test\Traits\MountProviderTrait; @@ -54,11 +51,6 @@ public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); $app = new Application(); - $app->registerMountProviders( - \OC::$server->get(IMountProviderCollection::class), - \OC::$server->get(MountProvider::class), - \OC::$server->get(ExternalMountProvider::class), - ); // reset backend \OC_User::clearBackends(); diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 0837fe2ab62b1..0948259ebed21 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -370,6 +370,7 @@ '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\\RegisterMountProviderEvent' => $baseDir . '/lib/public/Files/Events/RegisterMountProviderEvent.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', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index b7f11b43266df..99da90707dc94 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -403,6 +403,7 @@ 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\\RegisterMountProviderEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/RegisterMountProviderEvent.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', diff --git a/lib/private/Files/Config/MountProviderCollection.php b/lib/private/Files/Config/MountProviderCollection.php index 0e103690b6bb0..26af82d60ee4b 100644 --- a/lib/private/Files/Config/MountProviderCollection.php +++ b/lib/private/Files/Config/MountProviderCollection.php @@ -10,11 +10,13 @@ use OC\Hooks\Emitter; use OC\Hooks\EmitterTrait; use OCP\Diagnostics\IEventLogger; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Config\IHomeMountProvider; use OCP\Files\Config\IMountProvider; use OCP\Files\Config\IMountProviderCollection; use OCP\Files\Config\IRootMountProvider; use OCP\Files\Config\IUserMountCache; +use OCP\Files\Events\RegisterMountProviderEvent; use OCP\Files\Mount\IMountManager; use OCP\Files\Mount\IMountPoint; use OCP\Files\Storage\IStorageFactory; @@ -23,46 +25,30 @@ class MountProviderCollection implements IMountProviderCollection, Emitter { use EmitterTrait; - /** - * @var \OCP\Files\Config\IHomeMountProvider[] - */ - private $homeProviders = []; + /** @var \OCP\Files\Config\IHomeMountProvider[] */ + private array $homeProviders = []; - /** - * @var \OCP\Files\Config\IMountProvider[] - */ - private $providers = []; + /** @var \OCP\Files\Config\IMountProvider[] */ + private array $providers = []; /** @var \OCP\Files\Config\IRootMountProvider[] */ - private $rootProviders = []; - - /** - * @var \OCP\Files\Storage\IStorageFactory - */ - private $loader; - - /** - * @var \OCP\Files\Config\IUserMountCache - */ - private $mountCache; + private array $rootProviders = []; /** @var callable[] */ - private $mountFilters = []; + private array $mountFilters = []; - private IEventLogger $eventLogger; + private bool $registerEventEmitted = false; /** * @param \OCP\Files\Storage\IStorageFactory $loader * @param IUserMountCache $mountCache */ public function __construct( - IStorageFactory $loader, - IUserMountCache $mountCache, - IEventLogger $eventLogger + private IStorageFactory $loader, + private IUserMountCache $mountCache, + private IEventLogger $eventLogger, + private IEventDispatcher $eventDispatcher, ) { - $this->loader = $loader; - $this->mountCache = $mountCache; - $this->eventLogger = $eventLogger; } private function getMountsFromProvider(IMountProvider $provider, IUser $user, IStorageFactory $loader): array { @@ -91,12 +77,12 @@ private function getUserMountsForProviders(IUser $user, array $providers): array } public function getMountsForUser(IUser $user): array { - return $this->getUserMountsForProviders($user, $this->providers); + return $this->getUserMountsForProviders($user, $this->getProviders()); } public function getUserMountsForProviderClasses(IUser $user, array $mountProviderClasses): array { $providers = array_filter( - $this->providers, + $this->getProviders(), fn (IMountProvider $mountProvider) => (in_array(get_class($mountProvider), $mountProviderClasses)) ); return $this->getUserMountsForProviders($user, $providers); @@ -107,9 +93,9 @@ public function addMountForUser(IUser $user, IMountManager $mountManager, ?calla // to check for name collisions $firstMounts = []; if ($providerFilter) { - $providers = array_filter($this->providers, $providerFilter); + $providers = array_filter($this->getProviders(), $providerFilter); } else { - $providers = $this->providers; + $providers = $this->getProviders(); } $firstProviders = array_filter($providers, function (IMountProvider $provider) { return (get_class($provider) !== 'OCA\Files_Sharing\MountProvider'); @@ -230,12 +216,17 @@ public function getRootMounts(): array { } public function clearProviders() { + $this->registerEventEmitted = false; $this->providers = []; $this->homeProviders = []; $this->rootProviders = []; } public function getProviders(): array { + if (!$this->registerEventEmitted) { + $this->registerEventEmitted = true; + $this->eventDispatcher->dispatchTyped(new RegisterMountProviderEvent($this)); + } return $this->providers; } } diff --git a/lib/private/Server.php b/lib/private/Server.php index bcdf482f02d0e..a95241142995f 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -889,7 +889,8 @@ public function __construct($webRoot, \OC\Config $config) { $loader = $c->get(IStorageFactory::class); $mountCache = $c->get(IUserMountCache::class); $eventLogger = $c->get(IEventLogger::class); - $manager = new MountProviderCollection($loader, $mountCache, $eventLogger); + $eventDispatcher = $c->get(IEventDispatcher::class); + $manager = new MountProviderCollection($loader, $mountCache, $eventLogger, $eventDispatcher); // builtin providers diff --git a/lib/public/Files/Events/RegisterMountProviderEvent.php b/lib/public/Files/Events/RegisterMountProviderEvent.php new file mode 100644 index 0000000000000..2c9188d1fcb2f --- /dev/null +++ b/lib/public/Files/Events/RegisterMountProviderEvent.php @@ -0,0 +1,29 @@ +mountProviderCollection; + } +}