share.php 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650
  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. /**
  22. * Class Test_Share
  23. *
  24. * @group DB
  25. */
  26. class Test_Share extends \Test\TestCase {
  27. protected $itemType;
  28. protected $userBackend;
  29. protected $user1;
  30. protected $user2;
  31. protected $user3;
  32. protected $user4;
  33. protected $user5;
  34. protected $user6;
  35. protected $groupAndUser;
  36. protected $groupBackend;
  37. protected $group1;
  38. protected $group2;
  39. protected $resharing;
  40. protected $dateInFuture;
  41. protected $dateInPast;
  42. protected function setUp() {
  43. parent::setUp();
  44. OC_User::clearBackends();
  45. OC_User::useBackend('dummy');
  46. $this->user1 = $this->getUniqueID('user1_');
  47. $this->user2 = $this->getUniqueID('user2_');
  48. $this->user3 = $this->getUniqueID('user3_');
  49. $this->user4 = $this->getUniqueID('user4_');
  50. $this->user5 = $this->getUniqueID('user5_');
  51. $this->user6 = $this->getUniqueID('user6_');
  52. $this->groupAndUser = $this->getUniqueID('groupAndUser_');
  53. \OC::$server->getUserManager()->createUser($this->user1, 'pass');
  54. \OC::$server->getUserManager()->createUser($this->user2, 'pass');
  55. \OC::$server->getUserManager()->createUser($this->user3, 'pass');
  56. \OC::$server->getUserManager()->createUser($this->user4, 'pass');
  57. \OC::$server->getUserManager()->createUser($this->user5, 'pass');
  58. \OC::$server->getUserManager()->createUser($this->user6, 'pass'); // no group
  59. \OC::$server->getUserManager()->createUser($this->groupAndUser, 'pass');
  60. OC_User::setUserId($this->user1);
  61. OC_Group::clearBackends();
  62. OC_Group::useBackend(new OC_Group_Dummy);
  63. $this->group1 = $this->getUniqueID('group1_');
  64. $this->group2 = $this->getUniqueID('group2_');
  65. OC_Group::createGroup($this->group1);
  66. OC_Group::createGroup($this->group2);
  67. OC_Group::createGroup($this->groupAndUser);
  68. OC_Group::addToGroup($this->user1, $this->group1);
  69. OC_Group::addToGroup($this->user2, $this->group1);
  70. OC_Group::addToGroup($this->user3, $this->group1);
  71. OC_Group::addToGroup($this->user2, $this->group2);
  72. OC_Group::addToGroup($this->user4, $this->group2);
  73. OC_Group::addToGroup($this->user2, $this->groupAndUser);
  74. OC_Group::addToGroup($this->user3, $this->groupAndUser);
  75. OCP\Share::registerBackend('test', 'Test_Share_Backend');
  76. OC_Hook::clear('OCP\\Share');
  77. OC::registerShareHooks();
  78. $this->resharing = \OC::$server->getAppConfig()->getValue('core', 'shareapi_allow_resharing', 'yes');
  79. \OC::$server->getAppConfig()->setValue('core', 'shareapi_allow_resharing', 'yes');
  80. // 20 Minutes in the past, 20 minutes in the future.
  81. $now = time();
  82. $dateFormat = 'Y-m-d H:i:s';
  83. $this->dateInPast = date($dateFormat, $now - 20 * 60);
  84. $this->dateInFuture = date($dateFormat, $now + 20 * 60);
  85. }
  86. protected function tearDown() {
  87. $query = OC_DB::prepare('DELETE FROM `*PREFIX*share` WHERE `item_type` = ?');
  88. $query->execute(array('test'));
  89. \OC::$server->getAppConfig()->setValue('core', 'shareapi_allow_resharing', $this->resharing);
  90. $user = \OC::$server->getUserManager()->get($this->user1);
  91. if ($user !== null) { $user->delete(); }
  92. $user = \OC::$server->getUserManager()->get($this->user2);
  93. if ($user !== null) { $user->delete(); }
  94. $user = \OC::$server->getUserManager()->get($this->user3);
  95. if ($user !== null) { $user->delete(); }
  96. $user = \OC::$server->getUserManager()->get($this->user4);
  97. if ($user !== null) { $user->delete(); }
  98. $user = \OC::$server->getUserManager()->get($this->user5);
  99. if ($user !== null) { $user->delete(); }
  100. $user = \OC::$server->getUserManager()->get($this->user6);
  101. if ($user !== null) { $user->delete(); }
  102. $user = \OC::$server->getUserManager()->get($this->groupAndUser);
  103. if ($user !== null) { $user->delete(); }
  104. OC_Group::deleteGroup($this->group1);
  105. OC_Group::deleteGroup($this->group2);
  106. OC_Group::deleteGroup($this->groupAndUser);
  107. $this->logout();
  108. parent::tearDown();
  109. }
  110. protected function setHttpHelper($httpHelper) {
  111. \OC::$server->registerService('HTTPHelper', function () use ($httpHelper) {
  112. return $httpHelper;
  113. });
  114. }
  115. public function testShareInvalidShareType() {
  116. $message = 'Share type foobar is not valid for test.txt';
  117. try {
  118. OCP\Share::shareItem('test', 'test.txt', 'foobar', $this->user2, \OCP\Constants::PERMISSION_READ);
  119. } catch (Exception $exception) {
  120. $this->assertEquals($message, $exception->getMessage());
  121. }
  122. }
  123. public function testInvalidItemType() {
  124. $message = 'Sharing backend for foobar not found';
  125. try {
  126. OCP\Share::shareItem('foobar', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ);
  127. $this->fail('Exception was expected: '.$message);
  128. } catch (Exception $exception) {
  129. $this->assertEquals($message, $exception->getMessage());
  130. }
  131. try {
  132. OCP\Share::getItemsSharedWith('foobar');
  133. $this->fail('Exception was expected: '.$message);
  134. } catch (Exception $exception) {
  135. $this->assertEquals($message, $exception->getMessage());
  136. }
  137. try {
  138. OCP\Share::getItemSharedWith('foobar', 'test.txt');
  139. $this->fail('Exception was expected: '.$message);
  140. } catch (Exception $exception) {
  141. $this->assertEquals($message, $exception->getMessage());
  142. }
  143. try {
  144. OCP\Share::getItemSharedWithBySource('foobar', 'test.txt');
  145. $this->fail('Exception was expected: '.$message);
  146. } catch (Exception $exception) {
  147. $this->assertEquals($message, $exception->getMessage());
  148. }
  149. try {
  150. OCP\Share::getItemShared('foobar', 'test.txt');
  151. $this->fail('Exception was expected: '.$message);
  152. } catch (Exception $exception) {
  153. $this->assertEquals($message, $exception->getMessage());
  154. }
  155. try {
  156. OCP\Share::unshare('foobar', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2);
  157. $this->fail('Exception was expected: '.$message);
  158. } catch (Exception $exception) {
  159. $this->assertEquals($message, $exception->getMessage());
  160. }
  161. try {
  162. OCP\Share::setPermissions('foobar', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_UPDATE);
  163. $this->fail('Exception was expected: '.$message);
  164. } catch (Exception $exception) {
  165. $this->assertEquals($message, $exception->getMessage());
  166. }
  167. }
  168. protected function shareUserOneTestFileWithUserTwo() {
  169. OC_User::setUserId($this->user1);
  170. $this->assertTrue(
  171. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ),
  172. 'Failed asserting that user 1 successfully shared text.txt with user 2.'
  173. );
  174. $this->assertContains(
  175. 'test.txt',
  176. OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  177. 'Failed asserting that test.txt is a shared file of user 1.'
  178. );
  179. OC_User::setUserId($this->user2);
  180. $this->assertContains(
  181. 'test.txt',
  182. OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  183. 'Failed asserting that user 2 has access to test.txt after initial sharing.'
  184. );
  185. }
  186. protected function shareUserTestFileAsLink() {
  187. OC_User::setUserId($this->user1);
  188. $result = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ);
  189. $this->assertTrue(is_string($result));
  190. }
  191. /**
  192. * @param string $sharer
  193. * @param string $receiver
  194. */
  195. protected function shareUserTestFileWithUser($sharer, $receiver) {
  196. OC_User::setUserId($sharer);
  197. $this->assertTrue(
  198. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $receiver, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE),
  199. 'Failed asserting that ' . $sharer . ' successfully shared text.txt with ' . $receiver . '.'
  200. );
  201. $this->assertContains(
  202. 'test.txt',
  203. OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  204. 'Failed asserting that test.txt is a shared file of ' . $sharer . '.'
  205. );
  206. OC_User::setUserId($receiver);
  207. $this->assertContains(
  208. 'test.txt',
  209. OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  210. 'Failed asserting that ' . $receiver . ' has access to test.txt after initial sharing.'
  211. );
  212. }
  213. public function testShareWithUser() {
  214. // Invalid shares
  215. $message = 'Sharing test.txt failed, because you can not share with yourself';
  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. $message = 'Sharing test.txt failed, because the user foobar does not exist';
  223. try {
  224. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, 'foobar', \OCP\Constants::PERMISSION_READ);
  225. $this->fail('Exception was expected: '.$message);
  226. } catch (Exception $exception) {
  227. $this->assertEquals($message, $exception->getMessage());
  228. }
  229. $message = 'Sharing foobar failed, because the sharing backend for test could not find its source';
  230. try {
  231. OCP\Share::shareItem('test', 'foobar', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ);
  232. $this->fail('Exception was expected: '.$message);
  233. } catch (Exception $exception) {
  234. $this->assertEquals($message, $exception->getMessage());
  235. }
  236. // Valid share
  237. $this->shareUserOneTestFileWithUserTwo();
  238. // Attempt to share again
  239. OC_User::setUserId($this->user1);
  240. $message = 'Sharing test.txt failed, because this item is already shared with '.$this->user2;
  241. try {
  242. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ);
  243. $this->fail('Exception was expected: '.$message);
  244. } catch (Exception $exception) {
  245. $this->assertEquals($message, $exception->getMessage());
  246. }
  247. // Attempt to share back
  248. OC_User::setUserId($this->user2);
  249. $message = 'Sharing failed, because the user '.$this->user1.' is the original sharer';
  250. try {
  251. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_READ);
  252. $this->fail('Exception was expected: '.$message);
  253. } catch (Exception $exception) {
  254. $this->assertEquals($message, $exception->getMessage());
  255. }
  256. // Unshare
  257. OC_User::setUserId($this->user1);
  258. $this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2));
  259. // Attempt reshare without share permission
  260. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  261. OC_User::setUserId($this->user2);
  262. $message = 'Sharing test.txt failed, because resharing is not allowed';
  263. try {
  264. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ);
  265. $this->fail('Exception was expected: '.$message);
  266. } catch (Exception $exception) {
  267. $this->assertEquals($message, $exception->getMessage());
  268. }
  269. // Owner grants share and update 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 | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE));
  272. // Attempt reshare with escalated permissions
  273. OC_User::setUserId($this->user2);
  274. $message = 'Sharing test.txt failed, because the permissions exceed permissions granted to '.$this->user2;
  275. try {
  276. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE);
  277. $this->fail('Exception was expected: '.$message);
  278. } catch (Exception $exception) {
  279. $this->assertEquals($message, $exception->getMessage());
  280. }
  281. // Valid reshare
  282. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE));
  283. $this->assertEquals(array('test.txt'), OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE));
  284. OC_User::setUserId($this->user3);
  285. $this->assertEquals(array('test.txt'), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE));
  286. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  287. // Attempt to escalate permissions
  288. OC_User::setUserId($this->user2);
  289. $message = 'Setting permissions for test.txt failed, because the permissions exceed permissions granted to '.$this->user2;
  290. try {
  291. OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE);
  292. $this->fail('Exception was expected: '.$message);
  293. } catch (Exception $exception) {
  294. $this->assertEquals($message, $exception->getMessage());
  295. }
  296. // Remove update permission
  297. OC_User::setUserId($this->user1);
  298. $this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE));
  299. OC_User::setUserId($this->user2);
  300. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  301. OC_User::setUserId($this->user3);
  302. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  303. // Remove share permission
  304. OC_User::setUserId($this->user1);
  305. $this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  306. OC_User::setUserId($this->user2);
  307. $this->assertEquals(array(\OCP\Constants::PERMISSION_READ), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
  308. OC_User::setUserId($this->user3);
  309. $this->assertSame(array(), OCP\Share::getItemSharedWith('test', 'test.txt'));
  310. // Reshare again, and then have owner unshare
  311. OC_User::setUserId($this->user1);
  312. $this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE));
  313. OC_User::setUserId($this->user2);
  314. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ));
  315. OC_User::setUserId($this->user1);
  316. $this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2));
  317. OC_User::setUserId($this->user2);
  318. $this->assertSame(array(), OCP\Share::getItemSharedWith('test', 'test.txt'));
  319. OC_User::setUserId($this->user3);
  320. $this->assertSame(array(), OCP\Share::getItemSharedWith('test', 'test.txt'));
  321. // Attempt target conflict
  322. OC_User::setUserId($this->user1);
  323. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  324. OC_User::setUserId($this->user3);
  325. $this->assertTrue(OCP\Share::shareItem('test', 'share.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  326. OC_User::setUserId($this->user2);
  327. $to_test = OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET);
  328. $this->assertEquals(2, count($to_test));
  329. $this->assertTrue(in_array('test.txt', $to_test));
  330. $this->assertTrue(in_array('test1.txt', $to_test));
  331. // Unshare from self
  332. $this->assertTrue(OCP\Share::unshareFromSelf('test', 'test.txt'));
  333. $this->assertEquals(array('test1.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  334. // Unshare from self via source
  335. $this->assertTrue(OCP\Share::unshareFromSelf('test', 'share.txt', true));
  336. $this->assertEquals(array(), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  337. OC_User::setUserId($this->user1);
  338. $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  339. OC_User::setUserId($this->user3);
  340. $this->assertTrue(OCP\Share::shareItem('test', 'share.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ));
  341. OC_User::setUserId($this->user2);
  342. $to_test = OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET);
  343. $this->assertEquals(2, count($to_test));
  344. $this->assertTrue(in_array('test.txt', $to_test));
  345. $this->assertTrue(in_array('test1.txt', $to_test));
  346. // Remove user
  347. OC_User::setUserId($this->user1);
  348. $user = \OC::$server->getUserManager()->get($this->user1);
  349. if ($user !== null) { $user->delete(); }
  350. OC_User::setUserId($this->user2);
  351. $this->assertEquals(array('test1.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
  352. }
  353. public function testShareWithUserExpirationExpired() {
  354. OC_User::setUserId($this->user1);
  355. $this->shareUserOneTestFileWithUserTwo();
  356. $this->shareUserTestFileAsLink();
  357. // manipulate share table and set expire date to the past
  358. $query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `expiration` = ? WHERE `item_type` = ? AND `item_source` = ? AND `uid_owner` = ? AND `share_type` = ?');
  359. $query->bindValue(1, new \DateTime($this->dateInPast), 'datetime');
  360. $query->bindValue(2, 'test');
  361. $query->bindValue(3, 'test.txt');
  362. $query->bindValue(4, $this->user1);
  363. $query->bindValue(5, \OCP\Share::SHARE_TYPE_LINK);
  364. $query->execute();
  365. $shares = OCP\Share::getItemsShared('test');
  366. $this->assertSame(1, count($shares));
  367. $share = reset($shares);
  368. $this->assertSame(\OCP\Share::SHARE_TYPE_USER, $share['share_type']);
  369. }
  370. public function testGetShareFromOutsideFilesFolder() {
  371. OC_User::setUserId($this->user1);
  372. $view = new \OC\Files\View('/' . $this->user1 . '/');
  373. $view->mkdir('files/test');
  374. $view->mkdir('files/test/sub');
  375. $view->mkdir('files_trashbin');
  376. $view->mkdir('files_trashbin/files');
  377. $fileInfo = $view->getFileInfo('files/test/sub');
  378. $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
  379. $fileId = $fileInfo->getId();
  380. $this->assertTrue(
  381. OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ),
  382. 'Failed asserting that user 1 successfully shared "test/sub" with user 2.'
  383. );
  384. $result = OCP\Share::getItemShared('folder', $fileId, Test_Share_Backend::FORMAT_SOURCE);
  385. $this->assertNotEmpty($result);
  386. $result = OCP\Share::getItemSharedWithUser('folder', $fileId, $this->user2);
  387. $this->assertNotEmpty($result);
  388. $result = OCP\Share::getItemsSharedWithUser('folder', $this->user2);
  389. $this->assertNotEmpty($result);
  390. // move to trash (keeps file id)
  391. $view->rename('files/test', 'files_trashbin/files/test');
  392. $result = OCP\Share::getItemShared('folder', $fileId, Test_Share_Backend::FORMAT_SOURCE);
  393. $this->assertEmpty($result, 'Share must not be returned for files outside of "files"');
  394. $result = OCP\Share::getItemSharedWithUser('folder', $fileId, $this->user2);
  395. $this->assertEmpty($result, 'Share must not be returned for files outside of "files"');
  396. $result = OCP\Share::getItemsSharedWithUser('folder', $this->user2);
  397. $this->assertEmpty($result, 'Share must not be returned for files outside of "files"');
  398. }
  399. public function testSetExpireDateInPast() {
  400. OC_User::setUserId($this->user1);
  401. $this->shareUserOneTestFileWithUserTwo();
  402. $this->shareUserTestFileAsLink();
  403. $setExpireDateFailed = false;
  404. try {
  405. $this->assertTrue(
  406. OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInPast, ''),
  407. 'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
  408. );
  409. } catch (\Exception $e) {
  410. $setExpireDateFailed = true;
  411. }
  412. $this->assertTrue($setExpireDateFailed);
  413. }
  414. public function testShareWithUserExpirationValid() {
  415. OC_User::setUserId($this->user1);
  416. $this->shareUserOneTestFileWithUserTwo();
  417. $this->shareUserTestFileAsLink();
  418. $this->assertTrue(
  419. OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInFuture, ''),
  420. 'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
  421. );
  422. $shares = OCP\Share::getItemsShared('test');
  423. $this->assertSame(2, count($shares));
  424. }
  425. /*
  426. * if user is in a group excluded from resharing, then the share permission should
  427. * be removed
  428. */
  429. public function testShareWithUserAndUserIsExcludedFromResharing() {
  430. OC_User::setUserId($this->user1);
  431. $this->assertTrue(
  432. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user4, \OCP\Constants::PERMISSION_ALL),
  433. 'Failed asserting that user 1 successfully shared text.txt with user 4.'
  434. );
  435. $this->assertContains(
  436. 'test.txt',
  437. OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  438. 'Failed asserting that test.txt is a shared file of user 1.'
  439. );
  440. // exclude group2 from sharing
  441. \OC::$server->getAppConfig()->setValue('core', 'shareapi_exclude_groups_list', $this->group2);
  442. \OC::$server->getAppConfig()->setValue('core', 'shareapi_exclude_groups', "yes");
  443. OC_User::setUserId($this->user4);
  444. $share = OCP\Share::getItemSharedWith('test', 'test.txt');
  445. $this->assertSame(\OCP\Constants::PERMISSION_ALL & ~\OCP\Constants::PERMISSION_SHARE, $share['permissions'],
  446. 'Failed asserting that user 4 is excluded from re-sharing');
  447. \OC::$server->getAppConfig()->deleteKey('core', 'shareapi_exclude_groups_list');
  448. \OC::$server->getAppConfig()->deleteKey('core', 'shareapi_exclude_groups');
  449. }
  450. public function testSharingAFolderThatIsSharedWithAGroupOfTheOwner() {
  451. OC_User::setUserId($this->user1);
  452. $view = new \OC\Files\View('/' . $this->user1 . '/');
  453. $view->mkdir('files/test');
  454. $view->mkdir('files/test/sub1');
  455. $view->mkdir('files/test/sub1/sub2');
  456. $fileInfo = $view->getFileInfo('files/test/sub1');
  457. $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
  458. $fileId = $fileInfo->getId();
  459. $this->assertTrue(
  460. OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ + \OCP\Constants::PERMISSION_CREATE),
  461. 'Failed asserting that user 1 successfully shared "test/sub1" with group 1.'
  462. );
  463. $result = OCP\Share::getItemShared('folder', $fileId, Test_Share_Backend::FORMAT_SOURCE);
  464. $this->assertNotEmpty($result);
  465. $this->assertEquals(\OCP\Constants::PERMISSION_READ + \OCP\Constants::PERMISSION_CREATE, $result['permissions']);
  466. $fileInfo = $view->getFileInfo('files/test/sub1/sub2');
  467. $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
  468. $fileId = $fileInfo->getId();
  469. $this->assertTrue(
  470. OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user4, \OCP\Constants::PERMISSION_READ),
  471. 'Failed asserting that user 1 successfully shared "test/sub1/sub2" with user 4.'
  472. );
  473. $result = OCP\Share::getItemShared('folder', $fileId, Test_Share_Backend::FORMAT_SOURCE);
  474. $this->assertNotEmpty($result);
  475. $this->assertEquals(\OCP\Constants::PERMISSION_READ, $result['permissions']);
  476. }
  477. public function testSharingAFileInsideAFolderThatIsAlreadyShared() {
  478. OC_User::setUserId($this->user1);
  479. $view = new \OC\Files\View('/' . $this->user1 . '/');
  480. $view->mkdir('files/test');
  481. $view->mkdir('files/test/sub1');
  482. $view->file_put_contents('files/test/sub1/file.txt', 'abc');
  483. $folderInfo = $view->getFileInfo('files/test/sub1');
  484. $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
  485. $folderId = $folderInfo->getId();
  486. $fileInfo = $view->getFileInfo('files/test/sub1/file.txt');
  487. $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
  488. $fileId = $fileInfo->getId();
  489. $this->assertTrue(
  490. OCP\Share::shareItem('folder', $folderId, OCP\Share::SHARE_TYPE_GROUP, $this->group2, \OCP\Constants::PERMISSION_READ + \OCP\Constants::PERMISSION_UPDATE),
  491. 'Failed asserting that user 1 successfully shared "test/sub1" with group 2.'
  492. );
  493. $this->assertTrue(
  494. OCP\Share::shareItem('file', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ),
  495. 'Failed asserting that user 1 successfully shared "test/sub1/file.txt" with user 2.'
  496. );
  497. $result = \OCP\Share::getItemsSharedWithUser('file', $this->user2);
  498. $this->assertCount(2, $result);
  499. foreach ($result as $share) {
  500. $itemName = substr($share['path'], strrpos($share['path'], '/'));
  501. $this->assertSame($itemName, $share['file_target'], 'Asserting that the file_target is the last segment of the path');
  502. $this->assertSame($share['item_target'], '/' . $share['item_source'], 'Asserting that the item is the item that was shared');
  503. }
  504. }
  505. protected function shareUserOneTestFileWithGroupOne() {
  506. OC_User::setUserId($this->user1);
  507. $this->assertTrue(
  508. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ),
  509. 'Failed asserting that user 1 successfully shared text.txt with group 1.'
  510. );
  511. $this->assertContains(
  512. 'test.txt',
  513. OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  514. 'Failed asserting that test.txt is a shared file of user 1.'
  515. );
  516. OC_User::setUserId($this->user2);
  517. $this->assertContains(
  518. 'test.txt',
  519. OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  520. 'Failed asserting that user 2 has access to test.txt after initial sharing.'
  521. );
  522. OC_User::setUserId($this->user3);
  523. $this->assertContains(
  524. 'test.txt',
  525. OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  526. 'Failed asserting that user 3 has access to test.txt after initial sharing.'
  527. );
  528. }
  529. /**
  530. * Test that unsharing from group will also delete all
  531. * child entries
  532. */
  533. public function testShareWithGroupThenUnshare() {
  534. OC_User::setUserId($this->user5);
  535. OCP\Share::shareItem(
  536. 'test',
  537. 'test.txt',
  538. OCP\Share::SHARE_TYPE_GROUP,
  539. $this->group1,
  540. \OCP\Constants::PERMISSION_ALL
  541. );
  542. $targetUsers = array($this->user1, $this->user2, $this->user3);
  543. foreach($targetUsers as $targetUser) {
  544. OC_User::setUserId($targetUser);
  545. $items = OCP\Share::getItemsSharedWithUser(
  546. 'test',
  547. $targetUser,
  548. Test_Share_Backend::FORMAT_TARGET
  549. );
  550. $this->assertEquals(1, count($items));
  551. }
  552. OC_User::setUserId($this->user5);
  553. OCP\Share::unshare(
  554. 'test',
  555. 'test.txt',
  556. OCP\Share::SHARE_TYPE_GROUP,
  557. $this->group1
  558. );
  559. // verify that all were deleted
  560. foreach($targetUsers as $targetUser) {
  561. OC_User::setUserId($targetUser);
  562. $items = OCP\Share::getItemsSharedWithUser(
  563. 'test',
  564. $targetUser,
  565. Test_Share_Backend::FORMAT_TARGET
  566. );
  567. $this->assertEquals(0, count($items));
  568. }
  569. }
  570. public function testShareWithGroupAndUserBothHaveTheSameId() {
  571. $this->shareUserTestFileWithUser($this->user1, $this->groupAndUser);
  572. OC_User::setUserId($this->groupAndUser);
  573. $this->assertEquals(array('test.txt'), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  574. '"groupAndUser"-User does not see the file but it was shared with him');
  575. OC_User::setUserId($this->user2);
  576. $this->assertEquals(array(), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  577. 'User2 sees test.txt but it was only shared with the user "groupAndUser" and not with group');
  578. OC_User::setUserId($this->user1);
  579. $this->assertTrue(OCP\Share::unshareAll('test', 'test.txt'));
  580. $this->assertTrue(
  581. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->groupAndUser, \OCP\Constants::PERMISSION_READ),
  582. 'Failed asserting that user 1 successfully shared text.txt with group 1.'
  583. );
  584. OC_User::setUserId($this->groupAndUser);
  585. $this->assertEquals(array(), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  586. '"groupAndUser"-User sees test.txt but it was only shared with the group "groupAndUser" and not with the user');
  587. OC_User::setUserId($this->user2);
  588. $this->assertEquals(array('test.txt'), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
  589. 'User2 does not see test.txt but it was shared with the group "groupAndUser"');
  590. OC_User::setUserId($this->user1);
  591. $this->assertTrue(OCP\Share::unshareAll('test', 'test.txt'));
  592. }
  593. /**
  594. * @param boolean|string $token
  595. * @return array
  596. */
  597. protected function getShareByValidToken($token) {
  598. $row = OCP\Share::getShareByToken($token);
  599. $this->assertInternalType(
  600. 'array',
  601. $row,
  602. "Failed asserting that a share for token $token exists."
  603. );
  604. return $row;
  605. }
  606. public function testGetItemSharedWithUser() {
  607. OC_User::setUserId($this->user1);
  608. //add dummy values to the share table
  609. $query = \OC_DB::prepare('INSERT INTO `*PREFIX*share` ('
  610. .' `item_type`, `item_source`, `item_target`, `share_type`,'
  611. .' `share_with`, `uid_owner`) VALUES (?,?,?,?,?,?)');
  612. $args = array('test', 99, 'target1', OCP\Share::SHARE_TYPE_USER, $this->user2, $this->user1);
  613. $query->execute($args);
  614. $args = array('test', 99, 'target2', OCP\Share::SHARE_TYPE_USER, $this->user4, $this->user1);
  615. $query->execute($args);
  616. $args = array('test', 99, 'target3', OCP\Share::SHARE_TYPE_USER, $this->user3, $this->user2);
  617. $query->execute($args);
  618. $args = array('test', 99, 'target4', OCP\Share::SHARE_TYPE_USER, $this->user3, $this->user4);
  619. $query->execute($args);
  620. $args = array('test', 99, 'target4', OCP\Share::SHARE_TYPE_USER, $this->user6, $this->user4);
  621. $query->execute($args);
  622. $result1 = \OCP\Share::getItemSharedWithUser('test', 99, $this->user2, $this->user1);
  623. $this->assertSame(1, count($result1));
  624. $this->verifyResult($result1, array('target1'));
  625. $result2 = \OCP\Share::getItemSharedWithUser('test', 99, null, $this->user1);
  626. $this->assertSame(2, count($result2));
  627. $this->verifyResult($result2, array('target1', 'target2'));
  628. $result3 = \OCP\Share::getItemSharedWithUser('test', 99, $this->user3);
  629. $this->assertSame(2, count($result3));
  630. $this->verifyResult($result3, array('target3', 'target4'));
  631. $result4 = \OCP\Share::getItemSharedWithUser('test', 99, null, null);
  632. $this->assertSame(5, count($result4)); // 5 because target4 appears twice
  633. $this->verifyResult($result4, array('target1', 'target2', 'target3', 'target4'));
  634. $result6 = \OCP\Share::getItemSharedWithUser('test', 99, $this->user6, null);
  635. $this->assertSame(1, count($result6));
  636. $this->verifyResult($result6, array('target4'));
  637. }
  638. public function testGetItemSharedWithUserFromGroupShare() {
  639. OC_User::setUserId($this->user1);
  640. //add dummy values to the share table
  641. $query = \OC_DB::prepare('INSERT INTO `*PREFIX*share` ('
  642. .' `item_type`, `item_source`, `item_target`, `share_type`,'
  643. .' `share_with`, `uid_owner`) VALUES (?,?,?,?,?,?)');
  644. $args = array('test', 99, 'target1', OCP\Share::SHARE_TYPE_GROUP, $this->group1, $this->user1);
  645. $query->execute($args);
  646. $args = array('test', 99, 'target2', OCP\Share::SHARE_TYPE_GROUP, $this->group2, $this->user1);
  647. $query->execute($args);
  648. $args = array('test', 99, 'target3', OCP\Share::SHARE_TYPE_GROUP, $this->group1, $this->user2);
  649. $query->execute($args);
  650. $args = array('test', 99, 'target4', OCP\Share::SHARE_TYPE_GROUP, $this->group1, $this->user4);
  651. $query->execute($args);
  652. // user2 is in group1 and group2
  653. $result1 = \OCP\Share::getItemSharedWithUser('test', 99, $this->user2, $this->user1);
  654. $this->assertSame(2, count($result1));
  655. $this->verifyResult($result1, array('target1', 'target2'));
  656. $result2 = \OCP\Share::getItemSharedWithUser('test', 99, null, $this->user1);
  657. $this->assertSame(2, count($result2));
  658. $this->verifyResult($result2, array('target1', 'target2'));
  659. // user3 is in group1 and group2
  660. $result3 = \OCP\Share::getItemSharedWithUser('test', 99, $this->user3);
  661. $this->assertSame(3, count($result3));
  662. $this->verifyResult($result3, array('target1', 'target3', 'target4'));
  663. $result4 = \OCP\Share::getItemSharedWithUser('test', 99, null, null);
  664. $this->assertSame(4, count($result4));
  665. $this->verifyResult($result4, array('target1', 'target2', 'target3', 'target4'));
  666. $result6 = \OCP\Share::getItemSharedWithUser('test', 99, $this->user6, null);
  667. $this->assertSame(0, count($result6));
  668. }
  669. public function verifyResult($result, $expected) {
  670. foreach ($result as $r) {
  671. if (in_array($r['item_target'], $expected)) {
  672. $key = array_search($r['item_target'], $expected);
  673. unset($expected[$key]);
  674. }
  675. }
  676. $this->assertEmpty($expected, 'did not found all expected values');
  677. }
  678. public function testGetShareSubItemsWhenUserNotInGroup() {
  679. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ);
  680. $result = \OCP\Share::getItemsSharedWithUser('test', $this->user2);
  681. $this->assertCount(1, $result);
  682. $groupShareId = array_keys($result)[0];
  683. // remove user from group
  684. $userObject = \OC::$server->getUserManager()->get($this->user2);
  685. \OC::$server->getGroupManager()->get($this->group1)->removeUser($userObject);
  686. $result = \OCP\Share::getItemsSharedWithUser('test', $this->user2);
  687. $this->assertCount(0, $result);
  688. // test with buggy data
  689. $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder();
  690. $qb->insert('share')
  691. ->values([
  692. 'share_type' => $qb->expr()->literal(2), // group sub-share
  693. 'share_with' => $qb->expr()->literal($this->user2),
  694. 'parent' => $qb->expr()->literal($groupShareId),
  695. 'uid_owner' => $qb->expr()->literal($this->user1),
  696. 'item_type' => $qb->expr()->literal('test'),
  697. 'item_source' => $qb->expr()->literal('test.txt'),
  698. 'item_target' => $qb->expr()->literal('test.txt'),
  699. 'file_target' => $qb->expr()->literal('test2.txt'),
  700. 'permissions' => $qb->expr()->literal(1),
  701. 'stime' => $qb->expr()->literal(time()),
  702. ])->execute();
  703. $result = \OCP\Share::getItemsSharedWithUser('test', $this->user2);
  704. $this->assertCount(0, $result);
  705. $qb->delete('share')->execute();
  706. }
  707. public function testShareItemWithLink() {
  708. OC_User::setUserId($this->user1);
  709. $token = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ);
  710. $this->assertInternalType(
  711. 'string',
  712. $token,
  713. 'Failed asserting that user 1 successfully shared text.txt as link with token.'
  714. );
  715. // testGetShareByTokenNoExpiration
  716. $row = $this->getShareByValidToken($token);
  717. $this->assertEmpty(
  718. $row['expiration'],
  719. 'Failed asserting that the returned row does not have an expiration date.'
  720. );
  721. // testGetShareByTokenExpirationValid
  722. $this->assertTrue(
  723. OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInFuture, ''),
  724. 'Failed asserting that user 1 successfully set a future expiration date for the test.txt share.'
  725. );
  726. $row = $this->getShareByValidToken($token);
  727. $this->assertNotEmpty(
  728. $row['expiration'],
  729. 'Failed asserting that the returned row has an expiration date.'
  730. );
  731. // manipulate share table and set expire date to the past
  732. $query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `expiration` = ? WHERE `item_type` = ? AND `item_source` = ? AND `uid_owner` = ? AND `share_type` = ?');
  733. $query->bindValue(1, new \DateTime($this->dateInPast), 'datetime');
  734. $query->bindValue(2, 'test');
  735. $query->bindValue(3, 'test.txt');
  736. $query->bindValue(4, $this->user1);
  737. $query->bindValue(5, \OCP\Share::SHARE_TYPE_LINK);
  738. $query->execute();
  739. $this->assertFalse(
  740. OCP\Share::getShareByToken($token),
  741. 'Failed asserting that an expired share could not be found.'
  742. );
  743. }
  744. public function testShareItemWithLinkAndDefaultExpireDate() {
  745. OC_User::setUserId($this->user1);
  746. $config = \OC::$server->getConfig();
  747. $config->setAppValue('core', 'shareapi_default_expire_date', 'yes');
  748. $config->setAppValue('core', 'shareapi_expire_after_n_days', '2');
  749. $token = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ);
  750. $this->assertInternalType(
  751. 'string',
  752. $token,
  753. 'Failed asserting that user 1 successfully shared text.txt as link with token.'
  754. );
  755. // share should have default expire date
  756. $row = $this->getShareByValidToken($token);
  757. $this->assertNotEmpty(
  758. $row['expiration'],
  759. 'Failed asserting that the returned row has an default expiration date.'
  760. );
  761. $config->deleteAppValue('core', 'shareapi_default_expire_date');
  762. $config->deleteAppValue('core', 'shareapi_expire_after_n_days');
  763. }
  764. public function dataShareWithRemoteUserAndRemoteIsInvalid() {
  765. return [
  766. // Invalid path
  767. array('user@'),
  768. // Invalid user
  769. array('@server'),
  770. array('us/er@server'),
  771. array('us:er@server'),
  772. // Invalid splitting
  773. array('user'),
  774. array(''),
  775. array('us/erserver'),
  776. array('us:erserver'),
  777. ];
  778. }
  779. /**
  780. * @dataProvider dataShareWithRemoteUserAndRemoteIsInvalid
  781. *
  782. * @param string $remoteId
  783. * @expectedException \OC\HintException
  784. */
  785. public function testShareWithRemoteUserAndRemoteIsInvalid($remoteId) {
  786. OC_User::setUserId($this->user1);
  787. OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_REMOTE, $remoteId, \OCP\Constants::PERMISSION_ALL);
  788. }
  789. public function testUnshareAll() {
  790. $this->shareUserTestFileWithUser($this->user1, $this->user2);
  791. $this->shareUserTestFileWithUser($this->user2, $this->user3);
  792. $this->shareUserTestFileWithUser($this->user3, $this->user4);
  793. $this->shareUserOneTestFileWithGroupOne();
  794. OC_User::setUserId($this->user1);
  795. $this->assertEquals(
  796. array('test.txt', 'test.txt'),
  797. OCP\Share::getItemsShared('test', Test_Share_Backend::FORMAT_SOURCE),
  798. 'Failed asserting that the test.txt file is shared exactly two times by user1.'
  799. );
  800. OC_User::setUserId($this->user2);
  801. $this->assertEquals(
  802. array('test.txt'),
  803. OCP\Share::getItemsShared('test', Test_Share_Backend::FORMAT_SOURCE),
  804. 'Failed asserting that the test.txt file is shared exactly once by user2.'
  805. );
  806. OC_User::setUserId($this->user3);
  807. $this->assertEquals(
  808. array('test.txt'),
  809. OCP\Share::getItemsShared('test', Test_Share_Backend::FORMAT_SOURCE),
  810. 'Failed asserting that the test.txt file is shared exactly once by user3.'
  811. );
  812. $this->assertTrue(
  813. OCP\Share::unshareAll('test', 'test.txt'),
  814. 'Failed asserting that user 3 successfully unshared all shares of the test.txt share.'
  815. );
  816. $this->assertEquals(
  817. array(),
  818. OCP\Share::getItemsShared('test'),
  819. 'Failed asserting that the share of the test.txt file by user 3 has been removed.'
  820. );
  821. OC_User::setUserId($this->user1);
  822. $this->assertEquals(
  823. array(),
  824. OCP\Share::getItemsShared('test'),
  825. 'Failed asserting that both shares of the test.txt file by user 1 have been removed.'
  826. );
  827. OC_User::setUserId($this->user2);
  828. $this->assertEquals(
  829. array(),
  830. OCP\Share::getItemsShared('test'),
  831. 'Failed asserting that the share of the test.txt file by user 2 has been removed.'
  832. );
  833. }
  834. /**
  835. * @dataProvider checkPasswordProtectedShareDataProvider
  836. * @param $expected
  837. * @param $item
  838. */
  839. public function testCheckPasswordProtectedShare($expected, $item) {
  840. \OC::$server->getSession()->set('public_link_authenticated', 100);
  841. $result = \OCP\Share::checkPasswordProtectedShare($item);
  842. $this->assertEquals($expected, $result);
  843. }
  844. function checkPasswordProtectedShareDataProvider() {
  845. return array(
  846. array(true, array()),
  847. array(true, array('share_with' => null)),
  848. array(true, array('share_with' => '')),
  849. array(true, array('share_with' => '1234567890', 'share_type' => '1')),
  850. array(true, array('share_with' => '1234567890', 'share_type' => 1)),
  851. array(true, array('share_with' => '1234567890', 'share_type' => '3', 'id' => 100)),
  852. array(true, array('share_with' => '1234567890', 'share_type' => 3, 'id' => 100)),
  853. array(false, array('share_with' => '1234567890', 'share_type' => '3', 'id' => 101)),
  854. array(false, array('share_with' => '1234567890', 'share_type' => 3, 'id' => 101)),
  855. );
  856. }
  857. /**
  858. * @dataProvider urls
  859. */
  860. function testRemoveProtocolFromUrl($url, $expectedResult) {
  861. $share = new \OC\Share\Share();
  862. $result = self::invokePrivate($share, 'removeProtocolFromUrl', array($url));
  863. $this->assertSame($expectedResult, $result);
  864. }
  865. function urls() {
  866. return array(
  867. array('http://owncloud.org', 'owncloud.org'),
  868. array('https://owncloud.org', 'owncloud.org'),
  869. array('owncloud.org', 'owncloud.org'),
  870. );
  871. }
  872. public function dataRemoteShareUrlCalls() {
  873. return [
  874. ['admin@localhost', 'localhost'],
  875. ['admin@https://localhost', 'localhost'],
  876. ['admin@http://localhost', 'localhost'],
  877. ['admin@localhost/subFolder', 'localhost/subFolder'],
  878. ];
  879. }
  880. /**
  881. * @dataProvider dataRemoteShareUrlCalls
  882. *
  883. * @param string $shareWith
  884. * @param string $urlHost
  885. */
  886. public function testRemoteShareUrlCalls($shareWith, $urlHost) {
  887. $oldHttpHelper = \OC::$server->query('HTTPHelper');
  888. $httpHelperMock = $this->getMockBuilder('OC\HttpHelper')
  889. ->disableOriginalConstructor()
  890. ->getMock();
  891. $this->setHttpHelper($httpHelperMock);
  892. $httpHelperMock->expects($this->at(0))
  893. ->method('post')
  894. ->with($this->stringStartsWith('https://' . $urlHost . '/ocs/v1.php/cloud/shares'), $this->anything())
  895. ->willReturn(['success' => false, 'result' => 'Exception']);
  896. $httpHelperMock->expects($this->at(1))
  897. ->method('post')
  898. ->with($this->stringStartsWith('http://' . $urlHost . '/ocs/v1.php/cloud/shares'), $this->anything())
  899. ->willReturn(['success' => true, 'result' => json_encode(['ocs' => ['meta' => ['statuscode' => 100]]])]);
  900. \OCP\Share::shareItem('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, $shareWith, \OCP\Constants::PERMISSION_READ);
  901. $shares = \OCP\Share::getItemShared('test', 'test.txt');
  902. $share = array_shift($shares);
  903. $httpHelperMock->expects($this->at(0))
  904. ->method('post')
  905. ->with($this->stringStartsWith('https://' . $urlHost . '/ocs/v1.php/cloud/shares/' . $share['id'] . '/unshare'), $this->anything())
  906. ->willReturn(['success' => false, 'result' => 'Exception']);
  907. $httpHelperMock->expects($this->at(1))
  908. ->method('post')
  909. ->with($this->stringStartsWith('http://' . $urlHost . '/ocs/v1.php/cloud/shares/' . $share['id'] . '/unshare'), $this->anything())
  910. ->willReturn(['success' => true, 'result' => json_encode(['ocs' => ['meta' => ['statuscode' => 100]]])]);
  911. \OCP\Share::unshare('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, $shareWith);
  912. $this->setHttpHelper($oldHttpHelper);
  913. }
  914. /**
  915. * @dataProvider dataProviderTestGroupItems
  916. * @param array $ungrouped
  917. * @param array $grouped
  918. */
  919. function testGroupItems($ungrouped, $grouped) {
  920. $result = DummyShareClass::groupItemsTest($ungrouped);
  921. $this->compareArrays($grouped, $result);
  922. }
  923. function compareArrays($result, $expectedResult) {
  924. foreach ($expectedResult as $key => $value) {
  925. if (is_array($value)) {
  926. $this->compareArrays($result[$key], $value);
  927. } else {
  928. $this->assertSame($value, $result[$key]);
  929. }
  930. }
  931. }
  932. function dataProviderTestGroupItems() {
  933. return array(
  934. // one array with one share
  935. array(
  936. array( // input
  937. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_ALL, 'item_target' => 't1')),
  938. array( // expected result
  939. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_ALL, 'item_target' => 't1'))),
  940. // two shares both point to the same source
  941. array(
  942. array( // input
  943. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  944. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1'),
  945. ),
  946. array( // expected result
  947. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1',
  948. 'grouped' => array(
  949. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  950. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1'),
  951. )
  952. ),
  953. )
  954. ),
  955. // two shares both point to the same source but with different targets
  956. array(
  957. array( // input
  958. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  959. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't2'),
  960. ),
  961. array( // expected result
  962. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  963. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't2'),
  964. )
  965. ),
  966. // three shares two point to the same source
  967. array(
  968. array( // input
  969. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  970. array('item_source' => 2, 'permissions' => \OCP\Constants::PERMISSION_CREATE, 'item_target' => 't2'),
  971. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1'),
  972. ),
  973. array( // expected result
  974. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1',
  975. 'grouped' => array(
  976. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_READ, 'item_target' => 't1'),
  977. array('item_source' => 1, 'permissions' => \OCP\Constants::PERMISSION_UPDATE, 'item_target' => 't1'),
  978. )
  979. ),
  980. array('item_source' => 2, 'permissions' => \OCP\Constants::PERMISSION_CREATE, 'item_target' => 't2'),
  981. )
  982. ),
  983. );
  984. }
  985. /**
  986. * Ensure that we do not allow removing a an expiration date from a link share if this
  987. * is enforced by the settings.
  988. */
  989. public function testClearExpireDateWhileEnforced() {
  990. OC_User::setUserId($this->user1);
  991. \OC::$server->getAppConfig()->setValue('core', 'shareapi_default_expire_date', 'yes');
  992. \OC::$server->getAppConfig()->setValue('core', 'shareapi_expire_after_n_days', '2');
  993. \OC::$server->getAppConfig()->setValue('core', 'shareapi_enforce_expire_date', 'yes');
  994. $token = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ);
  995. $this->assertInternalType(
  996. 'string',
  997. $token,
  998. 'Failed asserting that user 1 successfully shared text.txt as link with token.'
  999. );
  1000. $setExpireDateFailed = false;
  1001. try {
  1002. $this->assertTrue(
  1003. OCP\Share::setExpirationDate('test', 'test.txt', '', ''),
  1004. 'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
  1005. );
  1006. } catch (\Exception $e) {
  1007. $setExpireDateFailed = true;
  1008. }
  1009. $this->assertTrue($setExpireDateFailed);
  1010. \OC::$server->getAppConfig()->deleteKey('core', 'shareapi_default_expire_date');
  1011. \OC::$server->getAppConfig()->deleteKey('core', 'shareapi_expire_after_n_days');
  1012. \OC::$server->getAppConfig()->deleteKey('core', 'shareapi_enforce_expire_date');
  1013. }
  1014. /**
  1015. * Cannot set password is there is no user
  1016. *
  1017. * @expectedException Exception
  1018. * @expectedExceptionMessage User not logged in
  1019. */
  1020. public function testSetPasswordNoUser() {
  1021. $userSession = $this->getMockBuilder('\OCP\IUserSession')
  1022. ->disableOriginalConstructor()
  1023. ->getMock();
  1024. $connection = $this->getMockBuilder('\OC\DB\Connection')
  1025. ->disableOriginalConstructor()
  1026. ->getMock();
  1027. $config = $this->getMockBuilder('\OCP\IConfig')
  1028. ->disableOriginalConstructor()
  1029. ->getMock();
  1030. \OC\Share\Share::setPassword($userSession, $connection, $config, 1, 'pass');
  1031. }
  1032. public function testPasswords() {
  1033. $pass = 'secret';
  1034. $this->shareUserTestFileAsLink();
  1035. $userSession = \OC::$server->getUserSession();
  1036. $connection = \OC::$server->getDatabaseConnection();
  1037. $config = $this->getMockBuilder('\OCP\IConfig')
  1038. ->disableOriginalConstructor()
  1039. ->getMock();
  1040. // Find the share ID in the db
  1041. $qb = $connection->getQueryBuilder();
  1042. $qb->select('id')
  1043. ->from('share')
  1044. ->where($qb->expr()->eq('item_type', $qb->createParameter('type')))
  1045. ->andWhere($qb->expr()->eq('item_source', $qb->createParameter('source')))
  1046. ->andWhere($qb->expr()->eq('uid_owner', $qb->createParameter('owner')))
  1047. ->andWhere($qb->expr()->eq('share_type', $qb->createParameter('share_type')))
  1048. ->setParameter('type', 'test')
  1049. ->setParameter('source', 'test.txt')
  1050. ->setParameter('owner', $this->user1)
  1051. ->setParameter('share_type', \OCP\Share::SHARE_TYPE_LINK);
  1052. $res = $qb->execute()->fetchAll();
  1053. $this->assertCount(1, $res);
  1054. $id = $res[0]['id'];
  1055. // Set password on share
  1056. $res = \OC\Share\Share::setPassword($userSession, $connection, $config, $id, $pass);
  1057. $this->assertTrue($res);
  1058. // Fetch the hash from the database
  1059. $qb = $connection->getQueryBuilder();
  1060. $qb->select('share_with')
  1061. ->from('share')
  1062. ->where($qb->expr()->eq('id', $qb->createParameter('id')))
  1063. ->setParameter('id', $id);
  1064. $hash = $qb->execute()->fetch()['share_with'];
  1065. $hasher = \OC::$server->getHasher();
  1066. // Verify hash
  1067. $this->assertTrue($hasher->verify($pass, $hash));
  1068. }
  1069. /**
  1070. * Test setting a password when everything is fine
  1071. */
  1072. public function testSetPassword() {
  1073. $user = $this->getMockBuilder('\OCP\IUser')
  1074. ->disableOriginalConstructor()
  1075. ->getMock();
  1076. $user->method('getUID')->willReturn('user');
  1077. $userSession = $this->getMockBuilder('\OCP\IUserSession')
  1078. ->disableOriginalConstructor()
  1079. ->getMock();
  1080. $userSession->method('getUser')->willReturn($user);
  1081. $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
  1082. ->disableOriginalConstructor()
  1083. ->getMock();
  1084. $qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
  1085. ->disableOriginalConstructor()
  1086. ->getMock();
  1087. $qb->method('update')->will($this->returnSelf());
  1088. $qb->method('set')->will($this->returnSelf());
  1089. $qb->method('where')->will($this->returnSelf());
  1090. $qb->method('andWhere')->will($this->returnSelf());
  1091. $qb->method('select')->will($this->returnSelf());
  1092. $qb->method('from')->will($this->returnSelf());
  1093. $qb->method('setParameter')->will($this->returnSelf());
  1094. $qb->method('expr')->willReturn($ex);
  1095. $ret = $this->getMockBuilder('\Doctrine\DBAL\Driver\ResultStatement')
  1096. ->disableOriginalConstructor()
  1097. ->getMock();
  1098. $ret->method('fetch')->willReturn(['uid_owner' => 'user']);
  1099. $qb->method('execute')->willReturn($ret);
  1100. $connection = $this->getMockBuilder('\OC\DB\Connection')
  1101. ->disableOriginalConstructor()
  1102. ->getMock();
  1103. $connection->method('getQueryBuilder')->willReturn($qb);
  1104. $config = $this->getMockBuilder('\OCP\IConfig')
  1105. ->disableOriginalConstructor()
  1106. ->getMock();
  1107. $res = \OC\Share\Share::setPassword($userSession, $connection, $config, 1, 'pass');
  1108. $this->assertTrue($res);
  1109. }
  1110. /**
  1111. * @expectedException Exception
  1112. * @expectedExceptionMessage Cannot remove password
  1113. *
  1114. * Test removing a password when password is enforced
  1115. */
  1116. public function testSetPasswordRemove() {
  1117. $user = $this->getMockBuilder('\OCP\IUser')
  1118. ->disableOriginalConstructor()
  1119. ->getMock();
  1120. $user->method('getUID')->willReturn('user');
  1121. $userSession = $this->getMockBuilder('\OCP\IUserSession')
  1122. ->disableOriginalConstructor()
  1123. ->getMock();
  1124. $userSession->method('getUser')->willReturn($user);
  1125. $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
  1126. ->disableOriginalConstructor()
  1127. ->getMock();
  1128. $qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
  1129. ->disableOriginalConstructor()
  1130. ->getMock();
  1131. $qb->method('update')->will($this->returnSelf());
  1132. $qb->method('select')->will($this->returnSelf());
  1133. $qb->method('from')->will($this->returnSelf());
  1134. $qb->method('set')->will($this->returnSelf());
  1135. $qb->method('where')->will($this->returnSelf());
  1136. $qb->method('andWhere')->will($this->returnSelf());
  1137. $qb->method('setParameter')->will($this->returnSelf());
  1138. $qb->method('expr')->willReturn($ex);
  1139. $ret = $this->getMockBuilder('\Doctrine\DBAL\Driver\ResultStatement')
  1140. ->disableOriginalConstructor()
  1141. ->getMock();
  1142. $ret->method('fetch')->willReturn(['uid_owner' => 'user']);
  1143. $qb->method('execute')->willReturn($ret);
  1144. $connection = $this->getMockBuilder('\OC\DB\Connection')
  1145. ->disableOriginalConstructor()
  1146. ->getMock();
  1147. $connection->method('getQueryBuilder')->willReturn($qb);
  1148. $config = $this->getMockBuilder('\OCP\IConfig')
  1149. ->disableOriginalConstructor()
  1150. ->getMock();
  1151. $config->method('getAppValue')->willReturn('yes');
  1152. \OC\Share\Share::setPassword($userSession, $connection, $config, 1, '');
  1153. }
  1154. /**
  1155. * @expectedException Exception
  1156. * @expectedExceptionMessage Share not found
  1157. *
  1158. * Test modification of invaid share
  1159. */
  1160. public function testSetPasswordInvalidShare() {
  1161. $user = $this->getMockBuilder('\OCP\IUser')
  1162. ->disableOriginalConstructor()
  1163. ->getMock();
  1164. $user->method('getUID')->willReturn('user');
  1165. $userSession = $this->getMockBuilder('\OCP\IUserSession')
  1166. ->disableOriginalConstructor()
  1167. ->getMock();
  1168. $userSession->method('getUser')->willReturn($user);
  1169. $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
  1170. ->disableOriginalConstructor()
  1171. ->getMock();
  1172. $qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
  1173. ->disableOriginalConstructor()
  1174. ->getMock();
  1175. $qb->method('update')->will($this->returnSelf());
  1176. $qb->method('set')->will($this->returnSelf());
  1177. $qb->method('where')->will($this->returnSelf());
  1178. $qb->method('andWhere')->will($this->returnSelf());
  1179. $qb->method('select')->will($this->returnSelf());
  1180. $qb->method('from')->will($this->returnSelf());
  1181. $qb->method('setParameter')->will($this->returnSelf());
  1182. $qb->method('expr')->willReturn($ex);
  1183. $ret = $this->getMockBuilder('\Doctrine\DBAL\Driver\ResultStatement')
  1184. ->disableOriginalConstructor()
  1185. ->getMock();
  1186. $ret->method('fetch')->willReturn([]);
  1187. $qb->method('execute')->willReturn($ret);
  1188. $connection = $this->getMockBuilder('\OC\DB\Connection')
  1189. ->disableOriginalConstructor()
  1190. ->getMock();
  1191. $connection->method('getQueryBuilder')->willReturn($qb);
  1192. $config = $this->getMockBuilder('\OCP\IConfig')
  1193. ->disableOriginalConstructor()
  1194. ->getMock();
  1195. \OC\Share\Share::setPassword($userSession, $connection, $config, 1, 'pass');
  1196. }
  1197. /**
  1198. * @expectedException Exception
  1199. * @expectedExceptionMessage Cannot update share of a different user
  1200. *
  1201. * Test modification of share of another user
  1202. */
  1203. public function testSetPasswordShareOtherUser() {
  1204. $user = $this->getMockBuilder('\OCP\IUser')
  1205. ->disableOriginalConstructor()
  1206. ->getMock();
  1207. $user->method('getUID')->willReturn('user');
  1208. $userSession = $this->getMockBuilder('\OCP\IUserSession')
  1209. ->disableOriginalConstructor()
  1210. ->getMock();
  1211. $userSession->method('getUser')->willReturn($user);
  1212. $ex = $this->getMockBuilder('\OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder')
  1213. ->disableOriginalConstructor()
  1214. ->getMock();
  1215. $qb = $this->getMockBuilder('\OC\DB\QueryBuilder\QueryBuilder')
  1216. ->disableOriginalConstructor()
  1217. ->getMock();
  1218. $qb->method('update')->will($this->returnSelf());
  1219. $qb->method('set')->will($this->returnSelf());
  1220. $qb->method('where')->will($this->returnSelf());
  1221. $qb->method('andWhere')->will($this->returnSelf());
  1222. $qb->method('select')->will($this->returnSelf());
  1223. $qb->method('from')->will($this->returnSelf());
  1224. $qb->method('setParameter')->will($this->returnSelf());
  1225. $qb->method('expr')->willReturn($ex);
  1226. $ret = $this->getMockBuilder('\Doctrine\DBAL\Driver\ResultStatement')
  1227. ->disableOriginalConstructor()
  1228. ->getMock();
  1229. $ret->method('fetch')->willReturn(['uid_owner' => 'user2']);
  1230. $qb->method('execute')->willReturn($ret);
  1231. $connection = $this->getMockBuilder('\OC\DB\Connection')
  1232. ->disableOriginalConstructor()
  1233. ->getMock();
  1234. $connection->method('getQueryBuilder')->willReturn($qb);
  1235. $config = $this->getMockBuilder('\OCP\IConfig')
  1236. ->disableOriginalConstructor()
  1237. ->getMock();
  1238. \OC\Share\Share::setPassword($userSession, $connection, $config, 1, 'pass');
  1239. }
  1240. /**
  1241. * Make sure that a user cannot have multiple identical shares to remote users
  1242. */
  1243. public function testOnlyOneRemoteShare() {
  1244. $oldHttpHelper = \OC::$server->query('HTTPHelper');
  1245. $httpHelperMock = $this->getMockBuilder('OC\HttpHelper')
  1246. ->disableOriginalConstructor()
  1247. ->getMock();
  1248. $this->setHttpHelper($httpHelperMock);
  1249. $httpHelperMock->expects($this->at(0))
  1250. ->method('post')
  1251. ->with($this->stringStartsWith('https://localhost/ocs/v1.php/cloud/shares'), $this->anything())
  1252. ->willReturn(['success' => true, 'result' => json_encode(['ocs' => ['meta' => ['statuscode' => 100]]])]);
  1253. \OCP\Share::shareItem('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, 'foo@localhost', \OCP\Constants::PERMISSION_READ);
  1254. $shares = \OCP\Share::getItemShared('test', 'test.txt');
  1255. $share = array_shift($shares);
  1256. //Try share again
  1257. try {
  1258. \OCP\Share::shareItem('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, 'foo@localhost', \OCP\Constants::PERMISSION_READ);
  1259. $this->fail('Identical remote shares are not allowed');
  1260. } catch (\Exception $e) {
  1261. $this->assertEquals('Sharing test.txt failed, because this item is already shared with foo@localhost', $e->getMessage());
  1262. }
  1263. $httpHelperMock->expects($this->at(0))
  1264. ->method('post')
  1265. ->with($this->stringStartsWith('https://localhost/ocs/v1.php/cloud/shares/' . $share['id'] . '/unshare'), $this->anything())
  1266. ->willReturn(['success' => true, 'result' => json_encode(['ocs' => ['meta' => ['statuscode' => 100]]])]);
  1267. \OCP\Share::unshare('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, 'foo@localhost');
  1268. $this->setHttpHelper($oldHttpHelper);
  1269. }
  1270. /**
  1271. * Test case for #19119
  1272. */
  1273. public function testReshareWithLinkDefaultExpirationDate() {
  1274. $config = \OC::$server->getConfig();
  1275. $config->setAppValue('core', 'shareapi_default_expire_date', 'yes');
  1276. $config->setAppValue('core', 'shareapi_expire_after_n_days', '2');
  1277. // Expiration date
  1278. $expireAt = time() + 2 * 24*60*60;
  1279. $date = new DateTime();
  1280. $date->setTimestamp($expireAt);
  1281. $date->setTime(0, 0, 0);
  1282. //Share a file from user 1 to user 2
  1283. $this->shareUserTestFileWithUser($this->user1, $this->user2);
  1284. //User 2 shares as link
  1285. OC_User::setUserId($this->user2);
  1286. $result = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ);
  1287. $this->assertTrue(is_string($result));
  1288. //Check if expire date is correct
  1289. $result = OCP\Share::getItemShared('test', 'test.txt');
  1290. $this->assertCount(1, $result);
  1291. $result = reset($result);
  1292. $this->assertNotEmpty($result['expiration']);
  1293. $expireDate = new DateTime($result['expiration']);
  1294. $this->assertEquals($date, $expireDate);
  1295. //Unshare
  1296. $this->assertTrue(OCP\Share::unshareAll('test', 'test.txt'));
  1297. //Reset config
  1298. $config->deleteAppValue('core', 'shareapi_default_expire_date');
  1299. $config->deleteAppValue('core', 'shareapi_expire_after_n_days');
  1300. }
  1301. /**
  1302. * Test case for #17560
  1303. */
  1304. public function testAccesToSharedSubFolder() {
  1305. OC_User::setUserId($this->user1);
  1306. $view = new \OC\Files\View('/' . $this->user1 . '/');
  1307. $view->mkdir('files/folder1');
  1308. $fileInfo = $view->getFileInfo('files/folder1');
  1309. $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
  1310. $fileId = $fileInfo->getId();
  1311. $this->assertTrue(
  1312. OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_ALL),
  1313. 'Failed asserting that user 1 successfully shared "test" with user 2.'
  1314. );
  1315. $this->assertTrue(
  1316. OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_ALL),
  1317. 'Failed asserting that user 1 successfully shared "test" with user 3.'
  1318. );
  1319. $view->mkdir('files/folder1/folder2');
  1320. $fileInfo = $view->getFileInfo('files/folder1/folder2');
  1321. $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
  1322. $fileId = $fileInfo->getId();
  1323. $this->assertTrue(
  1324. OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user4, \OCP\Constants::PERMISSION_ALL),
  1325. 'Failed asserting that user 1 successfully shared "test" with user 4.'
  1326. );
  1327. $res = OCP\Share::getItemShared(
  1328. 'folder',
  1329. $fileId,
  1330. OCP\Share::FORMAT_NONE,
  1331. null,
  1332. true
  1333. );
  1334. $this->assertCount(3, $res);
  1335. $this->assertTrue(
  1336. OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user5, \OCP\Constants::PERMISSION_ALL),
  1337. 'Failed asserting that user 1 successfully shared "test" with user 5.'
  1338. );
  1339. $res = OCP\Share::getItemShared(
  1340. 'folder',
  1341. $fileId,
  1342. OCP\Share::FORMAT_NONE,
  1343. null,
  1344. true
  1345. );
  1346. $this->assertCount(4, $res);
  1347. }
  1348. public function testShareWithSelfError() {
  1349. OC_User::setUserId($this->user1);
  1350. $view = new \OC\Files\View('/' . $this->user1 . '/');
  1351. $view->mkdir('files/folder1');
  1352. $fileInfo = $view->getFileInfo('files/folder1');
  1353. $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
  1354. $fileId = $fileInfo->getId();
  1355. try {
  1356. OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_ALL);
  1357. $this->fail();
  1358. } catch (\Exception $e) {
  1359. $this->assertEquals('Sharing /folder1 failed, because you can not share with yourself', $e->getMessage());
  1360. }
  1361. }
  1362. public function testShareWithOwnerError() {
  1363. OC_User::setUserId($this->user1);
  1364. $view = new \OC\Files\View('/' . $this->user1 . '/');
  1365. $view->mkdir('files/folder1');
  1366. $fileInfo = $view->getFileInfo('files/folder1');
  1367. $this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
  1368. $fileId = $fileInfo->getId();
  1369. $this->assertTrue(
  1370. OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_ALL),
  1371. 'Failed asserting that user 1 successfully shared "test" with user 2.'
  1372. );
  1373. OC_User::setUserId($this->user2);
  1374. try {
  1375. OCP\Share::shareItem('folder', $fileId, OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_ALL);
  1376. $this->fail();
  1377. } catch (\Exception $e) {
  1378. $this->assertEquals('Sharing failed, because the user ' . $this->user1 . ' is the original sharer', $e->getMessage());
  1379. }
  1380. }
  1381. }
  1382. class DummyShareClass extends \OC\Share\Share {
  1383. public static function groupItemsTest($items) {
  1384. return parent::groupItems($items, 'test');
  1385. }
  1386. }
  1387. class DummyHookListener {
  1388. static $shareType = null;
  1389. public static function listen($params) {
  1390. self::$shareType = $params['shareType'];
  1391. }
  1392. }