Skip to content

Commit 9cd337b

Browse files
authored
Merge pull request #57745 from nextcloud/share-transfered-event
Share mount validation fixes
2 parents 83810ae + 9c10593 commit 9cd337b

File tree

6 files changed

+54
-13
lines changed

6 files changed

+54
-13
lines changed

apps/files/lib/Service/OwnershipTransferService.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use OCA\Files\Exception\TransferOwnershipException;
1919
use OCA\Files_External\Config\ConfigAdapter;
2020
use OCP\Encryption\IManager as IEncryptionManager;
21+
use OCP\EventDispatcher\IEventDispatcher;
2122
use OCP\Files\Config\IHomeMountProvider;
2223
use OCP\Files\Config\IUserMountCache;
2324
use OCP\Files\File;
@@ -30,6 +31,7 @@
3031
use OCP\IUserManager;
3132
use OCP\L10N\IFactory;
3233
use OCP\Server;
34+
use OCP\Share\Events\ShareTransferredEvent;
3335
use OCP\Share\IManager as IShareManager;
3436
use OCP\Share\IShare;
3537
use Symfony\Component\Console\Helper\ProgressBar;
@@ -52,6 +54,7 @@ public function __construct(
5254
private IUserManager $userManager,
5355
private IFactory $l10nFactory,
5456
private IRootFolder $rootFolder,
57+
private IEventDispatcher $eventDispatcher,
5558
) {
5659
}
5760

@@ -544,6 +547,7 @@ private function restoreShares(
544547
} catch (\Throwable $e) {
545548
$output->writeln('<error>Could not restore share with id ' . $share->getId() . ':' . $e->getMessage() . ' : ' . $e->getTraceAsString() . '</error>');
546549
}
550+
$this->eventDispatcher->dispatchTyped(new ShareTransferredEvent($share));
547551
$progress->advance();
548552
}
549553
$progress->finish();

apps/files_sharing/lib/AppInfo/Application.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
use OCP\Files\Events\BeforeDirectFileDownloadEvent;
4949
use OCP\Files\Events\BeforeZipCreatedEvent;
5050
use OCP\Files\Events\Node\BeforeNodeReadEvent;
51-
use OCP\Files\Events\Node\FilesystemTornDownEvent;
5251
use OCP\Group\Events\GroupChangedEvent;
5352
use OCP\Group\Events\GroupDeletedEvent;
5453
use OCP\Group\Events\UserAddedEvent;
@@ -57,6 +56,7 @@
5756
use OCP\IGroup;
5857
use OCP\Share\Events\BeforeShareDeletedEvent;
5958
use OCP\Share\Events\ShareCreatedEvent;
59+
use OCP\Share\Events\ShareTransferredEvent;
6060
use OCP\User\Events\UserChangedEvent;
6161
use OCP\User\Events\UserDeletedEvent;
6262
use OCP\Util;
@@ -117,10 +117,10 @@ function () use ($c) {
117117
// Update mounts
118118
$context->registerEventListener(ShareCreatedEvent::class, SharesUpdatedListener::class);
119119
$context->registerEventListener(BeforeShareDeletedEvent::class, SharesUpdatedListener::class);
120+
$context->registerEventListener(ShareTransferredEvent::class, SharesUpdatedListener::class);
120121
$context->registerEventListener(UserAddedEvent::class, SharesUpdatedListener::class);
121122
$context->registerEventListener(UserRemovedEvent::class, SharesUpdatedListener::class);
122123
$context->registerEventListener(UserShareAccessUpdatedEvent::class, SharesUpdatedListener::class);
123-
$context->registerEventListener(FilesystemTornDownEvent::class, SharesUpdatedListener::class);
124124

125125
$context->registerConfigLexicon(ConfigLexicon::class);
126126
}

apps/files_sharing/lib/Listener/SharesUpdatedListener.php

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,34 @@
1111
use OCA\Files_Sharing\Event\UserShareAccessUpdatedEvent;
1212
use OCA\Files_Sharing\MountProvider;
1313
use OCA\Files_Sharing\ShareTargetValidator;
14-
use OCP\Cache\CappedMemoryCache;
1514
use OCP\EventDispatcher\Event;
1615
use OCP\EventDispatcher\IEventListener;
1716
use OCP\Files\Config\ICachedMountInfo;
1817
use OCP\Files\Config\IUserMountCache;
19-
use OCP\Files\Events\Node\FilesystemTornDownEvent;
2018
use OCP\Group\Events\UserAddedEvent;
2119
use OCP\Group\Events\UserRemovedEvent;
2220
use OCP\IUser;
2321
use OCP\Share\Events\BeforeShareDeletedEvent;
2422
use OCP\Share\Events\ShareCreatedEvent;
23+
use OCP\Share\Events\ShareTransferredEvent;
2524
use OCP\Share\IManager;
2625

2726
/**
2827
* Listen to various events that can change what shares a user has access to
2928
*
30-
* @template-implements IEventListener<UserAddedEvent|UserRemovedEvent|ShareCreatedEvent|BeforeShareDeletedEvent|UserShareAccessUpdatedEvent|FilesystemTornDownEvent>
29+
* @template-implements IEventListener<UserAddedEvent|UserRemovedEvent|ShareCreatedEvent|ShareTransferredEvent|BeforeShareDeletedEvent|UserShareAccessUpdatedEvent>
3130
*/
3231
class SharesUpdatedListener implements IEventListener {
33-
private CappedMemoryCache $updatedUsers;
32+
private array $inUpdate = [];
3433

3534
public function __construct(
3635
private readonly IManager $shareManager,
3736
private readonly IUserMountCache $userMountCache,
3837
private readonly MountProvider $shareMountProvider,
3938
private readonly ShareTargetValidator $shareTargetValidator,
4039
) {
41-
$this->updatedUsers = new CappedMemoryCache();
4240
}
4341
public function handle(Event $event): void {
44-
if ($event instanceof FilesystemTornDownEvent) {
45-
$this->updatedUsers = new CappedMemoryCache();
46-
}
4742
if ($event instanceof UserShareAccessUpdatedEvent) {
4843
foreach ($event->getUsers() as $user) {
4944
$this->updateForUser($user);
@@ -52,18 +47,23 @@ public function handle(Event $event): void {
5247
if ($event instanceof UserAddedEvent || $event instanceof UserRemovedEvent) {
5348
$this->updateForUser($event->getUser());
5449
}
55-
if ($event instanceof ShareCreatedEvent || $event instanceof BeforeShareDeletedEvent) {
50+
if (
51+
$event instanceof ShareCreatedEvent
52+
|| $event instanceof BeforeShareDeletedEvent
53+
|| $event instanceof ShareTransferredEvent
54+
) {
5655
foreach ($this->shareManager->getUsersForShare($event->getShare()) as $user) {
5756
$this->updateForUser($user);
5857
}
5958
}
6059
}
6160

6261
private function updateForUser(IUser $user): void {
63-
if (isset($this->updatedUsers[$user->getUID()])) {
62+
// prevent recursion
63+
if (isset($this->inUpdate[$user->getUID()])) {
6464
return;
6565
}
66-
$this->updatedUsers[$user->getUID()] = true;
66+
$this->inUpdate[$user->getUID()] = true;
6767

6868
$cachedMounts = $this->userMountCache->getMountsForUser($user);
6969
$mountPoints = array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $cachedMounts);
@@ -79,5 +79,7 @@ private function updateForUser(IUser $user): void {
7979
$this->shareTargetValidator->verifyMountPoint($user, $parentShare, $mountsByPath, $groupedShares);
8080
}
8181
}
82+
83+
unset($this->inUpdate[$user->getUID()]);
8284
}
8385
}

lib/composer/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,7 @@
849849
'OCP\\Share\\Events\\ShareCreatedEvent' => $baseDir . '/lib/public/Share/Events/ShareCreatedEvent.php',
850850
'OCP\\Share\\Events\\ShareDeletedEvent' => $baseDir . '/lib/public/Share/Events/ShareDeletedEvent.php',
851851
'OCP\\Share\\Events\\ShareDeletedFromSelfEvent' => $baseDir . '/lib/public/Share/Events/ShareDeletedFromSelfEvent.php',
852+
'OCP\\Share\\Events\\ShareTransferredEvent' => $baseDir . '/lib/public/Share/Events/ShareTransferredEvent.php',
852853
'OCP\\Share\\Events\\VerifyMountPointEvent' => $baseDir . '/lib/public/Share/Events/VerifyMountPointEvent.php',
853854
'OCP\\Share\\Exceptions\\AlreadySharedException' => $baseDir . '/lib/public/Share/Exceptions/AlreadySharedException.php',
854855
'OCP\\Share\\Exceptions\\GenericShareException' => $baseDir . '/lib/public/Share/Exceptions/GenericShareException.php',

lib/composer/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
890890
'OCP\\Share\\Events\\ShareCreatedEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/ShareCreatedEvent.php',
891891
'OCP\\Share\\Events\\ShareDeletedEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/ShareDeletedEvent.php',
892892
'OCP\\Share\\Events\\ShareDeletedFromSelfEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/ShareDeletedFromSelfEvent.php',
893+
'OCP\\Share\\Events\\ShareTransferredEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/ShareTransferredEvent.php',
893894
'OCP\\Share\\Events\\VerifyMountPointEvent' => __DIR__ . '/../../..' . '/lib/public/Share/Events/VerifyMountPointEvent.php',
894895
'OCP\\Share\\Exceptions\\AlreadySharedException' => __DIR__ . '/../../..' . '/lib/public/Share/Exceptions/AlreadySharedException.php',
895896
'OCP\\Share\\Exceptions\\GenericShareException' => __DIR__ . '/../../..' . '/lib/public/Share/Exceptions/GenericShareException.php',
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-License-Identifier: AGPL-3.0-or-later
8+
*/
9+
namespace OCP\Share\Events;
10+
11+
use OCP\EventDispatcher\Event;
12+
use OCP\Share\IShare;
13+
14+
/**
15+
* @since 33.0.0
16+
*/
17+
class ShareTransferredEvent extends Event {
18+
/**
19+
* @since 33.0.0
20+
*/
21+
public function __construct(
22+
private readonly IShare $share,
23+
) {
24+
parent::__construct();
25+
}
26+
27+
/**
28+
* @since 33.0.0
29+
*/
30+
public function getShare(): IShare {
31+
return $this->share;
32+
}
33+
}

0 commit comments

Comments
 (0)