2222use OCP \Share \Events \ShareCreatedEvent ;
2323use OCP \Share \Events \ShareTransferredEvent ;
2424use OCP \Share \IManager ;
25+ use OCP \Share \IShare ;
2526
2627/**
2728 * Listen to various events that can change what shares a user has access to
@@ -47,13 +48,15 @@ public function handle(Event $event): void {
4748 if ($ event instanceof UserAddedEvent || $ event instanceof UserRemovedEvent) {
4849 $ this ->updateForUser ($ event ->getUser ());
4950 }
50- if (
51- $ event instanceof ShareCreatedEvent
52- || $ event instanceof BeforeShareDeletedEvent
53- || $ event instanceof ShareTransferredEvent
54- ) {
55- foreach ($ this ->shareManager ->getUsersForShare ($ event ->getShare ()) as $ user ) {
56- $ this ->updateForUser ($ user );
51+ if ($ event instanceof ShareCreatedEvent || $ event instanceof ShareTransferredEvent) {
52+ $ share = $ event ->getShare ();
53+ $ shareTarget = $ share ->getTarget ();
54+ foreach ($ this ->shareManager ->getUsersForShare ($ share ) as $ user ) {
55+ if ($ share ->getSharedBy () !== $ user ->getUID ()) {
56+ $ this ->updateForShare ($ user , $ share );
57+ // Share target validation might have changed the target, restore it for the next user
58+ $ share ->setTarget ($ shareTarget );
59+ }
5760 }
5861 }
5962 }
@@ -82,4 +85,12 @@ private function updateForUser(IUser $user): void {
8285
8386 unset($ this ->inUpdate [$ user ->getUID ()]);
8487 }
88+
89+ private function updateForShare (IUser $ user , IShare $ share ): void {
90+ $ cachedMounts = $ this ->userMountCache ->getMountsForUser ($ user );
91+ $ mountPoints = array_map (fn (ICachedMountInfo $ mount ) => $ mount ->getMountPoint (), $ cachedMounts );
92+ $ mountsByPath = array_combine ($ mountPoints , $ cachedMounts );
93+
94+ $ this ->shareTargetValidator ->verifyMountPoint ($ user , $ share , $ mountsByPath , [$ share ]);
95+ }
8596}
0 commit comments