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.

share.php 40KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933
  1. <?php
  2. /**
  3. * ownCloud
  4. *
  5. * @author Michael Gapczynski
  6. * @copyright 2012 Michael Gapczynski mtgap@owncloud.com
  7. *
  8. * This library is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
  10. * License as published by the Free Software Foundation; either
  11. * version 3 of the License, or any later version.
  12. *
  13. * This library is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public
  19. * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  20. */
  21. class Test_Share extends \Test\TestCase {
  22. protected $itemType;
  23. protected $userBackend;
  24. protected $user1;
  25. protected $user2;
  26. protected $user3;
  27. protected $user4;
  28. protected $groupAndUser;
  29. protected $groupBackend;
  30. protected $group1;
  31. protected $group2;
  32. protected $resharing;
  33. protected $dateInFuture;
  34. protected $dateInPast;
  35. protected function setUp() {
  36. parent::setUp();
  37. OC_User::clearBackends();
  38. OC_User::useBackend('dummy');
  39. $this->user1 = $this->getUniqueID('user1_');
  40. $this->user2 = $this->getUniqueID('user2_');
  41. $this->user3 = $this->getUniqueID('user3_');
  42. $this->user4 = $this->getUniqueID('user4_');
  43. $this->groupAndUser = $this->getUniqueID('groupAndUser_');
  44. OC_User::createUser($this->user1, 'pass');
  45. OC_User::createUser($this->user2, 'pass');
  46. OC_User::createUser($this->user3, 'pass');
  47. OC_User::createUser($this->user4, 'pass');
  48. OC_User::createUser($this->groupAndUser, 'pass');
  49. OC_User::setUserId($this->user1);
  50. OC_Group::clearBackends();
  51. OC_Group::useBackend(new OC_Group_Dummy);
  52. $this->group1 = $this->getUniqueID('group1_');
  53. $this->group2 = $this->getUniqueID('group2_');
  54. OC_Group::createGroup($this->group1);
  55. OC_Group::createGroup($this->group2);
  56. OC_Group::createGroup($this->groupAndUser);
  57. OC_Group::addToGroup($this->user1, $this->group1);
  58. OC_Group::addToGroup($this->user2, $this->group1);
  59. OC_Group::addToGroup($this->user3, $this->group1);
  60. OC_Group::addToGroup($this->user2, $this->group2);
  61. OC_Group::addToGroup($this->user4, $this->group2);
  62. OC_Group::addToGroup($this->user2, $this->groupAndUser);
  63. OC_Group::addToGroup($this->user3, $this->groupAndUser);
  64. OCP\Share::registerBackend('test', 'Test_Share_Backend');
  65. OC_Hook::clear('OCP\\Share');
  66. OC::registerShareHooks();
  67. $this->resharing = OC_Appconfig::getValue('core', 'shareapi_allow_resharing', 'yes');
  68. OC_Appconfig::setValue('core', 'shareapi_allow_resharing', 'yes');
  69. // 20 Minutes in the past, 20 minutes in the future.
  70. $now = time();
  71. $dateFormat = 'Y-m-d H:i:s';
  72. $this->dateInPast = date($dateFormat, $now - 20 * 60);
  73. $this->dateInFuture = date($dateFormat, $now + 20 * 60);
  74. }
  75. protected function tearDown() {
  76. $query = OC_DB::prepare('DELETE FROM `*PREFIX*share` WHERE `item_type` = ?');
  77. $query->execute(array('test'));
  78. OC_Appconfig::setValue('core', 'shareapi_allow_resharing', $this->resharing);
  79. parent::tearDown();
  80. }
  81. public function testShareInvalidShareType() {
  82. $message = 'Share type foobar is not valid for test.txt';
  83. try {
  84. OCP\Share::shareItem('test', 'test.txt', 'foobar', $this->user2, \OCP\Constants::PERMISSION_READ);
  85. } catch (Exception $exception) {
  86. $this->assertEquals($message, $exception->getMessage());
  87. }
  88. }
  89. public function testInvalidItemType() {
  90. $message = 'Sharing backend for foobar not found';
  91. try {
  92. OCP\Share::shareItem('foobar', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ);
  93. $this->fail('Exception was expected: '.$message);
  94. } catch (Exception $exception) {
  95. $this->assertEquals($message, $exception->getMessage());
  96. }
  97. try {
  98. OCP\Share::getItemsSharedWith('foobar');
  99. $this->fail('Exception was expected: '.$message);
  100. } catch (Exception $exception) {
  101. $this->assertEquals($message, $exception->getMessage());
  102. }
  103. try {
  104. OCP\Share::getItemSharedWith('foobar', 'test.txt');
  105. $this->fail('Exception was expected: '.$message);
  106. } catch (Exception $exception) {
  107. $this->assertEquals($message, $exception->getMessage());
  108. }
  109. try {
  110. OCP\Share::getItemSharedWithBySource('foobar', 'test.txt');
  111. $this->fail('Exception was expected: '.$message);
  112. } catch (Exception $exception) {
  113. $this->assertEquals($message, $exception->getMessage());
  114. }
  115. try {
  116. OCP\Share::getItemShared('foobar', 'test.txt');
  117. $this->fail('Exception was expected: '.$message);
  118. } catch (Exception $exception) {
  119. $this->assertEquals($message, $exception->getMessage());
  120. }
  121. try {
  122. OCP\Share::unshare('foobar', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2);
  123. $this->fail('Exception was expected: '.$message);
  124. } catch (Exception $exception) {
  125. $this->assertEquals($message, $exception->getMessage());
  126. }
  127. try {
  128. OCP\Share::setPermissions('foobar', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_UPDATE);
  129. $this->fail('Exception was expected: '.$message);
  130. } catch (Exception $exception) {
  131. $this->assertEquals($message, $exception->getMessage());
  132. }
  133. }
  134. protected function shareUserOneTestFileWithUserTwo() {
  135. OC_User::setUserId($this->user1);
  136. $this->assertTrue(
  137. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ),
  138. 'Failed asserting that user 1 successfully shared text.txt with user 2.'
  139. );
  140. $this->assertContains(
  141. 'test.txt',
  142. OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  143. 'Failed asserting that test.txt is a shared file of user 1.'
  144. );
  145. OC_User::setUserId($this->user2);
  146. $this->assertContains(
  147. 'test.txt',
  148. OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  149. 'Failed asserting that user 2 has access to test.txt after initial sharing.'
  150. );
  151. }
  152. protected function shareUserTestFileAsLink() {
  153. OC_User::setUserId($this->user1);
  154. $result = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ);
  155. $this->assertTrue(is_string($result));
  156. }
  157. /**
  158. * @param string $sharer
  159. * @param string $receiver
  160. */
  161. protected function shareUserTestFileWithUser($sharer, $receiver) {
  162. OC_User::setUserId($sharer);
  163. $this->assertTrue(
  164. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $receiver, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE),
  165. 'Failed asserting that ' . $sharer . ' successfully shared text.txt with ' . $receiver . '.'
  166. );
  167. $this->assertContains(
  168. 'test.txt',
  169. OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  170. 'Failed asserting that test.txt is a shared file of ' . $sharer . '.'
  171. );
  172. OC_User::setUserId($receiver);
  173. $this->assertContains(
  174. 'test.txt',
  175. OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  176. 'Failed asserting that ' . $receiver . ' has access to test.txt after initial sharing.'
  177. );
  178. }
  179. public function testShareWithUser() {
  180. // Invalid shares
  181. $message = 'Sharing test.txt failed, because the user '.$this->user1.' is the item owner';
  182. try {
  183. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_READ);
  184. $this->fail('Exception was expected: '.$message);
  185. } catch (Exception $exception) {
  186. $this->assertEquals($message, $exception->getMessage());
  187. }
  188. $message = 'Sharing test.txt failed, because the user foobar does not exist';
  189. try {
  190. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, 'foobar', \OCP\Constants::PERMISSION_READ);
  191. $this->fail('Exception was expected: '.$message);
  192. } catch (Exception $exception) {
  193. $this->assertEquals($message, $exception->getMessage());
  194. }
  195. $message = 'Sharing foobar failed, because the sharing backend for test could not find its source';
  196. try {
  197. OCP\Share::shareItem('test', 'foobar', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ);
  198. $this->fail('Exception was expected: '.$message);
  199. } catch (Exception $exception) {
  200. $this->assertEquals($message, $exception->getMessage());
  201. }
  202. // Valid share
  203. $this->shareUserOneTestFileWithUserTwo();
  204. // Attempt to share again
  205. OC_User::setUserId($this->user1);
  206. $message = 'Sharing test.txt failed, because this item is already shared with '.$this->user2;
  207. try {
  208. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ);
  209. $this->fail('Exception was expected: '.$message);
  210. } catch (Exception $exception) {
  211. $this->assertEquals($message, $exception->getMessage());
  212. }
  213. // Attempt to share back
  214. OC_User::setUserId($this->user2);
  215. $message = 'Sharing test.txt failed, because the user '.$this->user1.' is the original sharer';
  216. try {
  217. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_READ);
  218. $this->fail('Exception was expected: '.$message);
  219. } catch (Exception $exception) {
  220. $this->assertEquals($message, $exception->getMessage());
  221. }
  222. // Unshare
  223. OC_User::setUserId($this->user1);
  224. $this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2));
  225. // Attempt reshare without share permission
  226. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  227. OC_User::setUserId($this->user2);
  228. $message = 'Sharing test.txt failed, because resharing is not allowed';
  229. try {
  230. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ);
  231. $this->fail('Exception was expected: '.$message);
  232. } catch (Exception $exception) {
  233. $this->assertEquals($message, $exception->getMessage());
  234. }
  235. // Owner grants share and update permission
  236. OC_User::setUserId($this->user1);
  237. $this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE));
  238. // Attempt reshare with escalated permissions
  239. OC_User::setUserId($this->user2);
  240. $message = 'Sharing test.txt failed, because the permissions exceed permissions granted to '.$this->user2;
  241. try {
  242. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE);
  243. $this->fail('Exception was expected: '.$message);
  244. } catch (Exception $exception) {
  245. $this->assertEquals($message, $exception->getMessage());
  246. }
  247. // Valid reshare
  248. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE));
  249. $this->assertEquals(array('test.txt'), OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE));
  250. OC_User::setUserId($this->user3);
  251. $this->assertEquals(array('test.txt'), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE));
  252. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  253. // Attempt to escalate permissions
  254. OC_User::setUserId($this->user2);
  255. $message = 'Setting permissions for test.txt failed, because the permissions exceed permissions granted to '.$this->user2;
  256. try {
  257. OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE);
  258. $this->fail('Exception was expected: '.$message);
  259. } catch (Exception $exception) {
  260. $this->assertEquals($message, $exception->getMessage());
  261. }
  262. // Remove update permission
  263. OC_User::setUserId($this->user1);
  264. $this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE));
  265. OC_User::setUserId($this->user2);
  266. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  267. OC_User::setUserId($this->user3);
  268. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  269. // Remove share permission
  270. OC_User::setUserId($this->user1);
  271. $this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  272. OC_User::setUserId($this->user2);
  273. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  274. OC_User::setUserId($this->user3);
  275. $this->assertSame(array(), OCP\Share::getItemSharedWith('test', 'test.txt'));
  276. // Reshare again, and then have owner unshare
  277. OC_User::setUserId($this->user1);
  278. $this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE));
  279. OC_User::setUserId($this->user2);
  280. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ));
  281. OC_User::setUserId($this->user1);
  282. $this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2));
  283. OC_User::setUserId($this->user2);
  284. $this->assertSame(array(), OCP\Share::getItemSharedWith('test', 'test.txt'));
  285. OC_User::setUserId($this->user3);
  286. $this->assertSame(array(), OCP\Share::getItemSharedWith('test', 'test.txt'));
  287. // Attempt target conflict
  288. OC_User::setUserId($this->user1);
  289. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  290. OC_User::setUserId($this->user3);
  291. $this->assertTrue(OCP\Share::shareItem('test', 'share.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  292. OC_User::setUserId($this->user2);
  293. $to_test = OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET);
  294. $this->assertEquals(2, count($to_test));
  295. $this->assertTrue(in_array('test.txt', $to_test));
  296. $this->assertTrue(in_array('test1.txt', $to_test));
  297. // Unshare from self
  298. $this->assertTrue(OCP\Share::unshareFromSelf('test', 'test.txt'));
  299. $this->assertEquals(array('test1.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  300. // Unshare from self via source
  301. $this->assertTrue(OCP\Share::unshareFromSelf('test', 'share.txt', true));
  302. $this->assertEquals(array(), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  303. OC_User::setUserId($this->user1);
  304. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  305. OC_User::setUserId($this->user3);
  306. $this->assertTrue(OCP\Share::shareItem('test', 'share.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  307. OC_User::setUserId($this->user2);
  308. $to_test = OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET);
  309. $this->assertEquals(2, count($to_test));
  310. $this->assertTrue(in_array('test.txt', $to_test));
  311. $this->assertTrue(in_array('test1.txt', $to_test));
  312. // Remove user
  313. OC_User::setUserId($this->user1);
  314. OC_User::deleteUser($this->user1);
  315. OC_User::setUserId($this->user2);
  316. $this->assertEquals(array('test1.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  317. }
  318. public function testShareWithUserExpirationExpired() {
  319. OC_User::setUserId($this->user1);
  320. $this->shareUserOneTestFileWithUserTwo();
  321. $this->shareUserTestFileAsLink();
  322. // manipulate share table and set expire date to the past
  323. $query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `expiration` = ? WHERE `item_type` = ? AND `item_source` = ? AND `uid_owner` = ? AND `share_type` = ?');
  324. $query->bindValue(1, new \DateTime($this->dateInPast), 'datetime');
  325. $query->bindValue(2, 'test');
  326. $query->bindValue(3, 'test.txt');
  327. $query->bindValue(4, $this->user1);
  328. $query->bindValue(5, \OCP\Share::SHARE_TYPE_LINK);
  329. $query->execute();
  330. $shares = OCP\Share::getItemsShared('test');
  331. $this->assertSame(1, count($shares));
  332. $share = reset($shares);
  333. $this->assertSame(\OCP\Share::SHARE_TYPE_USER, $share['share_type']);
  334. }
  335. public function testSetExpireDateInPast() {
  336. OC_User::setUserId($this->user1);
  337. $this->shareUserOneTestFileWithUserTwo();
  338. $this->shareUserTestFileAsLink();
  339. $setExpireDateFailed = false;
  340. try {
  341. $this->assertTrue(
  342. OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInPast, ''),
  343. 'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
  344. );
  345. } catch (\Exception $e) {
  346. $setExpireDateFailed = true;
  347. }
  348. $this->assertTrue($setExpireDateFailed);
  349. }
  350. public function testShareWithUserExpirationValid() {
  351. OC_User::setUserId($this->user1);
  352. $this->shareUserOneTestFileWithUserTwo();
  353. $this->shareUserTestFileAsLink();
  354. $this->assertTrue(
  355. OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInFuture, ''),
  356. 'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
  357. );
  358. $shares = OCP\Share::getItemsShared('test');
  359. $this->assertSame(2, count($shares));
  360. }
  361. /*
  362. * if user is in a group excluded from resharing, then the share permission should
  363. * be removed
  364. */
  365. public function testShareWithUserAndUserIsExcludedFromResharing() {
  366. OC_User::setUserId($this->user1);
  367. $this->assertTrue(
  368. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user4, \OCP\Constants::PERMISSION_ALL),
  369. 'Failed asserting that user 1 successfully shared text.txt with user 4.'
  370. );
  371. $this->assertContains(
  372. 'test.txt',
  373. OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  374. 'Failed asserting that test.txt is a shared file of user 1.'
  375. );
  376. // exclude group2 from sharing
  377. \OC_Appconfig::setValue('core', 'shareapi_exclude_groups_list', $this->group2);
  378. \OC_Appconfig::setValue('core', 'shareapi_exclude_groups', "yes");
  379. OC_User::setUserId($this->user4);
  380. $share = OCP\Share::getItemSharedWith('test', 'test.txt');
  381. $this->assertSame(\OCP\Constants::PERMISSION_ALL & ~\OCP\Constants::PERMISSION_SHARE, $share['permissions'],
  382. 'Failed asserting that user 4 is excluded from re-sharing');
  383. \OC_Appconfig::deleteKey('core', 'shareapi_exclude_groups_list');
  384. \OC_Appconfig::deleteKey('core', 'shareapi_exclude_groups');
  385. }
  386. protected function shareUserOneTestFileWithGroupOne() {
  387. OC_User::setUserId($this->user1);
  388. $this->assertTrue(
  389. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ),
  390. 'Failed asserting that user 1 successfully shared text.txt with group 1.'
  391. );
  392. $this->assertContains(
  393. 'test.txt',
  394. OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  395. 'Failed asserting that test.txt is a shared file of user 1.'
  396. );
  397. OC_User::setUserId($this->user2);
  398. $this->assertContains(
  399. 'test.txt',
  400. OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  401. 'Failed asserting that user 2 has access to test.txt after initial sharing.'
  402. );
  403. OC_User::setUserId($this->user3);
  404. $this->assertContains(
  405. 'test.txt',
  406. OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  407. 'Failed asserting that user 3 has access to test.txt after initial sharing.'
  408. );
  409. }
  410. public function testShareWithGroup() {
  411. // Invalid shares
  412. $message = 'Sharing test.txt failed, because the group foobar does not exist';
  413. try {
  414. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, 'foobar', \OCP\Constants::PERMISSION_READ);
  415. $this->fail('Exception was expected: '.$message);
  416. } catch (Exception $exception) {
  417. $this->assertEquals($message, $exception->getMessage());
  418. }
  419. $policy = OC_Appconfig::getValue('core', 'shareapi_only_share_with_group_members', 'no');
  420. OC_Appconfig::setValue('core', 'shareapi_only_share_with_group_members', 'yes');
  421. $message = 'Sharing test.txt failed, because '.$this->user1.' is not a member of the group '.$this->group2;
  422. try {
  423. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group2, \OCP\Constants::PERMISSION_READ);
  424. $this->fail('Exception was expected: '.$message);
  425. } catch (Exception $exception) {
  426. $this->assertEquals($message, $exception->getMessage());
  427. }
  428. OC_Appconfig::setValue('core', 'shareapi_only_share_with_group_members', $policy);
  429. // Valid share
  430. $this->shareUserOneTestFileWithGroupOne();
  431. // Attempt to share again
  432. OC_User::setUserId($this->user1);
  433. $message = 'Sharing test.txt failed, because this item is already shared with '.$this->group1;
  434. try {
  435. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ);
  436. $this->fail('Exception was expected: '.$message);
  437. } catch (Exception $exception) {
  438. $this->assertEquals($message, $exception->getMessage());
  439. }
  440. // Attempt to share back to owner of group share
  441. OC_User::setUserId($this->user2);
  442. $message = 'Sharing test.txt failed, because the user '.$this->user1.' is the original sharer';
  443. try {
  444. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_READ);
  445. $this->fail('Exception was expected: '.$message);
  446. } catch (Exception $exception) {
  447. $this->assertEquals($message, $exception->getMessage());
  448. }
  449. // Attempt to share back to group
  450. $message = 'Sharing test.txt failed, because this item is already shared with '.$this->group1;
  451. try {
  452. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ);
  453. $this->fail('Exception was expected: '.$message);
  454. } catch (Exception $exception) {
  455. $this->assertEquals($message, $exception->getMessage());
  456. }
  457. // Attempt to share back to member of group
  458. $message ='Sharing test.txt failed, because this item is already shared with '.$this->user3;
  459. try {
  460. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ);
  461. $this->fail('Exception was expected: '.$message);
  462. } catch (Exception $exception) {
  463. $this->assertEquals($message, $exception->getMessage());
  464. }
  465. // Unshare
  466. OC_User::setUserId($this->user1);
  467. $this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1));
  468. // Valid share with same person - user then group
  469. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE | \OCP\Constants::PERMISSION_SHARE));
  470. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE));
  471. OC_User::setUserId($this->user2);
  472. $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  473. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE | \OCP\Constants::PERMISSION_SHARE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  474. OC_User::setUserId($this->user3);
  475. $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  476. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  477. // Valid reshare
  478. OC_User::setUserId($this->user2);
  479. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user4, \OCP\Constants::PERMISSION_READ));
  480. OC_User::setUserId($this->user4);
  481. $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  482. // Unshare from user only
  483. OC_User::setUserId($this->user1);
  484. $this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2));
  485. OC_User::setUserId($this->user2);
  486. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  487. OC_User::setUserId($this->user4);
  488. $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  489. // Valid share with same person - group then user
  490. OC_User::setUserId($this->user1);
  491. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE));
  492. OC_User::setUserId($this->user2);
  493. $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  494. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  495. // Unshare from group only
  496. OC_User::setUserId($this->user1);
  497. $this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1));
  498. OC_User::setUserId($this->user2);
  499. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  500. // Attempt user specific target conflict
  501. OC_User::setUserId($this->user3);
  502. $this->assertTrue(OCP\Share::shareItem('test', 'share.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE));
  503. OC_User::setUserId($this->user2);
  504. $to_test = OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET);
  505. $this->assertEquals(2, count($to_test));
  506. $this->assertTrue(in_array('test.txt', $to_test));
  507. $this->assertTrue(in_array('test1.txt', $to_test));
  508. // Valid reshare
  509. $this->assertTrue(OCP\Share::shareItem('test', 'share.txt', OCP\Share::SHARE_TYPE_USER, $this->user4, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE));
  510. OC_User::setUserId($this->user4);
  511. $this->assertEquals(array('test1.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  512. // Remove user from group
  513. OC_Group::removeFromGroup($this->user2, $this->group1);
  514. OC_User::setUserId($this->user2);
  515. $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  516. OC_User::setUserId($this->user4);
  517. $this->assertEquals(array(), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  518. // Add user to group
  519. OC_Group::addToGroup($this->user4, $this->group1);
  520. $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  521. // Unshare from self
  522. $this->assertTrue(OCP\Share::unshareFromSelf('test', 'test.txt'));
  523. $this->assertEquals(array(), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  524. OC_User::setUserId($this->user2);
  525. $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  526. // Unshare from self via source
  527. OC_User::setUserId($this->user1);
  528. $this->assertTrue(OCP\Share::unshareFromSelf('test', 'share.txt', true));
  529. $this->assertEquals(array(), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  530. // Remove group
  531. OC_Group::deleteGroup($this->group1);
  532. OC_User::setUserId($this->user4);
  533. $this->assertEquals(array(), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  534. OC_User::setUserId($this->user3);
  535. $this->assertEquals(array(), OCP\Share::getItemsShared('test'));
  536. }
  537. public function testShareWithGroupAndUserBothHaveTheSameId() {
  538. $this->shareUserTestFileWithUser($this->user1, $this->groupAndUser);
  539. OC_User::setUserId($this->groupAndUser);
  540. $this->assertEquals(array('test.txt'), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  541. '"groupAndUser"-User does not see the file but it was shared with him');
  542. OC_User::setUserId($this->user2);
  543. $this->assertEquals(array(), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  544. 'User2 sees test.txt but it was only shared with the user "groupAndUser" and not with group');
  545. OC_User::setUserId($this->user1);
  546. $this->assertTrue(OCP\Share::unshareAll('test', 'test.txt'));
  547. $this->assertTrue(
  548. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->groupAndUser, \OCP\Constants::PERMISSION_READ),
  549. 'Failed asserting that user 1 successfully shared text.txt with group 1.'
  550. );
  551. OC_User::setUserId($this->groupAndUser);
  552. $this->assertEquals(array(), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  553. '"groupAndUser"-User sees test.txt but it was only shared with the group "groupAndUser" and not with the user');
  554. OC_User::setUserId($this->user2);
  555. $this->assertEquals(array('test.txt'), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  556. 'User2 does not see test.txt but it was shared with the group "groupAndUser"');
  557. OC_User::setUserId($this->user1);
  558. $this->assertTrue(OCP\Share::unshareAll('test', 'test.txt'));
  559. }
  560. /**
  561. * @param boolean|string $token
  562. */
  563. protected function getShareByValidToken($token) {
  564. $row = OCP\Share::getShareByToken($token);
  565. $this->assertInternalType(
  566. 'array',
  567. $row,
  568. "Failed asserting that a share for token $token exists."
  569. );
  570. return $row;
  571. }
  572. public function testGetItemSharedWithUser() {
  573. OC_User::setUserId($this->user1);
  574. //add dummy values to the share table
  575. $query = \OC_DB::prepare('INSERT INTO `*PREFIX*share` ('
  576. .' `item_type`, `item_source`, `item_target`, `share_type`,'
  577. .' `share_with`, `uid_owner`) VALUES (?,?,?,?,?,?)');
  578. $args = array('test', 99, 'target1', OCP\Share::SHARE_TYPE_USER, $this->user2, $this->user1);
  579. $query->execute($args);
  580. $args = array('test', 99, 'target2', OCP\Share::SHARE_TYPE_USER, $this->user4, $this->user1);
  581. $query->execute($args);
  582. $args = array('test', 99, 'target3', OCP\Share::SHARE_TYPE_USER, $this->user3, $this->user2);
  583. $query->execute($args);
  584. $args = array('test', 99, 'target4', OCP\Share::SHARE_TYPE_USER, $this->user3, $this->user4);
  585. $query->execute($args);
  586. $result1 = \OCP\Share::getItemSharedWithUser('test', 99, $this->user2, $this->user1);
  587. $this->assertSame(1, count($result1));
  588. $this->verifyResult($result1, array('target1'));
  589. $result2 = \OCP\Share::getItemSharedWithUser('test', 99, null, $this->user1);
  590. $this->assertSame(2, count($result2));
  591. $this->verifyResult($result2, array('target1', 'target2'));
  592. $result3 = \OCP\Share::getItemSharedWithUser('test', 99, $this->user3);
  593. $this->assertSame(2, count($result3));
  594. $this->verifyResult($result3, array('target3', 'target4'));
  595. $result4 = \OCP\Share::getItemSharedWithUser('test', 99, null, null);
  596. $this->assertSame(4, count($result4));
  597. $this->verifyResult($result4, array('target1', 'target2', 'target3', 'target4'));
  598. }
  599. public function verifyResult($result, $expected) {
  600. foreach ($result as $r) {
  601. if (in_array($r['item_target'], $expected)) {
  602. $key = array_search($r['item_target'], $expected);
  603. unset($expected[$key]);
  604. }
  605. }
  606. $this->assertEmpty($expected, 'did not found all expected values');
  607. }
  608. public function testShareItemWithLink() {
  609. OC_User::setUserId($this->user1);
  610. $token = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ);
  611. $this->assertInternalType(
  612. 'string',
  613. $token,
  614. 'Failed asserting that user 1 successfully shared text.txt as link with token.'
  615. );
  616. // testGetShareByTokenNoExpiration
  617. $row = $this->getShareByValidToken($token);
  618. $this->assertEmpty(
  619. $row['expiration'],
  620. 'Failed asserting that the returned row does not have an expiration date.'
  621. );
  622. // testGetShareByTokenExpirationValid
  623. $this->assertTrue(
  624. OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInFuture, ''),
  625. 'Failed asserting that user 1 successfully set a future expiration date for the test.txt share.'
  626. );
  627. $row = $this->getShareByValidToken($token);
  628. $this->assertNotEmpty(
  629. $row['expiration'],
  630. 'Failed asserting that the returned row has an expiration date.'
  631. );
  632. // manipulate share table and set expire date to the past
  633. $query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `expiration` = ? WHERE `item_type` = ? AND `item_source` = ? AND `uid_owner` = ? AND `share_type` = ?');
  634. $query->bindValue(1, new \DateTime($this->dateInPast), 'datetime');
  635. $query->bindValue(2, 'test');
  636. $query->bindValue(3, 'test.txt');
  637. $query->bindValue(4, $this->user1);
  638. $query->bindValue(5, \OCP\Share::SHARE_TYPE_LINK);
  639. $query->execute();
  640. $this->assertFalse(
  641. OCP\Share::getShareByToken($token),
  642. 'Failed asserting that an expired share could not be found.'
  643. );
  644. }
  645. public function testShareItemWithLinkAndDefaultExpireDate() {
  646. OC_User::setUserId($this->user1);
  647. \OC_Appconfig::setValue('core', 'shareapi_default_expire_date', 'yes');
  648. \OC_Appconfig::setValue('core', 'shareapi_expire_after_n_days', '2');
  649. $token = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ);
  650. $this->assertInternalType(
  651. 'string',
  652. $token,
  653. 'Failed asserting that user 1 successfully shared text.txt as link with token.'
  654. );
  655. // share should have default expire date
  656. $row = $this->getShareByValidToken($token);
  657. $this->assertNotEmpty(
  658. $row['expiration'],
  659. 'Failed asserting that the returned row has an default expiration date.'
  660. );
  661. \OC_Appconfig::deleteKey('core', 'shareapi_default_expire_date');
  662. \OC_Appconfig::deleteKey('core', 'shareapi_expire_after_n_days');
  663. }
  664. public function testUnshareAll() {
  665. $this->shareUserTestFileWithUser($this->user1, $this->user2);
  666. $this->shareUserTestFileWithUser($this->user2, $this->user3);
  667. $this->shareUserTestFileWithUser($this->user3, $this->user4);
  668. $this->shareUserOneTestFileWithGroupOne();
  669. OC_User::setUserId($this->user1);
  670. $this->assertEquals(
  671. array('test.txt', 'test.txt'),
  672. OCP\Share::getItemsShared('test', Test_Share_Backend::FORMAT_SOURCE),
  673. 'Failed asserting that the test.txt file is shared exactly two times by user1.'
  674. );
  675. OC_User::setUserId($this->user2);
  676. $this->assertEquals(
  677. array('test.txt'),
  678. OCP\Share::getItemsShared('test', Test_Share_Backend::FORMAT_SOURCE),
  679. 'Failed asserting that the test.txt file is shared exactly once by user2.'
  680. );
  681. OC_User::setUserId($this->user3);
  682. $this->assertEquals(
  683. array('test.txt'),
  684. OCP\Share::getItemsShared('test', Test_Share_Backend::FORMAT_SOURCE),
  685. 'Failed asserting that the test.txt file is shared exactly once by user3.'
  686. );
  687. $this->assertTrue(
  688. OCP\Share::unshareAll('test', 'test.txt'),
  689. 'Failed asserting that user 3 successfully unshared all shares of the test.txt share.'
  690. );
  691. $this->assertEquals(
  692. array(),
  693. OCP\Share::getItemsShared('test'),
  694. 'Failed asserting that the share of the test.txt file by user 3 has been removed.'
  695. );
  696. OC_User::setUserId($this->user1);
  697. $this->assertEquals(
  698. array(),
  699. OCP\Share::getItemsShared('test'),
  700. 'Failed asserting that both shares of the test.txt file by user 1 have been removed.'
  701. );
  702. OC_User::setUserId($this->user2);
  703. $this->assertEquals(
  704. array(),
  705. OCP\Share::getItemsShared('test'),
  706. 'Failed asserting that the share of the test.txt file by user 2 has been removed.'
  707. );
  708. }
  709. /**
  710. * @dataProvider checkPasswordProtectedShareDataProvider
  711. * @param $expected
  712. * @param $item
  713. */
  714. public function testCheckPasswordProtectedShare($expected, $item) {
  715. \OC::$server->getSession()->set('public_link_authenticated', 100);
  716. $result = \OCP\Share::checkPasswordProtectedShare($item);
  717. $this->assertEquals($expected, $result);
  718. }
  719. function checkPasswordProtectedShareDataProvider() {
  720. return array(
  721. array(true, array()),
  722. array(true, array('share_with' => null)),
  723. array(true, array('share_with' => '')),
  724. array(true, array('share_with' => '1234567890', 'share_type' => '1')),
  725. array(true, array('share_with' => '1234567890', 'share_type' => 1)),
  726. array(true, array('share_with' => '1234567890', 'share_type' => '3', 'id' => 100)),
  727. array(true, array('share_with' => '1234567890', 'share_type' => 3, 'id' => 100)),
  728. array(false, array('share_with' => '1234567890', 'share_type' => '3', 'id' => 101)),
  729. array(false, array('share_with' => '1234567890', 'share_type' => 3, 'id' => 101)),
  730. );
  731. }
  732. /**
  733. * @dataProvider dataProviderTestGroupItems
  734. * @param type $ungrouped
  735. * @param type $grouped
  736. */
  737. function testGroupItems($ungrouped, $grouped) {
  738. $result = DummyShareClass::groupItemsTest($ungrouped);
  739. $this->compareArrays($grouped, $result);
  740. }
  741. function compareArrays($result, $expectedResult) {
  742. foreach ($expectedResult as $key => $value) {
  743. if (is_array($value)) {
  744. $this->compareArrays($result[$key], $value);
  745. } else {
  746. $this->assertSame($value, $result[$key]);
  747. }
  748. }
  749. }
  750. function dataProviderTestGroupItems() {
  751. return array(
  752. // one array with one share
  753. array(
  754. array( // input
  755. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_ALL, 'item_target' => 't1')),
  756. array( // expected result
  757. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_ALL, 'item_target' => 't1'))),
  758. // two shares both point to the same source
  759. array(
  760. array( // input
  761. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  762. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1'),
  763. ),
  764. array( // expected result
  765. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1',
  766. 'grouped' => array(
  767. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  768. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1'),
  769. )
  770. ),
  771. )
  772. ),
  773. // two shares both point to the same source but with different targets
  774. array(
  775. array( // input
  776. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  777. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't2'),
  778. ),
  779. array( // expected result
  780. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  781. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't2'),
  782. )
  783. ),
  784. // three shares two point to the same source
  785. array(
  786. array( // input
  787. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  788. array('item_source' => 2, 'permissions' => \OCP\Constants::PERMISSION_CREATE, 'item_target' => 't2'),
  789. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1'),
  790. ),
  791. array( // expected result
  792. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1',
  793. 'grouped' => array(
  794. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  795. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1'),
  796. )
  797. ),
  798. array('item_source' => 2, 'permissions' => \OCP\Constants::PERMISSION_CREATE, 'item_target' => 't2'),
  799. )
  800. ),
  801. );
  802. }
  803. }
  804. class DummyShareClass extends \OC\Share\Share {
  805. public static function groupItemsTest($items) {
  806. return parent::groupItems($items, 'test');
  807. }
  808. }