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.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2016, ownCloud, Inc.
  4. *
  5. * @author Joas Schilling <coding@schilljs.com>
  6. * @author Lukas Reschke <lukas@statuscode.ch>
  7. * @author Robin Appelman <robin@icewind.nl>
  8. * @author Roeland Jago Douma <roeland@famdouma.nl>
  9. * @author Vincent Petry <vincent@nextcloud.com>
  10. *
  11. * @license AGPL-3.0
  12. *
  13. * This code is free software: you can redistribute it and/or modify
  14. * it under the terms of the GNU Affero General Public License, version 3,
  15. * as published by the Free Software Foundation.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU Affero General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU Affero General Public License, version 3,
  23. * along with this program. If not, see <http://www.gnu.org/licenses/>
  24. *
  25. */
  26. namespace OCA\Files_Sharing\Tests;
  27. use OC\Files\Filesystem;
  28. use OC\Files\View;
  29. use OCP\Share\IShare;
  30. /**
  31. * @group SLOWDB
  32. *
  33. * @package OCA\Files_Sharing\Tests
  34. */
  35. class GroupEtagPropagationTest extends PropagationTestCase {
  36. /**
  37. * "user1" creates /test, /test/sub and shares with group1
  38. * "user2" (in group1) reshares /test with group2 and reshared /test/sub with group3
  39. * "user3" (in group 2)
  40. * "user4" (in group 3)
  41. */
  42. protected function setUpShares() {
  43. $this->fileIds[self::TEST_FILES_SHARING_API_USER1] = [];
  44. $this->fileIds[self::TEST_FILES_SHARING_API_USER2] = [];
  45. $this->fileIds[self::TEST_FILES_SHARING_API_USER3] = [];
  46. $this->fileIds[self::TEST_FILES_SHARING_API_USER4] = [];
  47. $this->rootView = new View('');
  48. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  49. $view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
  50. $view1->mkdir('/test/sub');
  51. $share = $this->share(
  52. IShare::TYPE_GROUP,
  53. '/test',
  54. self::TEST_FILES_SHARING_API_USER1,
  55. 'group1',
  56. \OCP\Constants::PERMISSION_ALL
  57. );
  58. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2);
  59. $this->fileIds[self::TEST_FILES_SHARING_API_USER1][''] = $view1->getFileInfo('')->getId();
  60. $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['test'] = $view1->getFileInfo('test')->getId();
  61. $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['test/sub'] = $view1->getFileInfo('test/sub')->getId();
  62. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  63. $view2 = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
  64. $share = $this->share(
  65. IShare::TYPE_GROUP,
  66. '/test',
  67. self::TEST_FILES_SHARING_API_USER2,
  68. 'group2',
  69. \OCP\Constants::PERMISSION_ALL
  70. );
  71. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER3);
  72. $share = $this->share(
  73. IShare::TYPE_GROUP,
  74. '/test/sub',
  75. self::TEST_FILES_SHARING_API_USER2,
  76. 'group3',
  77. \OCP\Constants::PERMISSION_ALL
  78. );
  79. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER4);
  80. $this->fileIds[self::TEST_FILES_SHARING_API_USER2][''] = $view2->getFileInfo('')->getId();
  81. $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['test'] = $view2->getFileInfo('test')->getId();
  82. $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['test/sub'] = $view2->getFileInfo('test/sub')->getId();
  83. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3);
  84. $view3 = new View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files');
  85. $this->fileIds[self::TEST_FILES_SHARING_API_USER3][''] = $view3->getFileInfo('')->getId();
  86. $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['test'] = $view3->getFileInfo('test')->getId();
  87. $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['test/sub'] = $view3->getFileInfo('test/sub')->getId();
  88. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  89. $view4 = new View('/' . self::TEST_FILES_SHARING_API_USER4 . '/files');
  90. $this->fileIds[self::TEST_FILES_SHARING_API_USER4][''] = $view4->getFileInfo('')->getId();
  91. $this->fileIds[self::TEST_FILES_SHARING_API_USER4]['sub'] = $view4->getFileInfo('sub')->getId();
  92. foreach ($this->fileIds as $user => $ids) {
  93. $this->loginAsUser($user);
  94. foreach ($ids as $id) {
  95. $path = $this->rootView->getPath($id);
  96. $this->fileEtags[$id] = $this->rootView->getFileInfo($path)->getEtag();
  97. }
  98. }
  99. }
  100. public function testGroupReShareRecipientWrites() {
  101. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3);
  102. Filesystem::file_put_contents('/test/sub/file.txt', 'asd');
  103. $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]);
  104. $this->assertAllUnchanged();
  105. }
  106. public function testGroupReShareSubFolderRecipientWrites() {
  107. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  108. Filesystem::file_put_contents('/sub/file.txt', 'asd');
  109. $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]);
  110. $this->assertAllUnchanged();
  111. }
  112. public function testRecipientUnsharesFromSelf() {
  113. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  114. $this->assertTrue(
  115. $this->rootView->unlink('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/test')
  116. );
  117. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER2]);
  118. $this->assertAllUnchanged();
  119. }
  120. public function testRecipientUnsharesFromSelfUniqueGroupShare() {
  121. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  122. // rename to create an extra entry in the share table
  123. $this->rootView->rename('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/test', '/' . self::TEST_FILES_SHARING_API_USER2 . '/files/test_renamed');
  124. $this->assertTrue(
  125. $this->rootView->unlink('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/test_renamed')
  126. );
  127. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER2]);
  128. $this->assertAllUnchanged();
  129. }
  130. }