1515use OCP \EventDispatcher \IEventListener ;
1616use OCP \Files \Config \ICachedMountInfo ;
1717use OCP \Files \Config \IUserMountCache ;
18+ use OCP \Files \Storage \IStorageFactory ;
1819use OCP \Group \Events \UserAddedEvent ;
1920use OCP \Group \Events \UserRemovedEvent ;
2021use OCP \IUser ;
@@ -33,34 +34,50 @@ public function __construct(
3334 private readonly IUserMountCache $ userMountCache ,
3435 private readonly MountProvider $ shareMountProvider ,
3536 private readonly ShareTargetValidator $ shareTargetValidator ,
37+ private readonly IStorageFactory $ storageFactory ,
3638 ) {
3739 }
3840
3941 public function handle (Event $ event ): void {
4042 if ($ event instanceof UserAddedEvent || $ event instanceof UserRemovedEvent || $ event instanceof UserShareAccessUpdatedEvent) {
41- $ this ->updateForUser ($ event ->getUser ());
43+ $ this ->updateForUser ($ event ->getUser (), true );
4244 }
43- if ($ event instanceof ShareCreatedEvent || $ event instanceof BeforeShareDeletedEvent ) {
45+ if ($ event instanceof ShareCreatedEvent) {
4446 foreach ($ this ->shareManager ->getUsersForShare ($ event ->getShare ()) as $ user ) {
45- $ this ->updateForUser ($ user );
47+ $ this ->updateForUser ($ user , true );
48+ }
49+ }
50+ if ($ event instanceof BeforeShareDeletedEvent) {
51+ foreach ($ this ->shareManager ->getUsersForShare ($ event ->getShare ()) as $ user ) {
52+ $ this ->updateForUser ($ user , false , [$ event ->getShare ()]);
4653 }
4754 }
4855 }
4956
50- private function updateForUser (IUser $ user ): void {
57+ private function updateForUser (IUser $ user, bool $ verifyMountPoints , array $ ignoreShares = [] ): void {
5158 $ cachedMounts = $ this ->userMountCache ->getMountsForUser ($ user );
59+ $ shareMounts = array_filter ($ cachedMounts , fn (ICachedMountInfo $ mount ) => $ mount ->getMountProvider () === MountProvider::class);
5260 $ mountPoints = array_map (fn (ICachedMountInfo $ mount ) => $ mount ->getMountPoint (), $ cachedMounts );
5361 $ mountsByPath = array_combine ($ mountPoints , $ cachedMounts );
5462
55- $ shares = $ this ->shareMountProvider ->getSuperSharesForUser ($ user );
63+ $ shares = $ this ->shareMountProvider ->getSuperSharesForUser ($ user, $ ignoreShares );
5664
65+ $ mountsChanged = count ($ shares ) !== count ($ shareMounts );
5766 foreach ($ shares as &$ share ) {
5867 [$ parentShare , $ groupedShares ] = $ share ;
5968 $ mountPoint = '/ ' . $ user ->getUID () . '/files/ ' . trim ($ parentShare ->getTarget (), '/ ' ) . '/ ' ;
6069 $ mountKey = $ parentShare ->getNodeId () . ':: ' . $ mountPoint ;
6170 if (!isset ($ cachedMounts [$ mountKey ])) {
62- $ this ->shareTargetValidator ->verifyMountPoint ($ user , $ parentShare , $ mountsByPath , $ groupedShares );
71+ $ mountsChanged = true ;
72+ if ($ verifyMountPoints ) {
73+ $ this ->shareTargetValidator ->verifyMountPoint ($ user , $ parentShare , $ mountsByPath , $ groupedShares );
74+ }
6375 }
6476 }
77+
78+ if ($ mountsChanged ) {
79+ $ newMounts = $ this ->shareMountProvider ->getMountsFromSuperShares ($ user , $ shares , $ this ->storageFactory );
80+ $ this ->userMountCache ->registerMounts ($ user , $ newMounts , [MountProvider::class]);
81+ }
6582 }
6683}
0 commit comments