2323use OCP \Share \Events \BeforeShareDeletedEvent ;
2424use OCP \Share \Events \ShareCreatedEvent ;
2525use OCP \Share \IManager ;
26+ use OCP \Share \IShare ;
2627
2728/**
2829 * Listen to various events that can change what shares a user has access to
@@ -52,9 +53,15 @@ public function handle(Event $event): void {
5253 if ($ event instanceof UserAddedEvent || $ event instanceof UserRemovedEvent) {
5354 $ this ->updateForUser ($ event ->getUser ());
5455 }
55- if ($ event instanceof ShareCreatedEvent || $ event instanceof BeforeShareDeletedEvent) {
56- foreach ($ this ->shareManager ->getUsersForShare ($ event ->getShare ()) as $ user ) {
57- $ this ->updateForUser ($ user );
56+ if ($ event instanceof ShareCreatedEvent) {
57+ $ share = $ event ->getShare ();
58+ $ shareTarget = $ share ->getTarget ();
59+ foreach ($ this ->shareManager ->getUsersForShare ($ share ) as $ user ) {
60+ if ($ share ->getSharedBy () !== $ user ->getUID ()) {
61+ $ this ->updateForShare ($ user , $ share );
62+ // Share target validation might have changed the target, restore it for the next user
63+ $ share ->setTarget ($ shareTarget );
64+ }
5865 }
5966 }
6067 }
@@ -80,4 +87,12 @@ private function updateForUser(IUser $user): void {
8087 }
8188 }
8289 }
90+
91+ private function updateForShare (IUser $ user , IShare $ share ): void {
92+ $ cachedMounts = $ this ->userMountCache ->getMountsForUser ($ user );
93+ $ mountPoints = array_map (fn (ICachedMountInfo $ mount ) => $ mount ->getMountPoint (), $ cachedMounts );
94+ $ mountsByPath = array_combine ($ mountPoints , $ cachedMounts );
95+
96+ $ this ->shareTargetValidator ->verifyMountPoint ($ user , $ share , $ mountsByPath , [$ share ]);
97+ }
8398}
0 commit comments