diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 6319b04dd..3a19dd59f 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -53,6 +53,7 @@ use OCP\Mail\IMailer; use OCP\RichObjectStrings\IValidator; use OCP\Share\Events\BeforeShareDeletedEvent; +use OCP\Share\Events\ShareCreatedEvent; use OCP\Share\Events\ShareDeletedFromSelfEvent; use OCP\User\Events\PostLoginEvent; use OCP\User\Events\UserDeletedEvent; @@ -178,8 +179,8 @@ private function registerFilesActivity(IRegistrationContext $context) { Util::connectHook('OC_Filesystem', 'rename', FilesHooksStatic::class, 'fileMove'); Util::connectHook('OC_Filesystem', 'post_rename', FilesHooksStatic::class, 'fileMovePost'); Util::connectHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', FilesHooksStatic::class, 'fileRestore'); - Util::connectHook('OCP\Share', 'post_shared', FilesHooksStatic::class, 'share'); + $context->registerEventListener(ShareCreatedEvent::class, ShareEventListener::class); $context->registerEventListener(BeforeShareDeletedEvent::class, ShareEventListener::class); $context->registerEventListener(ShareDeletedFromSelfEvent::class, ShareEventListener::class); } diff --git a/lib/FilesHooks.php b/lib/FilesHooks.php index 12a85f745..86eb02ba9 100755 --- a/lib/FilesHooks.php +++ b/lib/FilesHooks.php @@ -661,17 +661,37 @@ protected function getSourcePathAndOwner($path) { /** * Manage sharing events * - * @param array $params The hook params + * @param IShare $share the share from the event */ - public function share($params) { - if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') { - if ((int)$params['shareType'] === IShare::TYPE_USER) { - $this->shareWithUser($params['shareWith'], (int)$params['fileSource'], $params['itemType'], $params['fileTarget']); - } elseif ((int)$params['shareType'] === IShare::TYPE_GROUP) { - $this->shareWithGroup($params['shareWith'], (int)$params['fileSource'], $params['itemType'], $params['fileTarget'], (int)$params['id']); - } elseif ((int)$params['shareType'] === IShare::TYPE_LINK) { - $this->shareByLink((int)$params['fileSource'], $params['itemType'], $params['uidOwner']); - } + public function share($share) { + switch($share->getShareType()) { + case IShare::TYPE_USER: + $this->shareWithUser( + $share->getSharedWith(), + $share->getNodeId(), + $share->getNodeType(), + $share->getTarget() + ); + break; + case IShare::TYPE_GROUP: + $this->shareWithGroup( + $share->getSharedWith(), + $share->getNodeId(), + $share->getNodeType(), + $share->getTarget(), + (int)$share->getId() + ); + break; + case IShare::TYPE_LINK: + $this->shareByLink( + $share->getNodeId(), + $share->getNodeType(), + $share->getSharedBy() + ); + break; + default: + // Currently not supported + break; } } @@ -990,7 +1010,7 @@ protected function fixPathsForShareExceptions(array $affectedUsers, $shareId) { ->from('share') ->where($queryBuilder->expr()->eq('parent', $queryBuilder->createParameter('parent'))) ->setParameter('parent', (int)$shareId); - $query = $queryBuilder->execute(); + $query = $queryBuilder->executeQuery(); while ($row = $query->fetch()) { $affectedUsers[$row['share_with']] = $row['file_target']; @@ -1222,7 +1242,7 @@ private function getUnrelatedUsers(int $fileId, array $cachedMounts): array { try { $ruleManager = \OC::$server->get(\OCA\GroupFolders\ACL\RuleManager::class); $folderManager = \OC::$server->get(\OCA\GroupFolders\Folder\FolderManager::class); - } catch (\Exception $e) { + } catch (\Throwable $e) { return []; // if we have no access to RuleManager, we cannot filter unrelated users } diff --git a/lib/FilesHooksStatic.php b/lib/FilesHooksStatic.php index 038c2e262..ff003934a 100755 --- a/lib/FilesHooksStatic.php +++ b/lib/FilesHooksStatic.php @@ -82,12 +82,4 @@ public static function fileMovePost($params) { public static function fileRestore($params) { self::getHooks()->fileRestore($params['filePath']); } - - /** - * Manage sharing events - * @param array $params The hook params - */ - public static function share($params) { - self::getHooks()->share($params); - } } diff --git a/lib/Listener/ShareEventListener.php b/lib/Listener/ShareEventListener.php index 35f4ed6d5..d8f2a5ea9 100755 --- a/lib/Listener/ShareEventListener.php +++ b/lib/Listener/ShareEventListener.php @@ -26,6 +26,7 @@ use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; use OCP\Share\Events\BeforeShareDeletedEvent; +use OCP\Share\Events\ShareCreatedEvent; use OCP\Share\Events\ShareDeletedFromSelfEvent; /** @@ -47,6 +48,18 @@ public function handle(Event $event): void { if ($event instanceof ShareDeletedFromSelfEvent) { $this->unShareSelf($event); } + + if ($event instanceof ShareCreatedEvent) { + $this->createShare($event); + } + } + + /** + * Node shared event + */ + public function createShare(ShareCreatedEvent $event): void { + $share = $event->getShare(); + $this->fileHooks->share($share); } /** diff --git a/tests/FilesHooksTest.php b/tests/FilesHooksTest.php index df7f174b8..c8932a8d9 100755 --- a/tests/FilesHooksTest.php +++ b/tests/FilesHooksTest.php @@ -43,6 +43,7 @@ use OCP\IGroupManager; use OCP\IURLGenerator; use OCP\IUser; +use OCP\Share\IManager as ShareIManager; use OCP\Share\IShare; use OCP\Share\IShareHelper; use PHPUnit\Framework\MockObject\MockObject; @@ -485,13 +486,16 @@ public function testHookShareWithUser(): void { ->method('shareWithUser') ->with('u1', 1337, 'file', 'path'); - $filesHooks->share([ - 'fileSource' => 1337, - 'shareType' => IShare::TYPE_USER, - 'shareWith' => 'u1', - 'itemType' => 'file', - 'fileTarget' => 'path', - ]); + /** @var ShareIManager */ + $manager = \OC::$server->get(ShareIManager::class); + $share = $manager->newShare(); + $share->setSharedWith('u1'); + $share->setShareType(IShare::TYPE_USER); + $share->setTarget('path'); + $share->setNodeType('file'); + $share->setNodeId(1337); + + $filesHooks->share($share); } public function testHookShareWithGroup(): void { @@ -503,14 +507,17 @@ public function testHookShareWithGroup(): void { ->method('shareWithGroup') ->with('g1', 1337, 'file', 'path', 42); - $filesHooks->share([ - 'fileSource' => 1337, - 'shareType' => IShare::TYPE_GROUP, - 'shareWith' => 'g1', - 'itemType' => 'file', - 'fileTarget' => 'path', - 'id' => '42', - ]); + /** @var ShareIManager */ + $manager = \OC::$server->get(ShareIManager::class); + $share = $manager->newShare(); + $share->setId('42'); + $share->setSharedWith('g1'); + $share->setShareType(IShare::TYPE_GROUP); + $share->setTarget('path'); + $share->setNodeType('file'); + $share->setNodeId(1337); + + $filesHooks->share($share); } public function testShareViaPublicLink(): void { @@ -522,12 +529,15 @@ public function testShareViaPublicLink(): void { ->method('shareByLink') ->with(1337, 'file', 'admin'); - $filesHooks->share([ - 'fileSource' => 1337, - 'shareType' => IShare::TYPE_LINK, - 'itemType' => 'file', - 'uidOwner' => 'admin', - ]); + /** @var ShareIManager */ + $manager = \OC::$server->get(ShareIManager::class); + $share = $manager->newShare(); + $share->setShareType(IShare::TYPE_LINK); + $share->setNodeType('file'); + $share->setNodeId(1337); + $share->setSharedBy('admin'); + + $filesHooks->share($share); } public function dataShareWithUser(): array {