2012-07-26 01:08:18 +04:00
< ? php
/**
* ownCloud
*
* @ author Michael Gapczynski
* @ copyright 2012 Michael Gapczynski mtgap @ owncloud . com
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation ; either
* version 3 of the License , or any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details .
*
* You should have received a copy of the GNU Affero General Public
* License along with this library . If not , see < http :// www . gnu . org / licenses />.
*/
2014-11-11 01:30:38 +03:00
class Test_Share extends \Test\TestCase {
2012-07-26 01:08:18 +04:00
protected $itemType ;
protected $userBackend ;
protected $user1 ;
protected $user2 ;
2014-01-21 15:07:08 +04:00
protected $user3 ;
protected $user4 ;
2015-01-19 16:39:00 +03:00
protected $user5 ;
protected $user6 ;
2014-11-17 15:09:13 +03:00
protected $groupAndUser ;
2012-07-26 01:08:18 +04:00
protected $groupBackend ;
protected $group1 ;
protected $group2 ;
2013-02-26 22:31:15 +04:00
protected $resharing ;
2013-09-13 01:37:43 +04:00
protected $dateInFuture ;
protected $dateInPast ;
2013-09-05 04:27:29 +04:00
2014-11-18 13:08:01 +03:00
protected function setUp () {
parent :: setUp ();
2014-11-11 01:30:38 +03:00
2012-07-26 01:08:18 +04:00
OC_User :: clearBackends ();
OC_User :: useBackend ( 'dummy' );
2014-11-18 13:08:01 +03:00
$this -> user1 = $this -> getUniqueID ( 'user1_' );
$this -> user2 = $this -> getUniqueID ( 'user2_' );
$this -> user3 = $this -> getUniqueID ( 'user3_' );
$this -> user4 = $this -> getUniqueID ( 'user4_' );
2015-01-20 15:09:39 +03:00
$this -> user5 = $this -> getUniqueID ( 'user5_' );
2015-01-19 16:39:00 +03:00
$this -> user6 = $this -> getUniqueID ( 'user6_' );
2014-11-18 13:08:01 +03:00
$this -> groupAndUser = $this -> getUniqueID ( 'groupAndUser_' );
2012-08-15 19:55:54 +04:00
OC_User :: createUser ( $this -> user1 , 'pass' );
OC_User :: createUser ( $this -> user2 , 'pass' );
OC_User :: createUser ( $this -> user3 , 'pass' );
2012-08-20 00:30:38 +04:00
OC_User :: createUser ( $this -> user4 , 'pass' );
2015-01-20 15:09:39 +03:00
OC_User :: createUser ( $this -> user5 , 'pass' );
2015-01-19 16:39:00 +03:00
OC_User :: createUser ( $this -> user6 , 'pass' ); // no group
2014-11-17 15:09:13 +03:00
OC_User :: createUser ( $this -> groupAndUser , 'pass' );
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user1 );
2012-07-26 01:08:18 +04:00
OC_Group :: clearBackends ();
OC_Group :: useBackend ( new OC_Group_Dummy );
2014-11-18 13:08:01 +03:00
$this -> group1 = $this -> getUniqueID ( 'group1_' );
$this -> group2 = $this -> getUniqueID ( 'group2_' );
2012-07-26 01:08:18 +04:00
OC_Group :: createGroup ( $this -> group1 );
OC_Group :: createGroup ( $this -> group2 );
2014-11-17 15:09:13 +03:00
OC_Group :: createGroup ( $this -> groupAndUser );
2012-08-15 19:55:54 +04:00
OC_Group :: addToGroup ( $this -> user1 , $this -> group1 );
OC_Group :: addToGroup ( $this -> user2 , $this -> group1 );
OC_Group :: addToGroup ( $this -> user3 , $this -> group1 );
2012-08-20 00:30:38 +04:00
OC_Group :: addToGroup ( $this -> user2 , $this -> group2 );
OC_Group :: addToGroup ( $this -> user4 , $this -> group2 );
2014-11-17 15:09:13 +03:00
OC_Group :: addToGroup ( $this -> user2 , $this -> groupAndUser );
OC_Group :: addToGroup ( $this -> user3 , $this -> groupAndUser );
2012-08-15 19:55:54 +04:00
OCP\Share :: registerBackend ( 'test' , 'Test_Share_Backend' );
2012-11-14 02:45:17 +04:00
OC_Hook :: clear ( 'OCP\\Share' );
2012-11-15 21:13:54 +04:00
OC :: registerShareHooks ();
2013-02-26 22:31:15 +04:00
$this -> resharing = OC_Appconfig :: getValue ( 'core' , 'shareapi_allow_resharing' , 'yes' );
OC_Appconfig :: setValue ( 'core' , 'shareapi_allow_resharing' , 'yes' );
2013-09-13 01:37:43 +04:00
// 20 Minutes in the past, 20 minutes in the future.
$now = time ();
$dateFormat = 'Y-m-d H:i:s' ;
$this -> dateInPast = date ( $dateFormat , $now - 20 * 60 );
$this -> dateInFuture = date ( $dateFormat , $now + 20 * 60 );
2012-07-26 01:08:18 +04:00
}
2014-11-18 13:08:01 +03:00
protected function tearDown () {
2012-08-25 03:52:27 +04:00
$query = OC_DB :: prepare ( 'DELETE FROM `*PREFIX*share` WHERE `item_type` = ?' );
2012-08-15 19:55:54 +04:00
$query -> execute ( array ( 'test' ));
2013-02-26 22:31:15 +04:00
OC_Appconfig :: setValue ( 'core' , 'shareapi_allow_resharing' , $this -> resharing );
2014-11-11 01:30:38 +03:00
2015-01-19 16:39:00 +03:00
OC_User :: deleteUser ( $this -> user1 );
OC_User :: deleteUser ( $this -> user2 );
OC_User :: deleteUser ( $this -> user3 );
OC_User :: deleteUser ( $this -> user4 );
OC_User :: deleteUser ( $this -> user5 );
OC_User :: deleteUser ( $this -> user6 );
OC_User :: deleteUser ( $this -> groupAndUser );
OC_Group :: deleteGroup ( $this -> group1 );
OC_Group :: deleteGroup ( $this -> group2 );
OC_Group :: deleteGroup ( $this -> groupAndUser );
2015-03-27 17:54:29 +03:00
$this -> logout ();
2014-11-18 13:08:01 +03:00
parent :: tearDown ();
2012-07-26 01:08:18 +04:00
}
2015-04-27 23:07:35 +03:00
protected function setHttpHelper ( $httpHelper ) {
2015-04-28 09:13:49 +03:00
\OC :: $server -> registerService ( 'HTTPHelper' , function () use ( $httpHelper ) {
2015-04-27 23:07:35 +03:00
return $httpHelper ;
});
}
2012-08-15 19:55:54 +04:00
public function testShareInvalidShareType () {
2012-10-12 21:28:24 +04:00
$message = 'Share type foobar is not valid for test.txt' ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , 'foobar' , $this -> user2 , \OCP\Constants :: PERMISSION_READ );
2012-10-12 21:28:24 +04:00
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-10-12 21:28:24 +04:00
}
2012-07-26 01:08:18 +04:00
}
2012-08-15 19:55:54 +04:00
public function testInvalidItemType () {
$message = 'Sharing backend for foobar not found' ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'foobar' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
try {
OCP\Share :: getItemsSharedWith ( 'foobar' );
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
try {
OCP\Share :: getItemSharedWith ( 'foobar' , 'test.txt' );
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
try {
OCP\Share :: getItemSharedWithBySource ( 'foobar' , 'test.txt' );
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
try {
OCP\Share :: getItemShared ( 'foobar' , 'test.txt' );
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
try {
OCP\Share :: unshare ( 'foobar' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 );
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: setPermissions ( 'foobar' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_UPDATE );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
2012-07-26 01:08:18 +04:00
}
2013-09-05 04:45:52 +04:00
protected function shareUserOneTestFileWithUserTwo () {
2013-09-05 04:31:54 +04:00
OC_User :: setUserId ( $this -> user1 );
$this -> assertTrue (
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ ),
2013-09-05 04:31:54 +04:00
'Failed asserting that user 1 successfully shared text.txt with user 2.'
);
2013-09-23 18:16:48 +04:00
$this -> assertContains (
'test.txt' ,
2013-09-05 04:31:54 +04:00
OCP\Share :: getItemShared ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'Failed asserting that test.txt is a shared file of user 1.'
);
OC_User :: setUserId ( $this -> user2 );
2013-09-23 18:16:48 +04:00
$this -> assertContains (
'test.txt' ,
2013-09-05 04:31:54 +04:00
OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'Failed asserting that user 2 has access to test.txt after initial sharing.'
);
}
2014-06-03 17:15:04 +04:00
protected function shareUserTestFileAsLink () {
OC_User :: setUserId ( $this -> user1 );
2014-11-25 18:28:41 +03:00
$result = OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_LINK , null , \OCP\Constants :: PERMISSION_READ );
2014-06-03 17:15:04 +04:00
$this -> assertTrue ( is_string ( $result ));
}
2014-02-19 12:31:54 +04:00
/**
* @ param string $sharer
* @ param string $receiver
*/
2014-01-10 05:08:29 +04:00
protected function shareUserTestFileWithUser ( $sharer , $receiver ) {
OC_User :: setUserId ( $sharer );
$this -> assertTrue (
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $receiver , \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_SHARE ),
2014-01-10 05:08:29 +04:00
'Failed asserting that ' . $sharer . ' successfully shared text.txt with ' . $receiver . '.'
);
$this -> assertContains (
'test.txt' ,
OCP\Share :: getItemShared ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'Failed asserting that test.txt is a shared file of ' . $sharer . '.'
);
OC_User :: setUserId ( $receiver );
$this -> assertContains (
'test.txt' ,
OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'Failed asserting that ' . $receiver . ' has access to test.txt after initial sharing.'
);
}
2012-08-15 19:55:54 +04:00
public function testShareWithUser () {
// Invalid shares
$message = 'Sharing test.txt failed, because the user ' . $this -> user1 . ' is the item owner' ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user1 , \OCP\Constants :: PERMISSION_READ );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
$message = 'Sharing test.txt failed, because the user foobar does not exist' ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , 'foobar' , \OCP\Constants :: PERMISSION_READ );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
2012-08-20 00:30:38 +04:00
$message = 'Sharing foobar failed, because the sharing backend for test could not find its source' ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'foobar' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ );
2012-08-20 00:30:38 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-20 00:30:38 +04:00
}
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Valid share
2013-09-05 04:31:54 +04:00
$this -> shareUserOneTestFileWithUserTwo ();
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Attempt to share again
OC_User :: setUserId ( $this -> user1 );
$message = 'Sharing test.txt failed, because this item is already shared with ' . $this -> user2 ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Attempt to share back
OC_User :: setUserId ( $this -> user2 );
$message = 'Sharing test.txt failed, because the user ' . $this -> user1 . ' is the original sharer' ;
2012-08-15 19:55:54 +04:00
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user1 , \OCP\Constants :: PERMISSION_READ );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Unshare
OC_User :: setUserId ( $this -> user1 );
$this -> assertTrue ( OCP\Share :: unshare ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 ));
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Attempt reshare without share permission
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user2 );
$message = 'Sharing test.txt failed, because resharing is not allowed' ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user3 , \OCP\Constants :: PERMISSION_READ );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
2012-11-11 22:58:54 +04:00
2012-11-05 01:16:04 +04:00
// Owner grants share and update permission
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user1 );
2014-11-25 18:28:41 +03:00
$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 ));
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Attempt reshare with escalated permissions
OC_User :: setUserId ( $this -> user2 );
$message = 'Sharing test.txt failed, because the permissions exceed permissions granted to ' . $this -> user2 ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user3 , \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_DELETE );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Valid reshare
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user3 , \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_UPDATE ));
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemShared ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user3 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ));
2014-11-25 18:28:41 +03:00
$this -> assertEquals ( array ( \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_UPDATE ), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_PERMISSIONS ));
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Attempt to escalate permissions
OC_User :: setUserId ( $this -> user2 );
$message = 'Setting permissions for test.txt failed, because the permissions exceed permissions granted to ' . $this -> user2 ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: setPermissions ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user3 , \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_DELETE );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Remove update permission
OC_User :: setUserId ( $this -> user1 );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: setPermissions ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_SHARE ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user2 );
2014-11-25 18:28:41 +03:00
$this -> assertEquals ( array ( \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_SHARE ), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_PERMISSIONS ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user3 );
2014-11-25 18:28:41 +03:00
$this -> assertEquals ( array ( \OCP\Constants :: PERMISSION_READ ), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_PERMISSIONS ));
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Remove share permission
OC_User :: setUserId ( $this -> user1 );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: setPermissions ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user2 );
2014-11-25 18:28:41 +03:00
$this -> assertEquals ( array ( \OCP\Constants :: PERMISSION_READ ), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_PERMISSIONS ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user3 );
2014-03-06 17:00:12 +04:00
$this -> assertSame ( array (), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' ));
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Reshare again, and then have owner unshare
OC_User :: setUserId ( $this -> user1 );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: setPermissions ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_SHARE ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user2 );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user3 , \OCP\Constants :: PERMISSION_READ ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user1 );
$this -> assertTrue ( OCP\Share :: unshare ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 ));
OC_User :: setUserId ( $this -> user2 );
2014-03-06 17:00:12 +04:00
$this -> assertSame ( array (), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user3 );
2014-03-06 17:00:12 +04:00
$this -> assertSame ( array (), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' ));
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Attempt target conflict
OC_User :: setUserId ( $this -> user1 );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user3 );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'share.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ ));
2012-08-28 02:12:01 +04:00
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user2 );
2012-08-28 02:12:01 +04:00
$to_test = OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( 2 , count ( $to_test ));
2012-08-28 02:12:01 +04:00
$this -> assertTrue ( in_array ( 'test.txt' , $to_test ));
$this -> assertTrue ( in_array ( 'test1.txt' , $to_test ));
2012-08-22 19:35:30 +04:00
2014-08-23 14:05:19 +04:00
// Unshare from self
$this -> assertTrue ( OCP\Share :: unshareFromSelf ( 'test' , 'test.txt' ));
$this -> assertEquals ( array ( 'test1.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
// Unshare from self via source
$this -> assertTrue ( OCP\Share :: unshareFromSelf ( 'test' , 'share.txt' , true ));
$this -> assertEquals ( array (), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
OC_User :: setUserId ( $this -> user1 );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ ));
2014-08-23 14:05:19 +04:00
OC_User :: setUserId ( $this -> user3 );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'share.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ ));
2014-08-23 14:05:19 +04:00
OC_User :: setUserId ( $this -> user2 );
$to_test = OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET );
$this -> assertEquals ( 2 , count ( $to_test ));
$this -> assertTrue ( in_array ( 'test.txt' , $to_test ));
$this -> assertTrue ( in_array ( 'test1.txt' , $to_test ));
2012-08-16 20:20:14 +04:00
// Remove user
2012-09-09 04:15:35 +04:00
OC_User :: setUserId ( $this -> user1 );
2012-08-20 00:30:38 +04:00
OC_User :: deleteUser ( $this -> user1 );
OC_User :: setUserId ( $this -> user2 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test1.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-08-15 19:55:54 +04:00
}
2012-07-26 01:08:18 +04:00
2013-09-05 04:45:52 +04:00
public function testShareWithUserExpirationExpired () {
2014-06-03 17:15:04 +04:00
OC_User :: setUserId ( $this -> user1 );
2013-09-04 19:26:30 +04:00
$this -> shareUserOneTestFileWithUserTwo ();
2014-06-03 17:15:04 +04:00
$this -> shareUserTestFileAsLink ();
2013-09-04 19:26:30 +04:00
2014-07-23 18:42:33 +04:00
// manipulate share table and set expire date to the past
$query = \OC_DB :: prepare ( 'UPDATE `*PREFIX*share` SET `expiration` = ? WHERE `item_type` = ? AND `item_source` = ? AND `uid_owner` = ? AND `share_type` = ?' );
$query -> bindValue ( 1 , new \DateTime ( $this -> dateInPast ), 'datetime' );
$query -> bindValue ( 2 , 'test' );
$query -> bindValue ( 3 , 'test.txt' );
$query -> bindValue ( 4 , $this -> user1 );
$query -> bindValue ( 5 , \OCP\Share :: SHARE_TYPE_LINK );
$query -> execute ();
2013-09-04 19:26:30 +04:00
2014-06-03 17:15:04 +04:00
$shares = OCP\Share :: getItemsShared ( 'test' );
$this -> assertSame ( 1 , count ( $shares ));
$share = reset ( $shares );
$this -> assertSame ( \OCP\Share :: SHARE_TYPE_USER , $share [ 'share_type' ]);
2013-09-04 19:26:30 +04:00
}
2015-03-24 13:08:19 +03:00
public function testGetShareFromOutsideFilesFolder () {
OC_User :: setUserId ( $this -> user1 );
$view = new \OC\Files\View ( '/' . $this -> user1 . '/' );
$view -> mkdir ( 'files/test' );
$view -> mkdir ( 'files/test/sub' );
$view -> mkdir ( 'files_trashbin' );
$view -> mkdir ( 'files_trashbin/files' );
$fileInfo = $view -> getFileInfo ( 'files/test/sub' );
$fileId = $fileInfo -> getId ();
$this -> assertTrue (
OCP\Share :: shareItem ( 'folder' , $fileId , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ ),
'Failed asserting that user 1 successfully shared "test/sub" with user 2.'
);
$result = OCP\Share :: getItemShared ( 'folder' , $fileId , Test_Share_Backend :: FORMAT_SOURCE );
$this -> assertNotEmpty ( $result );
$result = OCP\Share :: getItemSharedWithUser ( 'folder' , $fileId , $this -> user2 );
$this -> assertNotEmpty ( $result );
$result = OCP\Share :: getItemsSharedWithUser ( 'folder' , $this -> user2 );
$this -> assertNotEmpty ( $result );
// move to trash (keeps file id)
$view -> rename ( 'files/test' , 'files_trashbin/files/test' );
$result = OCP\Share :: getItemShared ( 'folder' , $fileId , Test_Share_Backend :: FORMAT_SOURCE );
$this -> assertEmpty ( $result , 'Share must not be returned for files outside of "files"' );
$result = OCP\Share :: getItemSharedWithUser ( 'folder' , $fileId , $this -> user2 );
$this -> assertEmpty ( $result , 'Share must not be returned for files outside of "files"' );
$result = OCP\Share :: getItemsSharedWithUser ( 'folder' , $this -> user2 );
$this -> assertEmpty ( $result , 'Share must not be returned for files outside of "files"' );
}
2014-07-23 18:42:33 +04:00
public function testSetExpireDateInPast () {
OC_User :: setUserId ( $this -> user1 );
$this -> shareUserOneTestFileWithUserTwo ();
$this -> shareUserTestFileAsLink ();
$setExpireDateFailed = false ;
try {
$this -> assertTrue (
OCP\Share :: setExpirationDate ( 'test' , 'test.txt' , $this -> dateInPast , '' ),
'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
);
} catch ( \Exception $e ) {
$setExpireDateFailed = true ;
}
$this -> assertTrue ( $setExpireDateFailed );
}
2013-09-05 04:45:52 +04:00
public function testShareWithUserExpirationValid () {
2014-06-03 17:15:04 +04:00
OC_User :: setUserId ( $this -> user1 );
2013-09-04 19:26:30 +04:00
$this -> shareUserOneTestFileWithUserTwo ();
2014-06-03 17:15:04 +04:00
$this -> shareUserTestFileAsLink ();
2013-09-04 19:26:30 +04:00
$this -> assertTrue (
2014-07-23 18:42:33 +04:00
OCP\Share :: setExpirationDate ( 'test' , 'test.txt' , $this -> dateInFuture , '' ),
2013-09-04 19:26:30 +04:00
'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
2013-09-04 19:15:08 +04:00
);
2014-06-03 17:15:04 +04:00
$shares = OCP\Share :: getItemsShared ( 'test' );
$this -> assertSame ( 2 , count ( $shares ));
2013-09-04 19:26:30 +04:00
}
2013-09-04 19:15:08 +04:00
2014-07-29 00:35:11 +04:00
/*
* if user is in a group excluded from resharing , then the share permission should
* be removed
*/
public function testShareWithUserAndUserIsExcludedFromResharing () {
OC_User :: setUserId ( $this -> user1 );
$this -> assertTrue (
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user4 , \OCP\Constants :: PERMISSION_ALL ),
2014-07-29 00:35:11 +04:00
'Failed asserting that user 1 successfully shared text.txt with user 4.'
);
$this -> assertContains (
'test.txt' ,
OCP\Share :: getItemShared ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'Failed asserting that test.txt is a shared file of user 1.'
);
// exclude group2 from sharing
\OC_Appconfig :: setValue ( 'core' , 'shareapi_exclude_groups_list' , $this -> group2 );
\OC_Appconfig :: setValue ( 'core' , 'shareapi_exclude_groups' , " yes " );
OC_User :: setUserId ( $this -> user4 );
$share = OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' );
2014-11-25 18:28:41 +03:00
$this -> assertSame ( \OCP\Constants :: PERMISSION_ALL & ~ \OCP\Constants :: PERMISSION_SHARE , $share [ 'permissions' ],
2014-07-29 00:35:11 +04:00
'Failed asserting that user 4 is excluded from re-sharing' );
\OC_Appconfig :: deleteKey ( 'core' , 'shareapi_exclude_groups_list' );
\OC_Appconfig :: deleteKey ( 'core' , 'shareapi_exclude_groups' );
}
2015-04-29 14:33:20 +03:00
public function testSharingAFolderThatIsSharedWithAGroupOfTheOwner () {
OC_User :: setUserId ( $this -> user1 );
$view = new \OC\Files\View ( '/' . $this -> user1 . '/' );
$view -> mkdir ( 'files/test' );
$view -> mkdir ( 'files/test/sub1' );
$view -> mkdir ( 'files/test/sub1/sub2' );
$fileInfo = $view -> getFileInfo ( 'files/test/sub1' );
$fileId = $fileInfo -> getId ();
$this -> assertTrue (
OCP\Share :: shareItem ( 'folder' , $fileId , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 , \OCP\Constants :: PERMISSION_READ + \OCP\Constants :: PERMISSION_CREATE ),
'Failed asserting that user 1 successfully shared "test/sub1" with group 1.'
);
$result = OCP\Share :: getItemShared ( 'folder' , $fileId , Test_Share_Backend :: FORMAT_SOURCE );
$this -> assertNotEmpty ( $result );
$this -> assertEquals ( \OCP\Constants :: PERMISSION_READ + \OCP\Constants :: PERMISSION_CREATE , $result [ 'permissions' ]);
$fileInfo = $view -> getFileInfo ( 'files/test/sub1/sub2' );
$fileId = $fileInfo -> getId ();
$this -> assertTrue (
OCP\Share :: shareItem ( 'folder' , $fileId , OCP\Share :: SHARE_TYPE_USER , $this -> user4 , \OCP\Constants :: PERMISSION_READ ),
'Failed asserting that user 1 successfully shared "test/sub1/sub2" with user 4.'
);
$result = OCP\Share :: getItemShared ( 'folder' , $fileId , Test_Share_Backend :: FORMAT_SOURCE );
$this -> assertNotEmpty ( $result );
$this -> assertEquals ( \OCP\Constants :: PERMISSION_READ , $result [ 'permissions' ]);
}
2013-09-05 04:45:52 +04:00
protected function shareUserOneTestFileWithGroupOne () {
2013-09-05 04:41:24 +04:00
OC_User :: setUserId ( $this -> user1 );
$this -> assertTrue (
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 , \OCP\Constants :: PERMISSION_READ ),
2013-09-05 04:41:24 +04:00
'Failed asserting that user 1 successfully shared text.txt with group 1.'
);
2013-09-23 18:16:48 +04:00
$this -> assertContains (
'test.txt' ,
2013-09-05 04:41:24 +04:00
OCP\Share :: getItemShared ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'Failed asserting that test.txt is a shared file of user 1.'
);
OC_User :: setUserId ( $this -> user2 );
2013-09-23 18:16:48 +04:00
$this -> assertContains (
'test.txt' ,
2013-09-05 04:41:24 +04:00
OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'Failed asserting that user 2 has access to test.txt after initial sharing.'
);
OC_User :: setUserId ( $this -> user3 );
2013-09-23 18:16:48 +04:00
$this -> assertContains (
'test.txt' ,
2013-09-05 04:41:24 +04:00
OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'Failed asserting that user 3 has access to test.txt after initial sharing.'
);
}
2012-08-15 19:55:54 +04:00
public function testShareWithGroup () {
// Invalid shares
$message = 'Sharing test.txt failed, because the group foobar does not exist' ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_GROUP , 'foobar' , \OCP\Constants :: PERMISSION_READ );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
2014-06-04 13:07:31 +04:00
$policy = OC_Appconfig :: getValue ( 'core' , 'shareapi_only_share_with_group_members' , 'no' );
OC_Appconfig :: setValue ( 'core' , 'shareapi_only_share_with_group_members' , 'yes' );
2012-08-15 19:55:54 +04:00
$message = 'Sharing test.txt failed, because ' . $this -> user1 . ' is not a member of the group ' . $this -> group2 ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group2 , \OCP\Constants :: PERMISSION_READ );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
2014-06-04 13:07:31 +04:00
OC_Appconfig :: setValue ( 'core' , 'shareapi_only_share_with_group_members' , $policy );
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Valid share
2013-09-05 04:41:24 +04:00
$this -> shareUserOneTestFileWithGroupOne ();
2012-11-11 22:58:54 +04:00
2015-02-05 16:00:05 +03:00
// check if only the group share was created and not a single db-entry for each user
$statement = \OCP\DB :: prepare ( 'select `id` from `*PREFIX*share`' );
$query = $statement -> execute ();
$result = $query -> fetchAll ();
$this -> assertSame ( 1 , count ( $result ));
2012-08-15 19:55:54 +04:00
// Attempt to share again
OC_User :: setUserId ( $this -> user1 );
$message = 'Sharing test.txt failed, because this item is already shared with ' . $this -> group1 ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 , \OCP\Constants :: PERMISSION_READ );
2012-08-15 19:55:54 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-15 19:55:54 +04:00
}
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Attempt to share back to owner of group share
OC_User :: setUserId ( $this -> user2 );
$message = 'Sharing test.txt failed, because the user ' . $this -> user1 . ' is the original sharer' ;
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user1 , \OCP\Constants :: PERMISSION_READ );
2012-08-20 00:30:38 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-20 00:30:38 +04:00
}
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Attempt to share back to group
2012-08-22 19:35:30 +04:00
$message = 'Sharing test.txt failed, because this item is already shared with ' . $this -> group1 ;
2012-08-20 00:30:38 +04:00
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 , \OCP\Constants :: PERMISSION_READ );
2012-08-20 00:30:38 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-20 00:30:38 +04:00
}
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Attempt to share back to member of group
2012-08-22 19:35:30 +04:00
$message = 'Sharing test.txt failed, because this item is already shared with ' . $this -> user3 ;
2012-08-20 00:30:38 +04:00
try {
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user3 , \OCP\Constants :: PERMISSION_READ );
2012-08-20 00:30:38 +04:00
$this -> fail ( 'Exception was expected: ' . $message );
} catch ( Exception $exception ) {
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( $message , $exception -> getMessage ());
2012-08-20 00:30:38 +04:00
}
2012-11-11 22:58:54 +04:00
2012-08-15 19:55:54 +04:00
// Unshare
2012-08-20 00:30:38 +04:00
OC_User :: setUserId ( $this -> user1 );
2012-08-15 19:55:54 +04:00
$this -> assertTrue ( OCP\Share :: unshare ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 ));
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Valid share with same person - user then group
2014-11-25 18:28:41 +03:00
$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 ));
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 , \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_UPDATE ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user2 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2014-11-25 18:28:41 +03:00
$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 ));
2012-08-15 19:55:54 +04:00
OC_User :: setUserId ( $this -> user3 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2014-11-25 18:28:41 +03:00
$this -> assertEquals ( array ( \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_UPDATE ), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_PERMISSIONS ));
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Valid reshare
OC_User :: setUserId ( $this -> user2 );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user4 , \OCP\Constants :: PERMISSION_READ ));
2012-08-20 00:30:38 +04:00
OC_User :: setUserId ( $this -> user4 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Unshare from user only
OC_User :: setUserId ( $this -> user1 );
$this -> assertTrue ( OCP\Share :: unshare ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 ));
OC_User :: setUserId ( $this -> user2 );
2014-11-25 18:28:41 +03:00
$this -> assertEquals ( array ( \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_UPDATE ), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_PERMISSIONS ));
2012-08-20 00:30:38 +04:00
OC_User :: setUserId ( $this -> user4 );
2014-08-01 18:24:19 +04:00
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Valid share with same person - group then user
OC_User :: setUserId ( $this -> user1 );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_DELETE ));
2012-08-20 00:30:38 +04:00
OC_User :: setUserId ( $this -> user2 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2014-11-25 18:28:41 +03:00
$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 ));
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Unshare from group only
OC_User :: setUserId ( $this -> user1 );
$this -> assertTrue ( OCP\Share :: unshare ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 ));
OC_User :: setUserId ( $this -> user2 );
2014-11-25 18:28:41 +03:00
$this -> assertEquals ( array ( \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_DELETE ), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_PERMISSIONS ));
2012-11-11 22:58:54 +04:00
2012-08-20 00:30:38 +04:00
// Attempt user specific target conflict
OC_User :: setUserId ( $this -> user3 );
2015-02-09 15:12:34 +03:00
\OCP\Util :: connectHook ( 'OCP\\Share' , 'post_shared' , 'DummyHookListener' , 'listen' );
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'share.txt' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 , \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_SHARE ));
2015-02-09 15:12:34 +03:00
$this -> assertEquals ( OCP\Share :: SHARE_TYPE_GROUP , DummyHookListener :: $shareType );
2012-08-20 00:30:38 +04:00
OC_User :: setUserId ( $this -> user2 );
2012-08-28 02:35:10 +04:00
$to_test = OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( 2 , count ( $to_test ));
2012-08-28 02:35:10 +04:00
$this -> assertTrue ( in_array ( 'test.txt' , $to_test ));
$this -> assertTrue ( in_array ( 'test1.txt' , $to_test ));
2012-11-11 22:58:54 +04:00
2012-11-05 01:16:04 +04:00
// Valid reshare
2014-11-25 18:28:41 +03:00
$this -> assertTrue ( OCP\Share :: shareItem ( 'test' , 'share.txt' , OCP\Share :: SHARE_TYPE_USER , $this -> user4 , \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_SHARE ));
2012-09-03 02:23:09 +04:00
OC_User :: setUserId ( $this -> user4 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test1.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-11-11 22:58:54 +04:00
2012-09-03 02:23:09 +04:00
// Remove user from group
OC_Group :: removeFromGroup ( $this -> user2 , $this -> group1 );
OC_User :: setUserId ( $this -> user2 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-09-03 02:23:09 +04:00
OC_User :: setUserId ( $this -> user4 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array (), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-11-11 22:58:54 +04:00
2012-08-16 20:20:14 +04:00
// Add user to group
2012-09-03 02:23:09 +04:00
OC_Group :: addToGroup ( $this -> user4 , $this -> group1 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-11-11 22:58:54 +04:00
2012-09-09 04:15:35 +04:00
// Unshare from self
$this -> assertTrue ( OCP\Share :: unshareFromSelf ( 'test' , 'test.txt' ));
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array (), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-09-09 04:15:35 +04:00
OC_User :: setUserId ( $this -> user2 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-11-11 22:58:54 +04:00
2014-08-23 14:05:19 +04:00
// Unshare from self via source
OC_User :: setUserId ( $this -> user1 );
$this -> assertTrue ( OCP\Share :: unshareFromSelf ( 'test' , 'share.txt' , true ));
$this -> assertEquals ( array (), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-11-11 22:58:54 +04:00
2012-08-16 20:20:14 +04:00
// Remove group
2012-09-03 04:01:09 +04:00
OC_Group :: deleteGroup ( $this -> group1 );
2012-09-09 04:15:35 +04:00
OC_User :: setUserId ( $this -> user4 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array (), OCP\Share :: getItemsSharedWith ( 'test' , Test_Share_Backend :: FORMAT_TARGET ));
2012-09-03 04:01:09 +04:00
OC_User :: setUserId ( $this -> user3 );
2012-10-12 22:05:45 +04:00
$this -> assertEquals ( array (), OCP\Share :: getItemsShared ( 'test' ));
2012-07-26 01:08:18 +04:00
}
2015-01-20 15:09:39 +03:00
/**
* Test that unsharing from group will also delete all
* child entries
*/
public function testShareWithGroupThenUnshare () {
OC_User :: setUserId ( $this -> user5 );
OCP\Share :: shareItem (
'test' ,
'test.txt' ,
OCP\Share :: SHARE_TYPE_GROUP ,
$this -> group1 ,
\OCP\Constants :: PERMISSION_ALL
);
$targetUsers = array ( $this -> user1 , $this -> user2 , $this -> user3 );
foreach ( $targetUsers as $targetUser ) {
OC_User :: setUserId ( $targetUser );
$items = OCP\Share :: getItemsSharedWithUser (
'test' ,
$targetUser ,
Test_Share_Backend :: FORMAT_TARGET
);
$this -> assertEquals ( 1 , count ( $items ));
}
OC_User :: setUserId ( $this -> user5 );
OCP\Share :: unshare (
'test' ,
'test.txt' ,
OCP\Share :: SHARE_TYPE_GROUP ,
$this -> group1
);
// verify that all were deleted
foreach ( $targetUsers as $targetUser ) {
OC_User :: setUserId ( $targetUser );
$items = OCP\Share :: getItemsSharedWithUser (
'test' ,
$targetUser ,
Test_Share_Backend :: FORMAT_TARGET
);
$this -> assertEquals ( 0 , count ( $items ));
}
}
2014-11-17 15:09:13 +03:00
public function testShareWithGroupAndUserBothHaveTheSameId () {
$this -> shareUserTestFileWithUser ( $this -> user1 , $this -> groupAndUser );
OC_User :: setUserId ( $this -> groupAndUser );
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'"groupAndUser"-User does not see the file but it was shared with him' );
OC_User :: setUserId ( $this -> user2 );
$this -> assertEquals ( array (), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'User2 sees test.txt but it was only shared with the user "groupAndUser" and not with group' );
OC_User :: setUserId ( $this -> user1 );
$this -> assertTrue ( OCP\Share :: unshareAll ( 'test' , 'test.txt' ));
$this -> assertTrue (
2014-11-25 18:28:41 +03:00
OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_GROUP , $this -> groupAndUser , \OCP\Constants :: PERMISSION_READ ),
2014-11-17 15:09:13 +03:00
'Failed asserting that user 1 successfully shared text.txt with group 1.'
);
OC_User :: setUserId ( $this -> groupAndUser );
$this -> assertEquals ( array (), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'"groupAndUser"-User sees test.txt but it was only shared with the group "groupAndUser" and not with the user' );
OC_User :: setUserId ( $this -> user2 );
$this -> assertEquals ( array ( 'test.txt' ), OCP\Share :: getItemSharedWith ( 'test' , 'test.txt' , Test_Share_Backend :: FORMAT_SOURCE ),
'User2 does not see test.txt but it was shared with the group "groupAndUser"' );
OC_User :: setUserId ( $this -> user1 );
$this -> assertTrue ( OCP\Share :: unshareAll ( 'test' , 'test.txt' ));
}
2014-02-19 12:31:54 +04:00
/**
* @ param boolean | string $token
2015-04-29 14:33:20 +03:00
* @ return array
2014-02-19 12:31:54 +04:00
*/
2013-09-14 19:56:55 +04:00
protected function getShareByValidToken ( $token ) {
$row = OCP\Share :: getShareByToken ( $token );
$this -> assertInternalType (
'array' ,
$row ,
" Failed asserting that a share for token $token exists. "
);
return $row ;
}
2014-11-10 15:08:45 +03:00
public function testGetItemSharedWithUser () {
OC_User :: setUserId ( $this -> user1 );
//add dummy values to the share table
$query = \OC_DB :: prepare ( 'INSERT INTO `*PREFIX*share` ('
. ' `item_type`, `item_source`, `item_target`, `share_type`,'
. ' `share_with`, `uid_owner`) VALUES (?,?,?,?,?,?)' );
$args = array ( 'test' , 99 , 'target1' , OCP\Share :: SHARE_TYPE_USER , $this -> user2 , $this -> user1 );
$query -> execute ( $args );
$args = array ( 'test' , 99 , 'target2' , OCP\Share :: SHARE_TYPE_USER , $this -> user4 , $this -> user1 );
$query -> execute ( $args );
$args = array ( 'test' , 99 , 'target3' , OCP\Share :: SHARE_TYPE_USER , $this -> user3 , $this -> user2 );
$query -> execute ( $args );
$args = array ( 'test' , 99 , 'target4' , OCP\Share :: SHARE_TYPE_USER , $this -> user3 , $this -> user4 );
$query -> execute ( $args );
2015-01-19 16:39:00 +03:00
$args = array ( 'test' , 99 , 'target4' , OCP\Share :: SHARE_TYPE_USER , $this -> user6 , $this -> user4 );
$query -> execute ( $args );
2014-11-10 15:08:45 +03:00
$result1 = \OCP\Share :: getItemSharedWithUser ( 'test' , 99 , $this -> user2 , $this -> user1 );
$this -> assertSame ( 1 , count ( $result1 ));
$this -> verifyResult ( $result1 , array ( 'target1' ));
$result2 = \OCP\Share :: getItemSharedWithUser ( 'test' , 99 , null , $this -> user1 );
$this -> assertSame ( 2 , count ( $result2 ));
$this -> verifyResult ( $result2 , array ( 'target1' , 'target2' ));
$result3 = \OCP\Share :: getItemSharedWithUser ( 'test' , 99 , $this -> user3 );
$this -> assertSame ( 2 , count ( $result3 ));
$this -> verifyResult ( $result3 , array ( 'target3' , 'target4' ));
$result4 = \OCP\Share :: getItemSharedWithUser ( 'test' , 99 , null , null );
2015-01-19 16:39:00 +03:00
$this -> assertSame ( 5 , count ( $result4 )); // 5 because target4 appears twice
2014-11-10 15:08:45 +03:00
$this -> verifyResult ( $result4 , array ( 'target1' , 'target2' , 'target3' , 'target4' ));
2015-01-19 16:39:00 +03:00
$result6 = \OCP\Share :: getItemSharedWithUser ( 'test' , 99 , $this -> user6 , null );
$this -> assertSame ( 1 , count ( $result6 ));
$this -> verifyResult ( $result6 , array ( 'target4' ));
2014-11-10 15:08:45 +03:00
}
2015-01-16 20:11:13 +03:00
public function testGetItemSharedWithUserFromGroupShare () {
OC_User :: setUserId ( $this -> user1 );
//add dummy values to the share table
$query = \OC_DB :: prepare ( 'INSERT INTO `*PREFIX*share` ('
. ' `item_type`, `item_source`, `item_target`, `share_type`,'
. ' `share_with`, `uid_owner`) VALUES (?,?,?,?,?,?)' );
$args = array ( 'test' , 99 , 'target1' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 , $this -> user1 );
$query -> execute ( $args );
$args = array ( 'test' , 99 , 'target2' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group2 , $this -> user1 );
$query -> execute ( $args );
$args = array ( 'test' , 99 , 'target3' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 , $this -> user2 );
$query -> execute ( $args );
$args = array ( 'test' , 99 , 'target4' , OCP\Share :: SHARE_TYPE_GROUP , $this -> group1 , $this -> user4 );
$query -> execute ( $args );
// user2 is in group1 and group2
$result1 = \OCP\Share :: getItemSharedWithUser ( 'test' , 99 , $this -> user2 , $this -> user1 );
$this -> assertSame ( 2 , count ( $result1 ));
$this -> verifyResult ( $result1 , array ( 'target1' , 'target2' ));
$result2 = \OCP\Share :: getItemSharedWithUser ( 'test' , 99 , null , $this -> user1 );
$this -> assertSame ( 2 , count ( $result2 ));
$this -> verifyResult ( $result2 , array ( 'target1' , 'target2' ));
// user3 is in group1 and group2
$result3 = \OCP\Share :: getItemSharedWithUser ( 'test' , 99 , $this -> user3 );
$this -> assertSame ( 3 , count ( $result3 ));
$this -> verifyResult ( $result3 , array ( 'target1' , 'target3' , 'target4' ));
$result4 = \OCP\Share :: getItemSharedWithUser ( 'test' , 99 , null , null );
$this -> assertSame ( 4 , count ( $result4 ));
$this -> verifyResult ( $result4 , array ( 'target1' , 'target2' , 'target3' , 'target4' ));
2015-01-19 16:39:00 +03:00
$result6 = \OCP\Share :: getItemSharedWithUser ( 'test' , 99 , $this -> user6 , null );
$this -> assertSame ( 0 , count ( $result6 ));
2015-01-16 20:11:13 +03:00
}
2014-11-10 15:08:45 +03:00
public function verifyResult ( $result , $expected ) {
foreach ( $result as $r ) {
if ( in_array ( $r [ 'item_target' ], $expected )) {
$key = array_search ( $r [ 'item_target' ], $expected );
unset ( $expected [ $key ]);
}
}
$this -> assertEmpty ( $expected , 'did not found all expected values' );
}
2013-09-14 19:56:55 +04:00
public function testShareItemWithLink () {
OC_User :: setUserId ( $this -> user1 );
2014-11-25 18:28:41 +03:00
$token = OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_LINK , null , \OCP\Constants :: PERMISSION_READ );
2013-09-14 19:56:55 +04:00
$this -> assertInternalType (
'string' ,
$token ,
'Failed asserting that user 1 successfully shared text.txt as link with token.'
);
// testGetShareByTokenNoExpiration
$row = $this -> getShareByValidToken ( $token );
$this -> assertEmpty (
$row [ 'expiration' ],
'Failed asserting that the returned row does not have an expiration date.'
);
// testGetShareByTokenExpirationValid
$this -> assertTrue (
2014-07-23 18:42:33 +04:00
OCP\Share :: setExpirationDate ( 'test' , 'test.txt' , $this -> dateInFuture , '' ),
2013-09-14 19:56:55 +04:00
'Failed asserting that user 1 successfully set a future expiration date for the test.txt share.'
);
$row = $this -> getShareByValidToken ( $token );
$this -> assertNotEmpty (
$row [ 'expiration' ],
'Failed asserting that the returned row has an expiration date.'
);
2014-07-23 18:42:33 +04:00
// manipulate share table and set expire date to the past
$query = \OC_DB :: prepare ( 'UPDATE `*PREFIX*share` SET `expiration` = ? WHERE `item_type` = ? AND `item_source` = ? AND `uid_owner` = ? AND `share_type` = ?' );
$query -> bindValue ( 1 , new \DateTime ( $this -> dateInPast ), 'datetime' );
$query -> bindValue ( 2 , 'test' );
$query -> bindValue ( 3 , 'test.txt' );
$query -> bindValue ( 4 , $this -> user1 );
$query -> bindValue ( 5 , \OCP\Share :: SHARE_TYPE_LINK );
$query -> execute ();
2013-09-14 19:56:55 +04:00
$this -> assertFalse (
OCP\Share :: getShareByToken ( $token ),
'Failed asserting that an expired share could not be found.'
);
}
2013-09-23 18:16:48 +04:00
2014-07-28 19:19:19 +04:00
public function testShareItemWithLinkAndDefaultExpireDate () {
OC_User :: setUserId ( $this -> user1 );
2015-03-17 19:26:03 +03:00
$config = \OC :: $server -> getConfig ();
$config -> setAppValue ( 'core' , 'shareapi_default_expire_date' , 'yes' );
$config -> setAppValue ( 'core' , 'shareapi_expire_after_n_days' , '2' );
2014-07-28 19:19:19 +04:00
2014-11-25 18:28:41 +03:00
$token = OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_LINK , null , \OCP\Constants :: PERMISSION_READ );
2014-07-28 19:19:19 +04:00
$this -> assertInternalType (
'string' ,
$token ,
'Failed asserting that user 1 successfully shared text.txt as link with token.'
);
// share should have default expire date
$row = $this -> getShareByValidToken ( $token );
$this -> assertNotEmpty (
$row [ 'expiration' ],
'Failed asserting that the returned row has an default expiration date.'
);
2015-03-17 19:26:03 +03:00
$config -> deleteAppValue ( 'core' , 'shareapi_default_expire_date' );
$config -> deleteAppValue ( 'core' , 'shareapi_expire_after_n_days' );
2014-07-28 19:19:19 +04:00
}
2013-09-23 18:16:48 +04:00
public function testUnshareAll () {
2014-01-10 05:08:29 +04:00
$this -> shareUserTestFileWithUser ( $this -> user1 , $this -> user2 );
$this -> shareUserTestFileWithUser ( $this -> user2 , $this -> user3 );
$this -> shareUserTestFileWithUser ( $this -> user3 , $this -> user4 );
2013-09-23 18:16:48 +04:00
$this -> shareUserOneTestFileWithGroupOne ();
OC_User :: setUserId ( $this -> user1 );
$this -> assertEquals (
array ( 'test.txt' , 'test.txt' ),
2014-02-19 19:56:37 +04:00
OCP\Share :: getItemsShared ( 'test' , Test_Share_Backend :: FORMAT_SOURCE ),
2014-01-10 05:08:29 +04:00
'Failed asserting that the test.txt file is shared exactly two times by user1.'
);
OC_User :: setUserId ( $this -> user2 );
$this -> assertEquals (
array ( 'test.txt' ),
2014-02-19 19:56:37 +04:00
OCP\Share :: getItemsShared ( 'test' , Test_Share_Backend :: FORMAT_SOURCE ),
2014-01-10 05:08:29 +04:00
'Failed asserting that the test.txt file is shared exactly once by user2.'
);
OC_User :: setUserId ( $this -> user3 );
$this -> assertEquals (
array ( 'test.txt' ),
2014-02-19 19:56:37 +04:00
OCP\Share :: getItemsShared ( 'test' , Test_Share_Backend :: FORMAT_SOURCE ),
2014-01-10 05:08:29 +04:00
'Failed asserting that the test.txt file is shared exactly once by user3.'
2013-09-23 18:16:48 +04:00
);
$this -> assertTrue (
OCP\Share :: unshareAll ( 'test' , 'test.txt' ),
2014-01-10 05:08:29 +04:00
'Failed asserting that user 3 successfully unshared all shares of the test.txt share.'
2013-09-23 18:16:48 +04:00
);
$this -> assertEquals (
array (),
OCP\Share :: getItemsShared ( 'test' ),
2014-01-10 05:08:29 +04:00
'Failed asserting that the share of the test.txt file by user 3 has been removed.'
);
OC_User :: setUserId ( $this -> user1 );
$this -> assertEquals (
array (),
OCP\Share :: getItemsShared ( 'test' ),
'Failed asserting that both shares of the test.txt file by user 1 have been removed.'
);
OC_User :: setUserId ( $this -> user2 );
$this -> assertEquals (
array (),
OCP\Share :: getItemsShared ( 'test' ),
'Failed asserting that the share of the test.txt file by user 2 has been removed.'
2013-09-23 18:16:48 +04:00
);
}
2014-01-21 15:07:08 +04:00
/**
* @ dataProvider checkPasswordProtectedShareDataProvider
* @ param $expected
* @ param $item
*/
public function testCheckPasswordProtectedShare ( $expected , $item ) {
2014-07-16 21:40:22 +04:00
\OC :: $server -> getSession () -> set ( 'public_link_authenticated' , 100 );
2014-01-21 15:07:08 +04:00
$result = \OCP\Share :: checkPasswordProtectedShare ( $item );
$this -> assertEquals ( $expected , $result );
}
function checkPasswordProtectedShareDataProvider () {
return array (
array ( true , array ()),
array ( true , array ( 'share_with' => null )),
array ( true , array ( 'share_with' => '' )),
array ( true , array ( 'share_with' => '1234567890' , 'share_type' => '1' )),
array ( true , array ( 'share_with' => '1234567890' , 'share_type' => 1 )),
array ( true , array ( 'share_with' => '1234567890' , 'share_type' => '3' , 'id' => 100 )),
array ( true , array ( 'share_with' => '1234567890' , 'share_type' => 3 , 'id' => 100 )),
array ( false , array ( 'share_with' => '1234567890' , 'share_type' => '3' , 'id' => 101 )),
array ( false , array ( 'share_with' => '1234567890' , 'share_type' => 3 , 'id' => 101 )),
);
2014-08-01 18:24:19 +04:00
}
2014-01-21 15:07:08 +04:00
2014-12-04 21:51:04 +03:00
/**
* @ dataProvider urls
*/
function testRemoveProtocolFromUrl ( $url , $expectedResult ) {
$share = new \OC\Share\Share ();
$result = \Test_Helper :: invokePrivate ( $share , 'removeProtocolFromUrl' , array ( $url ));
$this -> assertSame ( $expectedResult , $result );
}
function urls () {
return array (
array ( 'http://owncloud.org' , 'owncloud.org' ),
array ( 'https://owncloud.org' , 'owncloud.org' ),
array ( 'owncloud.org' , 'owncloud.org' ),
);
}
2015-04-27 23:07:35 +03:00
public function dataRemoteShareUrlCalls () {
return [
[ 'admin@localhost' , 'localhost' ],
[ 'admin@https://localhost' , 'localhost' ],
[ 'admin@http://localhost' , 'localhost' ],
[ 'admin@localhost/subFolder' , 'localhost/subFolder' ],
];
}
/**
* @ dataProvider dataRemoteShareUrlCalls
*
* @ param string $shareWith
* @ param string $urlHost
*/
public function testRemoteShareUrlCalls ( $shareWith , $urlHost ) {
$oldHttpHelper = \OC :: $server -> query ( 'HTTPHelper' );
$httpHelperMock = $this -> getMockBuilder ( 'OC\HttpHelper' )
-> disableOriginalConstructor ()
-> getMock ();
$this -> setHttpHelper ( $httpHelperMock );
$httpHelperMock -> expects ( $this -> at ( 0 ))
-> method ( 'post' )
-> with ( $this -> stringStartsWith ( 'https://' . $urlHost . '/ocs/v1.php/cloud/shares' ), $this -> anything ())
-> willReturn ([ 'success' => false , 'result' => 'Exception' ]);
$httpHelperMock -> expects ( $this -> at ( 1 ))
-> method ( 'post' )
-> with ( $this -> stringStartsWith ( 'http://' . $urlHost . '/ocs/v1.php/cloud/shares' ), $this -> anything ())
-> willReturn ([ 'success' => true , 'result' => json_encode ([ 'ocs' => [ 'meta' => [ 'statuscode' => 100 ]]])]);
2015-04-28 15:56:13 +03:00
\OCP\Share :: shareItem ( 'test' , 'test.txt' , \OCP\Share :: SHARE_TYPE_REMOTE , $shareWith , \OCP\Constants :: PERMISSION_READ );
$shares = \OCP\Share :: getItemShared ( 'test' , 'test.txt' );
$share = array_shift ( $shares );
$httpHelperMock -> expects ( $this -> at ( 0 ))
2015-04-27 23:07:35 +03:00
-> method ( 'post' )
2015-04-28 15:56:13 +03:00
-> with ( $this -> stringStartsWith ( 'https://' . $urlHost . '/ocs/v1.php/cloud/shares/' . $share [ 'id' ] . '/unshare' ), $this -> anything ())
2015-04-27 23:07:35 +03:00
-> willReturn ([ 'success' => false , 'result' => 'Exception' ]);
2015-04-28 15:56:13 +03:00
$httpHelperMock -> expects ( $this -> at ( 1 ))
2015-04-27 23:07:35 +03:00
-> method ( 'post' )
2015-04-28 15:56:13 +03:00
-> with ( $this -> stringStartsWith ( 'http://' . $urlHost . '/ocs/v1.php/cloud/shares/' . $share [ 'id' ] . '/unshare' ), $this -> anything ())
2015-04-27 23:07:35 +03:00
-> willReturn ([ 'success' => true , 'result' => json_encode ([ 'ocs' => [ 'meta' => [ 'statuscode' => 100 ]]])]);
\OCP\Share :: unshare ( 'test' , 'test.txt' , \OCP\Share :: SHARE_TYPE_REMOTE , $shareWith );
$this -> setHttpHelper ( $oldHttpHelper );
}
2014-08-01 18:24:19 +04:00
/**
* @ dataProvider dataProviderTestGroupItems
2015-04-27 23:07:35 +03:00
* @ param array $ungrouped
* @ param array $grouped
2014-08-01 18:24:19 +04:00
*/
function testGroupItems ( $ungrouped , $grouped ) {
2014-01-21 15:07:08 +04:00
2014-08-01 18:24:19 +04:00
$result = DummyShareClass :: groupItemsTest ( $ungrouped );
2014-01-21 15:07:08 +04:00
2014-08-01 18:24:19 +04:00
$this -> compareArrays ( $grouped , $result );
}
function compareArrays ( $result , $expectedResult ) {
foreach ( $expectedResult as $key => $value ) {
if ( is_array ( $value )) {
$this -> compareArrays ( $result [ $key ], $value );
} else {
$this -> assertSame ( $value , $result [ $key ]);
}
2014-01-21 15:07:08 +04:00
}
2014-08-01 18:24:19 +04:00
}
function dataProviderTestGroupItems () {
return array (
// one array with one share
array (
array ( // input
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_ALL , 'item_target' => 't1' )),
2014-08-01 18:24:19 +04:00
array ( // expected result
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_ALL , 'item_target' => 't1' ))),
2014-08-01 18:24:19 +04:00
// two shares both point to the same source
array (
array ( // input
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_READ , 'item_target' => 't1' ),
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_UPDATE , 'item_target' => 't1' ),
2014-08-01 18:24:19 +04:00
),
array ( // expected result
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_UPDATE , 'item_target' => 't1' ,
2014-08-01 18:24:19 +04:00
'grouped' => array (
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_READ , 'item_target' => 't1' ),
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_UPDATE , 'item_target' => 't1' ),
2014-08-01 18:24:19 +04:00
)
),
)
),
// two shares both point to the same source but with different targets
array (
array ( // input
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_READ , 'item_target' => 't1' ),
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_UPDATE , 'item_target' => 't2' ),
2014-08-01 18:24:19 +04:00
),
array ( // expected result
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_READ , 'item_target' => 't1' ),
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_UPDATE , 'item_target' => 't2' ),
2014-08-01 18:24:19 +04:00
)
),
// three shares two point to the same source
array (
array ( // input
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_READ , 'item_target' => 't1' ),
array ( 'item_source' => 2 , 'permissions' => \OCP\Constants :: PERMISSION_CREATE , 'item_target' => 't2' ),
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_UPDATE , 'item_target' => 't1' ),
2014-08-01 18:24:19 +04:00
),
array ( // expected result
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_UPDATE , 'item_target' => 't1' ,
2014-08-01 18:24:19 +04:00
'grouped' => array (
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_READ , 'item_target' => 't1' ),
array ( 'item_source' => 1 , 'permissions' => \OCP\Constants :: PERMISSION_UPDATE , 'item_target' => 't1' ),
2014-08-01 18:24:19 +04:00
)
),
2014-11-25 18:28:41 +03:00
array ( 'item_source' => 2 , 'permissions' => \OCP\Constants :: PERMISSION_CREATE , 'item_target' => 't2' ),
2014-08-01 18:24:19 +04:00
)
),
);
}
2015-03-19 12:47:09 +03:00
/**
* Ensure that we do not allow removing a an expiration date from a link share if this
* is enforced by the settings .
*/
public function testClearExpireDateWhileEnforced () {
OC_User :: setUserId ( $this -> user1 );
\OC_Appconfig :: setValue ( 'core' , 'shareapi_default_expire_date' , 'yes' );
\OC_Appconfig :: setValue ( 'core' , 'shareapi_expire_after_n_days' , '2' );
\OC_Appconfig :: setValue ( 'core' , 'shareapi_enforce_expire_date' , 'yes' );
$token = OCP\Share :: shareItem ( 'test' , 'test.txt' , OCP\Share :: SHARE_TYPE_LINK , null , \OCP\Constants :: PERMISSION_READ );
$this -> assertInternalType (
'string' ,
$token ,
'Failed asserting that user 1 successfully shared text.txt as link with token.'
);
$setExpireDateFailed = false ;
try {
$this -> assertTrue (
OCP\Share :: setExpirationDate ( 'test' , 'test.txt' , '' , '' ),
'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
);
} catch ( \Exception $e ) {
$setExpireDateFailed = true ;
}
$this -> assertTrue ( $setExpireDateFailed );
\OC_Appconfig :: deleteKey ( 'core' , 'shareapi_default_expire_date' );
\OC_Appconfig :: deleteKey ( 'core' , 'shareapi_expire_after_n_days' );
\OC_Appconfig :: deleteKey ( 'core' , 'shareapi_enforce_expire_date' );
}
2015-03-13 14:29:13 +03:00
/**
* Cannot set password is there is no user
*
* @ expectedException Exception
* @ expectedExceptionMessage User not logged in
*/
public function testSetPasswordNoUser () {
$userSession = $this -> getMockBuilder ( '\OCP\IUserSession' )
-> disableOriginalConstructor ()
-> getMock ();
$connection = $this -> getMockBuilder ( '\OC\DB\Connection' )
-> disableOriginalConstructor ()
-> getMock ();
$config = $this -> getMockBuilder ( '\OCP\IConfig' )
-> disableOriginalConstructor ()
-> getMock ();
\OC\Share\Share :: setPassword ( $userSession , $connection , $config , 1 , 'pass' );
}
2015-04-28 15:00:36 +03:00
public function testPasswords () {
$pass = 'secret' ;
$this -> shareUserTestFileAsLink ();
$userSession = \OC :: $server -> getUserSession ();
$connection = \OC :: $server -> getDatabaseConnection ();
$config = $this -> getMockBuilder ( '\OCP\IConfig' )
-> disableOriginalConstructor ()
-> getMock ();
// Find the share ID in the db
$qb = $connection -> createQueryBuilder ();
$qb -> select ( '`id`' )
-> from ( '`*PREFIX*share`' )
-> where ( '`item_type` = :type' )
-> andWhere ( '`item_source` = :source' )
-> andWhere ( '`uid_owner` = :owner' )
-> andWhere ( '`share_type` = :share_type' )
-> setParameter ( 'type' , 'test' )
-> setParameter ( 'source' , 'test.txt' )
-> setParameter ( 'owner' , $this -> user1 )
-> setParameter ( 'share_type' , \OCP\Share :: SHARE_TYPE_LINK );
$res = $qb -> execute () -> fetchAll ();
$this -> assertCount ( 1 , $res );
$id = $res [ 0 ][ 'id' ];
// Set password on share
$res = \OC\Share\Share :: setPassword ( $userSession , $connection , $config , $id , $pass );
$this -> assertTrue ( $res );
// Fetch the hash from the database
$qb = $connection -> createQueryBuilder ();
$qb -> select ( '`share_with`' )
-> from ( '`*PREFIX*share`' )
-> where ( '`id` = :id' )
-> setParameter ( 'id' , $id );
$hash = $qb -> execute () -> fetch ()[ 'share_with' ];
$hasher = \OC :: $server -> getHasher ();
// Verify hash
$this -> assertTrue ( $hasher -> verify ( $pass , $hash ));
}
2015-03-13 14:29:13 +03:00
/**
* Test setting a password when everything is fine
*/
public function testSetPassword () {
$user = $this -> getMockBuilder ( '\OCP\IUser' )
-> disableOriginalConstructor ()
-> getMock ();
$user -> method ( 'getUID' ) -> willReturn ( 'user' );
$userSession = $this -> getMockBuilder ( '\OCP\IUserSession' )
-> disableOriginalConstructor ()
-> getMock ();
$userSession -> method ( 'getUser' ) -> willReturn ( $user );
$ex = $this -> getMockBuilder ( '\Doctrine\DBAL\Query\Expression\ExpressionBuilder' )
-> disableOriginalConstructor ()
-> getMock ();
$qb = $this -> getMockBuilder ( '\Doctrine\DBAL\Query\QueryBuilder' )
-> disableOriginalConstructor ()
-> getMock ();
$qb -> method ( 'update' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'set' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'where' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'andWhere' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'select' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'from' ) -> will ( $this -> returnSelf ());
2015-03-30 22:18:24 +03:00
$qb -> method ( 'setParameter' ) -> will ( $this -> returnSelf ());
2015-03-13 14:29:13 +03:00
$qb -> method ( 'expr' ) -> willReturn ( $ex );
$ret = $this -> getMockBuilder ( '\Doctrine\DBAL\Driver\ResultStatement' )
-> disableOriginalConstructor ()
-> getMock ();
$ret -> method ( 'fetch' ) -> willReturn ([ 'uid_owner' => 'user' ]);
$qb -> method ( 'execute' ) -> willReturn ( $ret );
$connection = $this -> getMockBuilder ( '\OC\DB\Connection' )
-> disableOriginalConstructor ()
-> getMock ();
$connection -> method ( 'createQueryBuilder' ) -> willReturn ( $qb );
$config = $this -> getMockBuilder ( '\OCP\IConfig' )
-> disableOriginalConstructor ()
-> getMock ();
$res = \OC\Share\Share :: setPassword ( $userSession , $connection , $config , 1 , 'pass' );
$this -> assertTrue ( $res );
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Cannot remove password
*
* Test removing a password when password is enforced
*/
public function testSetPasswordRemove () {
$user = $this -> getMockBuilder ( '\OCP\IUser' )
-> disableOriginalConstructor ()
-> getMock ();
$user -> method ( 'getUID' ) -> willReturn ( 'user' );
$userSession = $this -> getMockBuilder ( '\OCP\IUserSession' )
-> disableOriginalConstructor ()
-> getMock ();
$userSession -> method ( 'getUser' ) -> willReturn ( $user );
$ex = $this -> getMockBuilder ( '\Doctrine\DBAL\Query\Expression\ExpressionBuilder' )
-> disableOriginalConstructor ()
-> getMock ();
$qb = $this -> getMockBuilder ( '\Doctrine\DBAL\Query\QueryBuilder' )
-> disableOriginalConstructor ()
-> getMock ();
$qb -> method ( 'update' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'select' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'from' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'set' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'where' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'andWhere' ) -> will ( $this -> returnSelf ());
2015-03-30 22:18:24 +03:00
$qb -> method ( 'setParameter' ) -> will ( $this -> returnSelf ());
2015-03-13 14:29:13 +03:00
$qb -> method ( 'expr' ) -> willReturn ( $ex );
$ret = $this -> getMockBuilder ( '\Doctrine\DBAL\Driver\ResultStatement' )
-> disableOriginalConstructor ()
-> getMock ();
$ret -> method ( 'fetch' ) -> willReturn ([ 'uid_owner' => 'user' ]);
$qb -> method ( 'execute' ) -> willReturn ( $ret );
$connection = $this -> getMockBuilder ( '\OC\DB\Connection' )
-> disableOriginalConstructor ()
-> getMock ();
$connection -> method ( 'createQueryBuilder' ) -> willReturn ( $qb );
$config = $this -> getMockBuilder ( '\OCP\IConfig' )
-> disableOriginalConstructor ()
-> getMock ();
$config -> method ( 'getAppValue' ) -> willReturn ( 'yes' );
\OC\Share\Share :: setPassword ( $userSession , $connection , $config , 1 , '' );
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Share not found
*
* Test modification of invaid share
*/
public function testSetPasswordInvalidShare () {
$user = $this -> getMockBuilder ( '\OCP\IUser' )
-> disableOriginalConstructor ()
-> getMock ();
$user -> method ( 'getUID' ) -> willReturn ( 'user' );
$userSession = $this -> getMockBuilder ( '\OCP\IUserSession' )
-> disableOriginalConstructor ()
-> getMock ();
$userSession -> method ( 'getUser' ) -> willReturn ( $user );
$ex = $this -> getMockBuilder ( '\Doctrine\DBAL\Query\Expression\ExpressionBuilder' )
-> disableOriginalConstructor ()
-> getMock ();
$qb = $this -> getMockBuilder ( '\Doctrine\DBAL\Query\QueryBuilder' )
-> disableOriginalConstructor ()
-> getMock ();
$qb -> method ( 'update' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'set' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'where' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'andWhere' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'select' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'from' ) -> will ( $this -> returnSelf ());
2015-03-30 22:18:24 +03:00
$qb -> method ( 'setParameter' ) -> will ( $this -> returnSelf ());
2015-03-13 14:29:13 +03:00
$qb -> method ( 'expr' ) -> willReturn ( $ex );
$ret = $this -> getMockBuilder ( '\Doctrine\DBAL\Driver\ResultStatement' )
-> disableOriginalConstructor ()
-> getMock ();
$ret -> method ( 'fetch' ) -> willReturn ([]);
$qb -> method ( 'execute' ) -> willReturn ( $ret );
$connection = $this -> getMockBuilder ( '\OC\DB\Connection' )
-> disableOriginalConstructor ()
-> getMock ();
$connection -> method ( 'createQueryBuilder' ) -> willReturn ( $qb );
$config = $this -> getMockBuilder ( '\OCP\IConfig' )
-> disableOriginalConstructor ()
-> getMock ();
\OC\Share\Share :: setPassword ( $userSession , $connection , $config , 1 , 'pass' );
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Cannot update share of a different user
*
* Test modification of share of another user
*/
public function testSetPasswordShareOtherUser () {
$user = $this -> getMockBuilder ( '\OCP\IUser' )
-> disableOriginalConstructor ()
-> getMock ();
$user -> method ( 'getUID' ) -> willReturn ( 'user' );
$userSession = $this -> getMockBuilder ( '\OCP\IUserSession' )
-> disableOriginalConstructor ()
-> getMock ();
$userSession -> method ( 'getUser' ) -> willReturn ( $user );
$ex = $this -> getMockBuilder ( '\Doctrine\DBAL\Query\Expression\ExpressionBuilder' )
-> disableOriginalConstructor ()
-> getMock ();
$qb = $this -> getMockBuilder ( '\Doctrine\DBAL\Query\QueryBuilder' )
-> disableOriginalConstructor ()
-> getMock ();
$qb -> method ( 'update' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'set' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'where' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'andWhere' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'select' ) -> will ( $this -> returnSelf ());
$qb -> method ( 'from' ) -> will ( $this -> returnSelf ());
2015-03-30 22:18:24 +03:00
$qb -> method ( 'setParameter' ) -> will ( $this -> returnSelf ());
2015-03-13 14:29:13 +03:00
$qb -> method ( 'expr' ) -> willReturn ( $ex );
$ret = $this -> getMockBuilder ( '\Doctrine\DBAL\Driver\ResultStatement' )
-> disableOriginalConstructor ()
-> getMock ();
$ret -> method ( 'fetch' ) -> willReturn ([ 'uid_owner' => 'user2' ]);
$qb -> method ( 'execute' ) -> willReturn ( $ret );
$connection = $this -> getMockBuilder ( '\OC\DB\Connection' )
-> disableOriginalConstructor ()
-> getMock ();
$connection -> method ( 'createQueryBuilder' ) -> willReturn ( $qb );
$config = $this -> getMockBuilder ( '\OCP\IConfig' )
-> disableOriginalConstructor ()
-> getMock ();
\OC\Share\Share :: setPassword ( $userSession , $connection , $config , 1 , 'pass' );
}
2014-08-01 18:24:19 +04:00
}
class DummyShareClass extends \OC\Share\Share {
public static function groupItemsTest ( $items ) {
return parent :: groupItems ( $items , 'test' );
2014-01-21 15:07:08 +04:00
}
2012-07-26 01:08:18 +04:00
}
2015-02-09 15:12:34 +03:00
class DummyHookListener {
static $shareType = null ;
public static function listen ( $params ) {
self :: $shareType = $params [ 'shareType' ];
}
}