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 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2016, ownCloud, Inc.
  4. *
  5. * @author Christoph Wurst <christoph@winzerhof-wurst.at>
  6. * @author Joas Schilling <coding@schilljs.com>
  7. * @author Jörn Friedrich Dreyer <jfd@butonic.de>
  8. * @author Lukas Reschke <lukas@statuscode.ch>
  9. * @author Robin Appelman <robin@icewind.nl>
  10. * @author Roeland Jago Douma <roeland@famdouma.nl>
  11. * @author Thomas Müller <thomas.mueller@tmit.eu>
  12. * @author Vincent Petry <vincent@nextcloud.com>
  13. *
  14. * @license AGPL-3.0
  15. *
  16. * This code is free software: you can redistribute it and/or modify
  17. * it under the terms of the GNU Affero General Public License, version 3,
  18. * as published by the Free Software Foundation.
  19. *
  20. * This program is distributed in the hope that it will be useful,
  21. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. * GNU Affero General Public License for more details.
  24. *
  25. * You should have received a copy of the GNU Affero General Public License, version 3,
  26. * along with this program. If not, see <http://www.gnu.org/licenses/>
  27. *
  28. */
  29. namespace OCA\Files_Sharing\Tests;
  30. use OC\Files\Filesystem;
  31. use OC\Files\View;
  32. use OCP\Share\IShare;
  33. /**
  34. * Class EtagPropagationTest
  35. *
  36. * @group SLOWDB
  37. *
  38. * @package OCA\Files_Sharing\Tests
  39. */
  40. class EtagPropagationTest extends PropagationTestCase {
  41. /**
  42. * "user1" is the admin who shares a folder "sub1/sub2/folder" with "user2" and "user3"
  43. * "user2" receives the folder and puts it in "sub1/sub2/folder"
  44. * "user3" receives the folder and puts it in "sub1/sub2/folder"
  45. * "user2" reshares the subdir "sub1/sub2/folder/inside" with "user4"
  46. * "user4" puts the received "inside" folder into "sub1/sub2/inside" (this is to check if it propagates across multiple subfolders)
  47. */
  48. protected function setUpShares() {
  49. $this->fileIds[self::TEST_FILES_SHARING_API_USER1] = [];
  50. $this->fileIds[self::TEST_FILES_SHARING_API_USER2] = [];
  51. $this->fileIds[self::TEST_FILES_SHARING_API_USER3] = [];
  52. $this->fileIds[self::TEST_FILES_SHARING_API_USER4] = [];
  53. $rootFolder = \OC::$server->getRootFolder();
  54. $shareManager = \OC::$server->getShareManager();
  55. $this->rootView = new View('');
  56. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  57. $view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
  58. $view1->mkdir('/sub1/sub2/folder/inside');
  59. $view1->mkdir('/directReshare');
  60. $view1->mkdir('/sub1/sub2/folder/other');
  61. $view1->file_put_contents('/foo.txt', 'foobar');
  62. $view1->file_put_contents('/sub1/sub2/folder/file.txt', 'foobar');
  63. $view1->file_put_contents('/sub1/sub2/folder/inside/file.txt', 'foobar');
  64. $folderInfo = $view1->getFileInfo('/sub1/sub2/folder');
  65. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  66. $fileInfo = $view1->getFileInfo('/foo.txt');
  67. $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
  68. $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1)
  69. ->get('/foo.txt');
  70. $share = $shareManager->newShare();
  71. $share->setNode($node)
  72. ->setShareType(IShare::TYPE_USER)
  73. ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
  74. ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
  75. ->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE);
  76. $share = $shareManager->createShare($share);
  77. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2);
  78. $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1)
  79. ->get('/sub1/sub2/folder');
  80. $share = $shareManager->newShare();
  81. $share->setNode($node)
  82. ->setShareType(IShare::TYPE_USER)
  83. ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
  84. ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
  85. ->setPermissions(\OCP\Constants::PERMISSION_ALL);
  86. $share = $shareManager->createShare($share);
  87. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2);
  88. $share = $shareManager->newShare();
  89. $share->setNode($node)
  90. ->setShareType(IShare::TYPE_USER)
  91. ->setSharedWith(self::TEST_FILES_SHARING_API_USER3)
  92. ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
  93. ->setPermissions(\OCP\Constants::PERMISSION_ALL);
  94. $share = $shareManager->createShare($share);
  95. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER3);
  96. $folderInfo = $view1->getFileInfo('/directReshare');
  97. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  98. $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1)
  99. ->get('/directReshare');
  100. $share = $shareManager->newShare();
  101. $share->setNode($node)
  102. ->setShareType(IShare::TYPE_USER)
  103. ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
  104. ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
  105. ->setPermissions(\OCP\Constants::PERMISSION_ALL);
  106. $share = $shareManager->createShare($share);
  107. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER2);
  108. $this->fileIds[self::TEST_FILES_SHARING_API_USER1][''] = $view1->getFileInfo('')->getId();
  109. $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['sub1'] = $view1->getFileInfo('sub1')->getId();
  110. $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['sub1/sub2'] = $view1->getFileInfo('sub1/sub2')->getId();
  111. /*
  112. * User 2
  113. */
  114. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  115. $view2 = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
  116. $view2->mkdir('/sub1/sub2');
  117. $view2->rename('/folder', '/sub1/sub2/folder');
  118. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  119. $insideInfo = $view2->getFileInfo('/sub1/sub2/folder/inside');
  120. $this->assertInstanceOf('\OC\Files\FileInfo', $insideInfo);
  121. $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER2)
  122. ->get('/sub1/sub2/folder/inside');
  123. $share = $shareManager->newShare();
  124. $share->setNode($node)
  125. ->setShareType(IShare::TYPE_USER)
  126. ->setSharedWith(self::TEST_FILES_SHARING_API_USER4)
  127. ->setSharedBy(self::TEST_FILES_SHARING_API_USER2)
  128. ->setPermissions(\OCP\Constants::PERMISSION_ALL);
  129. $share = $shareManager->createShare($share);
  130. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER4);
  131. $folderInfo = $view2->getFileInfo('/directReshare');
  132. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  133. $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER2)
  134. ->get('/directReshare');
  135. $share = $shareManager->newShare();
  136. $share->setNode($node)
  137. ->setShareType(IShare::TYPE_USER)
  138. ->setSharedWith(self::TEST_FILES_SHARING_API_USER4)
  139. ->setSharedBy(self::TEST_FILES_SHARING_API_USER2)
  140. ->setPermissions(\OCP\Constants::PERMISSION_ALL);
  141. $share = $shareManager->createShare($share);
  142. $this->shareManager->acceptShare($share, self::TEST_FILES_SHARING_API_USER4);
  143. $this->fileIds[self::TEST_FILES_SHARING_API_USER2][''] = $view2->getFileInfo('')->getId();
  144. $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['sub1'] = $view2->getFileInfo('sub1')->getId();
  145. $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['sub1/sub2'] = $view2->getFileInfo('sub1/sub2')->getId();
  146. /*
  147. * User 3
  148. */
  149. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3);
  150. $view3 = new View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files');
  151. $view3->mkdir('/sub1/sub2');
  152. $view3->rename('/folder', '/sub1/sub2/folder');
  153. $this->fileIds[self::TEST_FILES_SHARING_API_USER3][''] = $view3->getFileInfo('')->getId();
  154. $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['sub1'] = $view3->getFileInfo('sub1')->getId();
  155. $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['sub1/sub2'] = $view3->getFileInfo('sub1/sub2')->getId();
  156. /*
  157. * User 4
  158. */
  159. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  160. $view4 = new View('/' . self::TEST_FILES_SHARING_API_USER4 . '/files');
  161. $view4->mkdir('/sub1/sub2');
  162. $view4->rename('/inside', '/sub1/sub2/inside');
  163. $this->fileIds[self::TEST_FILES_SHARING_API_USER4][''] = $view4->getFileInfo('')->getId();
  164. $this->fileIds[self::TEST_FILES_SHARING_API_USER4]['sub1'] = $view4->getFileInfo('sub1')->getId();
  165. $this->fileIds[self::TEST_FILES_SHARING_API_USER4]['sub1/sub2'] = $view4->getFileInfo('sub1/sub2')->getId();
  166. foreach ($this->fileIds as $user => $ids) {
  167. $this->loginAsUser($user);
  168. foreach ($ids as $id) {
  169. $path = $this->rootView->getPath($id);
  170. $ls = $this->rootView->getDirectoryContent($path);
  171. $this->fileEtags[$id] = $this->rootView->getFileInfo($path)->getEtag();
  172. }
  173. }
  174. }
  175. public function testOwnerWritesToShare() {
  176. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  177. Filesystem::file_put_contents('/sub1/sub2/folder/asd.txt', 'bar');
  178. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  179. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  180. self::TEST_FILES_SHARING_API_USER3]);
  181. $this->assertAllUnchanged();
  182. }
  183. public function testOwnerWritesToSingleFileShare() {
  184. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  185. Filesystem::file_put_contents('/foo.txt', 'longer_bar');
  186. $t = (int)Filesystem::filemtime('/foo.txt') - 1;
  187. Filesystem::touch('/foo.txt', $t);
  188. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4, self::TEST_FILES_SHARING_API_USER3]);
  189. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2]);
  190. $this->assertAllUnchanged();
  191. }
  192. public function testOwnerWritesToShareWithReshare() {
  193. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  194. Filesystem::file_put_contents('/sub1/sub2/folder/inside/bar.txt', 'bar');
  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 testOwnerRenameInShare() {
  200. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  201. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  202. Filesystem::rename('/sub1/sub2/folder/file.txt', '/sub1/sub2/folder/renamed.txt');
  203. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  204. self::TEST_FILES_SHARING_API_USER3]);
  205. $this->assertAllUnchanged();
  206. }
  207. public function testOwnerRenameInReShare() {
  208. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  209. Filesystem::rename('/sub1/sub2/folder/inside/file.txt', '/sub1/sub2/folder/inside/renamed.txt');
  210. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  211. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  212. $this->assertAllUnchanged();
  213. }
  214. public function testOwnerRenameIntoReShare() {
  215. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  216. Filesystem::rename('/sub1/sub2/folder/file.txt', '/sub1/sub2/folder/inside/renamed.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 testOwnerRenameOutOfReShare() {
  222. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  223. Filesystem::rename('/sub1/sub2/folder/inside/file.txt', '/sub1/sub2/folder/renamed.txt');
  224. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  225. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  226. $this->assertAllUnchanged();
  227. }
  228. public function testOwnerDeleteInShare() {
  229. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  230. Filesystem::unlink('/sub1/sub2/folder/file.txt');
  231. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  232. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  233. self::TEST_FILES_SHARING_API_USER3]);
  234. $this->assertAllUnchanged();
  235. }
  236. public function testOwnerDeleteInReShare() {
  237. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  238. Filesystem::unlink('/sub1/sub2/folder/inside/file.txt');
  239. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  240. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  241. $this->assertAllUnchanged();
  242. }
  243. public function testOwnerUnshares() {
  244. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  245. $folderInfo = $this->rootView->getFileInfo('/' . self::TEST_FILES_SHARING_API_USER1 . '/files/sub1/sub2/folder');
  246. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  247. $node = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1)->get('/sub1/sub2/folder');
  248. $shareManager = \OC::$server->getShareManager();
  249. $shares = $shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, IShare::TYPE_USER, $node, true);
  250. foreach ($shares as $share) {
  251. if ($share->getSharedWith() === self::TEST_FILES_SHARING_API_USER2) {
  252. $shareManager->deleteShare($share);
  253. }
  254. }
  255. $this->assertEtagsForFoldersChanged([
  256. // direct recipient affected
  257. self::TEST_FILES_SHARING_API_USER2,
  258. ]);
  259. $this->assertAllUnchanged();
  260. }
  261. public function testOwnerUnsharesFlatReshares() {
  262. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
  263. $folderInfo = $this->rootView->getFileInfo('/' . self::TEST_FILES_SHARING_API_USER1 . '/files/sub1/sub2/folder/inside');
  264. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  265. $node = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1)->get('/sub1/sub2/folder/inside');
  266. $shareManager = \OC::$server->getShareManager();
  267. $shares = $shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, IShare::TYPE_USER, $node, true);
  268. foreach ($shares as $share) {
  269. $shareManager->deleteShare($share);
  270. }
  271. $this->assertEtagsForFoldersChanged([
  272. // direct recipient affected
  273. self::TEST_FILES_SHARING_API_USER4,
  274. ]);
  275. $this->assertAllUnchanged();
  276. }
  277. public function testRecipientUnsharesFromSelf() {
  278. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  279. $ls = $this->rootView->getDirectoryContent('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/sub1/sub2/');
  280. $this->assertTrue(
  281. $this->rootView->unlink('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/sub1/sub2/folder')
  282. );
  283. $this->assertEtagsForFoldersChanged([
  284. // direct recipient affected
  285. self::TEST_FILES_SHARING_API_USER2,
  286. ]);
  287. $this->assertAllUnchanged();
  288. }
  289. public function testRecipientWritesToShare() {
  290. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  291. Filesystem::file_put_contents('/sub1/sub2/folder/asd.txt', 'bar');
  292. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  293. $this->assertEtagsForFoldersChanged([
  294. self::TEST_FILES_SHARING_API_USER1,
  295. self::TEST_FILES_SHARING_API_USER2,
  296. self::TEST_FILES_SHARING_API_USER3
  297. ]);
  298. $this->assertAllUnchanged();
  299. }
  300. public function testRecipientWritesToReshare() {
  301. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  302. Filesystem::file_put_contents('/sub1/sub2/folder/inside/asd.txt', 'bar');
  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 testRecipientWritesToOtherRecipientsReshare() {
  308. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3);
  309. Filesystem::file_put_contents('/sub1/sub2/folder/inside/asd.txt', 'bar');
  310. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  311. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  312. $this->assertAllUnchanged();
  313. }
  314. public function testRecipientRenameInShare() {
  315. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  316. Filesystem::rename('/sub1/sub2/folder/file.txt', '/sub1/sub2/folder/renamed.txt');
  317. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  318. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  319. self::TEST_FILES_SHARING_API_USER3]);
  320. $this->assertAllUnchanged();
  321. }
  322. public function testRecipientRenameInReShare() {
  323. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  324. Filesystem::rename('/sub1/sub2/folder/inside/file.txt', '/sub1/sub2/folder/inside/renamed.txt');
  325. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  326. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  327. $this->assertAllUnchanged();
  328. }
  329. public function testRecipientRenameResharedFolder() {
  330. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  331. Filesystem::rename('/directReshare', '/sub1/directReshare');
  332. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  333. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER2]);
  334. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER2], 'sub1');
  335. $this->assertAllUnchanged();
  336. }
  337. public function testRecipientDeleteInShare() {
  338. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  339. Filesystem::unlink('/sub1/sub2/folder/file.txt');
  340. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
  341. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  342. self::TEST_FILES_SHARING_API_USER3]);
  343. $this->assertAllUnchanged();
  344. }
  345. public function testRecipientDeleteInReShare() {
  346. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  347. Filesystem::unlink('/sub1/sub2/folder/inside/file.txt');
  348. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  349. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  350. $this->assertAllUnchanged();
  351. }
  352. public function testReshareRecipientWritesToReshare() {
  353. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  354. Filesystem::file_put_contents('/sub1/sub2/inside/asd.txt', 'bar');
  355. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  356. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  357. $this->assertAllUnchanged();
  358. }
  359. public function testReshareRecipientRenameInReShare() {
  360. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  361. Filesystem::rename('/sub1/sub2/inside/file.txt', '/sub1/sub2/inside/renamed.txt');
  362. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  363. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  364. $this->assertAllUnchanged();
  365. }
  366. public function testReshareRecipientDeleteInReShare() {
  367. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
  368. Filesystem::unlink('/sub1/sub2/inside/file.txt');
  369. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
  370. self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]);
  371. $this->assertAllUnchanged();
  372. }
  373. public function testRecipientUploadInDirectReshare() {
  374. $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
  375. Filesystem::file_put_contents('/directReshare/test.txt', 'sad');
  376. $this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER3]);
  377. $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER4]);
  378. $this->assertAllUnchanged();
  379. }
  380. public function testEtagChangeOnPermissionsChange() {
  381. $userFolder = $this->rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1);
  382. $node = $userFolder->get('/sub1/sub2/folder');
  383. $shares = $this->shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, IShare::TYPE_USER, $node);
  384. /** @var \OCP\Share\IShare[] $shares */
  385. $shares = array_filter($shares, function (\OCP\Share\IShare $share) {
  386. return $share->getSharedWith() === self::TEST_FILES_SHARING_API_USER2;
  387. });
  388. $this->assertCount(1, $shares);
  389. $share = $shares[0];
  390. $share->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE);
  391. $this->shareManager->updateShare($share);
  392. $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER2]);
  393. $this->assertAllUnchanged();
  394. }
  395. }