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

11 jaren geleden
11 jaren geleden
11 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
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. }