You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GroupEtagPropagationTest.php 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. /**
  3. * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
  4. * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
  5. * SPDX-License-Identifier: AGPL-3.0-only
  6. */
  7. namespace OCA\Files_Sharing\Tests;
  8. use OC\Files\Filesystem;
  9. use OC\Files\View;
  10. use OCP\Share\IShare;
  11. /**
  12. * @group SLOWDB
  13. *
  14. * @package OCA\Files_Sharing\Tests
  15. */
  16. class GroupEtagPropagationTest extends PropagationTestCase {
  17. /**
  18. * "user1" creates /test, /test/sub and shares with group1
  19. * "user2" (in group1) reshares /test with group2 and reshared /test/sub with group3
  20. * "user3" (in group 2)
  21. * "user4" (in group 3)
  22. */
  23. protected function setUpShares() {
  24. $this->fileIds[self::TEST_FILES_SHARING_API_USER1] = [];
  25. $this->fileIds[self::TEST_FILES_SHARING_API_USER2] = [];
  26. $this->fileIds[self::TEST_FILES_SHARING_API_USER3] = [];
  27. $this->fileIds[self::TEST_FILES_SHARING_API_USER4] = [];
  28. $this->rootView = new View('');
  29. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  30. $view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
  31. $view1->mkdir('/test/sub');
  32. $share = $this->share(
  33. IShare::TYPE_GROUP,
  34. '/test',
  35. self::TEST_FILES_SHARING_API_USER1,
  36. 'group1',
  37. \OCP\Constants::PERMISSION_ALL
  38. );
  39. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2);
  40. $this->fileIds[self::TEST_FILES_SHARING_API_USER1][''] = $view1->getFileInfo('')->getId();
  41. $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['test'] = $view1->getFileInfo('test')->getId();
  42. $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['test/sub'] = $view1->getFileInfo('test/sub')->getId();
  43. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  44. $view2 = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
  45. $share = $this->share(
  46. IShare::TYPE_GROUP,
  47. '/test',
  48. self::TEST_FILES_SHARING_API_USER2,
  49. 'group2',
  50. \OCP\Constants::PERMISSION_ALL
  51. );
  52. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER3);
  53. $share = $this->share(
  54. IShare::TYPE_GROUP,
  55. '/test/sub',
  56. self::TEST_FILES_SHARING_API_USER2,
  57. 'group3',
  58. \OCP\Constants::PERMISSION_ALL
  59. );
  60. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER4);
  61. $this->fileIds[self::TEST_FILES_SHARING_API_USER2][''] = $view2->getFileInfo('')->getId();
  62. $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['test'] = $view2->getFileInfo('test')->getId();
  63. $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['test/sub'] = $view2->getFileInfo('test/sub')->getId();
  64. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3);
  65. $view3 = new View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files');
  66. $this->fileIds[self::TEST_FILES_SHARING_API_USER3][''] = $view3->getFileInfo('')->getId();
  67. $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['test'] = $view3->getFileInfo('test')->getId();
  68. $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['test/sub'] = $view3->getFileInfo('test/sub')->getId();
  69. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  70. $view4 = new View('/' . self::TEST_FILES_SHARING_API_USER4 . '/files');
  71. $this->fileIds[self::TEST_FILES_SHARING_API_USER4][''] = $view4->getFileInfo('')->getId();
  72. $this->fileIds[self::TEST_FILES_SHARING_API_USER4]['sub'] = $view4->getFileInfo('sub')->getId();
  73. foreach ($this->fileIds as $user => $ids) {
  74. $this->loginAsUser($user);
  75. foreach ($ids as $id) {
  76. $path = $this->rootView->getPath($id);
  77. $this->fileEtags[$id] = $this->rootView->getFileInfo($path)->getEtag();
  78. }
  79. }
  80. }
  81. public function testGroupReShareRecipientWrites() {
  82. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3);
  83. Filesystem::file_put_contents('/test/sub/file.txt', 'asd');
  84. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  85. $this->assertAllUnchanged();
  86. }
  87. public function testGroupReShareSubFolderRecipientWrites() {
  88. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  89. Filesystem::file_put_contents('/sub/file.txt', 'asd');
  90. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  91. $this->assertAllUnchanged();
  92. }
  93. public function testRecipientUnsharesFromSelf() {
  94. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  95. $this->assertTrue(
  96. $this->rootView->unlink('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/test')
  97. );
  98. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER2]);
  99. $this->assertAllUnchanged();
  100. }
  101. public function testRecipientUnsharesFromSelfUniqueGroupShare() {
  102. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  103. // rename to create an extra entry in the share table
  104. $this->rootView->rename('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/test', '/' . self::TEST_FILES_SHARING_API_USER2 . '/files/test_renamed');
  105. $this->assertTrue(
  106. $this->rootView->unlink('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/test_renamed')
  107. );
  108. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER2]);
  109. $this->assertAllUnchanged();
  110. }
  111. }