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-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 ;
2016-01-25 15:09:50 +03:00
use Sabre\VObject\Property\VCard\DateTime ;
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 ;
2015-10-30 15:10:08 +03:00
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 ;
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' );
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 ,
$this -> factory
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 ,
$this -> factory
]);
}
2015-10-30 15:10:08 +03:00
/**
2016-02-02 16:07:11 +03:00
* @ expectedException \OCP\Share\Exceptions\ShareNotFound
2015-10-30 15:10:08 +03:00
*/
public function testDeleteNoShareId () {
2016-01-27 14:13:53 +03:00
$share = $this -> getMock ( '\OCP\Share\IShare' );
2015-10-30 15:10:08 +03:00
$share
-> expects ( $this -> once ())
2016-01-13 15:02:23 +03:00
-> method ( 'getFullId' )
2015-10-30 15:10:08 +03:00
-> with ()
-> willReturn ( null );
$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 [
[ \OCP\Share :: SHARE_TYPE_USER , $user , 'sharedWithUser' ],
[ \OCP\Share :: SHARE_TYPE_GROUP , $group , 'sharedWithGroup' ],
[ \OCP\Share :: SHARE_TYPE_LINK , '' , '' ],
[ \OCP\Share :: SHARE_TYPE_REMOTE , 'foo@bar.com' , 'foo@bar.com' ],
];
}
/**
* @ dataProvider dataTestDelete
*/
public function testDelete ( $shareType , $sharedWith , $sharedWith_string ) {
2016-01-11 12:30:03 +03:00
$manager = $this -> createManagerMock ()
2015-11-10 16:14:49 +03:00
-> setMethods ([ 'getShareById' , 'deleteChildren' ])
-> getMock ();
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$sharedBy -> method ( 'getUID' ) -> willReturn ( 'sharedBy' );
$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 )
-> setSharedBy ( $sharedBy )
-> setNode ( $path )
-> setTarget ( 'myTarget' );
2015-11-10 16:14:49 +03:00
2016-01-13 15:02:23 +03:00
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'prov:42' ) -> willReturn ( $share );
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 ,
'shareWith' => $sharedWith_string ,
'itemparent' => null ,
'uidOwner' => 'sharedBy' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget' ,
];
$hookListnerExpectsPost = [
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => $shareType ,
'shareWith' => $sharedWith_string ,
'itemparent' => null ,
'uidOwner' => 'sharedBy' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget' ,
'deletedShares' => [
[
'id' => 42 ,
'itemType' => 'file' ,
'itemSource' => 1 ,
'shareType' => $shareType ,
'shareWith' => $sharedWith_string ,
'itemparent' => null ,
'uidOwner' => 'sharedBy' ,
'fileSource' => 1 ,
'fileTarget' => 'myTarget' ,
],
],
];
$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 ();
$sharedBy1 = $this -> getMock ( '\OCP\IUser' );
$sharedBy1 -> method ( 'getUID' ) -> willReturn ( 'sharedBy1' );
$sharedBy2 = $this -> getMock ( '\OCP\IUser' );
$sharedBy2 -> method ( 'getUID' ) -> willReturn ( 'sharedBy2' );
$sharedBy3 = $this -> getMock ( '\OCP\IUser' );
$sharedBy3 -> method ( 'getUID' ) -> willReturn ( 'sharedBy3' );
$sharedWith1 = $this -> getMock ( '\OCP\IUser' );
$sharedWith1 -> method ( 'getUID' ) -> willReturn ( 'sharedWith1' );
$sharedWith2 = $this -> getMock ( '\OCP\IGroup' );
$sharedWith2 -> method ( 'getGID' ) -> willReturn ( 'sharedWith2' );
$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 )
-> setSharedWith ( $sharedWith1 )
-> setSharedBy ( $sharedBy1 )
-> setNode ( $path )
-> setTarget ( 'myTarget1' );
$share2 = $this -> manager -> newShare ();
$share2 -> setId ( 43 )
-> setProviderId ( 'prov' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
-> setSharedWith ( $sharedWith2 )
-> setSharedBy ( $sharedBy2 )
-> setNode ( $path )
-> setTarget ( 'myTarget2' )
-> setParent ( 42 );
$share3 = $this -> manager -> newShare ();
$share3 -> setId ( 44 )
-> setProviderId ( 'prov' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_LINK )
-> setSharedBy ( $sharedBy3 )
-> setNode ( $path )
-> setTarget ( 'myTarget3' )
-> setParent ( 43 );
2015-11-10 16:14:49 +03:00
2016-01-13 15:02:23 +03:00
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'prov:42' ) -> willReturn ( $share1 );
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
/**
* @ 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 () {
$user = $this -> getMock ( '\OCP\IUser' );
$user2 = $this -> getMock ( '\OCP\IUser' );
$group = $this -> getMock ( '\OCP\IGroup' );
$file = $this -> getMock ( '\OCP\Files\File' );
$node = $this -> getMock ( '\OCP\Files\Node' );
$data = [
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $file , null , $user , $user , 31 , null , null ), 'SharedWith should be an IUser' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $file , $group , $user , $user , 31 , null , null ), 'SharedWith should be an IUser' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $file , 'foo@bar.com' , $user , $user , 31 , null , null ), 'SharedWith should be an IUser' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $file , null , $user , $user , 31 , null , null ), 'SharedWith should be an IGroup' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $file , $user2 , $user , $user , 31 , null , null ), 'SharedWith should be an IGroup' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $file , 'foo@bar.com' , $user , $user , 31 , null , null ), 'SharedWith should be an IGroup' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $file , $user2 , $user , $user , 31 , null , null ), 'SharedWith should be empty' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $file , $group , $user , $user , 31 , null , null ), 'SharedWith should be empty' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $file , 'foo@bar.com' , $user , $user , 31 , null , null ), 'SharedWith should be empty' , true ],
[ $this -> createShare ( null , - 1 , $file , null , $user , $user , 31 , null , null ), 'unkown share type' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $file , $user2 , null , $user , 31 , null , null ), 'SharedBy should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $file , $group , null , $user , 31 , null , null ), 'SharedBy should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $file , null , null , $user , 31 , null , null ), 'SharedBy should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $file , $user , $user , $user , 31 , null , null ), 'Can\'t share with yourself' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , null , $user2 , $user , $user , 31 , null , null ), 'Path should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , null , $group , $user , $user , 31 , null , null ), 'Path should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , null , null , $user , $user , 31 , null , null ), 'Path should be set' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $node , $user2 , $user , $user , 31 , null , null ), 'Path should be either a file or a folder' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $node , $group , $user , $user , 31 , null , null ), 'Path should be either a file or a folder' , true ],
[ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $node , null , $user , $user , 31 , null , null ), 'Path should be either a file or a folder' , true ],
];
$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-01-06 13:34:12 +03:00
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $nonShareAble , $user2 , $user , $user , 31 , null , null ), 'You are not allowed to share path' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $nonShareAble , $group , $user , $user , 31 , null , null ), 'You are not allowed to share path' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $nonShareAble , null , $user , $user , 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
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $limitedPermssions , $user2 , $user , $user , null , null , null ), 'A share requires permissions' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $limitedPermssions , $group , $user , $user , null , null , null ), 'A share requires permissions' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $limitedPermssions , null , $user , $user , null , null , null ), 'A share requires permissions' , true ];
2016-01-06 13:34:12 +03:00
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $limitedPermssions , $user2 , $user , $user , 31 , null , null ), 'Cannot increase permissions of path' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $limitedPermssions , $group , $user , $user , 17 , null , null ), 'Cannot increase permissions of path' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $limitedPermssions , null , $user , $user , 3 , null , null ), 'Cannot increase permissions of path' , 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 );
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $allPermssions , $user2 , $user , $user , 30 , null , null ), 'Shares need at least read permissions' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $allPermssions , $group , $user , $user , 2 , null , null ), 'Shares need at least read permissions' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $allPermssions , null , $user , $user , 16 , null , null ), 'Shares need at least read permissions' , true ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_USER , $allPermssions , $user2 , $user , $user , 31 , null , null ), null , false ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_GROUP , $allPermssions , $group , $user , $user , 3 , null , null ), null , false ];
$data [] = [ $this -> createShare ( null , \OCP\Share :: SHARE_TYPE_LINK , $allPermssions , null , $user , $user , 17 , null , null ), null , false ];
return $data ;
}
/**
* @ dataProvider dataGeneralChecks
*
* @ param $share
* @ param $exceptionMessage
*/
public function testGeneralChecks ( $share , $exceptionMessage , $exception ) {
$thrown = null ;
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-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 ();
2015-12-15 11:54:12 +03:00
$this -> config -> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ '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-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 ;
}));
$future = $this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
2015-12-15 11:54:12 +03:00
2016-01-30 01:04:42 +03:00
$this -> assertEquals ( $expected , $future );
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 ) {
return $data [ 'expirationDate' ] == $expected ;
}));
2015-12-15 11:54:12 +03:00
2016-01-30 01:04:42 +03:00
$res = $this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
$this -> assertEquals ( $expected , $res );
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 ) {
return $data [ 'expirationDate' ] === null ;
}));
$share = $this -> manager -> newShare ();
$date = $this -> invokePrivate ( $this -> manager , 'validateExpirationDate' , [ $share ]);
2015-12-15 11:54:12 +03:00
$this -> assertNull ( $date );
}
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
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Only sharing with group members is allowed
*/
public function testUserCreateChecksShareWithGroupMembersOnlyDifferentGroups () {
$share = new \OC\Share20\Share ();
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$sharedWith = $this -> getMock ( '\OCP\IUser' );
$share -> setSharedBy ( $sharedBy ) -> setSharedWith ( $sharedWith );
$this -> groupManager
-> method ( 'getUserGroupIds' )
-> will (
$this -> returnValueMap ([
[ $sharedBy , [ 'group1' ]],
[ $sharedWith , [ 'group2' ]],
])
);
$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 () {
$share = new \OC\Share20\Share ();
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$sharedWith = $this -> getMock ( '\OCP\IUser' );
$share -> setSharedBy ( $sharedBy ) -> setSharedWith ( $sharedWith );
$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' ]],
])
);
$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-01-27 22:51:26 +03:00
$share -> setSharedWith ( $sharedWith ) -> setNode ( $path )
2016-01-25 14:09:56 +03:00
-> setProviderId ( 'foo' ) -> setId ( 'bar' );
2016-01-27 22:51:26 +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' );
$owner = $this -> getMock ( '\OCP\IUser' );
$path = $this -> getMock ( '\OCP\Files\Node' );
2016-01-25 14:09:56 +03:00
2015-12-15 11:54:12 +03:00
$share -> setSharedWith ( $sharedWith )
2016-01-27 22:51:26 +03:00
-> setNode ( $path )
2016-01-25 14:09:56 +03:00
-> setShareOwner ( $owner )
-> setProviderId ( 'foo' )
-> setId ( 'bar' );
2015-12-15 11:54:12 +03:00
$share2 = new \OC\Share20\Share ();
$owner2 = $this -> getMock ( '\OCP\IUser' );
$share2 -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
2016-01-25 14:09:56 +03:00
-> setShareOwner ( $owner2 )
-> setProviderId ( 'foo' )
-> setId ( 'baz' );
2015-12-15 11:54:12 +03:00
$group = $this -> getMock ( '\OCP\IGroup' );
$group -> method ( 'inGroup' )
-> with ( $sharedWith )
-> willReturn ( true );
$share2 -> setSharedWith ( $group );
$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 () {
2015-12-15 11:54:12 +03:00
$share = new \OC\Share20\Share ();
$sharedWith = $this -> getMock ( '\OCP\IUser' );
$owner = $this -> getMock ( '\OCP\IUser' );
$path = $this -> getMock ( '\OCP\Files\Node' );
$share -> setSharedWith ( $sharedWith )
2016-01-27 22:51:26 +03:00
-> setNode ( $path )
2016-01-25 14:09:56 +03:00
-> setShareOwner ( $owner )
-> setProviderId ( 'foo' )
-> setId ( 'bar' );
2015-12-15 11:54:12 +03:00
$share2 = new \OC\Share20\Share ();
$owner2 = $this -> getMock ( '\OCP\IUser' );
$share2 -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
2016-01-25 14:09:56 +03:00
-> setShareOwner ( $owner2 )
-> setProviderId ( 'foo' )
-> setId ( 'baz' );
2015-12-15 11:54:12 +03:00
$group = $this -> getMock ( '\OCP\IGroup' );
$group -> method ( 'inGroup' )
-> with ( $sharedWith )
-> willReturn ( false );
$share2 -> setSharedWith ( $group );
$this -> defaultProvider
-> method ( 'getSharesByPath' )
-> with ( $path )
-> willReturn ([ $share2 ]);
$this -> invokePrivate ( $this -> manager , 'userCreateChecks' , [ $share ]);
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Only sharing within your own groups is allowed
*/
public function testGroupCreateChecksShareWithGroupMembersOnlyNotInGroup () {
$share = new \OC\Share20\Share ();
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$sharedWith = $this -> getMock ( '\OCP\IGroup' );
$share -> setSharedBy ( $sharedBy ) -> setSharedWith ( $sharedWith );
$sharedWith -> method ( 'inGroup' ) -> with ( $sharedBy ) -> willReturn ( false );
$this -> config
-> method ( 'getAppValue' )
-> will ( $this -> returnValueMap ([
[ 'core' , 'shareapi_only_share_with_group_members' , 'no' , 'yes' ],
]));
$this -> invokePrivate ( $this -> manager , 'groupCreateChecks' , [ $share ]);
}
public function testGroupCreateChecksShareWithGroupMembersOnlyInGroup () {
$share = new \OC\Share20\Share ();
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$sharedWith = $this -> getMock ( '\OCP\IGroup' );
$share -> setSharedBy ( $sharedBy ) -> setSharedWith ( $sharedWith );
$sharedWith -> method ( 'inGroup' ) -> with ( $sharedBy ) -> willReturn ( true );
$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' ],
]));
$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
$sharedWith = $this -> getMock ( '\OCP\IGroup' );
$path = $this -> getMock ( '\OCP\Files\Node' );
2016-01-25 14:09:56 +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
$share2 = new \OC\Share20\Share ();
2016-01-25 14:09:56 +03:00
$share2 -> setSharedWith ( $sharedWith )
-> setProviderId ( 'foo' )
-> setId ( 'baz' );
2015-12-15 11:54:12 +03:00
$this -> defaultProvider -> method ( 'getSharesByPath' )
-> with ( $path )
-> willReturn ([ $share2 ]);
$this -> invokePrivate ( $this -> manager , 'groupCreateChecks' , [ $share ]);
}
public function testGroupCreateChecksPathAlreadySharedWithDifferentGroup () {
$share = new \OC\Share20\Share ();
$sharedWith = $this -> getMock ( '\OCP\IGroup' );
$share -> setSharedWith ( $sharedWith );
$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
$share2 = new \OC\Share20\Share ();
$sharedWith2 = $this -> getMock ( '\OCP\IGroup' );
$share2 -> setSharedWith ( $sharedWith2 );
$this -> defaultProvider -> method ( 'getSharesByPath' )
-> with ( $path )
-> willReturn ([ $share2 ]);
$this -> invokePrivate ( $this -> manager , 'groupCreateChecks' , [ $share ]);
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Link sharing not allowed
*/
public function testLinkCreateChecksNoLinkSharesAllowed () {
$share = new \OC\Share20\Share ();
$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 () {
$share = new \OC\Share20\Share ();
$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 () {
$share = new \OC\Share20\Share ();
$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 () {
$share = new \OC\Share20\Share ();
$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 () {
$share = new \OC\Share20\Share ();
$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 () {
$share = new \OC\Share20\Share ();
$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-01-27 22:51:26 +03:00
$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-01-27 22:51:26 +03:00
$manager -> method ( 'sharingDisabledForUser' ) -> willReturn ( $disabledForUser );
2015-12-15 11:54:12 +03:00
$user = $this -> getMock ( '\OCP\IUser' );
2016-01-27 22:51:26 +03:00
$share = $this -> manager -> newShare ();
2015-12-15 11:54:12 +03:00
$share -> setSharedBy ( $user );
$res = $this -> invokePrivate ( $manager , 'canShare' , [ $share ]);
$this -> assertEquals ( $expected , $res );
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage The Share API is disabled
*/
public function testCreateShareCantShare () {
2016-01-11 12:30:03 +03:00
$manager = $this -> createManagerMock ()
2015-12-15 11:54:12 +03:00
-> setMethods ([ 'canShare' ])
-> getMock ();
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( false );
$share = new \OC\Share20\Share ();
$manager -> createShare ( $share );
}
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 ();
$sharedWith = $this -> getMock ( '\OCP\IUser' );
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$shareOwner = $this -> getMock ( '\OCP\IUser' );
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> method ( 'getOwner' ) -> willReturn ( $shareOwner );
$path -> method ( 'getName' ) -> willReturn ( 'target' );
$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 );
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' )
-> with ( $shareOwner );
$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 ();
$sharedWith = $this -> getMock ( '\OCP\IGroup' );
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$shareOwner = $this -> getMock ( '\OCP\IUser' );
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> method ( 'getOwner' ) -> willReturn ( $shareOwner );
$path -> method ( 'getName' ) -> willReturn ( 'target' );
$share = $this -> createShare (
null ,
\OCP\Share :: SHARE_TYPE_GROUP ,
$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 ( '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' )
-> with ( $shareOwner );
$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' ,
])
-> getMock ();
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$sharedBy -> method ( 'getUID' ) -> willReturn ( 'sharedBy' );
$shareOwner = $this -> getMock ( '\OCP\IUser' );
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> method ( 'getOwner' ) -> willReturn ( $shareOwner );
$path -> method ( 'getName' ) -> willReturn ( 'target' );
$path -> method ( 'getId' ) -> willReturn ( 1 );
$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-01-25 14:09:56 +03:00
-> setSharedBy ( $sharedBy )
-> 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' );
$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 );
$this -> assertSame ( $shareOwner , $share -> getShareOwner ());
$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 ();
$sharedWith = $this -> getMock ( '\OCP\IUser' );
$sharedBy = $this -> getMock ( '\OCP\IUser' );
$shareOwner = $this -> getMock ( '\OCP\IUser' );
$path = $this -> getMock ( '\OCP\Files\File' );
$path -> method ( 'getOwner' ) -> willReturn ( $shareOwner );
$path -> method ( 'getName' ) -> willReturn ( 'target' );
$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 );
$share -> expects ( $this -> once ())
-> method ( 'setShareOwner' )
-> with ( $shareOwner );
$share -> expects ( $this -> once ())
-> method ( 'setTarget' )
-> with ( '/target' );
$dummy = new DummyCreate ();
\OCP\Util :: connectHook ( 'OCP\Share' , 'pre_shared' , $dummy , 'listner' );
$manager -> createShare ( $share );
}
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 ,
$factory
);
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 );
}
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 The Share API is disabled
*/
public function testUpdateShareCantShare () {
$manager = $this -> createManagerMock ()
-> setMethods ([ 'canShare' ])
-> getMock ();
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( false );
$share = new \OC\Share20\Share ();
$manager -> updateShare ( $share );
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Can ' t change share type
*/
public function testUpdateShareCantChangeShareType () {
$manager = $this -> createManagerMock ()
-> setMethods ([
'canShare' ,
'getShareById'
])
-> getMock ();
$originalShare = new \OC\Share20\Share ();
$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 );
$share = new \OC\Share20\Share ();
$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 ();
$origGroup = $this -> getMock ( '\OCP\IGroup' );
$newGroup = $this -> getMock ( '\OCP\IGroup' );
$originalShare = new \OC\Share20\Share ();
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
-> setSharedWith ( $origGroup );
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( true );
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'foo:42' ) -> willReturn ( $originalShare );
$share = new \OC\Share20\Share ();
$share -> setProviderId ( 'foo' )
-> setId ( '42' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
-> setSharedWith ( $newGroup );
$manager -> updateShare ( $share );
}
/**
* @ expectedException Exception
* @ expectedExceptionMessage Can ' t share with the share owner
*/
public function testUpdateShareCantShareWithOwner () {
$manager = $this -> createManagerMock ()
-> setMethods ([
'canShare' ,
'getShareById'
])
-> getMock ();
$origUser = $this -> getMock ( '\OCP\IUser' );
$newUser = $this -> getMock ( '\OCP\IUser' );
$originalShare = new \OC\Share20\Share ();
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
-> setSharedWith ( $origUser );
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( true );
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'foo:42' ) -> willReturn ( $originalShare );
$share = new \OC\Share20\Share ();
$share -> setProviderId ( 'foo' )
-> setId ( '42' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
-> setSharedWith ( $newUser )
-> setShareOwner ( $newUser );
$manager -> updateShare ( $share );
}
public function testUpdateShareUser () {
$manager = $this -> createManagerMock ()
-> setMethods ([
'canShare' ,
'getShareById' ,
'generalCreateChecks' ,
'userCreateChecks' ,
'pathCreateChecks' ,
])
-> getMock ();
$origUser = $this -> getMock ( '\OCP\IUser' );
$newUser = $this -> getMock ( '\OCP\IUser' );
$originalShare = new \OC\Share20\Share ();
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
-> setSharedWith ( $origUser );
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( true );
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'foo:42' ) -> willReturn ( $originalShare );
$share = new \OC\Share20\Share ();
$share -> setProviderId ( 'foo' )
-> setId ( '42' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_USER )
-> setSharedWith ( $origUser )
-> setShareOwner ( $newUser );
$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' );
$manager -> updateShare ( $share );
}
public function testUpdateShareGroup () {
$manager = $this -> createManagerMock ()
-> setMethods ([
'canShare' ,
'getShareById' ,
'generalCreateChecks' ,
'groupCreateChecks' ,
'pathCreateChecks' ,
])
-> getMock ();
$origGroup = $this -> getMock ( '\OCP\IGroup' );
$user = $this -> getMock ( '\OCP\IUser' );
$originalShare = new \OC\Share20\Share ();
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
-> setSharedWith ( $origGroup );
$manager -> expects ( $this -> once ()) -> method ( 'canShare' ) -> willReturn ( true );
$manager -> expects ( $this -> once ()) -> method ( 'getShareById' ) -> with ( 'foo:42' ) -> willReturn ( $originalShare );
$share = new \OC\Share20\Share ();
$share -> setProviderId ( 'foo' )
-> setId ( '42' )
-> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP )
-> setSharedWith ( $origGroup )
-> setShareOwner ( $user );
$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' );
$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 ();
$user = $this -> getMock ( '\OCP\IUser' );
$user -> method ( 'getUID' ) -> willReturn ( 'owner' );
$originalShare = new \OC\Share20\Share ();
$originalShare -> setShareType ( \OCP\Share :: SHARE_TYPE_LINK );
$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 )
-> setSharedBy ( $user )
-> setShareOwner ( $user )
-> setPassword ( 'password' )
-> setExpirationDate ( $tomorrow )
2016-01-27 22:51:26 +03:00
-> setNode ( $file );
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' ,
]);
$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 );
$sharedWith = $this -> getMock ( '\OCP\IUser' );
$share -> setSharedWith ( $sharedWith );
$recipient = $this -> getMock ( '\OCP\IUser' );
$this -> manager -> moveShare ( $share , $recipient );
}
public function testMoveShareUser () {
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_USER );
$recipient = $this -> getMock ( '\OCP\IUser' );
$share -> setSharedWith ( $recipient );
$this -> defaultProvider -> method ( 'move' ) -> with ( $share , $recipient ) -> will ( $this -> returnArgument ( 0 ));
$this -> manager -> moveShare ( $share , $recipient );
}
/**
* @ expectedException \InvalidArgumentException
* @ expectedExceptionMessage Invalid recipient
*/
public function testMoveShareGroupNotRecipient () {
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP );
$sharedWith = $this -> getMock ( '\OCP\IGroup' );
$share -> setSharedWith ( $sharedWith );
$recipient = $this -> getMock ( '\OCP\IUser' );
$sharedWith -> method ( 'inGroup' ) -> with ( $recipient ) -> willReturn ( false );
$this -> manager -> moveShare ( $share , $recipient );
}
public function testMoveShareGroup () {
$share = $this -> manager -> newShare ();
$share -> setShareType ( \OCP\Share :: SHARE_TYPE_GROUP );
$sharedWith = $this -> getMock ( '\OCP\IGroup' );
$share -> setSharedWith ( $sharedWith );
$recipient = $this -> getMock ( '\OCP\IUser' );
$sharedWith -> method ( 'inGroup' ) -> with ( $recipient ) -> willReturn ( true );
$this -> defaultProvider -> method ( 'move' ) -> with ( $share , $recipient ) -> will ( $this -> returnArgument ( 0 ));
$this -> manager -> moveShare ( $share , $recipient );
}
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 DummyCreate {
public function listner ( $array ) {
$array [ 'run' ] = false ;
$array [ 'error' ] = 'I won\'t let you share!' ;
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
}