1111use OCA \Files_Sharing \Event \UserShareAccessUpdatedEvent ;
1212use OCA \Files_Sharing \MountProvider ;
1313use OCA \Files_Sharing \ShareTargetValidator ;
14- use OCP \Cache \CappedMemoryCache ;
1514use OCP \EventDispatcher \Event ;
1615use OCP \EventDispatcher \IEventListener ;
1716use OCP \Files \Config \ICachedMountInfo ;
1817use OCP \Files \Config \IUserMountCache ;
19- use OCP \Files \Events \Node \FilesystemTornDownEvent ;
2018use OCP \Group \Events \UserAddedEvent ;
2119use OCP \Group \Events \UserRemovedEvent ;
2220use OCP \IUser ;
2321use OCP \Share \Events \BeforeShareDeletedEvent ;
2422use OCP \Share \Events \ShareCreatedEvent ;
23+ use OCP \Share \Events \ShareTransferredEvent ;
2524use 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 */
3231class 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}
0 commit comments