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.

EtagPropagationTest.php 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  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. * Class EtagPropagationTest
  13. *
  14. * @group SLOWDB
  15. *
  16. * @package OCA\Files_Sharing\Tests
  17. */
  18. class EtagPropagationTest extends PropagationTestCase {
  19. /**
  20. * "user1" is the admin who shares a folder "sub1/sub2/folder" with "user2" and "user3"
  21. * "user2" receives the folder and puts it in "sub1/sub2/folder"
  22. * "user3" receives the folder and puts it in "sub1/sub2/folder"
  23. * "user2" reshares the subdir "sub1/sub2/folder/inside" with "user4"
  24. * "user4" puts the received "inside" folder into "sub1/sub2/inside" (this is to check if it propagates across multiple subfolders)
  25. */
  26. protected function setUpShares() {
  27. $this->fileIds[self::TEST_FILES_SHARING_API_USER1] = [];
  28. $this->fileIds[self::TEST_FILES_SHARING_API_USER2] = [];
  29. $this->fileIds[self::TEST_FILES_SHARING_API_USER3] = [];
  30. $this->fileIds[self::TEST_FILES_SHARING_API_USER4] = [];
  31. $rootFolder = \OC::$server->getRootFolder();
  32. $shareManager = \OC::$server->getShareManager();
  33. $this->rootView = new View('');
  34. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  35. $view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
  36. $view1->mkdir('/sub1/sub2/folder/inside');
  37. $view1->mkdir('/directReshare');
  38. $view1->mkdir('/sub1/sub2/folder/other');
  39. $view1->file_put_contents('/foo.txt', 'foobar');
  40. $view1->file_put_contents('/sub1/sub2/folder/file.txt', 'foobar');
  41. $view1->file_put_contents('/sub1/sub2/folder/inside/file.txt', 'foobar');
  42. $folderInfo = $view1->getFileInfo('/sub1/sub2/folder');
  43. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  44. $fileInfo = $view1->getFileInfo('/foo.txt');
  45. $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
  46. $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1)
  47. ->get('/foo.txt');
  48. $share = $shareManager->newShare();
  49. $share->setNode($node)
  50. ->setShareType(IShare::TYPE_USER)
  51. ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
  52. ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
  53. ->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE);
  54. $share = $shareManager->createShare($share);
  55. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2);
  56. $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1)
  57. ->get('/sub1/sub2/folder');
  58. $share = $shareManager->newShare();
  59. $share->setNode($node)
  60. ->setShareType(IShare::TYPE_USER)
  61. ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
  62. ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
  63. ->setPermissions(\OCP\Constants::PERMISSION_ALL);
  64. $share = $shareManager->createShare($share);
  65. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2);
  66. $share = $shareManager->newShare();
  67. $share->setNode($node)
  68. ->setShareType(IShare::TYPE_USER)
  69. ->setSharedWith(self::TEST_FILES_SHARING_API_USER3)
  70. ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
  71. ->setPermissions(\OCP\Constants::PERMISSION_ALL);
  72. $share = $shareManager->createShare($share);
  73. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER3);
  74. $folderInfo = $view1->getFileInfo('/directReshare');
  75. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  76. $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1)
  77. ->get('/directReshare');
  78. $share = $shareManager->newShare();
  79. $share->setNode($node)
  80. ->setShareType(IShare::TYPE_USER)
  81. ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
  82. ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
  83. ->setPermissions(\OCP\Constants::PERMISSION_ALL);
  84. $share = $shareManager->createShare($share);
  85. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2);
  86. $this->fileIds[self::TEST_FILES_SHARING_API_USER1][''] = $view1->getFileInfo('')->getId();
  87. $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['sub1'] = $view1->getFileInfo('sub1')->getId();
  88. $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['sub1/sub2'] = $view1->getFileInfo('sub1/sub2')->getId();
  89. /*
  90. * User 2
  91. */
  92. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  93. $view2 = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
  94. $view2->mkdir('/sub1/sub2');
  95. $view2->rename('/folder', '/sub1/sub2/folder');
  96. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  97. $insideInfo = $view2->getFileInfo('/sub1/sub2/folder/inside');
  98. $this->assertInstanceOf('\OC\Files\FileInfo', $insideInfo);
  99. $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER2)
  100. ->get('/sub1/sub2/folder/inside');
  101. $share = $shareManager->newShare();
  102. $share->setNode($node)
  103. ->setShareType(IShare::TYPE_USER)
  104. ->setSharedWith(self::TEST_FILES_SHARING_API_USER4)
  105. ->setSharedBy(self::TEST_FILES_SHARING_API_USER2)
  106. ->setPermissions(\OCP\Constants::PERMISSION_ALL);
  107. $share = $shareManager->createShare($share);
  108. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER4);
  109. $folderInfo = $view2->getFileInfo('/directReshare');
  110. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  111. $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER2)
  112. ->get('/directReshare');
  113. $share = $shareManager->newShare();
  114. $share->setNode($node)
  115. ->setShareType(IShare::TYPE_USER)
  116. ->setSharedWith(self::TEST_FILES_SHARING_API_USER4)
  117. ->setSharedBy(self::TEST_FILES_SHARING_API_USER2)
  118. ->setPermissions(\OCP\Constants::PERMISSION_ALL);
  119. $share = $shareManager->createShare($share);
  120. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER4);
  121. $this->fileIds[self::TEST_FILES_SHARING_API_USER2][''] = $view2->getFileInfo('')->getId();
  122. $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['sub1'] = $view2->getFileInfo('sub1')->getId();
  123. $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['sub1/sub2'] = $view2->getFileInfo('sub1/sub2')->getId();
  124. /*
  125. * User 3
  126. */
  127. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3);
  128. $view3 = new View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files');
  129. $view3->mkdir('/sub1/sub2');
  130. $view3->rename('/folder', '/sub1/sub2/folder');
  131. $this->fileIds[self::TEST_FILES_SHARING_API_USER3][''] = $view3->getFileInfo('')->getId();
  132. $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['sub1'] = $view3->getFileInfo('sub1')->getId();
  133. $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['sub1/sub2'] = $view3->getFileInfo('sub1/sub2')->getId();
  134. /*
  135. * User 4
  136. */
  137. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  138. $view4 = new View('/' . self::TEST_FILES_SHARING_API_USER4 . '/files');
  139. $view4->mkdir('/sub1/sub2');
  140. $view4->rename('/inside', '/sub1/sub2/inside');
  141. $this->fileIds[self::TEST_FILES_SHARING_API_USER4][''] = $view4->getFileInfo('')->getId();
  142. $this->fileIds[self::TEST_FILES_SHARING_API_USER4]['sub1'] = $view4->getFileInfo('sub1')->getId();
  143. $this->fileIds[self::TEST_FILES_SHARING_API_USER4]['sub1/sub2'] = $view4->getFileInfo('sub1/sub2')->getId();
  144. foreach ($this->fileIds as $user => $ids) {
  145. $this->loginAsUser($user);
  146. foreach ($ids as $id) {
  147. $path = $this->rootView->getPath($id);
  148. $ls = $this->rootView->getDirectoryContent($path);
  149. $this->fileEtags[$id] = $this->rootView->getFileInfo($path)->getEtag();
  150. }
  151. }
  152. }
  153. public function testOwnerWritesToShare() {
  154. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  155. Filesystem::file_put_contents('/sub1/sub2/folder/asd.txt', 'bar');
  156. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  157. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  158. self::TEST_FILES_SHARING_API_USER3]);
  159. $this->assertAllUnchanged();
  160. }
  161. public function testOwnerWritesToSingleFileShare() {
  162. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  163. Filesystem::file_put_contents('/foo.txt', 'longer_bar');
  164. $t = (int)Filesystem::filemtime('/foo.txt') - 1;
  165. Filesystem::touch('/foo.txt', $t);
  166. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4, self::TEST_FILES_SHARING_API_USER3]);
  167. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2]);
  168. $this->assertAllUnchanged();
  169. }
  170. public function testOwnerWritesToShareWithReshare() {
  171. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  172. Filesystem::file_put_contents('/sub1/sub2/folder/inside/bar.txt', 'bar');
  173. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  174. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  175. $this->assertAllUnchanged();
  176. }
  177. public function testOwnerRenameInShare() {
  178. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  179. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  180. Filesystem::rename('/sub1/sub2/folder/file.txt', '/sub1/sub2/folder/renamed.txt');
  181. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  182. self::TEST_FILES_SHARING_API_USER3]);
  183. $this->assertAllUnchanged();
  184. }
  185. public function testOwnerRenameInReShare() {
  186. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  187. Filesystem::rename('/sub1/sub2/folder/inside/file.txt', '/sub1/sub2/folder/inside/renamed.txt');
  188. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  189. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  190. $this->assertAllUnchanged();
  191. }
  192. public function testOwnerRenameIntoReShare() {
  193. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  194. Filesystem::rename('/sub1/sub2/folder/file.txt', '/sub1/sub2/folder/inside/renamed.txt');
  195. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  196. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  197. $this->assertAllUnchanged();
  198. }
  199. public function testOwnerRenameOutOfReShare() {
  200. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  201. Filesystem::rename('/sub1/sub2/folder/inside/file.txt', '/sub1/sub2/folder/renamed.txt');
  202. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  203. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  204. $this->assertAllUnchanged();
  205. }
  206. public function testOwnerDeleteInShare() {
  207. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  208. Filesystem::unlink('/sub1/sub2/folder/file.txt');
  209. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  210. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  211. self::TEST_FILES_SHARING_API_USER3]);
  212. $this->assertAllUnchanged();
  213. }
  214. public function testOwnerDeleteInReShare() {
  215. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  216. Filesystem::unlink('/sub1/sub2/folder/inside/file.txt');
  217. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  218. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  219. $this->assertAllUnchanged();
  220. }
  221. public function testOwnerUnshares() {
  222. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  223. $folderInfo = $this->rootView->getFileInfo('/' . self::TEST_FILES_SHARING_API_USER1 . '/files/sub1/sub2/folder');
  224. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  225. $node = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1)->get('/sub1/sub2/folder');
  226. $shareManager = \OC::$server->getShareManager();
  227. $shares = $shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, IShare::TYPE_USER, $node, true);
  228. foreach ($shares as $share) {
  229. if ($share->getSharedWith() === self::TEST_FILES_SHARING_API_USER2) {
  230. $shareManager->deleteShare($share);
  231. }
  232. }
  233. $this->assertEtagsForFoldersChanged([
  234. // direct recipient affected
  235. self::TEST_FILES_SHARING_API_USER2,
  236. ]);
  237. $this->assertAllUnchanged();
  238. }
  239. public function testOwnerUnsharesFlatReshares() {
  240. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  241. $folderInfo = $this->rootView->getFileInfo('/' . self::TEST_FILES_SHARING_API_USER1 . '/files/sub1/sub2/folder/inside');
  242. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  243. $node = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1)->get('/sub1/sub2/folder/inside');
  244. $shareManager = \OC::$server->getShareManager();
  245. $shares = $shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, IShare::TYPE_USER, $node, true);
  246. foreach ($shares as $share) {
  247. $shareManager->deleteShare($share);
  248. }
  249. $this->assertEtagsForFoldersChanged([
  250. // direct recipient affected
  251. self::TEST_FILES_SHARING_API_USER4,
  252. ]);
  253. $this->assertAllUnchanged();
  254. }
  255. public function testRecipientUnsharesFromSelf() {
  256. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  257. $ls = $this->rootView->getDirectoryContent('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/sub1/sub2/');
  258. $this->assertTrue(
  259. $this->rootView->unlink('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/sub1/sub2/folder')
  260. );
  261. $this->assertEtagsForFoldersChanged([
  262. // direct recipient affected
  263. self::TEST_FILES_SHARING_API_USER2,
  264. ]);
  265. $this->assertAllUnchanged();
  266. }
  267. public function testRecipientWritesToShare() {
  268. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  269. Filesystem::file_put_contents('/sub1/sub2/folder/asd.txt', 'bar');
  270. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  271. $this->assertEtagsForFoldersChanged([
  272. self::TEST_FILES_SHARING_API_USER1,
  273. self::TEST_FILES_SHARING_API_USER2,
  274. self::TEST_FILES_SHARING_API_USER3
  275. ]);
  276. $this->assertAllUnchanged();
  277. }
  278. public function testRecipientWritesToReshare() {
  279. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  280. Filesystem::file_put_contents('/sub1/sub2/folder/inside/asd.txt', 'bar');
  281. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  282. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  283. $this->assertAllUnchanged();
  284. }
  285. public function testRecipientWritesToOtherRecipientsReshare() {
  286. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3);
  287. Filesystem::file_put_contents('/sub1/sub2/folder/inside/asd.txt', 'bar');
  288. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  289. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  290. $this->assertAllUnchanged();
  291. }
  292. public function testRecipientRenameInShare() {
  293. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  294. Filesystem::rename('/sub1/sub2/folder/file.txt', '/sub1/sub2/folder/renamed.txt');
  295. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  296. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  297. self::TEST_FILES_SHARING_API_USER3]);
  298. $this->assertAllUnchanged();
  299. }
  300. public function testRecipientRenameInReShare() {
  301. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  302. Filesystem::rename('/sub1/sub2/folder/inside/file.txt', '/sub1/sub2/folder/inside/renamed.txt');
  303. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  304. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  305. $this->assertAllUnchanged();
  306. }
  307. public function testRecipientRenameResharedFolder() {
  308. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  309. Filesystem::rename('/directReshare', '/sub1/directReshare');
  310. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  311. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER2]);
  312. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER2], 'sub1');
  313. $this->assertAllUnchanged();
  314. }
  315. public function testRecipientDeleteInShare() {
  316. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  317. Filesystem::unlink('/sub1/sub2/folder/file.txt');
  318. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  319. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  320. self::TEST_FILES_SHARING_API_USER3]);
  321. $this->assertAllUnchanged();
  322. }
  323. public function testRecipientDeleteInReShare() {
  324. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  325. Filesystem::unlink('/sub1/sub2/folder/inside/file.txt');
  326. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  327. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  328. $this->assertAllUnchanged();
  329. }
  330. public function testReshareRecipientWritesToReshare() {
  331. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  332. Filesystem::file_put_contents('/sub1/sub2/inside/asd.txt', 'bar');
  333. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  334. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  335. $this->assertAllUnchanged();
  336. }
  337. public function testReshareRecipientRenameInReShare() {
  338. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  339. Filesystem::rename('/sub1/sub2/inside/file.txt', '/sub1/sub2/inside/renamed.txt');
  340. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  341. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  342. $this->assertAllUnchanged();
  343. }
  344. public function testReshareRecipientDeleteInReShare() {
  345. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  346. Filesystem::unlink('/sub1/sub2/inside/file.txt');
  347. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  348. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  349. $this->assertAllUnchanged();
  350. }
  351. public function testRecipientUploadInDirectReshare() {
  352. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  353. Filesystem::file_put_contents('/directReshare/test.txt', 'sad');
  354. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER3]);
  355. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER4]);
  356. $this->assertAllUnchanged();
  357. }
  358. public function testEtagChangeOnPermissionsChange() {
  359. $userFolder = $this->rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1);
  360. $node = $userFolder->get('/sub1/sub2/folder');
  361. $shares = $this->shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, IShare::TYPE_USER, $node);
  362. /** @var \OCP\Share\IShare[] $shares */
  363. $shares = array_filter($shares, function (\OCP\Share\IShare $share) {
  364. return $share->getSharedWith() === self::TEST_FILES_SHARING_API_USER2;
  365. });
  366. $this->assertCount(1, $shares);
  367. $share = $shares[0];
  368. $share->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE);
  369. $this->shareManager->updateShare($share);
  370. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER2]);
  371. $this->assertAllUnchanged();
  372. }
  373. }