2014-10-15 13:58:44 +04:00
< ? php
/**
2016-07-21 17:49:16 +03:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
*
* @ author Bjoern Schiessle < bjoern @ schiessle . org >
2016-05-26 20:56:05 +03:00
* @ author Björn Schießle < bjoern @ schiessle . org >
2017-11-06 22:15:27 +03:00
* @ author Georg Ehrke < oc . list @ georgehrke . com >
2016-07-21 17:49:16 +03:00
* @ author Joas Schilling < coding @ schilljs . com >
2016-05-26 20:56:05 +03:00
* @ author Lukas Reschke < lukas @ statuscode . ch >
2015-03-26 13:44:34 +03:00
* @ author Morris Jobke < hey @ morrisjobke . de >
2016-07-21 19:13:36 +03:00
* @ author Robin Appelman < robin @ icewind . nl >
2016-07-21 17:49:16 +03:00
* @ author Roeland Jago Douma < roeland @ famdouma . nl >
2016-01-12 17:02:16 +03:00
* @ author Thomas Müller < thomas . mueller @ tmit . eu >
2015-03-26 13:44:34 +03:00
* @ author Vincent Cloutier < vincent1cloutier @ gmail . com >
*
* @ 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 />
2014-10-15 13:58:44 +04:00
*
*/
2015-02-26 13:37:37 +03:00
2016-05-17 12:42:03 +03:00
namespace OCA\Files_Sharing\Tests\Controllers ;
2014-10-15 13:58:44 +04:00
use OC\Files\Filesystem ;
2016-04-18 19:17:08 +03:00
use OCA\FederatedFileSharing\FederatedShareProvider ;
2016-10-24 12:46:25 +03:00
use OCA\Files_Sharing\Controller\ShareController ;
2016-06-09 19:29:13 +03:00
use OCP\AppFramework\Http\DataResponse ;
2018-04-05 16:40:58 +03:00
use OCP\AppFramework\Http\Template\ExternalShareMenuAction ;
use OCP\AppFramework\Http\Template\LinkMenuAction ;
2018-02-09 13:34:34 +03:00
use OCP\AppFramework\Http\Template\PublicTemplateResponse ;
use OCP\AppFramework\Http\Template\SimpleMenuAction ;
2018-06-14 11:20:10 +03:00
use OCP\Files\NotFoundException ;
2017-10-24 16:26:53 +03:00
use OCP\IConfig ;
use OCP\IL10N ;
use OCP\ILogger ;
use OCP\IPreview ;
use OCP\IRequest ;
use OCP\IUser ;
2016-02-02 16:07:11 +03:00
use OCP\Share\Exceptions\ShareNotFound ;
2015-03-24 13:21:58 +03:00
use OCP\AppFramework\Http\NotFoundResponse ;
2014-10-15 13:58:44 +04:00
use OCP\AppFramework\Http\RedirectResponse ;
use OCP\AppFramework\Http\TemplateResponse ;
2016-01-15 11:41:51 +03:00
use OCP\ISession ;
2016-02-03 10:25:57 +03:00
use OCP\IUserManager ;
2014-10-15 13:58:44 +04:00
use OCP\Security\ISecureRandom ;
2016-01-15 11:41:51 +03:00
use OCP\IURLGenerator ;
2017-10-25 01:03:28 +03:00
use OCP\Share\IShare ;
2016-07-15 16:01:14 +03:00
use Symfony\Component\EventDispatcher\EventDispatcherInterface ;
2014-10-15 13:58:44 +04:00
/**
2015-11-20 13:27:11 +03:00
* @ group DB
*
2014-10-15 13:58:44 +04:00
* @ package OCA\Files_Sharing\Controllers
*/
2015-02-25 14:52:16 +03:00
class ShareControllerTest extends \Test\TestCase {
2014-10-15 13:58:44 +04:00
/** @var string */
private $user ;
/** @var string */
private $oldUser ;
2016-01-20 12:14:03 +03:00
/** @var string */
private $appName = 'files_sharing' ;
2014-10-15 13:58:44 +04:00
/** @var ShareController */
private $shareController ;
2016-01-20 12:14:03 +03:00
/** @var IURLGenerator | \PHPUnit_Framework_MockObject_MockObject */
2014-10-15 13:58:44 +04:00
private $urlGenerator ;
2016-01-15 11:41:51 +03:00
/** @var ISession | \PHPUnit_Framework_MockObject_MockObject */
private $session ;
2016-01-20 12:14:03 +03:00
/** @var \OCP\IPreview | \PHPUnit_Framework_MockObject_MockObject */
private $previewManager ;
/** @var \OCP\IConfig | \PHPUnit_Framework_MockObject_MockObject */
private $config ;
2016-01-15 11:41:51 +03:00
/** @var \OC\Share20\Manager | \PHPUnit_Framework_MockObject_MockObject */
private $shareManager ;
2016-02-03 10:25:57 +03:00
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject */
private $userManager ;
2016-04-18 19:17:08 +03:00
/** @var FederatedShareProvider | \PHPUnit_Framework_MockObject_MockObject */
private $federatedShareProvider ;
2016-07-15 16:01:14 +03:00
/** @var EventDispatcherInterface | \PHPUnit_Framework_MockObject_MockObject */
private $eventDispatcher ;
2018-02-09 13:34:34 +03:00
/** @var IL10N */
private $l10n ;
2014-10-15 13:58:44 +04:00
protected function setUp () {
2016-05-17 12:42:03 +03:00
parent :: setUp ();
2016-01-20 12:14:03 +03:00
$this -> appName = 'files_sharing' ;
$this -> shareManager = $this -> getMockBuilder ( '\OC\Share20\Manager' ) -> disableOriginalConstructor () -> getMock ();
2017-10-24 16:26:53 +03:00
$this -> urlGenerator = $this -> getMockBuilder ( IURLGenerator :: class ) -> getMock ();
$this -> session = $this -> getMockBuilder ( ISession :: class ) -> getMock ();
$this -> previewManager = $this -> getMockBuilder ( IPreview :: class ) -> getMock ();
$this -> config = $this -> getMockBuilder ( IConfig :: class ) -> getMock ();
$this -> userManager = $this -> getMockBuilder ( IUserManager :: class ) -> getMock ();
2016-04-18 19:17:08 +03:00
$this -> federatedShareProvider = $this -> getMockBuilder ( 'OCA\FederatedFileSharing\FederatedShareProvider' )
-> disableOriginalConstructor () -> getMock ();
$this -> federatedShareProvider -> expects ( $this -> any ())
-> method ( 'isOutgoingServer2serverShareEnabled' ) -> willReturn ( true );
$this -> federatedShareProvider -> expects ( $this -> any ())
-> method ( 'isIncomingServer2serverShareEnabled' ) -> willReturn ( true );
2016-07-15 16:01:14 +03:00
$this -> eventDispatcher = $this -> getMockBuilder ( 'Symfony\Component\EventDispatcher\EventDispatcherInterface' ) -> getMock ();
2018-02-09 13:34:34 +03:00
$this -> l10n = $this -> createMock ( IL10N :: class );
2016-01-20 12:14:03 +03:00
2016-10-24 12:46:25 +03:00
$this -> shareController = new \OCA\Files_Sharing\Controller\ShareController (
2016-01-20 12:14:03 +03:00
$this -> appName ,
2017-10-24 16:26:53 +03:00
$this -> getMockBuilder ( IRequest :: class ) -> getMock (),
2016-01-20 12:14:03 +03:00
$this -> config ,
$this -> urlGenerator ,
2016-02-03 10:25:57 +03:00
$this -> userManager ,
2017-10-24 16:26:53 +03:00
$this -> getMockBuilder ( ILogger :: class ) -> getMock (),
2016-07-15 13:22:53 +03:00
$this -> getMockBuilder ( '\OCP\Activity\IManager' ) -> getMock (),
2016-01-20 12:14:03 +03:00
$this -> shareManager ,
$this -> session ,
$this -> previewManager ,
2016-07-15 13:22:53 +03:00
$this -> getMockBuilder ( '\OCP\Files\IRootFolder' ) -> getMock (),
2016-07-15 16:01:14 +03:00
$this -> federatedShareProvider ,
2016-07-22 17:13:26 +03:00
$this -> eventDispatcher ,
2018-02-09 13:34:34 +03:00
$this -> l10n ,
2017-04-07 23:42:43 +03:00
$this -> getMockBuilder ( '\OCP\Defaults' ) -> getMock ()
2016-01-20 12:14:03 +03:00
);
2014-10-15 13:58:44 +04:00
// Store current user
$this -> oldUser = \OC_User :: getUser ();
// Create a dummy user
2016-01-11 21:59:15 +03:00
$this -> user = \OC :: $server -> getSecureRandom () -> generate ( 12 , ISecureRandom :: CHAR_LOWER );
2014-10-15 13:58:44 +04:00
2015-12-17 17:10:11 +03:00
\OC :: $server -> getUserManager () -> createUser ( $this -> user , $this -> user );
2014-10-15 13:58:44 +04:00
\OC_Util :: tearDownFS ();
2015-05-11 16:22:05 +03:00
$this -> loginAsUser ( $this -> user );
2014-10-15 13:58:44 +04:00
}
protected function tearDown () {
\OC_Util :: tearDownFS ();
\OC_User :: setUserId ( '' );
Filesystem :: tearDown ();
2015-12-17 17:59:23 +03:00
$user = \OC :: $server -> getUserManager () -> get ( $this -> user );
if ( $user !== null ) { $user -> delete (); }
2014-10-15 13:58:44 +04:00
\OC_User :: setIncognitoMode ( false );
\OC :: $server -> getSession () -> set ( 'public_link_authenticated' , '' );
// Set old user
\OC_User :: setUserId ( $this -> oldUser );
\OC_Util :: setupFS ( $this -> oldUser );
2016-05-17 12:42:03 +03:00
parent :: tearDown ();
2014-10-15 13:58:44 +04:00
}
2016-01-15 11:41:51 +03:00
public function testShowShareInvalidToken () {
2018-06-14 11:20:10 +03:00
$this -> shareController -> setToken ( 'invalidtoken' );
2016-01-15 11:41:51 +03:00
$this -> shareManager
-> expects ( $this -> once ())
-> method ( 'getShareByToken' )
-> with ( 'invalidtoken' )
-> will ( $this -> throwException ( new ShareNotFound ()));
2015-03-24 13:21:58 +03:00
2018-06-14 11:20:10 +03:00
$this -> expectException ( NotFoundException :: class );
2014-10-15 13:58:44 +04:00
// Test without a not existing token
2018-06-14 11:20:10 +03:00
$this -> shareController -> showShare ();
2016-01-15 11:41:51 +03:00
}
2014-10-15 13:58:44 +04:00
2016-01-15 11:41:51 +03:00
public function testShowShareNotAuthenticated () {
2018-06-14 11:20:10 +03:00
$this -> shareController -> setToken ( 'validtoken' );
2016-02-03 10:25:57 +03:00
$share = \OC :: $server -> getShareManager () -> newShare ();
$share -> setPassword ( 'password' );
2016-01-15 11:41:51 +03:00
$this -> shareManager
-> expects ( $this -> once ())
-> method ( 'getShareByToken' )
-> with ( 'validtoken' )
-> willReturn ( $share );
2018-06-14 11:20:10 +03:00
$this -> expectException ( NotFoundException :: class );
2016-01-20 12:14:03 +03:00
2016-01-15 11:41:51 +03:00
// Test without a not existing token
2018-06-14 11:20:10 +03:00
$this -> shareController -> showShare ();
2016-01-15 11:41:51 +03:00
}
2014-10-15 13:58:44 +04:00
2016-01-15 11:41:51 +03:00
public function testShowShare () {
2018-06-14 11:20:10 +03:00
$this -> shareController -> setToken ( 'token' );
2017-10-24 16:26:53 +03:00
$owner = $this -> getMockBuilder ( IUser :: class ) -> getMock ();
2016-01-15 11:41:51 +03:00
$owner -> method ( 'getDisplayName' ) -> willReturn ( 'ownerDisplay' );
$owner -> method ( 'getUID' ) -> willReturn ( 'ownerUID' );
2016-07-15 13:22:53 +03:00
$file = $this -> getMockBuilder ( 'OCP\Files\File' ) -> getMock ();
2016-01-15 11:41:51 +03:00
$file -> method ( 'getName' ) -> willReturn ( 'file1.txt' );
$file -> method ( 'getMimetype' ) -> willReturn ( 'text/plain' );
$file -> method ( 'getSize' ) -> willReturn ( 33 );
2016-02-09 16:56:47 +03:00
$file -> method ( 'isReadable' ) -> willReturn ( true );
$file -> method ( 'isShareable' ) -> willReturn ( true );
2016-01-15 11:41:51 +03:00
2016-02-03 10:25:57 +03:00
$share = \OC :: $server -> getShareManager () -> newShare ();
$share -> setId ( 42 );
$share -> setPassword ( 'password' )
-> setShareOwner ( 'ownerUID' )
-> setNode ( $file )
-> setTarget ( '/file1.txt' );
2016-01-15 11:41:51 +03:00
$this -> session -> method ( 'exists' ) -> with ( 'public_link_authenticated' ) -> willReturn ( true );
$this -> session -> method ( 'get' ) -> with ( 'public_link_authenticated' ) -> willReturn ( '42' );
2018-02-09 13:34:34 +03:00
$this -> urlGenerator -> expects ( $this -> at ( 0 ))
-> method ( 'linkToRouteAbsolute' )
-> with ( 'files_sharing.sharecontroller.downloadShare' , [ 'token' => 'token' ])
-> willReturn ( 'downloadURL' );
2016-01-20 12:14:03 +03:00
$this -> previewManager -> method ( 'isMimeSupported' ) -> with ( 'text/plain' ) -> willReturn ( true );
$this -> config -> method ( 'getSystemValue' )
-> willReturnMap (
[
[ 'max_filesize_animated_gifs_public_sharing' , 10 , 10 ],
[ 'enable_previews' , true , true ],
2016-05-25 11:21:07 +03:00
[ 'preview_max_x' , 1024 , 1024 ],
[ 'preview_max_y' , 1024 , 1024 ],
2016-01-20 12:14:03 +03:00
]
);
$shareTmpl [ 'maxSizeAnimateGif' ] = $this -> config -> getSystemValue ( 'max_filesize_animated_gifs_public_sharing' , 10 );
$shareTmpl [ 'previewEnabled' ] = $this -> config -> getSystemValue ( 'enable_previews' , true );
2016-01-15 11:41:51 +03:00
$this -> shareManager
-> expects ( $this -> once ())
-> method ( 'getShareByToken' )
-> with ( 'token' )
-> willReturn ( $share );
2016-09-08 21:34:04 +03:00
$this -> config
-> expects ( $this -> once ())
-> method ( 'getAppValue' )
-> with ( 'core' , 'shareapi_public_link_disclaimertext' , null )
-> willReturn ( 'My disclaimer text' );
2016-01-15 11:41:51 +03:00
2016-02-03 10:25:57 +03:00
$this -> userManager -> method ( 'get' ) -> with ( 'ownerUID' ) -> willReturn ( $owner );
2016-07-15 16:01:14 +03:00
$this -> eventDispatcher -> expects ( $this -> once ())
-> method ( 'dispatch' )
-> with ( 'OCA\Files_Sharing::loadAdditionalScripts' );
2018-02-09 13:34:34 +03:00
$this -> l10n -> expects ( $this -> any ())
-> method ( 't' )
-> will ( $this -> returnCallback ( function ( $text , $parameters ) {
return vsprintf ( $text , $parameters );
}));
2018-06-14 11:20:10 +03:00
$response = $this -> shareController -> showShare ();
2014-10-15 13:58:44 +04:00
$sharedTmplParams = array (
2016-01-15 11:41:51 +03:00
'displayName' => 'ownerDisplay' ,
'owner' => 'ownerUID' ,
2014-10-15 13:58:44 +04:00
'filename' => 'file1.txt' ,
'directory_path' => '/file1.txt' ,
'mimetype' => 'text/plain' ,
2016-01-15 11:41:51 +03:00
'dirToken' => 'token' ,
'sharingToken' => 'token' ,
2014-10-15 13:58:44 +04:00
'server2serversharing' => true ,
'protected' => 'true' ,
2014-11-18 16:54:08 +03:00
'dir' => '' ,
2018-02-09 13:34:34 +03:00
'downloadURL' => 'downloadURL' ,
2015-01-17 14:11:52 +03:00
'fileSize' => '33 B' ,
'nonHumanFileSize' => 33 ,
'maxSizeAnimateGif' => 10 ,
2015-03-16 14:09:03 +03:00
'previewSupported' => true ,
2015-06-09 17:33:26 +03:00
'previewEnabled' => true ,
2016-05-25 11:21:07 +03:00
'previewMaxX' => 1024 ,
'previewMaxY' => 1024 ,
2016-06-07 13:28:02 +03:00
'hideFileList' => false ,
2016-09-08 21:34:04 +03:00
'shareOwner' => 'ownerDisplay' ,
'disclaimer' => 'My disclaimer text' ,
2016-07-22 17:13:26 +03:00
'shareUrl' => null ,
2017-09-25 22:44:42 +03:00
'previewImage' => null ,
2018-02-09 13:34:34 +03:00
'previewURL' => 'downloadURL' ,
2014-10-15 13:58:44 +04:00
);
2015-03-10 12:06:15 +03:00
$csp = new \OCP\AppFramework\Http\ContentSecurityPolicy ();
$csp -> addAllowedFrameDomain ( '\'self\'' );
2018-02-09 13:34:34 +03:00
$expectedResponse = new PublicTemplateResponse ( $this -> appName , 'public' , $sharedTmplParams );
2015-03-10 12:06:15 +03:00
$expectedResponse -> setContentSecurityPolicy ( $csp );
2018-02-09 13:34:34 +03:00
$expectedResponse -> setHeaderTitle ( $sharedTmplParams [ 'filename' ]);
$expectedResponse -> setHeaderDetails ( 'shared by ' . $sharedTmplParams [ 'displayName' ]);
$expectedResponse -> setHeaderActions ([
new SimpleMenuAction ( 'download' , $this -> l10n -> t ( 'Download' ), 'icon-download-white' , $sharedTmplParams [ 'downloadURL' ], 0 ),
new SimpleMenuAction ( 'download' , $this -> l10n -> t ( 'Download' ), 'icon-download' , $sharedTmplParams [ 'downloadURL' ], 10 , $sharedTmplParams [ 'fileSize' ]),
new LinkMenuAction ( $this -> l10n -> t ( 'Direct link' ), 'icon-public' , $sharedTmplParams [ 'previewURL' ]),
new ExternalShareMenuAction ( $this -> l10n -> t ( 'Add to your Nextcloud' ), 'icon-external' , $sharedTmplParams [ 'owner' ], $sharedTmplParams [ 'displayName' ], $sharedTmplParams [ 'filename' ]),
]);
2015-03-10 12:06:15 +03:00
2014-10-15 13:58:44 +04:00
$this -> assertEquals ( $expectedResponse , $response );
}
2016-02-09 17:01:12 +03:00
/**
* @ expectedException \OCP\Files\NotFoundException
*/
public function testShowShareInvalid () {
2018-06-14 11:20:10 +03:00
$this -> shareController -> setToken ( 'token' );
2017-10-24 16:26:53 +03:00
$owner = $this -> getMockBuilder ( IUser :: class ) -> getMock ();
2016-02-09 17:01:12 +03:00
$owner -> method ( 'getDisplayName' ) -> willReturn ( 'ownerDisplay' );
$owner -> method ( 'getUID' ) -> willReturn ( 'ownerUID' );
2016-07-15 13:22:53 +03:00
$file = $this -> getMockBuilder ( 'OCP\Files\File' ) -> getMock ();
2016-02-09 17:01:12 +03:00
$file -> method ( 'getName' ) -> willReturn ( 'file1.txt' );
$file -> method ( 'getMimetype' ) -> willReturn ( 'text/plain' );
$file -> method ( 'getSize' ) -> willReturn ( 33 );
$file -> method ( 'isShareable' ) -> willReturn ( false );
$file -> method ( 'isReadable' ) -> willReturn ( true );
$share = \OC :: $server -> getShareManager () -> newShare ();
$share -> setId ( 42 );
$share -> setPassword ( 'password' )
-> setShareOwner ( 'ownerUID' )
-> setNode ( $file )
-> setTarget ( '/file1.txt' );
$this -> session -> method ( 'exists' ) -> with ( 'public_link_authenticated' ) -> willReturn ( true );
$this -> session -> method ( 'get' ) -> with ( 'public_link_authenticated' ) -> willReturn ( '42' );
$this -> previewManager -> method ( 'isMimeSupported' ) -> with ( 'text/plain' ) -> willReturn ( true );
$this -> config -> method ( 'getSystemValue' )
-> willReturnMap (
[
[ 'max_filesize_animated_gifs_public_sharing' , 10 , 10 ],
[ 'enable_previews' , true , true ],
]
);
$shareTmpl [ 'maxSizeAnimateGif' ] = $this -> config -> getSystemValue ( 'max_filesize_animated_gifs_public_sharing' , 10 );
$shareTmpl [ 'previewEnabled' ] = $this -> config -> getSystemValue ( 'enable_previews' , true );
$this -> shareManager
-> expects ( $this -> once ())
-> method ( 'getShareByToken' )
-> with ( 'token' )
-> willReturn ( $share );
$this -> userManager -> method ( 'get' ) -> with ( 'ownerUID' ) -> willReturn ( $owner );
2018-06-14 11:20:10 +03:00
$this -> shareController -> showShare ();
2014-10-15 13:58:44 +04:00
}
2015-03-24 13:21:58 +03:00
2016-06-09 19:29:13 +03:00
public function testDownloadShareWithCreateOnlyShare () {
2017-10-25 01:03:28 +03:00
$share = $this -> getMockBuilder ( IShare :: class ) -> getMock ();
2016-06-09 19:29:13 +03:00
$share -> method ( 'getPassword' ) -> willReturn ( 'password' );
$share
-> expects ( $this -> once ())
-> method ( 'getPermissions' )
-> willReturn ( \OCP\Constants :: PERMISSION_CREATE );
$this -> shareManager
-> expects ( $this -> once ())
-> method ( 'getShareByToken' )
-> with ( 'validtoken' )
-> willReturn ( $share );
// Test with a password protected share and no authentication
$response = $this -> shareController -> downloadShare ( 'validtoken' );
$expectedResponse = new DataResponse ( 'Share is read-only' );
$this -> assertEquals ( $expectedResponse , $response );
}
2014-10-15 13:58:44 +04:00
}