2015-10-30 15:10:08 +03:00
< ? php
/**
* @ author Roeland Jago Douma < rullzer @ owncloud . com >
*
* @ copyright Copyright ( c ) 2015 , ownCloud , Inc .
* @ license AGPL - 3.0
*
* This code is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License , version 3 ,
* as published by the Free Software Foundation .
*
* This program 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 , version 3 ,
* along with this program . If not , see < http :// www . gnu . org / licenses />
*
*/
namespace Test\Share20 ;
2016-02-04 14:51:23 +03:00
use OCP\Files\IRootFolder ;
2016-02-02 23:02:09 +03:00
use OCP\IUserManager ;
2016-02-05 14:59:46 +03:00
use OCP\Share\Exceptions\ShareNotFound ;
2016-01-27 14:13:53 +03:00
use OCP\Share\IProviderFactory ;
use OCP\Share\IShare ;
2015-10-30 15:10:08 +03:00
use OC\Share20\Manager ;
use OC\Share20\Exception ;
2016-01-25 14:09:56 +03:00
use OC\Share20\Share ;
2016-01-05 14:50:00 +03:00
use OCP\IL10N ;
2015-10-30 15:10:08 +03:00
use OCP\ILogger ;
2015-12-15 11:54:12 +03:00
use OCP\IConfig ;
2016-01-27 14:13:53 +03:00
use OCP\Share\IShareProvider ;
2015-12-15 11:54:12 +03:00
use OCP\Security\ISecureRandom ;
use OCP\Security\IHasher ;
use OCP\Files\Mount\IMountManager ;
use OCP\IGroupManager ;
2015-10-30 15:10:08 +03:00
2015-12-15 11:54:12 +03:00
/**
* Class ManagerTest
*
* @ package Test\Share20
* @ group DB
*/
2015-10-30 15:10:08 +03:00
class ManagerTest extends \Test\TestCase {
/** @var Manager */
protected $manager ;
/** @var ILogger */
protected $logger ;
2015-12-15 11:54:12 +03:00
/** @var IConfig */
protected $config ;
/** @var ISecureRandom */
protected $secureRandom ;
/** @var IHasher */
protected $hasher ;
2016-01-25 15:09:50 +03:00
/** @var IShareProvider | \PHPUnit_Framework_MockObject_MockObject */
2015-10-30 15:10:08 +03:00
protected $defaultProvider ;
2015-12-15 11:54:12 +03:00
/** @var IMountManager */
protected $mountManager ;
/** @var IGroupManager */
protected $groupManager ;
2016-01-05 14:50:00 +03:00
/** @var IL10N */
protected $l ;
2016-01-13 16:21:55 +03:00
/** @var DummyFactory */
2016-01-11 12:30:03 +03:00
protected $factory ;
2016-02-02 23:02:09 +03:00
/** @var IUserManager */
protected $userManager ;
2016-02-04 14:51:23 +03:00
/** @var IRootFolder | \PHPUnit_Framework_MockObject_MockObject */
protected $rootFolder ;
2016-02-02 23:02:09 +03:00
2015-10-30 15:10:08 +03:00
public function setUp () {
$this -> logger = $this -> getMock ( '\OCP\ILogger' );
2015-12-15 11:54:12 +03:00
$this -> config = $this -> getMock ( '\OCP\IConfig' );
$this -> secureRandom = $this -> getMock ( '\OCP\Security\ISecureRandom' );
$this -> hasher = $this -> getMock ( '\OCP\Security\IHasher' );
$this -> mountManager = $this -> getMock ( '\OCP\Files\Mount\IMountManager' );
$this -> groupManager = $this -> getMock ( '\OCP\IGroupManager' );
2016-02-02 23:02:09 +03:00
$this -> userManager = $this -> getMock ( '\OCP\IUserManager' );
2016-02-04 14:51:23 +03:00
$this -> rootFolder = $this -> getMock ( '\OCP\Files\IRootFolder' );
2015-10-30 15:10:08 +03:00
2016-01-05 14:50:00 +03:00
$this -> l = $this -> getMock ( '\OCP\IL10N' );
$this -> l -> method ( 't' )
-> will ( $this -> returnCallback ( function ( $text , $parameters = []) {
return vsprintf ( $text , $parameters );
}));
2016-01-20 10:30:37 +03:00
$this -> factory = new DummyFactory ( \OC :: $server );
2016-01-11 12:30:03 +03:00
2015-10-30 15:10:08 +03:00
$this -> manager = new Manager (
$this -> logger ,
2015-12-15 11:54:12 +03:00
$this -> config ,
$this -> secureRandom ,
$this -> hasher ,
$this -> mountManager ,
2016-01-05 14:50:00 +03:00
$this -> groupManager ,
2016-01-11 12:30:03 +03:00
$this -> l ,
2016-02-02 23:02:09 +03:00
$this -> factory ,
2016-02-04 14:51:23 +03:00
$this -> userManager ,
$this -> rootFolder
2015-10-30 15:10:08 +03:00
);
2016-01-11 12:30:03 +03:00
2016-01-27 14:13:53 +03:00
$this -> defaultProvider = $this -> getMockBuilder ( '\OC\Share20\DefaultShareProvider' )
-> disableOriginalConstructor ()
-> getMock ();
2016-01-13 15:02:23 +03:00
$this -> defaultProvider -> method ( 'identifier' ) -> willReturn ( 'default' );
2016-01-13 16:21:55 +03:00
$this -> factory -> setProvider ( $this -> defaultProvider );
2016-01-11 12:30:03 +03:00
}
/**
* @ return \PHPUnit_Framework_MockObject_MockBuilder
*/
private function createManagerMock () {
return $this -> getMockBuilder ( '\OC\Share20\Manager' )
-> setConstructorArgs ([
$this -> logger ,
$this -> config ,
$this -> secureRandom ,
$this -> hasher ,
$this -> mountManager ,
$this -> groupManager ,
$this -> l ,
2016-02-02 23:02:09 +03:00
$this -> factory ,
2016-02-04 14:51:23 +03:00
$this -> userManager ,
$this -> rootFolder
2016-01-11 12:30:03 +03:00
]);
}
2015-10-30 15:10:08 +03:00
/**
2016-02-11 13:21:12 +03:00
* @ expectedException \InvalidArgumentException
2015-10-30 15:10:08 +03:00
*/
public function testDeleteNoShareId () {
2016-02-11 13:21:12 +03:00
$share = $this -> manager -> newShare ();
2015-10-30 15:10:08 +03:00
$this -> manager -> deleteShare ( $share );
}
2015-11-10 16:14:49 +03:00
public function dataTestDelete () {
$user = $this -> getMock ( '\OCP\IUser' );
$user -> method ( 'getUID' ) -> willReturn ( 'sharedWithUser' );
$group = $this -> getMock ( '\OCP\IGroup' );
$group -> method ( 'getGID' ) -> willReturn ( 'sharedWithGroup' );
return [
2016-02-02 23:02:09 +03:00
[ \OCP\Share :: SHARE_TYPE_USER , 'sharedWithUser' ],
[ \OCP\Share :: SHARE_TYPE_GROUP , 'sharedWithGroup' ],
[ \OCP\Share :: SHARE_TYPE_LINK , '' ],
[ \OCP\Share :: SHARE_TYPE_REMOTE , 'foo@bar.com' ],
2015-11-10 16:14:49 +03:00
];
}
/**
* @ dataProvider dataTestDelete
*/
2016-02-02 23:02:09 +03:00
public function testDelete ( $shareType , $sharedWith ) {
2016-01-11 12:30:03 +03:00
$manager = $this -> createManagerMock ()
2015-11-10 16:14:49 +03:00
-> setMethods ([ 'getShareById' , 'deleteChildren' ])
-> getMock ();
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> method ( 'getId' ) -> willReturn ( 1 );
2016-01-27 22:51:26 +03:00
$share = $this -> manager -> newShare ();
$share -> setId ( 42 )
-> setProviderId ( 'prov' )
-> setShareType ( $shareType )
-> setSharedWith ( $sharedWith )
2016-02-02 23:02:09 +03:00
-> setSharedBy ( 'sharedBy' )
2016-01-27 22:51:26 +03:00
-> setNode ( $path )
-> setTarget ( 'myTarget' );
2015-11-10 16:14:49 +03:00
$manager -> expects ( $this -> once ()) -> method ( 'deleteChildren' ) -> with ( $share );
2015-10-30 15:10:08 +03:00
2016-01-13 16:21:55 +03:00
$this -> defaultProvider
2015-10-30 15:10:08 +03:00
-> expects ( $this -> once ())
-> method ( 'delete' )
-> with ( $share );
2015-11-10 16:14:49 +03:00
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'pre' , 'post' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'pre_unshare' , $hookListner , 'pre' );
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_unshare' , $hookListner , 'post' );
$hookListnerExpectsPre = [
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => $shareType ,
2016-02-02 23:02:09 +03:00
'shareWith' => $sharedWith ,
2015-11-10 16:14:49 +03:00
'itemparent' => null ,
'uidOwner' => 'sharedBy' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget' ,
];
$hookListnerExpectsPost = [
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => $shareType ,
2016-02-02 23:02:09 +03:00
'shareWith' => $sharedWith ,
2015-11-10 16:14:49 +03:00
'itemparent' => null ,
'uidOwner' => 'sharedBy' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget' ,
'deletedShares' => [
[
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => $shareType ,
2016-02-02 23:02:09 +03:00
'shareWith' => $sharedWith ,
2015-11-10 16:14:49 +03:00
'itemparent' => null ,
'uidOwner' => 'sharedBy' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget' ,
],
],
];
2016-02-04 16:28:09 +03:00
$hookListner
-> expects ( $this -> exactly ( 1 ))
-> method ( 'pre' )
-> with ( $hookListnerExpectsPre );
$hookListner
-> expects ( $this -> exactly ( 1 ))
-> method ( 'post' )
-> with ( $hookListnerExpectsPost );
$manager -> deleteShare ( $share );
}
public function testDeleteLazyShare () {
$manager = $this -> createManagerMock ()
-> setMethods ([ 'getShareById' , 'deleteChildren' ])
-> getMock ();
$share = $this -> manager -> newShare ();
$share -> setId ( 42 )
-> setProviderId ( 'prov' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
-> setSharedWith ( 'sharedWith' )
-> setSharedBy ( 'sharedBy' )
-> setShareOwner ( 'shareOwner' )
-> setTarget ( 'myTarget' )
-> setNodeId ( 1 )
-> setNodeType ( 'file' );
$this -> rootFolder -> expects ( $this -> never ()) -> method ( $this -> anything ());
$manager -> expects ( $this -> once ()) -> method ( 'deleteChildren' ) -> with ( $share );
$this -> defaultProvider
-> expects ( $this -> once ())
-> method ( 'delete' )
-> with ( $share );
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'pre' , 'post' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'pre_unshare' , $hookListner , 'pre' );
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_unshare' , $hookListner , 'post' );
$hookListnerExpectsPre = [
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => \OCP\Share :: SHARE_TYPE_USER ,
'shareWith' => 'sharedWith' ,
'itemparent' => null ,
'uidOwner' => 'sharedBy' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget' ,
];
$hookListnerExpectsPost = [
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => \OCP\Share :: SHARE_TYPE_USER ,
'shareWith' => 'sharedWith' ,
'itemparent' => null ,
'uidOwner' => 'sharedBy' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget' ,
'deletedShares' => [
[
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => \OCP\Share :: SHARE_TYPE_USER ,
'shareWith' => 'sharedWith' ,
'itemparent' => null ,
'uidOwner' => 'sharedBy' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget' ,
],
],
];
2015-11-10 16:14:49 +03:00
$hookListner
-> expects ( $this -> exactly ( 1 ))
-> method ( 'pre' )
-> with ( $hookListnerExpectsPre );
$hookListner
-> expects ( $this -> exactly ( 1 ))
-> method ( 'post' )
-> with ( $hookListnerExpectsPost );
$manager -> deleteShare ( $share );
}
public function testDeleteNested () {
2016-01-11 12:30:03 +03:00
$manager = $this -> createManagerMock ()
2015-11-10 16:14:49 +03:00
-> setMethods ([ 'getShareById' ])
-> getMock ();
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> method ( 'getId' ) -> willReturn ( 1 );
2016-01-27 22:51:26 +03:00
$share1 = $this -> manager -> newShare ();
$share1 -> setId ( 42 )
-> setProviderId ( 'prov' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
2016-02-02 23:02:09 +03:00
-> setSharedWith ( 'sharedWith1' )
-> setSharedBy ( 'sharedBy1' )
2016-01-27 22:51:26 +03:00
-> setNode ( $path )
-> setTarget ( 'myTarget1' );
$share2 = $this -> manager -> newShare ();
$share2 -> setId ( 43 )
-> setProviderId ( 'prov' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
2016-02-02 23:02:09 +03:00
-> setSharedWith ( 'sharedWith2' )
-> setSharedBy ( 'sharedBy2' )
2016-01-27 22:51:26 +03:00
-> setNode ( $path )
-> setTarget ( 'myTarget2' )
-> setParent ( 42 );
$share3 = $this -> manager -> newShare ();
$share3 -> setId ( 44 )
-> setProviderId ( 'prov' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_LINK )
2016-02-02 23:02:09 +03:00
-> setSharedBy ( 'sharedBy3' )
2016-01-27 22:51:26 +03:00
-> setNode ( $path )
-> setTarget ( 'myTarget3' )
-> setParent ( 43 );
2015-11-10 16:14:49 +03:00
2016-01-13 16:21:55 +03:00
$this -> defaultProvider
2015-11-10 16:14:49 +03:00
-> method ( 'getChildren' )
-> will ( $this -> returnValueMap ([
[ $share1 , [ $share2 ]],
[ $share2 , [ $share3 ]],
[ $share3 , []],
]));
$this -> defaultProvider
-> method ( 'delete' )
-> withConsecutive ( $share3 , $share2 , $share1 );
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'pre' , 'post' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'pre_unshare' , $hookListner , 'pre' );
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_unshare' , $hookListner , 'post' );
$hookListnerExpectsPre = [
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => \OCP\Share :: SHARE_TYPE_USER ,
'shareWith' => 'sharedWith1' ,
'itemparent' => null ,
'uidOwner' => 'sharedBy1' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget1' ,
];
$hookListnerExpectsPost = [
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => \OCP\Share :: SHARE_TYPE_USER ,
'shareWith' => 'sharedWith1' ,
'itemparent' => null ,
'uidOwner' => 'sharedBy1' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget1' ,
'deletedShares' => [
[
'id' => 44 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => \OCP\Share :: SHARE_TYPE_LINK ,
'shareWith' => '' ,
'itemparent' => 43 ,
'uidOwner' => 'sharedBy3' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget3' ,
],
[
'id' => 43 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => \OCP\Share :: SHARE_TYPE_GROUP ,
'shareWith' => 'sharedWith2' ,
'itemparent' => 42 ,
'uidOwner' => 'sharedBy2' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget2' ,
],
[
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => \OCP\Share :: SHARE_TYPE_USER ,
'shareWith' => 'sharedWith1' ,
'itemparent' => null ,
'uidOwner' => 'sharedBy1' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget1' ,
],
],
];
$hookListner
-> expects ( $this -> exactly ( 1 ))
-> method ( 'pre' )
-> with ( $hookListnerExpectsPre );
$hookListner
-> expects ( $this -> exactly ( 1 ))
-> method ( 'post' )
-> with ( $hookListnerExpectsPost );
$manager -> deleteShare ( $share1 );
}
public function testDeleteChildren () {
2016-01-11 12:30:03 +03:00
$manager = $this -> createManagerMock ()
2015-11-10 16:14:49 +03:00
-> setMethods ([ 'deleteShare' ])
-> getMock ();
2016-01-27 14:13:53 +03:00
$share = $this -> getMock ( '\OCP\Share\IShare' );
2016-01-13 15:02:23 +03:00
$share -> method ( 'getShareType' ) -> willReturn ( \OCP\Share :: SHARE_TYPE_USER );
2015-11-10 16:14:49 +03:00
2016-01-27 14:13:53 +03:00
$child1 = $this -> getMock ( '\OCP\Share\IShare' );
2016-01-13 15:02:23 +03:00
$child1 -> method ( 'getShareType' ) -> willReturn ( \OCP\Share :: SHARE_TYPE_USER );
2016-01-27 14:13:53 +03:00
$child2 = $this -> getMock ( '\OCP\Share\IShare' );
2016-01-13 15:02:23 +03:00
$child2 -> method ( 'getShareType' ) -> willReturn ( \OCP\Share :: SHARE_TYPE_USER );
2016-01-27 14:13:53 +03:00
$child3 = $this -> getMock ( '\OCP\Share\IShare' );
2016-01-13 15:02:23 +03:00
$child3 -> method ( 'getShareType' ) -> willReturn ( \OCP\Share :: SHARE_TYPE_USER );
2015-11-10 16:14:49 +03:00
$shares = [
$child1 ,
$child2 ,
$child3 ,
];
2016-01-13 16:21:55 +03:00
$this -> defaultProvider
2015-11-10 16:14:49 +03:00
-> expects ( $this -> exactly ( 4 ))
-> method ( 'getChildren' )
-> will ( $this -> returnCallback ( function ( $_share ) use ( $share , $shares ) {
if ( $_share === $share ) {
return $shares ;
}
return [];
}));
2016-01-13 16:21:55 +03:00
$this -> defaultProvider
2015-11-10 16:14:49 +03:00
-> expects ( $this -> exactly ( 3 ))
-> method ( 'delete' )
-> withConsecutive ( $child1 , $child2 , $child3 );
$result = $this -> invokePrivate ( $manager , 'deleteChildren' , [ $share ]);
$this -> assertSame ( $shares , $result );
2015-10-30 15:10:08 +03:00
}
2015-11-23 16:06:25 +03:00
public function testGetShareById () {
2016-01-27 14:13:53 +03:00
$share = $this -> getMock ( '\OCP\Share\IShare' );
2015-10-30 15:10:08 +03:00
$this -> defaultProvider
-> expects ( $this -> once ())
-> method ( 'getShareById' )
-> with ( 42 )
-> willReturn ( $share );
2016-01-13 15:02:23 +03:00
$this -> assertEquals ( $share , $this -> manager -> getShareById ( 'default:42' ));
2015-10-30 15:10:08 +03:00
}
2015-12-15 11:54:12 +03:00
2016-02-05 17:34:30 +03:00
/**
* @ expectedException \OCP\Share\Exceptions\ShareNotFound
*/
public function testGetExpiredShareById () {
$manager = $this -> createManagerMock ()
-> setMethods ([ 'deleteShare' ])
-> getMock ();
$date = new \DateTime ();
$date -> setTime ( 0 , 0 , 0 );
$share = $this -> manager -> newShare ();
$share -> setExpirationDate ( $date )
-> setShareType ( \OCP\Share :: SHARE_TYPE_LINK );
$this -> defaultProvider -> expects ( $this -> once ())
-> method ( 'getShareById' )
-> with ( '42' )
-> willReturn ( $share );
$manager -> expects ( $this -> once ())
-> method ( 'deleteShare' )
-> with ( $share );
$manager -> getShareById ( 'default:42' );
}
2015-12-15 11:54:12 +03:00
/**
* @ expectedException InvalidArgumentException
* @ expectedExceptionMessage Passwords are enforced for link shares
*/
public function testVerifyPasswordNullButEnforced () {
$this -> config -> method ( 'getAppValue' ) -> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_enforce_links_password' , 'no' , 'yes' ],
]));
$this -> invokePrivate ( $this -> manager , 'verifyPassword' , [ null ]);
}
public function testVerifyPasswordNull () {
$this -> config -> method ( 'getAppValue' ) -> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_enforce_links_password' , 'no' , 'no' ],
]));
$result = $this -> invokePrivate ( $this -> manager , 'verifyPassword' , [ null ]);
$this -> assertNull ( $result );
}
public function testVerifyPasswordHook () {
$this -> config -> method ( 'getAppValue' ) -> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_enforce_links_password' , 'no' , 'no' ],
]));
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'listner' ]) -> getMock ();
\OCP\Util :: connectHook ( '\OC\Share' , 'verifyPassword' , $hookListner , 'listner' );
$hookListner -> expects ( $this -> once ())
-> method ( 'listner' )
-> with ([
'password' => 'password' ,
'accepted' => true ,
'message' => ''
]);
$result = $this -> invokePrivate ( $this -> manager , 'verifyPassword' , [ 'password' ]);
$this -> assertNull ( $result );
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage password not accepted
*/
public function testVerifyPasswordHookFails () {
$this -> config -> method ( 'getAppValue' ) -> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_enforce_links_password' , 'no' , 'no' ],
]));
$dummy = new DummyPassword ();
\OCP\Util :: connectHook ( '\OC\Share' , 'verifyPassword' , $dummy , 'listner' );
$this -> invokePrivate ( $this -> manager , 'verifyPassword' , [ 'password' ]);
}
public function createShare ( $id , $type , $path , $sharedWith , $sharedBy , $shareOwner ,
$permissions , $expireDate = null , $password = null ) {
2016-01-27 14:13:53 +03:00
$share = $this -> getMock ( '\OCP\Share\IShare' );
2015-12-15 11:54:12 +03:00
$share -> method ( 'getShareType' ) -> willReturn ( $type );
$share -> method ( 'getSharedWith' ) -> willReturn ( $sharedWith );
$share -> method ( 'getSharedBy' ) -> willReturn ( $sharedBy );
$share -> method ( 'getSharedOwner' ) -> willReturn ( $shareOwner );
2016-01-27 22:51:26 +03:00
$share -> method ( 'getNode' ) -> willReturn ( $path );
2015-12-15 11:54:12 +03:00
$share -> method ( 'getPermissions' ) -> willReturn ( $permissions );
$share -> method ( 'getExpirationDate' ) -> willReturn ( $expireDate );
$share -> method ( 'getPassword' ) -> willReturn ( $password );
return $share ;
}
public function dataGeneralChecks () {
2016-02-02 23:02:09 +03:00
$user0 = 'user0' ;
$user2 = 'user1' ;
$group0 = 'group0' ;
2015-12-15 11:54:12 +03:00
$file = $this -> getMock ( '\OCP\Files\File' );
$node = $this -> getMock ( '\OCP\Files\Node' );
$data = [
2016-02-02 23:02:09 +03:00
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $file , null , $user0 , $user0 , 31 , null , null ), 'SharedWith is not a valid user' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $file , $group0 , $user0 , $user0 , 31 , null , null ), 'SharedWith is not a valid user' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $file , 'foo@bar.com' , $user0 , $user0 , 31 , null , null ), 'SharedWith is not a valid user' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $file , null , $user0 , $user0 , 31 , null , null ), 'SharedWith is not a valid group' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $file , $user2 , $user0 , $user0 , 31 , null , null ), 'SharedWith is not a valid group' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $file , 'foo@bar.com' , $user0 , $user0 , 31 , null , null ), 'SharedWith is not a valid group' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $file , $user2 , $user0 , $user0 , 31 , null , null ), 'SharedWith should be empty' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $file , $group0 , $user0 , $user0 , 31 , null , null ), 'SharedWith should be empty' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $file , 'foo@bar.com' , $user0 , $user0 , 31 , null , null ), 'SharedWith should be empty' , true ],
[ $this -> createShare ( null , - 1 , $file , null , $user0 , $user0 , 31 , null , null ), 'unkown share type' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $file , $user2 , null , $user0 , 31 , null , null ), 'SharedBy should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $file , $group0 , null , $user0 , 31 , null , null ), 'SharedBy should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $file , null , null , $user0 , 31 , null , null ), 'SharedBy should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $file , $user0 , $user0 , $user0 , 31 , null , null ), 'Can\'t share with yourself' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , null , $user2 , $user0 , $user0 , 31 , null , null ), 'Path should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , null , $group0 , $user0 , $user0 , 31 , null , null ), 'Path should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , null , null , $user0 , $user0 , 31 , null , null ), 'Path should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $node , $user2 , $user0 , $user0 , 31 , null , null ), 'Path should be either a file or a folder' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $node , $group0 , $user0 , $user0 , 31 , null , null ), 'Path should be either a file or a folder' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $node , null , $user0 , $user0 , 31 , null , null ), 'Path should be either a file or a folder' , true ],
2015-12-15 11:54:12 +03:00
];
$nonShareAble = $this -> getMock ( '\OCP\Files\Folder' );
$nonShareAble -> method ( 'isShareable' ) -> willReturn ( false );
2016-01-06 13:34:12 +03:00
$nonShareAble -> method ( 'getPath' ) -> willReturn ( 'path' );
2015-12-15 11:54:12 +03:00
2016-02-02 23:02:09 +03:00
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $nonShareAble , $user2 , $user0 , $user0 , 31 , null , null ), 'You are not allowed to share path' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $nonShareAble , $group0 , $user0 , $user0 , 31 , null , null ), 'You are not allowed to share path' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $nonShareAble , null , $user0 , $user0 , 31 , null , null ), 'You are not allowed to share path' , true ];
2015-12-15 11:54:12 +03:00
$limitedPermssions = $this -> getMock ( '\OCP\Files\File' );
$limitedPermssions -> method ( 'isShareable' ) -> willReturn ( true );
$limitedPermssions -> method ( 'getPermissions' ) -> willReturn ( \OCP\Constants :: PERMISSION_READ );
2016-01-06 13:34:12 +03:00
$limitedPermssions -> method ( 'getPath' ) -> willReturn ( 'path' );
2015-12-15 11:54:12 +03:00
2016-02-02 23:02:09 +03:00
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $limitedPermssions , $user2 , $user0 , $user0 , null , null , null ), 'A share requires permissions' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $limitedPermssions , $group0 , $user0 , $user0 , null , null , null ), 'A share requires permissions' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $limitedPermssions , null , $user0 , $user0 , null , null , null ), 'A share requires permissions' , true ];
2015-12-15 11:54:12 +03:00
2016-03-30 14:33:16 +03:00
$mount = $this -> getMock ( 'OC\Files\Mount\MoveableMount' );
$limitedPermssions -> method ( 'getMountPoint' ) -> willReturn ( $mount );
2016-02-02 23:02:09 +03:00
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $limitedPermssions , $user2 , $user0 , $user0 , 31 , null , null ), 'Cannot increase permissions of path' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $limitedPermssions , $group0 , $user0 , $user0 , 17 , null , null ), 'Cannot increase permissions of path' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $limitedPermssions , null , $user0 , $user0 , 3 , null , null ), 'Cannot increase permissions of path' , true ];
2015-12-15 11:54:12 +03:00
2016-03-30 14:33:16 +03:00
$nonMoveableMountPermssions = $this -> getMock ( '\OCP\Files\File' );
$nonMoveableMountPermssions -> method ( 'isShareable' ) -> willReturn ( true );
$nonMoveableMountPermssions -> method ( 'getPermissions' ) -> willReturn ( \OCP\Constants :: PERMISSION_READ );
$nonMoveableMountPermssions -> method ( 'getPath' ) -> willReturn ( 'path' );
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $nonMoveableMountPermssions , $user2 , $user0 , $user0 , 11 , null , null ), 'Cannot increase permissions of path' , false ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $nonMoveableMountPermssions , $group0 , $user0 , $user0 , 11 , null , null ), 'Cannot increase permissions of path' , false ];
2016-02-26 18:05:32 +03:00
$rootFolder = $this -> getMock ( '\OCP\Files\Folder' );
$rootFolder -> method ( 'isShareable' ) -> willReturn ( true );
$rootFolder -> method ( 'getPermissions' ) -> willReturn ( \OCP\Constants :: PERMISSION_ALL );
$rootFolder -> method ( 'getPath' ) -> willReturn ( 'myrootfolder' );
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $rootFolder , $user2 , $user0 , $user0 , 30 , null , null ), 'You can\'t share your root folder' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $rootFolder , $group0 , $user0 , $user0 , 2 , null , null ), 'You can\'t share your root folder' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $rootFolder , null , $user0 , $user0 , 16 , null , null ), 'You can\'t share your root folder' , true ];
2015-12-15 11:54:12 +03:00
$allPermssions = $this -> getMock ( '\OCP\Files\Folder' );
$allPermssions -> method ( 'isShareable' ) -> willReturn ( true );
$allPermssions -> method ( 'getPermissions' ) -> willReturn ( \OCP\Constants :: PERMISSION_ALL );
2016-02-02 23:02:09 +03:00
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $allPermssions , $user2 , $user0 , $user0 , 30 , null , null ), 'Shares need at least read permissions' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $allPermssions , $group0 , $user0 , $user0 , 2 , null , null ), 'Shares need at least read permissions' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $allPermssions , null , $user0 , $user0 , 16 , null , null ), 'Shares need at least read permissions' , true ];
2015-12-15 11:54:12 +03:00
2016-02-02 23:02:09 +03:00
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $allPermssions , $user2 , $user0 , $user0 , 31 , null , null ), null , false ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $allPermssions , $group0 , $user0 , $user0 , 3 , null , null ), null , false ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $allPermssions , null , $user0 , $user0 , 17 , null , null ), null , false ];
2015-12-15 11:54:12 +03:00
return $data ;
}
/**
* @ dataProvider dataGeneralChecks
*
* @ param $share
* @ param $exceptionMessage
*/
public function testGeneralChecks ( $share , $exceptionMessage , $exception ) {
$thrown = null ;
2016-02-02 23:02:09 +03:00
$this -> userManager -> method ( 'userExists' ) -> will ( $this -> returnValueMap ([
[ 'user0' , true ],
[ 'user1' , true ],
]));
$this -> groupManager -> method ( 'groupExists' ) -> will ( $this -> returnValueMap ([
[ 'group0' , true ],
]));
2016-02-25 22:22:35 +03:00
$userFolder = $this -> getMock ( '\OCP\Files\Folder' );
2016-02-26 18:05:32 +03:00
$userFolder -> method ( 'getPath' ) -> willReturn ( 'myrootfolder' );
2016-02-25 22:22:35 +03:00
$this -> rootFolder -> method ( 'getUserFolder' ) -> willReturn ( $userFolder );
2016-02-26 18:05:32 +03:00
2015-12-15 11:54:12 +03:00
try {
$this -> invokePrivate ( $this -> manager , 'generalCreateChecks' , [ $share ]);
$thrown = false ;
2016-02-02 16:18:59 +03:00
} catch ( \OCP\Share\Exceptions\GenericShareException $e ) {
2016-01-06 13:34:12 +03:00
$this -> assertEquals ( $exceptionMessage , $e -> getHint ());
$thrown = true ;
2015-12-15 11:54:12 +03:00
} catch ( \InvalidArgumentException $e ) {
$this -> assertEquals ( $exceptionMessage , $e -> getMessage ());
$thrown = true ;
}
$this -> assertSame ( $exception , $thrown );
}
2016-02-25 22:22:35 +03:00
/**
* @ expectedException \InvalidArgumentException
* @ expectedExceptionMessage You can ' t share your root folder
*/
public function testGeneralCheckShareRoot () {
$thrown = null ;
$this -> userManager -> method ( 'userExists' ) -> will ( $this -> returnValueMap ([
[ 'user0' , true ],
[ 'user1' , true ],
]));
$userFolder = $this -> getMock ( '\OCP\Files\Folder' );
$userFolder -> method ( 'isSubNode' ) -> with ( $userFolder ) -> willReturn ( false );
$this -> rootFolder -> method ( 'getUserFolder' ) -> willReturn ( $userFolder );
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
-> setSharedWith ( 'user0' )
-> setSharedBy ( 'user1' )
-> setNode ( $userFolder );
$this -> invokePrivate ( $this -> manager , 'generalCreateChecks' , [ $share ]);
}
2015-12-15 11:54:12 +03:00
/**
2016-02-02 16:18:59 +03:00
* @ expectedException \OCP\Share\Exceptions\GenericShareException
2015-12-15 11:54:12 +03:00
* @ expectedExceptionMessage Expiration date is in the past
*/
2016-01-26 16:29:30 +03:00
public function testvalidateExpirationDateInPast () {
2015-12-15 11:54:12 +03:00
// Expire date in the past
$past = new \DateTime ();
$past -> sub ( new \DateInterval ( 'P1D' ));
2016-01-30 01:04:42 +03:00
$share = $this -> manager -> newShare ();
$share -> setExpirationDate ( $past );
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
2015-12-15 11:54:12 +03:00
}
/**
* @ expectedException InvalidArgumentException
* @ expectedExceptionMessage Expiration date is enforced
*/
2016-01-26 16:29:30 +03:00
public function testvalidateExpirationDateEnforceButNotSet () {
2016-01-30 01:04:42 +03:00
$share = $this -> manager -> newShare ();
2016-02-25 16:21:46 +03:00
$share -> setProviderId ( 'foo' ) -> setId ( 'bar' );
2016-01-30 01:04:42 +03:00
2015-12-15 11:54:12 +03:00
$this -> config -> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
2016-02-26 13:38:06 +03:00
[ 'core' , 'shareapi_default_expire_date' , 'no' , 'yes' ],
2015-12-15 11:54:12 +03:00
[ 'core' , 'shareapi_enforce_expire_date' , 'no' , 'yes' ],
]));
2016-01-30 01:04:42 +03:00
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
2015-12-15 11:54:12 +03:00
}
2016-02-26 13:38:06 +03:00
public function testvalidateExpirationDateEnforceButNotEnabledAndNotSet () {
$share = $this -> manager -> newShare ();
$share -> setProviderId ( 'foo' ) -> setId ( 'bar' );
$this -> config -> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_enforce_expire_date' , 'no' , 'yes' ],
]));
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
$this -> assertNull ( $share -> getExpirationDate ());
}
2016-02-25 16:21:46 +03:00
public function testvalidateExpirationDateEnforceButNotSetNewShare () {
$share = $this -> manager -> newShare ();
$this -> config -> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_enforce_expire_date' , 'no' , 'yes' ],
[ 'core' , 'shareapi_expire_after_n_days' , '7' , '3' ],
[ 'core' , 'shareapi_default_expire_date' , 'no' , 'yes' ],
]));
$expected = new \DateTime ();
$expected -> setTime ( 0 , 0 , 0 );
$expected -> add ( new \DateInterval ( 'P3D' ));
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
$this -> assertNotNull ( $share -> getExpirationDate ());
$this -> assertEquals ( $expected , $share -> getExpirationDate ());
}
2016-01-26 16:29:30 +03:00
public function testvalidateExpirationDateEnforceToFarIntoFuture () {
2015-12-15 11:54:12 +03:00
// Expire date in the past
$future = new \DateTime ();
$future -> add ( new \DateInterval ( 'P7D' ));
2016-01-30 01:04:42 +03:00
$share = $this -> manager -> newShare ();
$share -> setExpirationDate ( $future );
2015-12-15 11:54:12 +03:00
$this -> config -> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_enforce_expire_date' , 'no' , 'yes' ],
[ 'core' , 'shareapi_expire_after_n_days' , '7' , '3' ],
]));
2016-01-05 14:50:00 +03:00
try {
2016-01-30 01:04:42 +03:00
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
2016-02-02 16:18:59 +03:00
} catch ( \OCP\Share\Exceptions\GenericShareException $e ) {
2016-01-05 14:50:00 +03:00
$this -> assertEquals ( 'Cannot set expiration date more than 3 days in the future' , $e -> getMessage ());
$this -> assertEquals ( 'Cannot set expiration date more than 3 days in the future' , $e -> getHint ());
$this -> assertEquals ( 404 , $e -> getCode ());
}
2015-12-15 11:54:12 +03:00
}
2016-01-26 16:29:30 +03:00
public function testvalidateExpirationDateEnforceValid () {
2015-12-15 11:54:12 +03:00
// Expire date in the past
$future = new \DateTime ();
$future -> add ( new \DateInterval ( 'P2D' ));
$future -> setTime ( 0 , 0 , 0 );
2016-01-30 01:04:42 +03:00
$expected = clone $future ;
2015-12-15 11:54:12 +03:00
$future -> setTime ( 1 , 2 , 3 );
2016-01-30 01:04:42 +03:00
$share = $this -> manager -> newShare ();
$share -> setExpirationDate ( $future );
2015-12-15 11:54:12 +03:00
$this -> config -> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_enforce_expire_date' , 'no' , 'yes' ],
[ 'core' , 'shareapi_expire_after_n_days' , '7' , '3' ],
]));
2016-01-30 01:04:42 +03:00
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'listener' ]) -> getMock ();
\OCP\Util :: connectHook ( '\OC\Share' , 'verifyExpirationDate' , $hookListner , 'listener' );
$hookListner -> expects ( $this -> once ()) -> method ( 'listener' ) -> with ( $this -> callback ( function ( $data ) use ( $future ) {
return $data [ 'expirationDate' ] == $future ;
}));
2016-02-25 16:21:46 +03:00
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
2015-12-15 11:54:12 +03:00
2016-02-25 16:21:46 +03:00
$this -> assertEquals ( $expected , $share -> getExpirationDate ());
2015-12-15 11:54:12 +03:00
}
2016-01-26 16:29:30 +03:00
public function testvalidateExpirationDateNoDateNoDefaultNull () {
2015-12-15 11:54:12 +03:00
$date = new \DateTime ();
$date -> add ( new \DateInterval ( 'P5D' ));
2016-01-30 01:04:42 +03:00
$expected = clone $date ;
$expected -> setTime ( 0 , 0 , 0 );
$share = $this -> manager -> newShare ();
$share -> setExpirationDate ( $date );
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'listener' ]) -> getMock ();
\OCP\Util :: connectHook ( '\OC\Share' , 'verifyExpirationDate' , $hookListner , 'listener' );
$hookListner -> expects ( $this -> once ()) -> method ( 'listener' ) -> with ( $this -> callback ( function ( $data ) use ( $expected ) {
2016-02-25 17:39:02 +03:00
return $data [ 'expirationDate' ] == $expected && $data [ 'passwordSet' ] === false ;
2016-01-30 01:04:42 +03:00
}));
2015-12-15 11:54:12 +03:00
2016-02-25 16:21:46 +03:00
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
2016-01-30 01:04:42 +03:00
2016-02-25 16:21:46 +03:00
$this -> assertEquals ( $expected , $share -> getExpirationDate ());
2015-12-15 11:54:12 +03:00
}
2016-01-26 16:29:30 +03:00
public function testvalidateExpirationDateNoDateNoDefault () {
2016-01-30 01:04:42 +03:00
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'listener' ]) -> getMock ();
\OCP\Util :: connectHook ( '\OC\Share' , 'verifyExpirationDate' , $hookListner , 'listener' );
$hookListner -> expects ( $this -> once ()) -> method ( 'listener' ) -> with ( $this -> callback ( function ( $data ) {
2016-02-25 17:39:02 +03:00
return $data [ 'expirationDate' ] === null && $data [ 'passwordSet' ] === true ;
2016-01-30 01:04:42 +03:00
}));
$share = $this -> manager -> newShare ();
2016-02-25 17:39:02 +03:00
$share -> setPassword ( 'password' );
2016-01-30 01:04:42 +03:00
2016-02-25 16:21:46 +03:00
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
2015-12-15 11:54:12 +03:00
2016-02-25 16:21:46 +03:00
$this -> assertNull ( $share -> getExpirationDate ());
2015-12-15 11:54:12 +03:00
}
2016-01-26 16:29:30 +03:00
public function testvalidateExpirationDateNoDateDefault () {
2015-12-15 11:54:12 +03:00
$future = new \DateTime ();
$future -> add ( new \DateInterval ( 'P3D' ));
$future -> setTime ( 0 , 0 , 0 );
2016-01-30 01:04:42 +03:00
$expected = clone $future ;
$share = $this -> manager -> newShare ();
$share -> setExpirationDate ( $future );
2015-12-15 11:54:12 +03:00
$this -> config -> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_default_expire_date' , 'no' , 'yes' ],
[ 'core' , 'shareapi_expire_after_n_days' , '7' , '3' ],
]));
2016-01-30 01:04:42 +03:00
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'listener' ]) -> getMock ();
\OCP\Util :: connectHook ( '\OC\Share' , 'verifyExpirationDate' , $hookListner , 'listener' );
$hookListner -> expects ( $this -> once ()) -> method ( 'listener' ) -> with ( $this -> callback ( function ( $data ) use ( $expected ) {
return $data [ 'expirationDate' ] == $expected ;
}));
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
$this -> assertEquals ( $expected , $share -> getExpirationDate ());
}
public function testValidateExpirationDateHookModification () {
$nextWeek = new \DateTime ();
$nextWeek -> add ( new \DateInterval ( 'P7D' ));
$nextWeek -> setTime ( 0 , 0 , 0 );
2015-12-15 11:54:12 +03:00
2016-01-30 01:04:42 +03:00
$save = clone $nextWeek ;
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'listener' ]) -> getMock ();
\OCP\Util :: connectHook ( '\OC\Share' , 'verifyExpirationDate' , $hookListner , 'listener' );
$hookListner -> expects ( $this -> once ()) -> method ( 'listener' ) -> will ( $this -> returnCallback ( function ( $data ) {
$data [ 'expirationDate' ] -> sub ( new \DateInterval ( 'P2D' ));
}));
$share = $this -> manager -> newShare ();
$share -> setExpirationDate ( $nextWeek );
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
$save -> sub ( new \DateInterval ( 'P2D' ));
$this -> assertEquals ( $save , $share -> getExpirationDate ());
}
/**
* @ expectedException \Exception
* @ expectedExceptionMessage Invalid date !
*/
public function testValidateExpirationDateHookException () {
$nextWeek = new \DateTime ();
$nextWeek -> add ( new \DateInterval ( 'P7D' ));
$nextWeek -> setTime ( 0 , 0 , 0 );
$share = $this -> manager -> newShare ();
$share -> setExpirationDate ( $nextWeek );
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'listener' ]) -> getMock ();
\OCP\Util :: connectHook ( '\OC\Share' , 'verifyExpirationDate' , $hookListner , 'listener' );
$hookListner -> expects ( $this -> once ()) -> method ( 'listener' ) -> will ( $this -> returnCallback ( function ( $data ) {
$data [ 'accepted' ] = false ;
$data [ 'message' ] = 'Invalid date!' ;
}));
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
2015-12-15 11:54:12 +03:00
}
2016-02-08 12:42:15 +03:00
public function testValidateExpirationDateExistingShareNoDefault () {
$share = $this -> manager -> newShare ();
$share -> setId ( '42' ) -> setProviderId ( 'foo' );
$this -> config -> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_default_expire_date' , 'no' , 'yes' ],
[ 'core' , 'shareapi_expire_after_n_days' , '7' , '6' ],
]));
$this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
$this -> assertEquals ( null , $share -> getExpirationDate ());
}
2015-12-15 11:54:12 +03:00
/**
* @ expectedException Exception
* @ expectedExceptionMessage Only sharing with group members is allowed
*/
public function testUserCreateChecksShareWithGroupMembersOnlyDifferentGroups () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$sharedWith = $this -> getMock ( '\OCP\IUser' );
2016-02-02 23:02:09 +03:00
$share -> setSharedBy ( 'sharedBy' ) -> setSharedWith ( 'sharedWith' );
2015-12-15 11:54:12 +03:00
$this -> groupManager
-> method ( 'getUserGroupIds' )
-> will (
$this -> returnValueMap ([
[ $sharedBy , [ 'group1' ]],
[ $sharedWith , [ 'group2' ]],
])
);
2016-02-02 23:02:09 +03:00
$this -> userManager -> method ( 'get' ) -> will ( $this -> returnValueMap ([
[ 'sharedBy' , $sharedBy ],
[ 'sharedWith' , $sharedWith ],
]));
2015-12-15 11:54:12 +03:00
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_only_share_with_group_members' , 'no' , 'yes' ],
]));
$this -> invokePrivate ( $this -> manager , 'userCreateChecks' , [ $share ]);
}
public function testUserCreateChecksShareWithGroupMembersOnlySharedGroup () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$sharedWith = $this -> getMock ( '\OCP\IUser' );
2016-02-02 23:02:09 +03:00
$share -> setSharedBy ( 'sharedBy' ) -> setSharedWith ( 'sharedWith' );
2015-12-15 11:54:12 +03:00
$path = $this -> getMock ( '\OCP\Files\Node' );
2016-01-27 22:51:26 +03:00
$share -> setNode ( $path );
2015-12-15 11:54:12 +03:00
$this -> groupManager
-> method ( 'getUserGroupIds' )
-> will (
$this -> returnValueMap ([
[ $sharedBy , [ 'group1' , 'group3' ]],
[ $sharedWith , [ 'group2' , 'group3' ]],
])
);
2016-02-02 23:02:09 +03:00
$this -> userManager -> method ( 'get' ) -> will ( $this -> returnValueMap ([
[ 'sharedBy' , $sharedBy ],
[ 'sharedWith' , $sharedWith ],
]));
2015-12-15 11:54:12 +03:00
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_only_share_with_group_members' , 'no' , 'yes' ],
]));
$this -> defaultProvider
-> method ( 'getSharesByPath' )
-> with ( $path )
-> willReturn ([]);
$this -> invokePrivate ( $this -> manager , 'userCreateChecks' , [ $share ]);
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Path already shared with this user
*/
public function testUserCreateChecksIdenticalShareExists () {
2016-01-27 22:51:26 +03:00
$share = $this -> manager -> newShare ();
$share2 = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$sharedWith = $this -> getMock ( '\OCP\IUser' );
$path = $this -> getMock ( '\OCP\Files\Node' );
2016-01-25 14:09:56 +03:00
2016-02-02 23:02:09 +03:00
$share -> setSharedWith ( 'sharedWith' ) -> setNode ( $path )
2016-01-25 14:09:56 +03:00
-> setProviderId ( 'foo' ) -> setId ( 'bar' );
2016-02-02 23:02:09 +03:00
$share2 -> setSharedWith ( 'sharedWith' ) -> setNode ( $path )
2016-01-25 14:09:56 +03:00
-> setProviderId ( 'foo' ) -> setId ( 'baz' );
2015-12-15 11:54:12 +03:00
$this -> defaultProvider
-> method ( 'getSharesByPath' )
-> with ( $path )
2016-01-25 14:09:56 +03:00
-> willReturn ([ $share2 ]);
2015-12-15 11:54:12 +03:00
$this -> invokePrivate ( $this -> manager , 'userCreateChecks' , [ $share ]);
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Path already shared with this user
*/
2016-01-13 16:21:55 +03:00
public function testUserCreateChecksIdenticalPathSharedViaGroup () {
2016-01-27 22:51:26 +03:00
$share = $this -> manager -> newShare ();
2016-01-25 14:09:56 +03:00
2015-12-15 11:54:12 +03:00
$sharedWith = $this -> getMock ( '\OCP\IUser' );
2016-02-02 23:02:09 +03:00
$sharedWith -> method ( 'getUID' ) -> willReturn ( 'sharedWith' );
$this -> userManager -> method ( 'get' ) -> with ( 'sharedWith' ) -> willReturn ( $sharedWith );
2015-12-15 11:54:12 +03:00
$path = $this -> getMock ( '\OCP\Files\Node' );
2016-01-25 14:09:56 +03:00
2016-02-02 23:02:09 +03:00
$share -> setSharedWith ( 'sharedWith' )
2016-01-27 22:51:26 +03:00
-> setNode ( $path )
2016-02-02 23:02:09 +03:00
-> setShareOwner ( 'shareOwner' )
2016-01-25 14:09:56 +03:00
-> setProviderId ( 'foo' )
-> setId ( 'bar' );
2015-12-15 11:54:12 +03:00
2016-02-04 14:51:23 +03:00
$share2 = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$share2 -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
2016-02-02 23:02:09 +03:00
-> setShareOwner ( 'shareOwner2' )
2016-01-25 14:09:56 +03:00
-> setProviderId ( 'foo' )
2016-02-02 23:02:09 +03:00
-> setId ( 'baz' )
-> setSharedWith ( 'group' );
2015-12-15 11:54:12 +03:00
$group = $this -> getMock ( '\OCP\IGroup' );
$group -> method ( 'inGroup' )
-> with ( $sharedWith )
-> willReturn ( true );
2016-02-02 23:02:09 +03:00
$this -> groupManager -> method ( 'get' ) -> with ( 'group' ) -> willReturn ( $group );
2015-12-15 11:54:12 +03:00
$this -> defaultProvider
-> method ( 'getSharesByPath' )
-> with ( $path )
-> willReturn ([ $share2 ]);
$this -> invokePrivate ( $this -> manager , 'userCreateChecks' , [ $share ]);
}
2016-01-25 14:09:56 +03:00
public function testUserCreateChecksIdenticalPathNotSharedWithUser () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$sharedWith = $this -> getMock ( '\OCP\IUser' );
$path = $this -> getMock ( '\OCP\Files\Node' );
2016-02-02 23:02:09 +03:00
$share -> setSharedWith ( 'sharedWith' )
2016-01-27 22:51:26 +03:00
-> setNode ( $path )
2016-02-02 23:02:09 +03:00
-> setShareOwner ( 'shareOwner' )
2016-01-25 14:09:56 +03:00
-> setProviderId ( 'foo' )
-> setId ( 'bar' );
2015-12-15 11:54:12 +03:00
2016-02-02 23:02:09 +03:00
$this -> userManager -> method ( 'get' ) -> with ( 'sharedWith' ) -> willReturn ( $sharedWith );
2016-02-04 14:51:23 +03:00
$share2 = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$share2 -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
2016-02-02 23:02:09 +03:00
-> setShareOwner ( 'shareOwner2' )
2016-01-25 14:09:56 +03:00
-> setProviderId ( 'foo' )
-> setId ( 'baz' );
2015-12-15 11:54:12 +03:00
$group = $this -> getMock ( '\OCP\IGroup' );
$group -> method ( 'inGroup' )
-> with ( $sharedWith )
-> willReturn ( false );
2016-02-02 23:02:09 +03:00
$this -> groupManager -> method ( 'get' ) -> with ( 'group' ) -> willReturn ( $group );
$share2 -> setSharedWith ( 'group' );
2015-12-15 11:54:12 +03:00
$this -> defaultProvider
-> method ( 'getSharesByPath' )
-> with ( $path )
-> willReturn ([ $share2 ]);
$this -> invokePrivate ( $this -> manager , 'userCreateChecks' , [ $share ]);
}
2016-03-18 18:36:27 +03:00
/**
* @ expectedException Exception
* @ expectedExceptionMessage Group sharing is now allowed
*/
public function testGroupCreateChecksShareWithGroupMembersGroupSharingNotAllowed () {
$share = $this -> manager -> newShare ();
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_allow_group_sharing' , 'yes' , 'no' ],
]));
$this -> invokePrivate ( $this -> manager , 'groupCreateChecks' , [ $share ]);
}
2015-12-15 11:54:12 +03:00
/**
* @ expectedException Exception
* @ expectedExceptionMessage Only sharing within your own groups is allowed
*/
public function testGroupCreateChecksShareWithGroupMembersOnlyNotInGroup () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
2016-02-02 23:02:09 +03:00
$user = $this -> getMock ( '\OCP\IUser' );
$group = $this -> getMock ( '\OCP\IGroup' );
$share -> setSharedBy ( 'user' ) -> setSharedWith ( 'group' );
2015-12-15 11:54:12 +03:00
2016-02-02 23:02:09 +03:00
$group -> method ( 'inGroup' ) -> with ( $user ) -> willReturn ( false );
$this -> groupManager -> method ( 'get' ) -> with ( 'group' ) -> willReturn ( $group );
$this -> userManager -> method ( 'get' ) -> with ( 'user' ) -> willReturn ( $user );
2015-12-15 11:54:12 +03:00
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_only_share_with_group_members' , 'no' , 'yes' ],
2016-03-18 18:36:27 +03:00
[ 'core' , 'shareapi_allow_group_sharing' , 'yes' , 'yes' ],
2015-12-15 11:54:12 +03:00
]));
$this -> invokePrivate ( $this -> manager , 'groupCreateChecks' , [ $share ]);
}
public function testGroupCreateChecksShareWithGroupMembersOnlyInGroup () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
2016-02-02 23:02:09 +03:00
$user = $this -> getMock ( '\OCP\IUser' );
$group = $this -> getMock ( '\OCP\IGroup' );
$share -> setSharedBy ( 'user' ) -> setSharedWith ( 'group' );
2015-12-15 11:54:12 +03:00
2016-02-02 23:02:09 +03:00
$this -> userManager -> method ( 'get' ) -> with ( 'user' ) -> willReturn ( $user );
$this -> groupManager -> method ( 'get' ) -> with ( 'group' ) -> willReturn ( $group );
$group -> method ( 'inGroup' ) -> with ( $user ) -> willReturn ( true );
2015-12-15 11:54:12 +03:00
$path = $this -> getMock ( '\OCP\Files\Node' );
2016-01-27 22:51:26 +03:00
$share -> setNode ( $path );
2015-12-15 11:54:12 +03:00
$this -> defaultProvider -> method ( 'getSharesByPath' )
-> with ( $path )
-> willReturn ([]);
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_only_share_with_group_members' , 'no' , 'yes' ],
2016-03-18 18:36:27 +03:00
[ 'core' , 'shareapi_allow_group_sharing' , 'yes' , 'yes' ],
2015-12-15 11:54:12 +03:00
]));
$this -> invokePrivate ( $this -> manager , 'groupCreateChecks' , [ $share ]);
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Path already shared with this group
*/
public function testGroupCreateChecksPathAlreadySharedWithSameGroup () {
2016-01-27 22:51:26 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$path = $this -> getMock ( '\OCP\Files\Node' );
2016-02-02 23:02:09 +03:00
$share -> setSharedWith ( 'sharedWith' )
2016-01-27 22:51:26 +03:00
-> setNode ( $path )
2016-01-25 14:09:56 +03:00
-> setProviderId ( 'foo' )
-> setId ( 'bar' );
2015-12-15 11:54:12 +03:00
2016-02-04 14:51:23 +03:00
$share2 = $this -> manager -> newShare ();
2016-02-02 23:02:09 +03:00
$share2 -> setSharedWith ( 'sharedWith' )
2016-01-25 14:09:56 +03:00
-> setProviderId ( 'foo' )
-> setId ( 'baz' );
2015-12-15 11:54:12 +03:00
$this -> defaultProvider -> method ( 'getSharesByPath' )
-> with ( $path )
-> willReturn ([ $share2 ]);
2016-03-18 18:36:27 +03:00
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_allow_group_sharing' , 'yes' , 'yes' ],
]));
2015-12-15 11:54:12 +03:00
$this -> invokePrivate ( $this -> manager , 'groupCreateChecks' , [ $share ]);
}
public function testGroupCreateChecksPathAlreadySharedWithDifferentGroup () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
2016-02-02 23:02:09 +03:00
$share -> setSharedWith ( 'sharedWith' );
2015-12-15 11:54:12 +03:00
$path = $this -> getMock ( '\OCP\Files\Node' );
2016-01-27 22:51:26 +03:00
$share -> setNode ( $path );
2015-12-15 11:54:12 +03:00
2016-02-04 14:51:23 +03:00
$share2 = $this -> manager -> newShare ();
2016-02-02 23:02:09 +03:00
$share2 -> setSharedWith ( 'sharedWith2' );
2015-12-15 11:54:12 +03:00
$this -> defaultProvider -> method ( 'getSharesByPath' )
-> with ( $path )
-> willReturn ([ $share2 ]);
2016-03-18 18:36:27 +03:00
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_allow_group_sharing' , 'yes' , 'yes' ],
]));
2015-12-15 11:54:12 +03:00
$this -> invokePrivate ( $this -> manager , 'groupCreateChecks' , [ $share ]);
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Link sharing not allowed
*/
public function testLinkCreateChecksNoLinkSharesAllowed () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_allow_links' , 'yes' , 'no' ],
]));
$this -> invokePrivate ( $this -> manager , 'linkCreateChecks' , [ $share ]);
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Link shares can ' t have reshare permissions
*/
public function testLinkCreateChecksSharePermissions () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$share -> setPermissions ( \OCP\Constants :: PERMISSION_SHARE );
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_allow_links' , 'yes' , 'yes' ],
]));
$this -> invokePrivate ( $this -> manager , 'linkCreateChecks' , [ $share ]);
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Link shares can ' t have delete permissions
*/
public function testLinkCreateChecksDeletePermissions () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$share -> setPermissions ( \OCP\Constants :: PERMISSION_DELETE );
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_allow_links' , 'yes' , 'yes' ],
]));
$this -> invokePrivate ( $this -> manager , 'linkCreateChecks' , [ $share ]);
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Public upload not allowed
*/
public function testLinkCreateChecksNoPublicUpload () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$share -> setPermissions ( \OCP\Constants :: PERMISSION_CREATE | \OCP\Constants :: PERMISSION_UPDATE );
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_allow_links' , 'yes' , 'yes' ],
[ 'core' , 'shareapi_allow_public_upload' , 'yes' , 'no' ]
]));
$this -> invokePrivate ( $this -> manager , 'linkCreateChecks' , [ $share ]);
}
public function testLinkCreateChecksPublicUpload () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$share -> setPermissions ( \OCP\Constants :: PERMISSION_CREATE | \OCP\Constants :: PERMISSION_UPDATE );
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_allow_links' , 'yes' , 'yes' ],
[ 'core' , 'shareapi_allow_public_upload' , 'yes' , 'yes' ]
]));
$this -> invokePrivate ( $this -> manager , 'linkCreateChecks' , [ $share ]);
}
public function testLinkCreateChecksReadOnly () {
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$share -> setPermissions ( \OCP\Constants :: PERMISSION_READ );
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_allow_links' , 'yes' , 'yes' ],
[ 'core' , 'shareapi_allow_public_upload' , 'yes' , 'no' ]
]));
$this -> invokePrivate ( $this -> manager , 'linkCreateChecks' , [ $share ]);
}
/**
* @ expectedException \InvalidArgumentException
* @ expectedExceptionMessage Path contains files shared with you
*/
public function testPathCreateChecksContainsSharedMount () {
$path = $this -> getMock ( '\OCP\Files\Folder' );
$path -> method ( 'getPath' ) -> willReturn ( 'path' );
$mount = $this -> getMock ( '\OCP\Files\Mount\IMountPoint' );
$storage = $this -> getMock ( '\OCP\Files\Storage' );
$mount -> method ( 'getStorage' ) -> willReturn ( $storage );
$storage -> method ( 'instanceOfStorage' ) -> with ( '\OCA\Files_Sharing\ISharedStorage' ) -> willReturn ( true );
$this -> mountManager -> method ( 'findIn' ) -> with ( 'path' ) -> willReturn ([ $mount ]);
$this -> invokePrivate ( $this -> manager , 'pathCreateChecks' , [ $path ]);
}
public function testPathCreateChecksContainsNoSharedMount () {
$path = $this -> getMock ( '\OCP\Files\Folder' );
$path -> method ( 'getPath' ) -> willReturn ( 'path' );
$mount = $this -> getMock ( '\OCP\Files\Mount\IMountPoint' );
$storage = $this -> getMock ( '\OCP\Files\Storage' );
$mount -> method ( 'getStorage' ) -> willReturn ( $storage );
$storage -> method ( 'instanceOfStorage' ) -> with ( '\OCA\Files_Sharing\ISharedStorage' ) -> willReturn ( false );
$this -> mountManager -> method ( 'findIn' ) -> with ( 'path' ) -> willReturn ([ $mount ]);
$this -> invokePrivate ( $this -> manager , 'pathCreateChecks' , [ $path ]);
}
public function testPathCreateChecksContainsNoFolder () {
$path = $this -> getMock ( '\OCP\Files\File' );
$this -> invokePrivate ( $this -> manager , 'pathCreateChecks' , [ $path ]);
}
public function dataIsSharingDisabledForUser () {
$data = [];
// No exclude groups
$data [] = [ 'no' , null , null , null , false ];
// empty exclude list, user no groups
$data [] = [ 'yes' , '' , json_encode ([ '' ]), [], false ];
// empty exclude list, user groups
$data [] = [ 'yes' , '' , json_encode ([ '' ]), [ 'group1' , 'group2' ], false ];
// Convert old list to json
$data [] = [ 'yes' , 'group1,group2' , json_encode ([ 'group1' , 'group2' ]), [], false ];
// Old list partly groups in common
$data [] = [ 'yes' , 'group1,group2' , json_encode ([ 'group1' , 'group2' ]), [ 'group1' , 'group3' ], false ];
// Old list only groups in common
$data [] = [ 'yes' , 'group1,group2' , json_encode ([ 'group1' , 'group2' ]), [ 'group1' ], true ];
// New list partly in common
$data [] = [ 'yes' , json_encode ([ 'group1' , 'group2' ]), null , [ 'group1' , 'group3' ], false ];
// New list only groups in common
$data [] = [ 'yes' , json_encode ([ 'group1' , 'group2' ]), null , [ 'group2' ], true ];
return $data ;
}
/**
* @ dataProvider dataIsSharingDisabledForUser
*
* @ param string $excludeGroups
* @ param string $groupList
* @ param string $setList
* @ param string [] $groupIds
* @ param bool $expected
*/
public function testIsSharingDisabledForUser ( $excludeGroups , $groupList , $setList , $groupIds , $expected ) {
$user = $this -> getMock ( '\OCP\IUser' );
$this -> config -> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_exclude_groups' , 'no' , $excludeGroups ],
[ 'core' , 'shareapi_exclude_groups_list' , '' , $groupList ],
]));
if ( $setList !== null ) {
$this -> config -> expects ( $this -> once ())
-> method ( 'setAppValue' )
-> with ( 'core' , 'shareapi_exclude_groups_list' , $setList );
} else {
$this -> config -> expects ( $this -> never ())
-> method ( 'setAppValue' );
}
$this -> groupManager -> method ( 'getUserGroupIds' )
-> with ( $user )
-> willReturn ( $groupIds );
2016-02-02 23:02:09 +03:00
$this -> userManager -> method ( 'get' ) -> with ( 'user' ) -> willReturn ( $user );
$res = $this -> manager -> sharingDisabledForUser ( 'user' );
2015-12-15 11:54:12 +03:00
$this -> assertEquals ( $expected , $res );
}
public function dataCanShare () {
$data = [];
/*
* [ expected , sharing enabled , disabled for user ]
*/
$data [] = [ false , 'no' , false ];
$data [] = [ false , 'no' , true ];
$data [] = [ true , 'yes' , false ];
$data [] = [ false , 'yes' , true ];
return $data ;
}
/**
* @ dataProvider dataCanShare
*
* @ param bool $expected
* @ param string $sharingEnabled
* @ param bool $disabledForUser
*/
public function testCanShare ( $expected , $sharingEnabled , $disabledForUser ) {
$this -> config -> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_enabled' , 'yes' , $sharingEnabled ],
]));
2016-01-11 12:30:03 +03:00
$manager = $this -> createManagerMock ()
2016-01-27 22:51:26 +03:00
-> setMethods ([ 'sharingDisabledForUser' ])
2015-12-15 11:54:12 +03:00
-> getMock ();
2016-02-16 12:22:49 +03:00
$manager -> method ( 'sharingDisabledForUser' )
-> with ( 'user' )
-> willReturn ( $disabledForUser );
2015-12-15 11:54:12 +03:00
2016-01-27 22:51:26 +03:00
$share = $this -> manager -> newShare ();
2016-02-02 23:02:09 +03:00
$share -> setSharedBy ( 'user' );
2015-12-15 11:54:12 +03:00
2016-02-16 12:22:49 +03:00
$exception = false ;
try {
$res = $this -> invokePrivate ( $manager , 'canShare' , [ $share ]);
} catch ( \Exception $e ) {
$exception = true ;
}
2015-12-15 11:54:12 +03:00
2016-02-16 12:22:49 +03:00
$this -> assertEquals ( $expected , ! $exception );
2015-12-15 11:54:12 +03:00
}
public function testCreateShareUser () {
2016-01-11 12:30:03 +03:00
$manager = $this -> createManagerMock ()
2015-12-15 11:54:12 +03:00
-> setMethods ([ 'canShare' , 'generalCreateChecks' , 'userCreateChecks' , 'pathCreateChecks' ])
-> getMock ();
$shareOwner = $this -> getMock ( '\OCP\IUser' );
2016-02-02 23:02:09 +03:00
$shareOwner -> method ( 'getUID' ) -> willReturn ( 'shareOwner' );
2015-12-15 11:54:12 +03:00
2016-02-18 15:38:38 +03:00
$storage = $this -> getMock ( '\OCP\Files\Storage' );
2015-12-15 11:54:12 +03:00
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> method ( 'getOwner' ) -> willReturn ( $shareOwner );
$path -> method ( 'getName' ) -> willReturn ( 'target' );
2016-02-18 15:38:38 +03:00
$path -> method ( 'getStorage' ) -> willReturn ( $storage );
2015-12-15 11:54:12 +03:00
$share = $this -> createShare (
null ,
\OCP\Share :: SHARE_TYPE_USER ,
$path ,
2016-02-02 23:02:09 +03:00
'sharedWith' ,
'sharedBy' ,
2015-12-15 11:54:12 +03:00
null ,
\OCP\Constants :: PERMISSION_ALL );
$manager -> expects ( $this -> once ())
-> method ( 'canShare' )
-> with ( $share )
-> willReturn ( true );
$manager -> expects ( $this -> once ())
-> method ( 'generalCreateChecks' )
-> with ( $share );;
$manager -> expects ( $this -> once ())
-> method ( 'userCreateChecks' )
-> with ( $share );;
$manager -> expects ( $this -> once ())
-> method ( 'pathCreateChecks' )
-> with ( $path );
2016-01-13 16:21:55 +03:00
$this -> defaultProvider
2015-12-15 11:54:12 +03:00
-> expects ( $this -> once ())
-> method ( 'create' )
-> with ( $share )
-> will ( $this -> returnArgument ( 0 ));
$share -> expects ( $this -> once ())
-> method ( 'setShareOwner' )
2016-02-02 23:02:09 +03:00
-> with ( 'shareOwner' );
2015-12-15 11:54:12 +03:00
$share -> expects ( $this -> once ())
-> method ( 'setTarget' )
-> with ( '/target' );
$manager -> createShare ( $share );
}
public function testCreateShareGroup () {
2016-01-11 12:30:03 +03:00
$manager = $this -> createManagerMock ()
2015-12-15 11:54:12 +03:00
-> setMethods ([ 'canShare' , 'generalCreateChecks' , 'groupCreateChecks' , 'pathCreateChecks' ])
-> getMock ();
$shareOwner = $this -> getMock ( '\OCP\IUser' );
2016-02-02 23:02:09 +03:00
$shareOwner -> method ( 'getUID' ) -> willReturn ( 'shareOwner' );
2015-12-15 11:54:12 +03:00
2016-02-18 15:38:38 +03:00
$storage = $this -> getMock ( '\OCP\Files\Storage' );
2015-12-15 11:54:12 +03:00
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> method ( 'getOwner' ) -> willReturn ( $shareOwner );
$path -> method ( 'getName' ) -> willReturn ( 'target' );
2016-02-18 15:38:38 +03:00
$path -> method ( 'getStorage' ) -> willReturn ( $storage );
2015-12-15 11:54:12 +03:00
$share = $this -> createShare (
null ,
\OCP\Share :: SHARE_TYPE_GROUP ,
$path ,
2016-02-02 23:02:09 +03:00
'sharedWith' ,
'sharedBy' ,
2015-12-15 11:54:12 +03:00
null ,
\OCP\Constants :: PERMISSION_ALL );
$manager -> expects ( $this -> once ())
-> method ( 'canShare' )
-> with ( $share )
-> willReturn ( true );
$manager -> expects ( $this -> once ())
-> method ( 'generalCreateChecks' )
-> with ( $share );;
$manager -> expects ( $this -> once ())
-> method ( 'groupCreateChecks' )
-> with ( $share );;
$manager -> expects ( $this -> once ())
-> method ( 'pathCreateChecks' )
-> with ( $path );
2016-01-13 16:21:55 +03:00
$this -> defaultProvider
2015-12-15 11:54:12 +03:00
-> expects ( $this -> once ())
-> method ( 'create' )
-> with ( $share )
-> will ( $this -> returnArgument ( 0 ));
$share -> expects ( $this -> once ())
-> method ( 'setShareOwner' )
2016-02-02 23:02:09 +03:00
-> with ( 'shareOwner' );
2015-12-15 11:54:12 +03:00
$share -> expects ( $this -> once ())
-> method ( 'setTarget' )
-> with ( '/target' );
$manager -> createShare ( $share );
}
public function testCreateShareLink () {
2016-01-11 12:30:03 +03:00
$manager = $this -> createManagerMock ()
2015-12-15 11:54:12 +03:00
-> setMethods ([
'canShare' ,
'generalCreateChecks' ,
'linkCreateChecks' ,
'pathCreateChecks' ,
2016-01-26 16:29:30 +03:00
'validateExpirationDate' ,
2015-12-15 11:54:12 +03:00
'verifyPassword' ,
2016-02-11 13:55:09 +03:00
'setLinkParent' ,
2015-12-15 11:54:12 +03:00
])
-> getMock ();
$shareOwner = $this -> getMock ( '\OCP\IUser' );
2016-02-02 23:02:09 +03:00
$shareOwner -> method ( 'getUID' ) -> willReturn ( 'shareOwner' );
2015-12-15 11:54:12 +03:00
2016-02-18 15:38:38 +03:00
$storage = $this -> getMock ( '\OCP\Files\Storage' );
2015-12-15 11:54:12 +03:00
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> method ( 'getOwner' ) -> willReturn ( $shareOwner );
$path -> method ( 'getName' ) -> willReturn ( 'target' );
$path -> method ( 'getId' ) -> willReturn ( 1 );
2016-02-18 15:38:38 +03:00
$path -> method ( 'getStorage' ) -> willReturn ( $storage );
2015-12-15 11:54:12 +03:00
$date = new \DateTime ();
2016-01-30 01:04:42 +03:00
$share = $this -> manager -> newShare ();
2016-01-25 14:09:56 +03:00
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_LINK )
2016-01-27 22:51:26 +03:00
-> setNode ( $path )
2016-02-02 23:02:09 +03:00
-> setSharedBy ( 'sharedBy' )
2016-01-25 14:09:56 +03:00
-> setPermissions ( \OCP\Constants :: PERMISSION_ALL )
-> setExpirationDate ( $date )
-> setPassword ( 'password' );
2015-12-15 11:54:12 +03:00
$manager -> expects ( $this -> once ())
-> method ( 'canShare' )
-> with ( $share )
-> willReturn ( true );
$manager -> expects ( $this -> once ())
-> method ( 'generalCreateChecks' )
-> with ( $share );;
$manager -> expects ( $this -> once ())
-> method ( 'linkCreateChecks' )
-> with ( $share );;
$manager -> expects ( $this -> once ())
-> method ( 'pathCreateChecks' )
-> with ( $path );
$manager -> expects ( $this -> once ())
2016-01-26 16:29:30 +03:00
-> method ( 'validateExpirationDate' )
2016-01-30 01:04:42 +03:00
-> with ( $share );
2015-12-15 11:54:12 +03:00
$manager -> expects ( $this -> once ())
-> method ( 'verifyPassword' )
-> with ( 'password' );
2016-02-11 13:55:09 +03:00
$manager -> expects ( $this -> once ())
-> method ( 'setLinkParent' )
-> with ( $share );
2015-12-15 11:54:12 +03:00
$this -> hasher -> expects ( $this -> once ())
-> method ( 'hash' )
-> with ( 'password' )
-> willReturn ( 'hashed' );
$this -> secureRandom -> method ( 'getMediumStrengthGenerator' )
-> will ( $this -> returnSelf ());
$this -> secureRandom -> method ( 'generate' )
-> willReturn ( 'token' );
2016-01-13 16:21:55 +03:00
$this -> defaultProvider
2015-12-15 11:54:12 +03:00
-> expects ( $this -> once ())
-> method ( 'create' )
-> with ( $share )
2016-01-25 14:09:56 +03:00
-> will ( $this -> returnCallback ( function ( Share $share ) {
return $share -> setId ( 42 );
}));
2015-12-15 11:54:12 +03:00
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'pre' , 'post' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'pre_shared' , $hookListner , 'pre' );
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_shared' , $hookListner , 'post' );
$hookListnerExpectsPre = [
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => \OCP\Share :: SHARE_TYPE_LINK ,
'uidOwner' => 'sharedBy' ,
'permissions' => 31 ,
'fileSource' => 1 ,
'expiration' => $date ,
'token' => 'token' ,
'run' => true ,
'error' => '' ,
2016-01-13 23:48:53 +03:00
'itemTarget' => '/target' ,
'shareWith' => null ,
2015-12-15 11:54:12 +03:00
];
$hookListnerExpectsPost = [
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => \OCP\Share :: SHARE_TYPE_LINK ,
'uidOwner' => 'sharedBy' ,
'permissions' => 31 ,
'fileSource' => 1 ,
'expiration' => $date ,
'token' => 'token' ,
'id' => 42 ,
2016-01-13 23:48:53 +03:00
'itemTarget' => '/target' ,
'fileTarget' => '/target' ,
'shareWith' => null ,
2015-12-15 11:54:12 +03:00
];
$hookListner -> expects ( $this -> once ())
-> method ( 'pre' )
-> with ( $this -> equalTo ( $hookListnerExpectsPre ));
$hookListner -> expects ( $this -> once ())
-> method ( 'post' )
-> with ( $this -> equalTo ( $hookListnerExpectsPost ));
2016-01-25 14:09:56 +03:00
/** @var IShare $share */
$share = $manager -> createShare ( $share );
2016-02-02 23:02:09 +03:00
$this -> assertSame ( 'shareOwner' , $share -> getShareOwner ());
2016-01-25 14:09:56 +03:00
$this -> assertEquals ( '/target' , $share -> getTarget ());
$this -> assertSame ( $date , $share -> getExpirationDate ());
$this -> assertEquals ( 'token' , $share -> getToken ());
$this -> assertEquals ( 'hashed' , $share -> getPassword ());
2015-12-15 11:54:12 +03:00
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage I won ' t let you share
*/
public function testCreateShareHookError () {
2016-01-11 12:30:03 +03:00
$manager = $this -> createManagerMock ()
2015-12-15 11:54:12 +03:00
-> setMethods ([
'canShare' ,
'generalCreateChecks' ,
'userCreateChecks' ,
'pathCreateChecks' ,
])
-> getMock ();
$shareOwner = $this -> getMock ( '\OCP\IUser' );
2016-02-02 23:02:09 +03:00
$shareOwner -> method ( 'getUID' ) -> willReturn ( 'shareOwner' );
2015-12-15 11:54:12 +03:00
2016-02-18 15:38:38 +03:00
$storage = $this -> getMock ( '\OCP\Files\Storage' );
2015-12-15 11:54:12 +03:00
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> method ( 'getOwner' ) -> willReturn ( $shareOwner );
$path -> method ( 'getName' ) -> willReturn ( 'target' );
2016-02-18 15:38:38 +03:00
$path -> method ( 'getStorage' ) -> willReturn ( $storage );
2015-12-15 11:54:12 +03:00
$share = $this -> createShare (
null ,
\OCP\Share :: SHARE_TYPE_USER ,
$path ,
2016-02-02 23:02:09 +03:00
'sharedWith' ,
'sharedBy' ,
2015-12-15 11:54:12 +03:00
null ,
\OCP\Constants :: PERMISSION_ALL );
$manager -> expects ( $this -> once ())
-> method ( 'canShare' )
-> with ( $share )
-> willReturn ( true );
$manager -> expects ( $this -> once ())
-> method ( 'generalCreateChecks' )
-> with ( $share );;
$manager -> expects ( $this -> once ())
-> method ( 'userCreateChecks' )
-> with ( $share );;
$manager -> expects ( $this -> once ())
-> method ( 'pathCreateChecks' )
-> with ( $path );
$share -> expects ( $this -> once ())
-> method ( 'setShareOwner' )
2016-02-02 23:02:09 +03:00
-> with ( 'shareOwner' );
2015-12-15 11:54:12 +03:00
$share -> expects ( $this -> once ())
-> method ( 'setTarget' )
-> with ( '/target' );
2016-02-18 15:38:38 +03:00
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'pre' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'pre_shared' , $hookListner , 'pre' );
$hookListner -> expects ( $this -> once ())
-> method ( 'pre' )
-> will ( $this -> returnCallback ( function ( array $data ) {
$data [ 'run' ] = false ;
$data [ 'error' ] = 'I won\'t let you share!' ;
}));
$manager -> createShare ( $share );
}
public function testCreateShareOfIncommingFederatedShare () {
$manager = $this -> createManagerMock ()
-> setMethods ([ 'canShare' , 'generalCreateChecks' , 'userCreateChecks' , 'pathCreateChecks' ])
-> getMock ();
$shareOwner = $this -> getMock ( '\OCP\IUser' );
$shareOwner -> method ( 'getUID' ) -> willReturn ( 'shareOwner' );
$storage = $this -> getMock ( '\OCP\Files\Storage' );
$storage -> method ( 'instanceOfStorage' )
-> with ( 'OCA\Files_Sharing\External\Storage' )
-> willReturn ( true );
$storage2 = $this -> getMock ( '\OCP\Files\Storage' );
$storage2 -> method ( 'instanceOfStorage' )
-> with ( 'OCA\Files_Sharing\External\Storage' )
-> willReturn ( false );
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> expects ( $this -> never ()) -> method ( 'getOwner' );
$path -> method ( 'getName' ) -> willReturn ( 'target' );
$path -> method ( 'getStorage' ) -> willReturn ( $storage );
$parent = $this -> getMock ( '\OCP\Files\Folder' );
$parent -> method ( 'getStorage' ) -> willReturn ( $storage );
$parentParent = $this -> getMock ( '\OCP\Files\Folder' );
$parentParent -> method ( 'getStorage' ) -> willReturn ( $storage2 );
$parentParent -> method ( 'getOwner' ) -> willReturn ( $shareOwner );
$path -> method ( 'getParent' ) -> willReturn ( $parent );
$parent -> method ( 'getParent' ) -> willReturn ( $parentParent );
$share = $this -> createShare (
null ,
\OCP\Share :: SHARE_TYPE_USER ,
$path ,
'sharedWith' ,
'sharedBy' ,
null ,
\OCP\Constants :: PERMISSION_ALL );
$manager -> expects ( $this -> once ())
-> method ( 'canShare' )
-> with ( $share )
-> willReturn ( true );
$manager -> expects ( $this -> once ())
-> method ( 'generalCreateChecks' )
-> with ( $share );;
$manager -> expects ( $this -> once ())
-> method ( 'userCreateChecks' )
-> with ( $share );;
$manager -> expects ( $this -> once ())
-> method ( 'pathCreateChecks' )
-> with ( $path );
$this -> defaultProvider
-> expects ( $this -> once ())
-> method ( 'create' )
-> with ( $share )
-> will ( $this -> returnArgument ( 0 ));
$share -> expects ( $this -> once ())
-> method ( 'setShareOwner' )
-> with ( 'shareOwner' );
$share -> expects ( $this -> once ())
-> method ( 'setTarget' )
-> with ( '/target' );
2015-12-15 11:54:12 +03:00
$manager -> createShare ( $share );
}
2016-01-20 23:56:55 +03:00
2016-02-05 22:00:07 +03:00
public function testGetSharesBy () {
$share = $this -> manager -> newShare ();
$node = $this -> getMock ( 'OCP\Files\Folder' );
$this -> defaultProvider -> expects ( $this -> once ())
-> method ( 'getSharesBy' )
-> with (
$this -> equalTo ( 'user' ),
$this -> equalTo ( \OCP\Share :: SHARE_TYPE_USER ),
$this -> equalTo ( $node ),
$this -> equalTo ( true ),
$this -> equalTo ( 1 ),
$this -> equalTo ( 1 )
) -> willReturn ([ $share ]);
$shares = $this -> manager -> getSharesBy ( 'user' , \OCP\Share :: SHARE_TYPE_USER , $node , true , 1 , 1 );
$this -> assertCount ( 1 , $shares );
$this -> assertSame ( $share , $shares [ 0 ]);
}
/**
* Test to ensure we correctly remove expired link shares
*
* We have 8 Shares and we want the 3 first valid shares .
* share 3 - 6 and 8 are expired . Thus at the end of this test we should
* have received share 1 , 2 and 7. And from the manager . Share 3 - 6 should be
* deleted ( as they are evaluated ) . but share 8 should still be there .
*/
public function testGetSharesByExpiredLinkShares () {
$manager = $this -> createManagerMock ()
-> setMethods ([ 'deleteShare' ])
-> getMock ();
/** @var \OCP\Share\IShare[] $shares */
$shares = [];
/*
* This results in an array of 8 IShare elements
*/
for ( $i = 0 ; $i < 8 ; $i ++ ) {
$share = $this -> manager -> newShare ();
$share -> setId ( $i );
$shares [] = $share ;
}
$today = new \DateTime ();
$today -> setTime ( 0 , 0 , 0 );
/*
* Set the expiration date to today for some shares
*/
$shares [ 2 ] -> setExpirationDate ( $today );
$shares [ 3 ] -> setExpirationDate ( $today );
$shares [ 4 ] -> setExpirationDate ( $today );
$shares [ 5 ] -> setExpirationDate ( $today );
/** @var \OCP\Share\IShare[] $i */
$shares2 = [];
for ( $i = 0 ; $i < 8 ; $i ++ ) {
$shares2 [] = clone $shares [ $i ];
}
$node = $this -> getMock ( 'OCP\Files\File' );
/*
* Simulate the getSharesBy call .
*/
$this -> defaultProvider
-> method ( 'getSharesBy' )
-> will ( $this -> returnCallback ( function ( $uid , $type , $node , $reshares , $limit , $offset ) use ( & $shares2 ) {
return array_slice ( $shares2 , $offset , $limit );
}));
/*
* Simulate the deleteShare call .
*/
$manager -> method ( 'deleteShare' )
-> will ( $this -> returnCallback ( function ( $share ) use ( & $shares2 ) {
for ( $i = 0 ; $i < count ( $shares2 ); $i ++ ) {
if ( $shares2 [ $i ] -> getId () === $share -> getId ()) {
array_splice ( $shares2 , $i , 1 );
break ;
}
}
}));
$res = $manager -> getSharesBy ( 'user' , \OCP\Share :: SHARE_TYPE_LINK , $node , true , 3 , 0 );
$this -> assertCount ( 3 , $res );
$this -> assertEquals ( $shares [ 0 ] -> getId (), $res [ 0 ] -> getId ());
$this -> assertEquals ( $shares [ 1 ] -> getId (), $res [ 1 ] -> getId ());
$this -> assertEquals ( $shares [ 6 ] -> getId (), $res [ 2 ] -> getId ());
$this -> assertCount ( 4 , $shares2 );
$this -> assertEquals ( 0 , $shares2 [ 0 ] -> getId ());
$this -> assertEquals ( 1 , $shares2 [ 1 ] -> getId ());
$this -> assertEquals ( 6 , $shares2 [ 2 ] -> getId ());
$this -> assertEquals ( 7 , $shares2 [ 3 ] -> getId ());
$this -> assertSame ( $today , $shares [ 3 ] -> getExpirationDate ());
}
2016-01-20 23:56:55 +03:00
public function testGetShareByToken () {
2016-01-27 14:13:53 +03:00
$factory = $this -> getMock ( '\OCP\Share\IProviderFactory' );
2016-01-20 23:56:55 +03:00
$manager = new Manager (
$this -> logger ,
$this -> config ,
$this -> secureRandom ,
$this -> hasher ,
$this -> mountManager ,
$this -> groupManager ,
$this -> l ,
2016-02-02 23:02:09 +03:00
$factory ,
2016-02-04 14:51:23 +03:00
$this -> userManager ,
$this -> rootFolder
2016-01-20 23:56:55 +03:00
);
2016-01-27 14:13:53 +03:00
$share = $this -> getMock ( '\OCP\Share\IShare' );
2016-01-20 23:56:55 +03:00
$factory -> expects ( $this -> once ())
-> method ( 'getProviderForType' )
-> with ( \OCP\Share :: SHARE_TYPE_LINK )
-> willReturn ( $this -> defaultProvider );
$this -> defaultProvider -> expects ( $this -> once ())
-> method ( 'getShareByToken' )
-> with ( 'token' )
-> willReturn ( $share );
$ret = $manager -> getShareByToken ( 'token' );
$this -> assertSame ( $share , $ret );
}
2016-02-05 14:59:46 +03:00
/**
* @ expectedException \OCP\Share\Exceptions\ShareNotFound
*/
public function testGetShareByTokenExpired () {
$manager = $this -> createManagerMock ()
-> setMethods ([ 'deleteShare' ])
-> getMock ();
$date = new \DateTime ();
$date -> setTime ( 0 , 0 , 0 );
$share = $this -> manager -> newShare ();
$share -> setExpirationDate ( $date );
$this -> defaultProvider -> expects ( $this -> once ())
-> method ( 'getShareByToken' )
-> with ( 'expiredToken' )
-> willReturn ( $share );
$manager -> expects ( $this -> once ())
-> method ( 'deleteShare' )
-> with ( $this -> equalTo ( $share ));
$manager -> getShareByToken ( 'expiredToken' );
}
public function testGetShareByTokenNotExpired () {
$date = new \DateTime ();
$date -> setTime ( 0 , 0 , 0 );
$date -> add ( new \DateInterval ( 'P2D' ));
$share = $this -> manager -> newShare ();
$share -> setExpirationDate ( $date );
$this -> defaultProvider -> expects ( $this -> once ())
-> method ( 'getShareByToken' )
-> with ( 'expiredToken' )
-> willReturn ( $share );
$res = $this -> manager -> getShareByToken ( 'expiredToken' );
$this -> assertSame ( $share , $res );
}
2016-04-01 18:02:59 +03:00
public function testGetShareByTokenPublicSharingDisabled () {
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_LINK )
-> setPermissions ( \OCP\Constants :: PERMISSION_READ | \OCP\Constants :: PERMISSION_CREATE | \OCP\Constants :: PERMISSION_UPDATE );
$this -> config -> method ( 'getAppValue' ) -> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_allow_public_upload' , 'yes' , 'no' ],
]));
$this -> defaultProvider -> expects ( $this -> once ())
-> method ( 'getShareByToken' )
-> willReturn ( 'validToken' )
-> willReturn ( $share );
$res = $this -> manager -> getShareByToken ( 'validToken' );
$this -> assertSame ( \OCP\Constants :: PERMISSION_READ , $res -> getPermissions ());
}
2016-01-20 23:56:55 +03:00
public function testCheckPasswordNoLinkShare () {
2016-01-27 14:13:53 +03:00
$share = $this -> getMock ( '\OCP\Share\IShare' );
2016-01-20 23:56:55 +03:00
$share -> method ( 'getShareType' ) -> willReturn ( \OCP\Share :: SHARE_TYPE_USER );
$this -> assertFalse ( $this -> manager -> checkPassword ( $share , 'password' ));
}
public function testCheckPasswordNoPassword () {
2016-01-27 14:13:53 +03:00
$share = $this -> getMock ( '\OCP\Share\IShare' );
2016-01-20 23:56:55 +03:00
$share -> method ( 'getShareType' ) -> willReturn ( \OCP\Share :: SHARE_TYPE_LINK );
$this -> assertFalse ( $this -> manager -> checkPassword ( $share , 'password' ));
$share -> method ( 'getPassword' ) -> willReturn ( 'password' );
$this -> assertFalse ( $this -> manager -> checkPassword ( $share , null ));
}
public function testCheckPasswordInvalidPassword () {
2016-01-27 14:13:53 +03:00
$share = $this -> getMock ( '\OCP\Share\IShare' );
2016-01-20 23:56:55 +03:00
$share -> method ( 'getShareType' ) -> willReturn ( \OCP\Share :: SHARE_TYPE_LINK );
$share -> method ( 'getPassword' ) -> willReturn ( 'password' );
$this -> hasher -> method ( 'verify' ) -> with ( 'invalidpassword' , 'password' , '' ) -> willReturn ( false );
$this -> assertFalse ( $this -> manager -> checkPassword ( $share , 'invalidpassword' ));
}
public function testCheckPasswordValidPassword () {
2016-01-27 14:13:53 +03:00
$share = $this -> getMock ( '\OCP\Share\IShare' );
2016-01-20 23:56:55 +03:00
$share -> method ( 'getShareType' ) -> willReturn ( \OCP\Share :: SHARE_TYPE_LINK );
$share -> method ( 'getPassword' ) -> willReturn ( 'passwordHash' );
$this -> hasher -> method ( 'verify' ) -> with ( 'password' , 'passwordHash' , '' ) -> willReturn ( true );
$this -> assertTrue ( $this -> manager -> checkPassword ( $share , 'password' ));
}
2016-01-25 15:09:50 +03:00
2016-02-01 23:46:32 +03:00
public function testCheckPasswordUpdateShare () {
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_LINK )
-> setPassword ( 'passwordHash' );
$this -> hasher -> method ( 'verify' ) -> with ( 'password' , 'passwordHash' , '' )
-> will ( $this -> returnCallback ( function ( $pass , $hash , & $newHash ) {
$newHash = 'newHash' ;
return true ;
}));
$this -> defaultProvider -> expects ( $this -> once ())
-> method ( 'update' )
-> with ( $this -> callback ( function ( \OCP\Share\IShare $share ) {
return $share -> getPassword () === 'newHash' ;
}));
$this -> assertTrue ( $this -> manager -> checkPassword ( $share , 'password' ));
}
2016-01-25 15:09:50 +03:00
/**
* @ expectedException Exception
* @ expectedExceptionMessage Can ' t change share type
*/
public function testUpdateShareCantChangeShareType () {
$manager = $this -> createManagerMock ()
-> setMethods ([
'canShare' ,
'getShareById'
])
-> getMock ();
2016-02-04 14:51:23 +03:00
$originalShare = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP );
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( true );
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'foo:42' ) -> willReturn ( $originalShare );
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$share -> setProviderId ( 'foo' )
-> setId ( '42' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_USER );
$manager -> updateShare ( $share );
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Can only update recipient on user shares
*/
public function testUpdateShareCantChangeRecipientForGroupShare () {
$manager = $this -> createManagerMock ()
-> setMethods ([
'canShare' ,
'getShareById'
])
-> getMock ();
2016-02-04 14:51:23 +03:00
$originalShare = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
2016-02-02 23:02:09 +03:00
-> setSharedWith ( 'origGroup' );
2016-01-25 15:09:50 +03:00
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( true );
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'foo:42' ) -> willReturn ( $originalShare );
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$share -> setProviderId ( 'foo' )
-> setId ( '42' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
2016-02-02 23:02:09 +03:00
-> setSharedWith ( 'newGroup' );
2016-01-25 15:09:50 +03:00
$manager -> updateShare ( $share );
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Can ' t share with the share owner
*/
public function testUpdateShareCantShareWithOwner () {
$manager = $this -> createManagerMock ()
-> setMethods ([
'canShare' ,
'getShareById'
])
-> getMock ();
2016-02-04 14:51:23 +03:00
$originalShare = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
2016-02-02 23:02:09 +03:00
-> setSharedWith ( 'sharedWith' );
2016-01-25 15:09:50 +03:00
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( true );
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'foo:42' ) -> willReturn ( $originalShare );
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$share -> setProviderId ( 'foo' )
-> setId ( '42' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
2016-02-02 23:02:09 +03:00
-> setSharedWith ( 'newUser' )
-> setShareOwner ( 'newUser' );
2016-01-25 15:09:50 +03:00
$manager -> updateShare ( $share );
}
public function testUpdateShareUser () {
$manager = $this -> createManagerMock ()
-> setMethods ([
'canShare' ,
'getShareById' ,
'generalCreateChecks' ,
'userCreateChecks' ,
'pathCreateChecks' ,
])
-> getMock ();
2016-02-04 14:51:23 +03:00
$originalShare = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
2016-02-04 11:53:47 +03:00
-> setSharedWith ( 'origUser' )
-> setPermissions ( 1 );
$node = $this -> getMock ( '\OCP\Files\File' );
$node -> method ( 'getId' ) -> willReturn ( 100 );
2016-02-04 15:25:24 +03:00
$node -> method ( 'getPath' ) -> willReturn ( '/newUser/files/myPath' );
2016-01-25 15:09:50 +03:00
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( true );
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'foo:42' ) -> willReturn ( $originalShare );
2016-02-04 14:51:23 +03:00
$share = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$share -> setProviderId ( 'foo' )
-> setId ( '42' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
2016-02-02 23:02:09 +03:00
-> setSharedWith ( 'origUser' )
2016-02-04 14:51:23 +03:00
-> setShareOwner ( 'newUser' )
2016-02-04 11:53:47 +03:00
-> setSharedBy ( 'sharer' )
-> setPermissions ( 31 )
2016-02-04 14:51:23 +03:00
-> setNode ( $node );
2016-01-25 15:09:50 +03:00
$this -> defaultProvider -> expects ( $this -> once ())
-> method ( 'update' )
-> with ( $share )
-> willReturn ( $share );
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'post' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_set_expiration_date' , $hookListner , 'post' );
$hookListner -> expects ( $this -> never ()) -> method ( 'post' );
2016-02-04 15:25:24 +03:00
$this -> rootFolder -> method ( 'getUserFolder' ) -> with ( 'newUser' ) -> will ( $this -> returnSelf ());
$this -> rootFolder -> method ( 'getRelativePath' ) -> with ( '/newUser/files/myPath' ) -> willReturn ( '/myPath' );
2016-02-04 11:53:47 +03:00
$hookListner2 = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'post' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_update_permissions' , $hookListner2 , 'post' );
$hookListner2 -> expects ( $this -> once ()) -> method ( 'post' ) -> with ([
'itemType' => 'file' ,
'itemSource' => 100 ,
'shareType' => \OCP\Share :: SHARE_TYPE_USER ,
'shareWith' => 'origUser' ,
'uidOwner' => 'sharer' ,
'permissions' => 31 ,
2016-02-04 15:25:24 +03:00
'path' => '/myPath' ,
2016-02-04 11:53:47 +03:00
]);
2016-01-25 15:09:50 +03:00
$manager -> updateShare ( $share );
}
public function testUpdateShareGroup () {
$manager = $this -> createManagerMock ()
-> setMethods ([
'canShare' ,
'getShareById' ,
'generalCreateChecks' ,
'groupCreateChecks' ,
'pathCreateChecks' ,
])
-> getMock ();
2016-02-04 14:51:23 +03:00
$originalShare = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
2016-02-04 11:53:47 +03:00
-> setSharedWith ( 'origUser' )
-> setPermissions ( 31 );
2016-01-25 15:09:50 +03:00
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( true );
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'foo:42' ) -> willReturn ( $originalShare );
2016-02-04 14:51:23 +03:00
$node = $this -> getMock ( '\OCP\Files\File' );
$share = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$share -> setProviderId ( 'foo' )
-> setId ( '42' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
2016-02-02 23:02:09 +03:00
-> setSharedWith ( 'origUser' )
2016-02-04 14:51:23 +03:00
-> setShareOwner ( 'owner' )
2016-02-04 11:53:47 +03:00
-> setNode ( $node )
-> setPermissions ( 31 );
2016-01-25 15:09:50 +03:00
$this -> defaultProvider -> expects ( $this -> once ())
-> method ( 'update' )
-> with ( $share )
-> willReturn ( $share );
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'post' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_set_expiration_date' , $hookListner , 'post' );
$hookListner -> expects ( $this -> never ()) -> method ( 'post' );
2016-02-04 11:53:47 +03:00
$hookListner2 = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'post' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_update_permissions' , $hookListner2 , 'post' );
$hookListner2 -> expects ( $this -> never ()) -> method ( 'post' );
2016-01-25 15:09:50 +03:00
$manager -> updateShare ( $share );
}
public function testUpdateShareLink () {
$manager = $this -> createManagerMock ()
-> setMethods ([
'canShare' ,
'getShareById' ,
'generalCreateChecks' ,
'linkCreateChecks' ,
'pathCreateChecks' ,
'verifyPassword' ,
2016-01-26 16:29:30 +03:00
'validateExpirationDate' ,
2016-01-25 15:09:50 +03:00
])
-> getMock ();
2016-02-04 14:51:23 +03:00
$originalShare = $this -> manager -> newShare ();
2016-02-04 11:53:47 +03:00
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_LINK )
-> setPermissions ( 15 );
2016-01-25 15:09:50 +03:00
$tomorrow = new \DateTime ();
$tomorrow -> setTime ( 0 , 0 , 0 );
$tomorrow -> add ( new \DateInterval ( 'P1D' ));
$file = $this -> getMock ( 'OCP\Files\File' , [], [], 'File' );
$file -> method ( 'getId' ) -> willReturn ( 100 );
2016-01-30 01:04:42 +03:00
$share = $this -> manager -> newShare ();
2016-01-25 15:09:50 +03:00
$share -> setProviderId ( 'foo' )
-> setId ( '42' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_LINK )
2016-02-02 23:02:09 +03:00
-> setSharedBy ( 'owner' )
-> setShareOwner ( 'owner' )
2016-01-25 15:09:50 +03:00
-> setPassword ( 'password' )
-> setExpirationDate ( $tomorrow )
2016-02-04 11:53:47 +03:00
-> setNode ( $file )
-> setPermissions ( 15 );
2016-01-25 15:09:50 +03:00
2016-01-30 01:04:42 +03:00
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( true );
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'foo:42' ) -> willReturn ( $originalShare );
$manager -> expects ( $this -> once ()) -> method ( 'validateExpirationDate' ) -> with ( $share );
2016-01-25 15:09:50 +03:00
$this -> defaultProvider -> expects ( $this -> once ())
-> method ( 'update' )
-> with ( $share )
-> willReturn ( $share );
$hookListner = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'post' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_set_expiration_date' , $hookListner , 'post' );
$hookListner -> expects ( $this -> once ()) -> method ( 'post' ) -> with ([
'itemType' => 'file' ,
'itemSource' => 100 ,
'date' => $tomorrow ,
'uidOwner' => 'owner' ,
]);
2016-02-04 11:53:47 +03:00
$hookListner2 = $this -> getMockBuilder ( 'Dummy' ) -> setMethods ([ 'post' ]) -> getMock ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'post_update_permissions' , $hookListner2 , 'post' );
$hookListner2 -> expects ( $this -> never ()) -> method ( 'post' );
2016-01-25 15:09:50 +03:00
$manager -> updateShare ( $share );
}
2016-01-29 12:27:39 +03:00
/**
* @ expectedException \InvalidArgumentException
* @ expectedExceptionMessage Can ' t change target of link share
*/
public function testMoveShareLink () {
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_LINK );
$recipient = $this -> getMock ( '\OCP\IUser' );
$this -> manager -> moveShare ( $share , $recipient );
}
/**
* @ expectedException \InvalidArgumentException
* @ expectedExceptionMessage Invalid recipient
*/
public function testMoveShareUserNotRecipient () {
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_USER );
2016-02-02 23:02:09 +03:00
$share -> setSharedWith ( 'sharedWith' );
2016-01-29 12:27:39 +03:00
2016-02-02 23:02:09 +03:00
$this -> manager -> moveShare ( $share , 'recipient' );
2016-01-29 12:27:39 +03:00
}
public function testMoveShareUser () {
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_USER );
2016-02-02 23:02:09 +03:00
$share -> setSharedWith ( 'recipient' );
2016-01-29 12:27:39 +03:00
2016-02-02 23:02:09 +03:00
$this -> defaultProvider -> method ( 'move' ) -> with ( $share , 'recipient' ) -> will ( $this -> returnArgument ( 0 ));
2016-01-29 12:27:39 +03:00
2016-02-02 23:02:09 +03:00
$this -> manager -> moveShare ( $share , 'recipient' );
2016-01-29 12:27:39 +03:00
}
/**
* @ expectedException \InvalidArgumentException
* @ expectedExceptionMessage Invalid recipient
*/
public function testMoveShareGroupNotRecipient () {
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP );
$sharedWith = $this -> getMock ( '\OCP\IGroup' );
2016-02-02 23:02:09 +03:00
$share -> setSharedWith ( 'shareWith' );
2016-01-29 12:27:39 +03:00
$recipient = $this -> getMock ( '\OCP\IUser' );
$sharedWith -> method ( 'inGroup' ) -> with ( $recipient ) -> willReturn ( false );
2016-02-02 23:02:09 +03:00
$this -> groupManager -> method ( 'get' ) -> with ( 'shareWith' ) -> willReturn ( $sharedWith );
$this -> userManager -> method ( 'get' ) -> with ( 'recipient' ) -> willReturn ( $recipient );
$this -> manager -> moveShare ( $share , 'recipient' );
2016-01-29 12:27:39 +03:00
}
public function testMoveShareGroup () {
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP );
2016-02-02 23:02:09 +03:00
$group = $this -> getMock ( '\OCP\IGroup' );
$share -> setSharedWith ( 'group' );
2016-01-29 12:27:39 +03:00
$recipient = $this -> getMock ( '\OCP\IUser' );
2016-02-02 23:02:09 +03:00
$group -> method ( 'inGroup' ) -> with ( $recipient ) -> willReturn ( true );
2016-01-29 12:27:39 +03:00
2016-02-02 23:02:09 +03:00
$this -> groupManager -> method ( 'get' ) -> with ( 'group' ) -> willReturn ( $group );
$this -> userManager -> method ( 'get' ) -> with ( 'recipient' ) -> willReturn ( $recipient );
2016-01-29 12:27:39 +03:00
2016-02-02 23:02:09 +03:00
$this -> defaultProvider -> method ( 'move' ) -> with ( $share , 'recipient' ) -> will ( $this -> returnArgument ( 0 ));
$this -> manager -> moveShare ( $share , 'recipient' );
2016-01-29 12:27:39 +03:00
}
2016-01-13 16:21:55 +03:00
}
2016-01-08 16:31:28 +03:00
2016-01-13 16:21:55 +03:00
class DummyPassword {
public function listner ( $array ) {
$array [ 'accepted' ] = false ;
$array [ 'message' ] = 'password not accepted' ;
2016-01-08 16:31:28 +03:00
}
2016-01-13 16:21:55 +03:00
}
2016-01-08 16:31:28 +03:00
2016-01-13 16:21:55 +03:00
class DummyFactory implements IProviderFactory {
2016-01-08 16:31:28 +03:00
2016-01-13 16:21:55 +03:00
/** @var IShareProvider */
private $provider ;
2016-01-08 16:31:28 +03:00
2016-01-20 10:30:37 +03:00
public function __construct ( \OCP\IServerContainer $serverContainer ) {
}
2016-01-08 16:31:28 +03:00
/**
2016-01-13 16:21:55 +03:00
* @ param IShareProvider $provider
2016-01-08 16:31:28 +03:00
*/
2016-01-13 16:21:55 +03:00
public function setProvider ( $provider ) {
$this -> provider = $provider ;
2016-01-08 16:31:28 +03:00
}
/**
2016-01-13 16:21:55 +03:00
* @ param string $id
* @ return IShareProvider
2016-01-08 16:31:28 +03:00
*/
2016-01-13 16:21:55 +03:00
public function getProvider ( $id ) {
return $this -> provider ;
2016-01-08 16:31:28 +03:00
}
/**
2016-01-13 16:21:55 +03:00
* @ param int $shareType
* @ return IShareProvider
2016-01-08 16:31:28 +03:00
*/
2016-01-13 16:21:55 +03:00
public function getProviderForType ( $shareType ) {
return $this -> provider ;
2015-12-15 11:54:12 +03:00
}
2016-01-13 16:21:55 +03:00
}