1111use OCA \Files_Sharing \Event \UserShareAccessUpdatedEvent ;
1212use OCA \Files_Sharing \MountProvider ;
1313use OCA \Files_Sharing \ShareTargetValidator ;
14+ use OCP \Cache \CappedMemoryCache ;
1415use OCP \EventDispatcher \Event ;
1516use OCP \EventDispatcher \IEventListener ;
1617use OCP \Files \Config \ICachedMountInfo ;
1718use OCP \Files \Config \IUserMountCache ;
19+ use OCP \Files \Events \Node \FilesystemTornDownEvent ;
1820use OCP \Group \Events \UserAddedEvent ;
1921use OCP \Group \Events \UserRemovedEvent ;
2022use OCP \IUser ;
2527/**
2628 * Listen to various events that can change what shares a user has access to
2729 *
28- * @template-implements IEventListener<UserAddedEvent|UserRemovedEvent|ShareCreatedEvent|BeforeShareDeletedEvent|UserShareAccessUpdatedEvent>
30+ * @template-implements IEventListener<UserAddedEvent|UserRemovedEvent|ShareCreatedEvent|BeforeShareDeletedEvent|UserShareAccessUpdatedEvent|FilesystemTornDownEvent >
2931 */
3032class SharesUpdatedListener implements IEventListener {
33+ private CappedMemoryCache $ updatedUsers ;
34+
3135 public function __construct (
3236 private readonly IManager $ shareManager ,
3337 private readonly IUserMountCache $ userMountCache ,
3438 private readonly MountProvider $ shareMountProvider ,
3539 private readonly ShareTargetValidator $ shareTargetValidator ,
3640 ) {
41+ $ this ->updatedUsers = new CappedMemoryCache ();
3742 }
38-
3943 public function handle (Event $ event ): void {
44+ if ($ event instanceof FilesystemTornDownEvent) {
45+ $ this ->updatedUsers = new CappedMemoryCache ();
46+ }
4047 if ($ event instanceof UserAddedEvent || $ event instanceof UserRemovedEvent || $ event instanceof UserShareAccessUpdatedEvent) {
4148 $ this ->updateForUser ($ event ->getUser ());
4249 }
@@ -48,6 +55,11 @@ public function handle(Event $event): void {
4855 }
4956
5057 private function updateForUser (IUser $ user ): void {
58+ if (isset ($ this ->updatedUsers [$ user ->getUID ()])) {
59+ return ;
60+ }
61+ $ this ->updatedUsers [$ user ->getUID ()] = true ;
62+
5163 $ cachedMounts = $ this ->userMountCache ->getMountsForUser ($ user );
5264 $ mountPoints = array_map (fn (ICachedMountInfo $ mount ) => $ mount ->getMountPoint (), $ cachedMounts );
5365 $ mountsByPath = array_combine ($ mountPoints , $ cachedMounts );
0 commit comments