4646use OCP \Share \Events \ShareDeletedEvent ;
4747use OCP \Share \Events \ShareDeletedFromSelfEvent ;
4848use OCP \Share \Exceptions \AlreadySharedException ;
49+ use OCP \Share \Exceptions \GenericShareException ;
4950use OCP \Share \Exceptions \ShareNotFound ;
5051use OCP \Share \IManager ;
5152use OCP \Share \IProviderFactory ;
@@ -227,7 +228,7 @@ public function dataTestDelete() {
227228 */
228229 public function testDelete ($ shareType , $ sharedWith ): void {
229230 $ manager = $ this ->createManagerMock ()
230- ->setMethods (['getShareById ' , 'deleteChildren ' ])
231+ ->setMethods (['getShareById ' , 'deleteChildren ' , ' deleteReshare ' ])
231232 ->getMock ();
232233
233234 $ manager ->method ('deleteChildren ' )->willReturn ([]);
@@ -245,6 +246,7 @@ public function testDelete($shareType, $sharedWith): void {
245246 ->setTarget ('myTarget ' );
246247
247248 $ manager ->expects ($ this ->once ())->method ('deleteChildren ' )->with ($ share );
249+ $ manager ->expects ($ this ->once ())->method ('deleteReshare ' )->with ($ share );
248250
249251 $ this ->defaultProvider
250252 ->expects ($ this ->once ())
@@ -269,7 +271,7 @@ public function testDelete($shareType, $sharedWith): void {
269271
270272 public function testDeleteLazyShare (): void {
271273 $ manager = $ this ->createManagerMock ()
272- ->setMethods (['getShareById ' , 'deleteChildren ' ])
274+ ->setMethods (['getShareById ' , 'deleteChildren ' , ' deleteReshare ' ])
273275 ->getMock ();
274276
275277 $ manager ->method ('deleteChildren ' )->willReturn ([]);
@@ -288,6 +290,7 @@ public function testDeleteLazyShare(): void {
288290 $ this ->rootFolder ->expects ($ this ->never ())->method ($ this ->anything ());
289291
290292 $ manager ->expects ($ this ->once ())->method ('deleteChildren ' )->with ($ share );
293+ $ manager ->expects ($ this ->once ())->method ('deleteReshare ' )->with ($ share );
291294
292295 $ this ->defaultProvider
293296 ->expects ($ this ->once ())
@@ -312,7 +315,7 @@ public function testDeleteLazyShare(): void {
312315
313316 public function testDeleteNested (): void {
314317 $ manager = $ this ->createManagerMock ()
315- ->setMethods (['getShareById ' ])
318+ ->setMethods (['getShareById ' , ' deleteReshare ' ])
316319 ->getMock ();
317320
318321 $ path = $ this ->createMock (File::class);
@@ -469,6 +472,115 @@ public function testDeleteChildren(): void {
469472 $ this ->assertSame ($ shares , $ result );
470473 }
471474
475+ public function testDeleteReshareWhenUserHasOneShare (): void {
476+ $ manager = $ this ->createManagerMock ()
477+ ->setMethods (['deleteShare ' , 'getSharesInFolder ' , 'generalCreateChecks ' ])
478+ ->getMock ();
479+
480+ $ folder = $ this ->createMock (Folder::class);
481+
482+ $ share = $ this ->createMock (IShare::class);
483+ $ share ->method ('getShareType ' )->willReturn (IShare::TYPE_USER );
484+ $ share ->method ('getNodeType ' )->willReturn ('folder ' );
485+ $ share ->method ('getSharedWith ' )->willReturn ('UserB ' );
486+ $ share ->method ('getNode ' )->willReturn ($ folder );
487+
488+ $ reShare = $ this ->createMock (IShare::class);
489+ $ reShare ->method ('getSharedBy ' )->willReturn ('UserB ' );
490+ $ reShare ->method ('getSharedWith ' )->willReturn ('UserC ' );
491+ $ reShare ->method ('getNode ' )->willReturn ($ folder );
492+
493+ $ reShareInSubFolder = $ this ->createMock (IShare::class);
494+ $ reShareInSubFolder ->method ('getSharedBy ' )->willReturn ('UserB ' );
495+
496+ $ manager ->method ('getSharesInFolder ' )->willReturn ([$ reShareInSubFolder ]);
497+ $ manager ->method ('generalCreateChecks ' )->willThrowException (new GenericShareException ());
498+
499+ $ this ->defaultProvider ->method ('getSharesBy ' )
500+ ->willReturn ([$ reShare ]);
501+
502+ $ manager ->expects ($ this ->atLeast (2 ))->method ('deleteShare ' )->withConsecutive ([$ reShare ], [$ reShareInSubFolder ]);
503+
504+ $ manager ->deleteReshare ($ share );
505+ }
506+
507+ public function testDeleteReshareWhenUserHasAnotherShare (): void {
508+ $ manager = $ this ->createManagerMock ()
509+ ->setMethods (['deleteShare ' , 'getSharesInFolder ' , 'getSharedWith ' , 'generalCreateChecks ' ])
510+ ->getMock ();
511+
512+ $ folder = $ this ->createMock (Folder::class);
513+
514+ $ share = $ this ->createMock (IShare::class);
515+ $ share ->method ('getShareType ' )->willReturn (IShare::TYPE_USER );
516+ $ share ->method ('getNodeType ' )->willReturn ('folder ' );
517+ $ share ->method ('getSharedWith ' )->willReturn ('UserB ' );
518+ $ share ->method ('getNode ' )->willReturn ($ folder );
519+
520+ $ reShare = $ this ->createMock (IShare::class);
521+ $ reShare ->method ('getShareType ' )->willReturn (IShare::TYPE_USER );
522+ $ reShare ->method ('getNodeType ' )->willReturn ('folder ' );
523+ $ reShare ->method ('getSharedBy ' )->willReturn ('UserB ' );
524+ $ reShare ->method ('getNode ' )->willReturn ($ folder );
525+
526+ $ this ->defaultProvider ->method ('getSharesBy ' )->willReturn ([$ reShare ]);
527+ $ manager ->method ('getSharesInFolder ' )->willReturn ([]);
528+ $ manager ->method ('generalCreateChecks ' )->willReturn (true );
529+
530+ $ manager ->expects ($ this ->never ())->method ('deleteShare ' );
531+
532+ $ manager ->deleteReshare ($ share );
533+ }
534+
535+ public function testDeleteReshareOfUsersInGroupShare (): void {
536+ $ manager = $ this ->createManagerMock ()
537+ ->setMethods (['deleteShare ' , 'getSharesInFolder ' , 'getSharedWith ' , 'generalCreateChecks ' ])
538+ ->getMock ();
539+
540+ $ folder = $ this ->createMock (Folder::class);
541+
542+ $ userA = $ this ->createMock (IUser::class);
543+ $ userA ->method ('getUID ' )->willReturn ('userA ' );
544+
545+ $ share = $ this ->createMock (IShare::class);
546+ $ share ->method ('getShareType ' )->willReturn (IShare::TYPE_GROUP );
547+ $ share ->method ('getNodeType ' )->willReturn ('folder ' );
548+ $ share ->method ('getSharedWith ' )->willReturn ('Group ' );
549+ $ share ->method ('getNode ' )->willReturn ($ folder );
550+ $ share ->method ('getShareOwner ' )->willReturn ($ userA );
551+
552+ $ reShare1 = $ this ->createMock (IShare::class);
553+ $ reShare1 ->method ('getShareType ' )->willReturn (IShare::TYPE_USER );
554+ $ reShare1 ->method ('getNodeType ' )->willReturn ('folder ' );
555+ $ reShare1 ->method ('getSharedBy ' )->willReturn ('UserB ' );
556+ $ reShare1 ->method ('getNode ' )->willReturn ($ folder );
557+
558+ $ reShare2 = $ this ->createMock (IShare::class);
559+ $ reShare2 ->method ('getShareType ' )->willReturn (IShare::TYPE_USER );
560+ $ reShare2 ->method ('getNodeType ' )->willReturn ('folder ' );
561+ $ reShare2 ->method ('getSharedBy ' )->willReturn ('UserC ' );
562+ $ reShare2 ->method ('getNode ' )->willReturn ($ folder );
563+
564+ $ userB = $ this ->createMock (IUser::class);
565+ $ userB ->method ('getUID ' )->willReturn ('userB ' );
566+ $ userC = $ this ->createMock (IUser::class);
567+ $ userC ->method ('getUID ' )->willReturn ('userC ' );
568+ $ group = $ this ->createMock (IGroup::class);
569+ $ group ->method ('getUsers ' )->willReturn ([$ userB , $ userC ]);
570+ $ this ->groupManager ->method ('get ' )->with ('Group ' )->willReturn ($ group );
571+
572+ $ this ->defaultProvider ->method ('getSharesBy ' )
573+ ->willReturn ([]);
574+ $ manager ->method ('generalCreateChecks ' )->willThrowException (new GenericShareException ());
575+
576+ $ manager ->method ('getSharedWith ' )->willReturn ([]);
577+ $ manager ->expects ($ this ->exactly (2 ))->method ('getSharesInFolder ' )->willReturnOnConsecutiveCalls ([[$ reShare1 ]], [[$ reShare2 ]]);
578+
579+ $ manager ->expects ($ this ->exactly (2 ))->method ('deleteShare ' )->withConsecutive ([$ reShare1 ], [$ reShare2 ]);
580+
581+ $ manager ->deleteReshare ($ share );
582+ }
583+
472584 public function testGetShareById (): void {
473585 $ share = $ this ->createMock (IShare::class);
474586
0 commit comments