2015-10-30 15:10:08 +03:00
< ? php
2018-04-23 21:31:57 +03:00
declare ( strict_types = 1 );
2015-10-30 15:10:08 +03:00
/**
2016-01-12 17:02:16 +03:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
2016-07-21 17:49:16 +03:00
*
2017-11-06 17:56:42 +03:00
* @ author Bjoern Schiessle < bjoern @ schiessle . org >
2016-07-21 17:49:16 +03:00
* @ author Joas Schilling < coding @ schilljs . com >
2017-11-06 17:56:42 +03:00
* @ author Lukas Reschke < lukas @ statuscode . ch >
* @ author Maxence Lange < maxence @ nextcloud . com >
* @ author Michael Jobst < mjobst + github @ tecratech . de >
* @ author Robin Appelman < robin @ icewind . nl >
2016-07-21 17:49:16 +03:00
* @ author Roeland Jago Douma < roeland @ famdouma . nl >
* @ author Vincent Petry < pvince81 @ owncloud . com >
2019-08-06 11:22:32 +03:00
* @ author John Molakvoæ < skjnldsv @ protonmail . com >
2016-07-21 17:49:16 +03:00
*
2015-10-30 15:10:08 +03:00
* @ 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 />
*
*/
2019-08-06 11:22:32 +03:00
2016-10-21 21:25:07 +03:00
namespace OCA\Files_Sharing\Controller ;
2015-10-30 15:10:08 +03:00
2016-11-10 11:13:25 +03:00
use OCA\Files\Helper ;
2018-07-10 14:01:31 +03:00
use OCP\App\IAppManager ;
2016-07-20 10:55:43 +03:00
use OCP\AppFramework\Http\DataResponse ;
2016-07-20 11:41:09 +03:00
use OCP\AppFramework\OCS\OCSBadRequestException ;
use OCP\AppFramework\OCS\OCSException ;
use OCP\AppFramework\OCS\OCSForbiddenException ;
2016-07-20 10:55:43 +03:00
use OCP\AppFramework\OCS\OCSNotFoundException ;
2016-07-19 15:13:27 +03:00
use OCP\AppFramework\OCSController ;
2018-06-29 14:22:26 +03:00
use OCP\AppFramework\QueryException ;
2017-12-01 16:49:35 +03:00
use OCP\Constants ;
2016-09-20 18:59:04 +03:00
use OCP\Files\Node ;
2016-02-16 18:04:17 +03:00
use OCP\Files\NotFoundException ;
2017-12-01 16:49:35 +03:00
use OCP\IConfig ;
2015-11-24 11:37:17 +03:00
use OCP\IGroupManager ;
2016-04-15 15:05:36 +03:00
use OCP\IL10N ;
2015-11-24 11:37:17 +03:00
use OCP\IUserManager ;
use OCP\IRequest ;
2018-06-29 14:22:26 +03:00
use OCP\IServerContainer ;
2015-11-24 11:37:17 +03:00
use OCP\IURLGenerator ;
2015-11-24 12:16:02 +03:00
use OCP\Files\IRootFolder ;
2016-03-09 11:11:41 +03:00
use OCP\Lock\LockedException ;
2018-06-13 15:19:59 +03:00
use OCP\Share ;
2016-02-03 10:14:48 +03:00
use OCP\Share\IManager ;
2016-02-02 16:18:59 +03:00
use OCP\Share\Exceptions\ShareNotFound ;
use OCP\Share\Exceptions\GenericShareException ;
2016-03-17 13:09:11 +03:00
use OCP\Lock\ILockingProvider ;
2016-09-07 19:38:08 +03:00
use OCP\Share\IShare ;
2018-04-23 21:31:57 +03:00
use OCA\Files_Sharing\External\Storage ;
2016-02-02 16:18:59 +03:00
2016-03-07 18:12:40 +03:00
/**
* Class Share20OCS
*
* @ package OCA\Files_Sharing\API
*/
2016-10-21 21:25:07 +03:00
class ShareAPIController extends OCSController {
2015-10-30 15:10:08 +03:00
2016-02-03 10:14:48 +03:00
/** @var IManager */
2015-10-30 15:10:08 +03:00
private $shareManager ;
2015-11-24 11:37:17 +03:00
/** @var IGroupManager */
2015-10-30 15:10:08 +03:00
private $groupManager ;
2015-11-24 11:37:17 +03:00
/** @var IUserManager */
2015-10-30 15:10:08 +03:00
private $userManager ;
2015-11-24 12:16:02 +03:00
/** @var IRootFolder */
private $rootFolder ;
2016-03-10 23:35:22 +03:00
/** @var IURLGenerator */
2015-11-24 11:37:17 +03:00
private $urlGenerator ;
2016-10-21 21:25:07 +03:00
/** @var string */
2015-11-24 11:37:17 +03:00
private $currentUser ;
2016-04-15 15:05:36 +03:00
/** @var IL10N */
private $l ;
2016-07-20 11:11:01 +03:00
/** @var \OCP\Files\Node */
private $lockedNode ;
2017-12-01 16:49:35 +03:00
/** @var IConfig */
private $config ;
2018-07-10 14:01:31 +03:00
/** @var IAppManager */
private $appManager ;
2018-06-29 14:22:26 +03:00
/** @var IServerContainer */
private $serverContainer ;
2015-11-24 11:37:17 +03:00
2016-02-03 10:14:48 +03:00
/**
* Share20OCS constructor .
*
2016-07-19 15:13:27 +03:00
* @ param string $appName
* @ param IRequest $request
2016-02-03 10:14:48 +03:00
* @ param IManager $shareManager
* @ param IGroupManager $groupManager
* @ param IUserManager $userManager
* @ param IRootFolder $rootFolder
* @ param IURLGenerator $urlGenerator
2016-10-21 21:25:07 +03:00
* @ param string $userId
2016-07-19 15:13:27 +03:00
* @ param IL10N $l10n
2017-12-01 16:49:35 +03:00
* @ param IConfig $config
2018-07-10 14:01:31 +03:00
* @ param IAppManager $appManager
2018-06-29 14:22:26 +03:00
* @ param IServerContainer $serverContainer
2016-02-03 10:14:48 +03:00
*/
2015-11-24 11:37:17 +03:00
public function __construct (
2018-04-23 21:31:57 +03:00
string $appName ,
2016-09-21 18:35:09 +03:00
IRequest $request ,
IManager $shareManager ,
IGroupManager $groupManager ,
IUserManager $userManager ,
IRootFolder $rootFolder ,
IURLGenerator $urlGenerator ,
2018-10-04 14:04:58 +03:00
string $userId = null ,
2017-12-01 16:49:35 +03:00
IL10N $l10n ,
2018-07-10 14:01:31 +03:00
IConfig $config ,
2018-06-29 14:22:26 +03:00
IAppManager $appManager ,
IServerContainer $serverContainer
2015-11-24 11:37:17 +03:00
) {
2016-07-19 15:13:27 +03:00
parent :: __construct ( $appName , $request );
2015-10-30 15:10:08 +03:00
$this -> shareManager = $shareManager ;
$this -> userManager = $userManager ;
$this -> groupManager = $groupManager ;
$this -> request = $request ;
2015-11-24 12:16:02 +03:00
$this -> rootFolder = $rootFolder ;
2015-11-06 14:05:19 +03:00
$this -> urlGenerator = $urlGenerator ;
2016-10-21 21:25:07 +03:00
$this -> currentUser = $userId ;
2016-04-15 15:05:36 +03:00
$this -> l = $l10n ;
2017-12-01 16:49:35 +03:00
$this -> config = $config ;
2018-07-10 14:01:31 +03:00
$this -> appManager = $appManager ;
2018-06-29 14:22:26 +03:00
$this -> serverContainer = $serverContainer ;
2015-11-06 14:05:19 +03:00
}
/**
* Convert an IShare to an array for OCS output
*
2016-01-27 14:13:53 +03:00
* @ param \OCP\Share\IShare $share
2016-09-20 18:59:04 +03:00
* @ param Node | null $recipientNode
2015-11-06 14:05:19 +03:00
* @ return array
2016-02-16 18:04:17 +03:00
* @ throws NotFoundException In case the node can ' t be resolved .
2018-07-24 12:57:52 +03:00
*
* @ suppress PhanUndeclaredClassMethod
2015-11-06 14:05:19 +03:00
*/
2018-04-23 21:31:57 +03:00
protected function formatShare ( \OCP\Share\IShare $share , Node $recipientNode = null ) : array {
2016-02-03 10:14:48 +03:00
$sharedBy = $this -> userManager -> get ( $share -> getSharedBy ());
2016-06-07 13:50:12 +03:00
$shareOwner = $this -> userManager -> get ( $share -> getShareOwner ());
2015-11-06 14:05:19 +03:00
$result = [
'id' => $share -> getId (),
'share_type' => $share -> getShareType (),
2016-02-03 10:14:48 +03:00
'uid_owner' => $share -> getSharedBy (),
2016-02-11 23:17:22 +03:00
'displayname_owner' => $sharedBy !== null ? $sharedBy -> getDisplayName () : $share -> getSharedBy (),
2019-10-24 16:51:56 +03:00
// recipient permissions
2015-11-06 14:05:19 +03:00
'permissions' => $share -> getPermissions (),
2019-10-24 16:51:56 +03:00
// current user permissions on this share
'can_edit' => $this -> canEditShare ( $share ),
'can_delete' => $this -> canDeleteShare ( $share ),
2016-01-27 22:51:26 +03:00
'stime' => $share -> getShareTime () -> getTimestamp (),
'parent' => null ,
2015-11-06 14:05:19 +03:00
'expiration' => null ,
'token' => null ,
2016-02-03 10:14:48 +03:00
'uid_file_owner' => $share -> getShareOwner (),
2018-07-13 18:53:14 +03:00
'note' => $share -> getNote (),
2018-10-16 11:31:38 +03:00
'label' => $share -> getLabel (),
2016-02-12 12:44:34 +03:00
'displayname_file_owner' => $shareOwner !== null ? $shareOwner -> getDisplayName () : $share -> getShareOwner (),
2015-11-06 14:05:19 +03:00
];
2016-10-21 21:25:07 +03:00
$userFolder = $this -> rootFolder -> getUserFolder ( $this -> currentUser );
2016-09-20 18:59:04 +03:00
if ( $recipientNode ) {
$node = $recipientNode ;
} else {
$nodes = $userFolder -> getById ( $share -> getNodeId ());
if ( empty ( $nodes )) {
2016-09-21 19:55:58 +03:00
// fallback to guessing the path
$node = $userFolder -> get ( $share -> getTarget ());
2018-04-04 12:33:05 +03:00
if ( $node === null || $share -> getTarget () === '' ) {
2016-09-21 19:55:58 +03:00
throw new NotFoundException ();
}
} else {
$node = $nodes [ 0 ];
2016-09-20 18:59:04 +03:00
}
}
2016-06-07 13:50:12 +03:00
$result [ 'path' ] = $userFolder -> getRelativePath ( $node -> getPath ());
2019-08-06 11:22:32 +03:00
if ( $node instanceof \OCP\Files\Folder ) {
2015-11-06 14:05:19 +03:00
$result [ 'item_type' ] = 'folder' ;
} else {
$result [ 'item_type' ] = 'file' ;
}
2019-08-06 11:22:32 +03:00
2016-07-19 15:13:27 +03:00
$result [ 'mimetype' ] = $node -> getMimetype ();
2016-01-27 22:51:26 +03:00
$result [ 'storage_id' ] = $node -> getStorage () -> getId ();
$result [ 'storage' ] = $node -> getStorage () -> getCache () -> getNumericStorageId ();
$result [ 'item_source' ] = $node -> getId ();
$result [ 'file_source' ] = $node -> getId ();
$result [ 'file_parent' ] = $node -> getParent () -> getId ();
2015-11-06 14:05:19 +03:00
$result [ 'file_target' ] = $share -> getTarget ();
2017-03-29 17:50:23 +03:00
$expiration = $share -> getExpirationDate ();
if ( $expiration !== null ) {
$result [ 'expiration' ] = $expiration -> format ( 'Y-m-d 00:00:00' );
}
2018-06-13 15:19:59 +03:00
if ( $share -> getShareType () === Share :: SHARE_TYPE_USER ) {
2016-02-03 10:14:48 +03:00
$sharedWith = $this -> userManager -> get ( $share -> getSharedWith ());
2016-02-12 12:44:34 +03:00
$result [ 'share_with' ] = $share -> getSharedWith ();
$result [ 'share_with_displayname' ] = $sharedWith !== null ? $sharedWith -> getDisplayName () : $share -> getSharedWith ();
2018-06-13 15:19:59 +03:00
} else if ( $share -> getShareType () === Share :: SHARE_TYPE_GROUP ) {
2016-11-30 22:56:10 +03:00
$group = $this -> groupManager -> get ( $share -> getSharedWith ());
2016-02-03 10:14:48 +03:00
$result [ 'share_with' ] = $share -> getSharedWith ();
2016-11-30 22:56:10 +03:00
$result [ 'share_with_displayname' ] = $group !== null ? $group -> getDisplayName () : $share -> getSharedWith ();
2018-06-13 15:19:59 +03:00
} else if ( $share -> getShareType () === Share :: SHARE_TYPE_LINK ) {
2015-11-06 14:05:19 +03:00
2018-11-07 01:48:28 +03:00
// "share_with" and "share_with_displayname" for passwords of link
// shares was deprecated in Nextcloud 15, use "password" instead.
2015-11-06 14:05:19 +03:00
$result [ 'share_with' ] = $share -> getPassword ();
$result [ 'share_with_displayname' ] = $share -> getPassword ();
2018-11-07 01:48:28 +03:00
$result [ 'password' ] = $share -> getPassword ();
2018-10-15 13:27:56 +03:00
$result [ 'send_password_by_talk' ] = $share -> getSendPasswordByTalk ();
2015-11-06 14:05:19 +03:00
$result [ 'token' ] = $share -> getToken ();
$result [ 'url' ] = $this -> urlGenerator -> linkToRouteAbsolute ( 'files_sharing.sharecontroller.showShare' , [ 'token' => $share -> getToken ()]);
2018-07-12 21:51:41 +03:00
} else if ( $share -> getShareType () === Share :: SHARE_TYPE_REMOTE || $share -> getShareType () === Share :: SHARE_TYPE_REMOTE_GROUP ) {
2015-11-06 14:05:19 +03:00
$result [ 'share_with' ] = $share -> getSharedWith ();
2016-10-25 17:24:24 +03:00
$result [ 'share_with_displayname' ] = $this -> getDisplayNameFromAddressBook ( $share -> getSharedWith (), 'CLOUD' );
2015-11-06 14:05:19 +03:00
$result [ 'token' ] = $share -> getToken ();
2018-06-13 15:19:59 +03:00
} else if ( $share -> getShareType () === Share :: SHARE_TYPE_EMAIL ) {
2016-07-29 16:38:31 +03:00
$result [ 'share_with' ] = $share -> getSharedWith ();
2017-03-28 16:11:07 +03:00
$result [ 'password' ] = $share -> getPassword ();
2018-07-10 14:01:31 +03:00
$result [ 'send_password_by_talk' ] = $share -> getSendPasswordByTalk ();
2016-10-25 17:24:24 +03:00
$result [ 'share_with_displayname' ] = $this -> getDisplayNameFromAddressBook ( $share -> getSharedWith (), 'EMAIL' );
2016-07-29 16:38:31 +03:00
$result [ 'token' ] = $share -> getToken ();
2018-06-13 15:19:59 +03:00
} else if ( $share -> getShareType () === Share :: SHARE_TYPE_CIRCLE ) {
2018-03-16 06:23:46 +03:00
// getSharedWith() returns either "name (type, owner)" or
// "name (type, owner) [id]", depending on the Circles app version.
$hasCircleId = ( substr ( $share -> getSharedWith (), - 1 ) === ']' );
2017-06-06 14:21:42 +03:00
$result [ 'share_with_displayname' ] = $share -> getSharedWithDisplayName ();
if ( empty ( $result [ 'share_with_displayname' ])) {
2019-08-06 11:22:32 +03:00
$displayNameLength = ( $hasCircleId ? strrpos ( $share -> getSharedWith (), ' ' ) : strlen ( $share -> getSharedWith ()));
2017-06-06 14:21:42 +03:00
$result [ 'share_with_displayname' ] = substr ( $share -> getSharedWith (), 0 , $displayNameLength );
}
$result [ 'share_with_avatar' ] = $share -> getSharedWithAvatar ();
2018-03-16 06:23:46 +03:00
2019-08-06 11:22:32 +03:00
$shareWithStart = ( $hasCircleId ? strrpos ( $share -> getSharedWith (), '[' ) + 1 : 0 );
$shareWithLength = ( $hasCircleId ? - 1 : strpos ( $share -> getSharedWith (), ' ' ));
2018-10-30 11:58:43 +03:00
if ( is_bool ( $shareWithLength )) {
$shareWithLength = - 1 ;
}
2018-03-16 06:23:46 +03:00
$result [ 'share_with' ] = substr ( $share -> getSharedWith (), $shareWithStart , $shareWithLength );
2018-06-29 14:22:26 +03:00
} else if ( $share -> getShareType () === Share :: SHARE_TYPE_ROOM ) {
$result [ 'share_with' ] = $share -> getSharedWith ();
$result [ 'share_with_displayname' ] = '' ;
try {
$result = array_merge ( $result , $this -> getRoomShareHelper () -> formatShare ( $share ));
2019-08-06 11:22:32 +03:00
} catch ( QueryException $e ) {}
2015-11-06 14:05:19 +03:00
}
2017-03-17 22:48:33 +03:00
2015-11-06 14:05:19 +03:00
$result [ 'mail_send' ] = $share -> getMailSend () ? 1 : 0 ;
2018-10-18 13:38:07 +03:00
$result [ 'hide_download' ] = $share -> getHideDownload () ? 1 : 0 ;
2015-11-06 14:05:19 +03:00
return $result ;
}
2016-10-25 17:24:24 +03:00
/**
* Check if one of the users address books knows the exact property , if
* yes we return the full name .
*
* @ param string $query
* @ param string $property
* @ return string
*/
2018-04-23 21:31:57 +03:00
private function getDisplayNameFromAddressBook ( string $query , string $property ) : string {
2016-10-25 17:24:24 +03:00
// FIXME: If we inject the contacts manager it gets initialized bofore any address books are registered
$result = \OC :: $server -> getContactsManager () -> search ( $query , [ $property ]);
foreach ( $result as $r ) {
2019-08-06 11:22:32 +03:00
foreach ( $r [ $property ] as $value ) {
2016-10-25 17:24:24 +03:00
if ( $value === $query ) {
return $r [ 'FN' ];
}
}
}
return $query ;
}
2015-11-06 14:05:19 +03:00
/**
* Get a specific share by id
*
2016-07-19 15:13:27 +03:00
* @ NoAdminRequired
*
2015-11-06 14:05:19 +03:00
* @ param string $id
2016-07-20 10:55:43 +03:00
* @ return DataResponse
* @ throws OCSNotFoundException
2015-11-06 14:05:19 +03:00
*/
2018-04-23 21:31:57 +03:00
public function getShare ( string $id ) : DataResponse {
2015-11-06 14:05:19 +03:00
try {
2016-03-07 18:10:27 +03:00
$share = $this -> getShareById ( $id );
2016-02-02 16:18:59 +03:00
} catch ( ShareNotFound $e ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Wrong share ID, share doesn\'t exist' ));
2015-11-06 14:05:19 +03:00
}
2019-08-16 16:09:15 +03:00
try {
if ( $this -> canAccessShare ( $share )) {
2016-02-16 18:04:17 +03:00
$share = $this -> formatShare ( $share );
2016-08-09 11:04:29 +03:00
return new DataResponse ([ $share ]);
2016-02-16 18:04:17 +03:00
}
2019-08-16 16:09:15 +03:00
} catch ( NotFoundException $e ) {
// Fall trough
2015-11-24 11:37:17 +03:00
}
2016-02-16 18:04:17 +03:00
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Wrong share ID, share doesn\'t exist' ));
2015-10-30 15:10:08 +03:00
}
/**
* Delete a share
*
2016-07-19 15:13:27 +03:00
* @ NoAdminRequired
*
2015-11-06 14:05:19 +03:00
* @ param string $id
2016-07-20 11:11:01 +03:00
* @ return DataResponse
2016-07-20 10:55:43 +03:00
* @ throws OCSNotFoundException
2015-10-30 15:10:08 +03:00
*/
2018-04-23 21:31:57 +03:00
public function deleteShare ( string $id ) : DataResponse {
2015-10-30 15:10:08 +03:00
try {
2016-03-07 18:10:27 +03:00
$share = $this -> getShareById ( $id );
2016-02-02 16:18:59 +03:00
} catch ( ShareNotFound $e ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Wrong share ID, share doesn\'t exist' ));
2015-11-02 21:49:39 +03:00
}
2016-03-09 11:11:41 +03:00
try {
2016-07-20 11:11:01 +03:00
$this -> lock ( $share -> getNode ());
2016-03-09 11:11:41 +03:00
} catch ( LockedException $e ) {
2019-08-26 14:11:09 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Could not delete share' ));
2016-03-09 11:11:41 +03:00
}
2016-10-25 11:18:42 +03:00
if ( ! $this -> canAccessShare ( $share )) {
2019-08-26 14:11:09 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Wrong share ID, share doesn\'t exist' ));
2015-11-24 11:37:17 +03:00
}
2019-08-26 14:11:09 +03:00
// if it's a group share or a room share
// we don't delete the share, but only the
// mount point. Allowing it to be restored
// from the deleted shares
if ( $this -> canDeleteShareFromSelf ( $share )) {
2016-10-25 11:18:42 +03:00
$this -> shareManager -> deleteFromSelf ( $share , $this -> currentUser );
} else {
2019-08-26 14:11:09 +03:00
if ( ! $this -> canDeleteShare ( $share )) {
throw new OCSForbiddenException ( $this -> l -> t ( 'Could not delete share' ));
}
2016-10-25 11:18:42 +03:00
$this -> shareManager -> deleteShare ( $share );
}
2015-10-30 15:10:08 +03:00
2016-07-20 11:44:52 +03:00
return new DataResponse ();
2015-10-30 15:10:08 +03:00
}
2015-11-24 11:37:17 +03:00
2015-12-15 11:54:50 +03:00
/**
2016-07-19 15:13:27 +03:00
* @ NoAdminRequired
*
2016-08-16 23:45:49 +03:00
* @ param string $path
* @ param int $permissions
* @ param int $shareType
* @ param string $shareWith
* @ param string $publicUpload
* @ param string $password
2018-10-16 11:31:38 +03:00
* @ param string $sendPasswordByTalk
2016-08-16 23:45:49 +03:00
* @ param string $expireDate
2018-10-16 11:31:38 +03:00
* @ param string $label
2016-08-16 23:45:49 +03:00
*
2016-07-20 10:55:43 +03:00
* @ return DataResponse
2018-10-16 11:31:38 +03:00
* @ throws NotFoundException
2016-07-20 11:41:09 +03:00
* @ throws OCSBadRequestException
* @ throws OCSException
2018-10-16 11:31:38 +03:00
* @ throws OCSForbiddenException
* @ throws OCSNotFoundException
* @ throws \OCP\Files\InvalidPathException
2017-07-18 21:38:40 +03:00
* @ suppress PhanUndeclaredClassMethod
2015-12-15 11:54:50 +03:00
*/
2016-08-16 23:45:49 +03:00
public function createShare (
2018-04-23 21:31:57 +03:00
string $path = null ,
int $permissions = null ,
int $shareType = - 1 ,
string $shareWith = null ,
string $publicUpload = 'false' ,
string $password = '' ,
2018-07-10 14:01:31 +03:00
string $sendPasswordByTalk = null ,
2018-10-16 11:31:38 +03:00
string $expireDate = '' ,
string $label = ''
2018-04-23 21:31:57 +03:00
) : DataResponse {
2015-12-15 11:54:50 +03:00
$share = $this -> shareManager -> newShare ();
2017-12-01 16:49:35 +03:00
if ( $permissions === null ) {
$permissions = $this -> config -> getAppValue ( 'core' , 'shareapi_default_permissions' , Constants :: PERMISSION_ALL );
}
2015-12-15 11:54:50 +03:00
// Verify path
if ( $path === null ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Please specify a file or folder path' ));
2015-12-15 11:54:50 +03:00
}
2016-10-21 21:25:07 +03:00
$userFolder = $this -> rootFolder -> getUserFolder ( $this -> currentUser );
2015-12-15 11:54:50 +03:00
try {
$path = $userFolder -> get ( $path );
2016-03-17 13:09:11 +03:00
} catch ( NotFoundException $e ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Wrong path, file/folder doesn\'t exist' ));
2015-12-15 11:54:50 +03:00
}
2016-01-27 22:51:26 +03:00
$share -> setNode ( $path );
2016-03-17 13:09:11 +03:00
try {
2016-07-20 11:11:01 +03:00
$this -> lock ( $share -> getNode ());
2016-03-17 13:09:11 +03:00
} catch ( LockedException $e ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Could not create share' ));
2016-03-17 13:09:11 +03:00
}
2015-12-15 11:54:50 +03:00
2017-12-01 16:49:35 +03:00
if ( $permissions < 0 || $permissions > Constants :: PERMISSION_ALL ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'invalid permissions' ));
2015-12-15 11:54:50 +03:00
}
// Shares always require read permissions
2017-12-01 16:49:35 +03:00
$permissions |= Constants :: PERMISSION_READ ;
2015-12-15 11:54:50 +03:00
if ( $path instanceof \OCP\Files\File ) {
// Single file shares should never have delete or create permissions
2017-12-01 16:49:35 +03:00
$permissions &= ~ Constants :: PERMISSION_DELETE ;
$permissions &= ~ Constants :: PERMISSION_CREATE ;
2015-12-15 11:54:50 +03:00
}
2019-08-06 11:22:32 +03:00
/**
2016-02-25 12:30:03 +03:00
* Hack for https :// github . com / owncloud / core / issues / 22587
* We check the permissions via webdav . But the permissions of the mount point
* do not equal the share permissions . Here we fix that for federated mounts .
*/
2018-04-23 21:31:57 +03:00
if ( $path -> getStorage () -> instanceOfStorage ( Storage :: class )) {
2016-02-25 12:30:03 +03:00
$permissions &= ~ ( $permissions & ~ $path -> getPermissions ());
}
2018-06-13 15:19:59 +03:00
if ( $shareType === Share :: SHARE_TYPE_USER ) {
2015-12-15 11:54:50 +03:00
// Valid user is required to share
if ( $shareWith === null || ! $this -> userManager -> userExists ( $shareWith )) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Please specify a valid user' ));
2015-12-15 11:54:50 +03:00
}
2016-02-03 10:14:48 +03:00
$share -> setSharedWith ( $shareWith );
2015-12-15 11:54:50 +03:00
$share -> setPermissions ( $permissions );
2018-06-13 15:19:59 +03:00
} else if ( $shareType === Share :: SHARE_TYPE_GROUP ) {
2016-03-18 18:36:27 +03:00
if ( ! $this -> shareManager -> allowGroupSharing ()) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Group sharing is disabled by the administrator' ));
2016-03-18 18:36:27 +03:00
}
2015-12-15 11:54:50 +03:00
// Valid group is required to share
if ( $shareWith === null || ! $this -> groupManager -> groupExists ( $shareWith )) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Please specify a valid group' ));
2015-12-15 11:54:50 +03:00
}
2016-02-03 10:14:48 +03:00
$share -> setSharedWith ( $shareWith );
2015-12-15 11:54:50 +03:00
$share -> setPermissions ( $permissions );
2019-08-01 14:56:35 +03:00
} else if ( $shareType === Share :: SHARE_TYPE_LINK
|| $shareType === Share :: SHARE_TYPE_EMAIL ) {
// Can we even share links?
2015-12-15 11:54:50 +03:00
if ( ! $this -> shareManager -> shareApiAllowLinks ()) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Public link sharing is disabled by the administrator' ));
2015-12-15 11:54:50 +03:00
}
if ( $publicUpload === 'true' ) {
// Check if public upload is allowed
if ( ! $this -> shareManager -> shareApiLinkAllowPublicUpload ()) {
2016-07-20 11:41:09 +03:00
throw new OCSForbiddenException ( $this -> l -> t ( 'Public upload disabled by the administrator' ));
2015-12-15 11:54:50 +03:00
}
// Public upload can only be set for folders
if ( $path instanceof \OCP\Files\File ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Public upload is only possible for publicly shared folders' ));
2015-12-15 11:54:50 +03:00
}
$share -> setPermissions (
2017-12-01 16:49:35 +03:00
Constants :: PERMISSION_READ |
Constants :: PERMISSION_CREATE |
Constants :: PERMISSION_UPDATE |
Constants :: PERMISSION_DELETE
2015-12-15 11:54:50 +03:00
);
} else {
2017-12-01 16:49:35 +03:00
$share -> setPermissions ( Constants :: PERMISSION_READ );
2015-12-15 11:54:50 +03:00
}
// Set password
2016-01-27 17:42:11 +03:00
if ( $password !== '' ) {
$share -> setPassword ( $password );
}
2015-12-15 11:54:50 +03:00
2019-08-01 14:56:35 +03:00
// Only share by mail have a recipient
if ( $shareType === Share :: SHARE_TYPE_EMAIL ) {
$share -> setSharedWith ( $shareWith );
} else {
// Only link share have a label
if ( ! empty ( $label )) {
$share -> setLabel ( $label );
}
2018-10-16 11:31:38 +03:00
}
2018-10-15 13:27:56 +03:00
if ( $sendPasswordByTalk === 'true' ) {
if ( ! $this -> appManager -> isEnabledForUser ( 'spreed' )) {
throw new OCSForbiddenException ( $this -> l -> t ( 'Sharing %s sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled' , [ $path -> getPath ()]));
}
$share -> setSendPasswordByTalk ( true );
}
2015-12-15 11:54:50 +03:00
//Expire date
2016-01-27 17:42:11 +03:00
if ( $expireDate !== '' ) {
2015-12-15 11:54:50 +03:00
try {
$expireDate = $this -> parseDate ( $expireDate );
$share -> setExpirationDate ( $expireDate );
} catch ( \Exception $e ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Invalid date, date format must be YYYY-MM-DD' ));
2015-12-15 11:54:50 +03:00
}
}
2018-06-13 15:19:59 +03:00
} else if ( $shareType === Share :: SHARE_TYPE_REMOTE ) {
2016-02-04 13:13:06 +03:00
if ( ! $this -> shareManager -> outgoingServer2ServerSharesAllowed ()) {
2018-10-09 15:32:14 +03:00
throw new OCSForbiddenException ( $this -> l -> t ( 'Sharing %1$s failed because the back end does not allow shares from type %2$s' , [ $path -> getPath (), $shareType ]));
2016-02-04 13:13:06 +03:00
}
2016-02-04 12:01:40 +03:00
$share -> setSharedWith ( $shareWith );
$share -> setPermissions ( $permissions );
2019-08-06 11:22:32 +03:00
} else if ( $shareType === Share :: SHARE_TYPE_REMOTE_GROUP ) {
2018-06-13 15:19:59 +03:00
if ( ! $this -> shareManager -> outgoingServer2ServerGroupSharesAllowed ()) {
2018-10-09 15:32:14 +03:00
throw new OCSForbiddenException ( $this -> l -> t ( 'Sharing %1$s failed because the back end does not allow shares from type %2$s' , [ $path -> getPath (), $shareType ]));
2018-06-13 15:19:59 +03:00
}
$share -> setSharedWith ( $shareWith );
$share -> setPermissions ( $permissions );
} else if ( $shareType === Share :: SHARE_TYPE_CIRCLE ) {
2017-07-11 14:21:24 +03:00
if ( ! \OC :: $server -> getAppManager () -> isEnabledForUser ( 'circles' ) || ! class_exists ( '\OCA\Circles\ShareByCircleProvider' )) {
2017-03-17 22:48:33 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'You cannot share to a Circle if the app is not enabled' ));
}
2017-07-11 14:21:24 +03:00
$circle = \OCA\Circles\Api\v1\Circles :: detailsCircle ( $shareWith );
2017-03-17 22:48:33 +03:00
// Valid circle is required to share
if ( $circle === null ) {
throw new OCSNotFoundException ( $this -> l -> t ( 'Please specify a valid circle' ));
}
$share -> setSharedWith ( $shareWith );
$share -> setPermissions ( $permissions );
2018-06-29 14:22:26 +03:00
} else if ( $shareType === Share :: SHARE_TYPE_ROOM ) {
try {
$this -> getRoomShareHelper () -> createShare ( $share , $shareWith , $permissions , $expireDate );
} catch ( QueryException $e ) {
throw new OCSForbiddenException ( $this -> l -> t ( 'Sharing %s failed because the back end does not support room shares' , [ $path -> getPath ()]));
}
2015-12-15 11:54:50 +03:00
} else {
2016-07-20 11:44:52 +03:00
throw new OCSBadRequestException ( $this -> l -> t ( 'Unknown share type' ));
2015-12-15 11:54:50 +03:00
}
$share -> setShareType ( $shareType );
2016-10-21 21:25:07 +03:00
$share -> setSharedBy ( $this -> currentUser );
2015-12-15 11:54:50 +03:00
try {
$share = $this -> shareManager -> createShare ( $share );
2016-02-02 16:18:59 +03:00
} catch ( GenericShareException $e ) {
2016-01-05 14:50:00 +03:00
$code = $e -> getCode () === 0 ? 403 : $e -> getCode ();
2016-07-20 11:41:09 +03:00
throw new OCSException ( $e -> getHint (), $code );
2016-09-20 12:29:12 +03:00
} catch ( \Exception $e ) {
2018-01-17 17:21:56 +03:00
throw new OCSForbiddenException ( $e -> getMessage (), $e );
2015-12-15 11:54:50 +03:00
}
2016-09-21 19:55:58 +03:00
$output = $this -> formatShare ( $share );
2016-03-09 11:11:41 +03:00
2016-08-09 11:04:29 +03:00
return new DataResponse ( $output );
2015-12-15 11:54:50 +03:00
}
2016-01-29 17:26:04 +03:00
/**
* @ param \OCP\Files\File | \OCP\Files\Folder $node
2016-11-10 11:13:25 +03:00
* @ param boolean $includeTags
2016-07-20 10:55:43 +03:00
* @ return DataResponse
2016-01-29 17:26:04 +03:00
*/
2018-04-23 21:31:57 +03:00
private function getSharedWithMe ( $node = null , bool $includeTags ) : DataResponse {
2017-03-17 22:48:33 +03:00
2018-06-13 15:19:59 +03:00
$userShares = $this -> shareManager -> getSharedWith ( $this -> currentUser , Share :: SHARE_TYPE_USER , $node , - 1 , 0 );
$groupShares = $this -> shareManager -> getSharedWith ( $this -> currentUser , Share :: SHARE_TYPE_GROUP , $node , - 1 , 0 );
$circleShares = $this -> shareManager -> getSharedWith ( $this -> currentUser , Share :: SHARE_TYPE_CIRCLE , $node , - 1 , 0 );
2018-06-29 14:22:26 +03:00
$roomShares = $this -> shareManager -> getSharedWith ( $this -> currentUser , Share :: SHARE_TYPE_ROOM , $node , - 1 , 0 );
2015-12-03 12:51:41 +03:00
2018-06-29 14:22:26 +03:00
$shares = array_merge ( $userShares , $groupShares , $circleShares , $roomShares );
2015-12-03 12:51:41 +03:00
2016-09-21 18:35:09 +03:00
$shares = array_filter ( $shares , function ( IShare $share ) {
2016-10-21 21:25:07 +03:00
return $share -> getShareOwner () !== $this -> currentUser ;
2016-09-07 19:38:08 +03:00
});
2015-12-03 12:51:41 +03:00
$formatted = [];
foreach ( $shares as $share ) {
2016-01-27 11:02:12 +03:00
if ( $this -> canAccessShare ( $share )) {
2016-02-16 18:04:17 +03:00
try {
$formatted [] = $this -> formatShare ( $share );
} catch ( NotFoundException $e ) {
// Ignore this share
}
2016-01-27 11:02:12 +03:00
}
2015-12-03 12:51:41 +03:00
}
2016-11-10 11:13:25 +03:00
if ( $includeTags ) {
2017-08-22 19:46:47 +03:00
$formatted = Helper :: populateTags ( $formatted , 'file_source' , \OC :: $server -> getTagManager ());
2016-11-10 11:13:25 +03:00
}
2016-08-09 11:04:29 +03:00
return new DataResponse ( $formatted );
2015-12-03 12:51:41 +03:00
}
2016-01-19 16:35:16 +03:00
/**
* @ param \OCP\Files\Folder $folder
2019-08-19 11:53:29 +03:00
* @ return array
2016-07-20 11:41:09 +03:00
* @ throws OCSBadRequestException
2016-01-19 16:35:16 +03:00
*/
2019-08-19 11:53:29 +03:00
private function getSharesInDir ( Node $folder ) : array {
2016-01-19 16:35:16 +03:00
if ( ! ( $folder instanceof \OCP\Files\Folder )) {
2016-07-20 11:41:09 +03:00
throw new OCSBadRequestException ( $this -> l -> t ( 'Not a directory' ));
2016-01-19 16:35:16 +03:00
}
$nodes = $folder -> getDirectoryListing ();
2019-10-25 11:45:49 +03:00
2016-01-27 14:13:53 +03:00
/** @var \OCP\Share\IShare[] $shares */
2019-10-25 11:45:49 +03:00
$shares = array_reduce ( $nodes , function ( $carry , $node ) {
$carry = array_merge ( $carry , $this -> getAllShares ( $node , true ));
return $carry ;
}, []);
2016-01-19 16:35:16 +03:00
2019-08-19 11:53:29 +03:00
// filter out duplicate shares
$known = [];
2019-08-19 11:53:29 +03:00
return array_filter ( $shares , function ( $share ) use ( & $known ) {
2019-08-19 11:53:29 +03:00
if ( in_array ( $share -> getId (), $known )) {
return false ;
}
$known [] = $share -> getId ();
return true ;
});
2016-01-19 16:35:16 +03:00
}
/**
* The getShares function .
*
2016-07-19 15:13:27 +03:00
* @ NoAdminRequired
*
2016-08-17 11:05:09 +03:00
* @ param string $shared_with_me
* @ param string $reshares
* @ param string $subfiles
* @ param string $path
*
2016-01-19 16:35:16 +03:00
* - Get shares by the current user
* - Get shares by the current user and reshares ( ? reshares = true )
* - Get shares with the current user ( ? shared_with_me = true )
* - Get shares for a specific path ( ? path =... )
* - Get all shares in a folder ( ? subfiles = true & path =.. )
*
2016-07-20 10:55:43 +03:00
* @ return DataResponse
* @ throws OCSNotFoundException
2016-01-19 16:35:16 +03:00
*/
2016-08-17 11:05:09 +03:00
public function getShares (
2018-04-23 21:31:57 +03:00
string $shared_with_me = 'false' ,
string $reshares = 'false' ,
string $subfiles = 'false' ,
string $path = null ,
string $include_tags = 'false'
) : DataResponse {
2015-12-03 12:51:41 +03:00
if ( $path !== null ) {
2016-10-21 21:25:07 +03:00
$userFolder = $this -> rootFolder -> getUserFolder ( $this -> currentUser );
2015-12-03 12:51:41 +03:00
try {
$path = $userFolder -> get ( $path );
2016-07-20 15:24:22 +03:00
$this -> lock ( $path );
2015-12-03 12:51:41 +03:00
} catch ( \OCP\Files\NotFoundException $e ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Wrong path, file/folder doesn\'t exist' ));
2016-03-17 13:09:11 +03:00
} catch ( LockedException $e ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Could not lock path' ));
2015-12-03 12:51:41 +03:00
}
}
2018-04-24 09:07:25 +03:00
$include_tags = $include_tags === 'true' ;
2016-08-17 11:05:09 +03:00
if ( $shared_with_me === 'true' ) {
2016-11-10 11:13:25 +03:00
$result = $this -> getSharedWithMe ( $path , $include_tags );
2016-03-17 13:09:11 +03:00
return $result ;
2016-01-29 17:26:04 +03:00
}
2015-12-03 12:51:41 +03:00
if ( $reshares === 'true' ) {
$reshares = true ;
} else {
$reshares = false ;
}
2019-08-19 11:53:29 +03:00
if ( $subfiles === 'true' ) {
$shares = $this -> getSharesInDir ( $path );
$recipientNode = null ;
} else {
// get all shares
$shares = $this -> getAllShares ( $path , $reshares );
$recipientNode = $path ;
}
2015-12-03 12:51:41 +03:00
2019-08-19 11:53:29 +03:00
// process all shares
2018-11-01 17:01:01 +03:00
$formatted = $miniFormatted = [];
2018-10-29 12:03:52 +03:00
$resharingRight = false ;
2015-12-03 12:51:41 +03:00
foreach ( $shares as $share ) {
2018-11-01 17:01:01 +03:00
/** @var IShare $share */
2019-08-19 11:53:29 +03:00
// do not list the shares of the current user
2019-10-25 12:15:02 +03:00
if ( $share -> getSharedWith () === $this -> currentUser ) {
continue ;
}
2016-02-16 18:04:17 +03:00
try {
2019-08-19 11:53:29 +03:00
$format = $this -> formatShare ( $share , $recipientNode );
2018-11-01 17:01:01 +03:00
$formatted [] = $format ;
2019-08-19 11:53:29 +03:00
// let's also build a list of shares created
// by the current user only, in case
// there is no resharing rights
2018-11-01 17:01:01 +03:00
if ( $share -> getSharedBy () === $this -> currentUser ) {
$miniFormatted [] = $format ;
}
2019-08-19 11:53:29 +03:00
// check if one of those share is shared with me
// and if I have resharing rights on it
2018-11-01 17:01:01 +03:00
if ( ! $resharingRight && $this -> shareProviderResharingRights ( $this -> currentUser , $share , $path )) {
2018-10-29 12:03:52 +03:00
$resharingRight = true ;
}
2018-11-01 15:41:19 +03:00
} catch ( \Exception $e ) {
2016-02-16 18:04:17 +03:00
//Ignore share
}
2015-12-03 12:51:41 +03:00
}
2018-10-29 12:03:52 +03:00
if ( ! $resharingRight ) {
2018-11-01 17:01:01 +03:00
$formatted = $miniFormatted ;
2018-10-29 12:03:52 +03:00
}
2016-11-10 11:13:25 +03:00
if ( $include_tags ) {
2017-08-22 19:46:47 +03:00
$formatted = Helper :: populateTags ( $formatted , 'file_source' , \OC :: $server -> getTagManager ());
2016-11-10 11:13:25 +03:00
}
2016-08-09 11:04:29 +03:00
return new DataResponse ( $formatted );
2015-12-03 12:51:41 +03:00
}
2016-01-22 16:52:20 +03:00
/**
2016-07-19 15:13:27 +03:00
* @ NoAdminRequired
*
2018-04-23 21:31:57 +03:00
* @ param string $id
2016-08-17 11:05:09 +03:00
* @ param int $permissions
* @ param string $password
2018-07-10 14:01:31 +03:00
* @ param string $sendPasswordByTalk
2016-08-17 11:05:09 +03:00
* @ param string $publicUpload
* @ param string $expireDate
2018-07-12 15:55:50 +03:00
* @ param string $note
2018-10-17 11:50:58 +03:00
* @ param string $label
2018-10-18 13:38:07 +03:00
* @ param string $hideDownload
2016-07-20 10:55:43 +03:00
* @ return DataResponse
2018-07-12 15:55:50 +03:00
* @ throws LockedException
* @ throws NotFoundException
2016-07-20 11:41:09 +03:00
* @ throws OCSBadRequestException
* @ throws OCSForbiddenException
2018-07-12 15:55:50 +03:00
* @ throws OCSNotFoundException
2016-01-22 16:52:20 +03:00
*/
2016-08-17 11:05:09 +03:00
public function updateShare (
2018-04-23 21:31:57 +03:00
string $id ,
int $permissions = null ,
string $password = null ,
2018-07-10 14:01:31 +03:00
string $sendPasswordByTalk = null ,
2018-04-23 21:31:57 +03:00
string $publicUpload = null ,
2018-07-12 15:55:50 +03:00
string $expireDate = null ,
2018-10-18 13:38:07 +03:00
string $note = null ,
2018-10-17 11:50:58 +03:00
string $label = null ,
2018-10-18 13:38:07 +03:00
string $hideDownload = null
2018-04-23 21:31:57 +03:00
) : DataResponse {
2016-01-22 16:52:20 +03:00
try {
2016-03-07 18:10:27 +03:00
$share = $this -> getShareById ( $id );
2016-02-02 16:18:59 +03:00
} catch ( ShareNotFound $e ) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Wrong share ID, share doesn\'t exist' ));
2016-01-22 16:52:20 +03:00
}
2016-07-20 11:11:01 +03:00
$this -> lock ( $share -> getNode ());
2016-03-09 11:11:41 +03:00
2016-07-28 17:52:00 +03:00
if ( ! $this -> canAccessShare ( $share , false )) {
2016-07-20 10:55:43 +03:00
throw new OCSNotFoundException ( $this -> l -> t ( 'Wrong share ID, share doesn\'t exist' ));
2016-01-22 16:52:20 +03:00
}
2019-08-26 14:11:09 +03:00
if ( ! $this -> canEditShare ( $share )) {
2018-12-05 13:27:38 +03:00
throw new OCSForbiddenException ( 'You are not allowed to edit incoming shares' );
2018-11-20 11:42:01 +03:00
}
2019-08-06 11:22:32 +03:00
if (
$permissions === null &&
2018-10-17 11:50:58 +03:00
$password === null &&
$sendPasswordByTalk === null &&
$publicUpload === null &&
$expireDate === null &&
$note === null &&
$label === null &&
$hideDownload === null
) {
2017-03-30 18:03:04 +03:00
throw new OCSBadRequestException ( $this -> l -> t ( 'Wrong or no update parameter given' ));
}
2019-08-06 11:22:32 +03:00
if ( $note !== null ) {
2018-07-12 15:55:50 +03:00
$share -> setNote ( $note );
}
2019-08-06 11:22:32 +03:00
/**
2016-01-27 18:46:48 +03:00
* expirationdate , password and publicUpload only make sense for link shares
*/
2019-08-06 11:22:32 +03:00
if ( $share -> getShareType () === Share :: SHARE_TYPE_LINK
|| $share -> getShareType () === Share :: SHARE_TYPE_EMAIL ) {
/**
* We do not allow editing link shares that the current user
* doesn ' t own . This is confusing and lead to errors when
* someone else edit a password or expiration date without
* the share owner knowing about it .
* We only allow deletion
*/
if ( $share -> getSharedBy () !== $this -> currentUser ) {
throw new OCSForbiddenException ( 'You are not allowed to edit link shares that you don\'t own' );
}
2016-01-22 16:52:20 +03:00
2018-10-18 13:38:07 +03:00
// Update hide download state
if ( $hideDownload === 'true' ) {
$share -> setHideDownload ( true );
} else if ( $hideDownload === 'false' ) {
$share -> setHideDownload ( false );
}
2016-01-27 22:32:04 +03:00
$newPermissions = null ;
if ( $publicUpload === 'true' ) {
2017-12-01 16:49:35 +03:00
$newPermissions = Constants :: PERMISSION_READ | Constants :: PERMISSION_CREATE | Constants :: PERMISSION_UPDATE | Constants :: PERMISSION_DELETE ;
2016-01-27 22:32:04 +03:00
} else if ( $publicUpload === 'false' ) {
2017-12-01 16:49:35 +03:00
$newPermissions = Constants :: PERMISSION_READ ;
2016-01-22 16:52:20 +03:00
}
2016-01-27 22:32:04 +03:00
if ( $permissions !== null ) {
2019-08-06 11:22:32 +03:00
$newPermissions = ( int ) $permissions ;
2017-12-01 16:49:35 +03:00
$newPermissions = $newPermissions & ~ Constants :: PERMISSION_SHARE ;
2016-01-27 22:32:04 +03:00
}
2016-01-22 16:52:20 +03:00
2016-01-27 22:32:04 +03:00
if ( $newPermissions !== null &&
2016-07-14 11:27:29 +03:00
! in_array ( $newPermissions , [
2017-12-01 16:49:35 +03:00
Constants :: PERMISSION_READ ,
Constants :: PERMISSION_READ | Constants :: PERMISSION_CREATE | Constants :: PERMISSION_UPDATE , // legacy
Constants :: PERMISSION_READ | Constants :: PERMISSION_CREATE | Constants :: PERMISSION_UPDATE | Constants :: PERMISSION_DELETE , // correct
Constants :: PERMISSION_CREATE , // hidden file list
Constants :: PERMISSION_READ | Constants :: PERMISSION_UPDATE , // allow to edit single files
2018-04-23 21:31:57 +03:00
], true )
2016-06-23 16:43:21 +03:00
) {
2016-07-20 11:41:09 +03:00
throw new OCSBadRequestException ( $this -> l -> t ( 'Can\'t change permissions for public share links' ));
2016-01-27 22:32:04 +03:00
}
2016-06-23 16:43:21 +03:00
if (
// legacy
2017-12-01 16:49:35 +03:00
$newPermissions === ( Constants :: PERMISSION_READ | Constants :: PERMISSION_CREATE | Constants :: PERMISSION_UPDATE ) ||
2016-06-23 16:43:21 +03:00
// correct
2017-12-01 16:49:35 +03:00
$newPermissions === ( Constants :: PERMISSION_READ | Constants :: PERMISSION_CREATE | Constants :: PERMISSION_UPDATE | Constants :: PERMISSION_DELETE )
2016-06-23 16:43:21 +03:00
) {
2016-01-27 22:32:04 +03:00
if ( ! $this -> shareManager -> shareApiLinkAllowPublicUpload ()) {
2016-07-20 11:41:09 +03:00
throw new OCSForbiddenException ( $this -> l -> t ( 'Public upload disabled by the administrator' ));
2016-01-27 22:32:04 +03:00
}
2016-01-28 15:17:16 +03:00
if ( ! ( $share -> getNode () instanceof \OCP\Files\Folder )) {
2016-07-20 11:41:09 +03:00
throw new OCSBadRequestException ( $this -> l -> t ( 'Public upload is only possible for publicly shared folders' ));
2016-01-27 22:32:04 +03:00
}
2016-06-23 16:43:21 +03:00
// normalize to correct public upload permissions
2017-12-01 16:49:35 +03:00
$newPermissions = Constants :: PERMISSION_READ | Constants :: PERMISSION_CREATE | Constants :: PERMISSION_UPDATE | Constants :: PERMISSION_DELETE ;
2016-01-27 22:32:04 +03:00
}
if ( $newPermissions !== null ) {
$share -> setPermissions ( $newPermissions );
2016-11-13 22:29:34 +03:00
$permissions = $newPermissions ;
2016-01-27 22:32:04 +03:00
}
2016-01-22 16:52:20 +03:00
2016-01-27 18:46:48 +03:00
if ( $expireDate === '' ) {
$share -> setExpirationDate ( null );
2016-01-27 19:09:02 +03:00
} else if ( $expireDate !== null ) {
2016-01-27 18:46:48 +03:00
try {
$expireDate = $this -> parseDate ( $expireDate );
} catch ( \Exception $e ) {
2018-01-17 17:21:56 +03:00
throw new OCSBadRequestException ( $e -> getMessage (), $e );
2016-01-27 18:46:48 +03:00
}
$share -> setExpirationDate ( $expireDate );
}
2016-01-22 16:52:20 +03:00
2016-01-27 18:46:48 +03:00
if ( $password === '' ) {
$share -> setPassword ( null );
2016-01-27 19:09:02 +03:00
} else if ( $password !== null ) {
2016-01-27 18:46:48 +03:00
$share -> setPassword ( $password );
2016-01-22 16:52:20 +03:00
}
2019-08-06 11:22:32 +03:00
// only link shares have labels
if ( $share -> getShareType () === Share :: SHARE_TYPE_LINK && $label !== null ) {
2018-10-17 11:50:58 +03:00
$share -> setLabel ( $label );
}
2018-10-15 13:27:56 +03:00
if ( $sendPasswordByTalk === 'true' ) {
if ( ! $this -> appManager -> isEnabledForUser ( 'spreed' )) {
throw new OCSForbiddenException ( $this -> l -> t ( 'Sharing sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled' ));
}
$share -> setSendPasswordByTalk ( true );
} else if ( $sendPasswordByTalk !== null ) {
$share -> setSendPasswordByTalk ( false );
}
2019-08-06 11:22:32 +03:00
}
// NOT A LINK SHARE
else {
2017-03-29 17:50:23 +03:00
if ( $permissions !== null ) {
2019-08-06 11:22:32 +03:00
$permissions = ( int ) $permissions ;
2016-01-27 18:46:48 +03:00
$share -> setPermissions ( $permissions );
}
2017-03-28 15:39:38 +03:00
2017-03-29 17:50:23 +03:00
if ( $expireDate === '' ) {
$share -> setExpirationDate ( null );
} else if ( $expireDate !== null ) {
try {
$expireDate = $this -> parseDate ( $expireDate );
} catch ( \Exception $e ) {
2018-01-17 17:21:56 +03:00
throw new OCSBadRequestException ( $e -> getMessage (), $e );
2017-03-29 17:50:23 +03:00
}
$share -> setExpirationDate ( $expireDate );
}
2016-01-22 16:52:20 +03:00
}
try {
$share = $this -> shareManager -> updateShare ( $share );
2019-07-03 17:32:45 +03:00
} catch ( GenericShareException $e ) {
$code = $e -> getCode () === 0 ? 403 : $e -> getCode ();
throw new OCSException ( $e -> getHint (), $code );
2016-01-22 16:52:20 +03:00
} catch ( \Exception $e ) {
2018-01-17 17:21:56 +03:00
throw new OCSBadRequestException ( $e -> getMessage (), $e );
2016-01-22 16:52:20 +03:00
}
2016-08-09 11:04:29 +03:00
return new DataResponse ( $this -> formatShare ( $share ));
2016-01-22 16:52:20 +03:00
}
2018-07-24 12:57:52 +03:00
/**
2019-08-16 16:09:15 +03:00
* Does the user have read permission on the share
*
* @ param \OCP\Share\IShare $share the share to check
* @ param boolean $checkGroups check groups as well ?
* @ return boolean
* @ throws NotFoundException
*
2018-07-24 12:57:52 +03:00
* @ suppress PhanUndeclaredClassMethod
*/
2018-04-23 21:31:57 +03:00
protected function canAccessShare ( \OCP\Share\IShare $share , bool $checkGroups = true ) : bool {
2016-01-27 11:02:12 +03:00
// A file with permissions 0 can't be accessed by us. So Don't show it
if ( $share -> getPermissions () === 0 ) {
return false ;
}
2015-11-24 11:37:17 +03:00
// Owner of the file and the sharer of the file can always get share
2019-08-06 11:22:32 +03:00
if ( $share -> getShareOwner () === $this -> currentUser
|| $share -> getSharedBy () === $this -> currentUser ) {
2015-11-24 11:37:17 +03:00
return true ;
}
2019-08-16 16:09:15 +03:00
// If the share is shared with you, you can access it!
2019-08-06 11:22:32 +03:00
if ( $share -> getShareType () === Share :: SHARE_TYPE_USER
&& $share -> getSharedWith () === $this -> currentUser ) {
2015-11-24 11:37:17 +03:00
return true ;
}
2019-08-16 16:09:15 +03:00
// Have reshare rights on the shared file/folder ?
// Does the currentUser have access to the shared file?
$userFolder = $this -> rootFolder -> getUserFolder ( $this -> currentUser );
$files = $userFolder -> getById ( $share -> getNodeId ());
if ( ! empty ( $files ) && $this -> shareProviderResharingRights ( $this -> currentUser , $share , $files [ 0 ])) {
return true ;
}
// If in the recipient group, you can see the share
2018-06-13 15:19:59 +03:00
if ( $checkGroups && $share -> getShareType () === Share :: SHARE_TYPE_GROUP ) {
2016-02-03 10:14:48 +03:00
$sharedWith = $this -> groupManager -> get ( $share -> getSharedWith ());
2016-10-21 21:25:07 +03:00
$user = $this -> userManager -> get ( $this -> currentUser );
2017-01-19 17:02:46 +03:00
if ( $user !== null && $sharedWith !== null && $sharedWith -> inGroup ( $user )) {
2016-02-03 10:14:48 +03:00
return true ;
}
2015-11-24 11:37:17 +03:00
}
2018-06-13 15:19:59 +03:00
if ( $share -> getShareType () === Share :: SHARE_TYPE_CIRCLE ) {
2017-03-17 22:48:33 +03:00
// TODO: have a sanity check like above?
return true ;
}
2018-06-29 14:22:26 +03:00
if ( $share -> getShareType () === Share :: SHARE_TYPE_ROOM ) {
try {
return $this -> getRoomShareHelper () -> canAccessShare ( $share , $this -> currentUser );
} catch ( QueryException $e ) {
return false ;
}
}
2015-11-24 11:37:17 +03:00
return false ;
}
2015-12-15 11:54:50 +03:00
2019-08-26 14:11:09 +03:00
/**
* Does the user have edit permission on the share
*
* @ param \OCP\Share\IShare $share the share to check
* @ return boolean
*/
protected function canEditShare ( \OCP\Share\IShare $share ) : bool {
// A file with permissions 0 can't be accessed by us. So Don't show it
if ( $share -> getPermissions () === 0 ) {
return false ;
}
// The owner of the file and the creator of the share
// can always edit the share
if ( $share -> getShareOwner () === $this -> currentUser ||
$share -> getSharedBy () === $this -> currentUser
) {
return true ;
}
//! we do NOT support some kind of `admin` in groups.
//! You cannot edit shares shared to a group you're
//! a member of if you're not the share owner or the file owner!
return false ;
}
2019-08-26 14:11:09 +03:00
/**
* Does the user have delete permission on the share
*
* @ param \OCP\Share\IShare $share the share to check
* @ return boolean
*/
protected function canDeleteShare ( \OCP\Share\IShare $share ) : bool {
// A file with permissions 0 can't be accessed by us. So Don't show it
if ( $share -> getPermissions () === 0 ) {
return false ;
}
// if the user is the recipient, i can unshare
// the share with self
if ( $share -> getShareType () === Share :: SHARE_TYPE_USER &&
$share -> getSharedWith () === $this -> currentUser
) {
return true ;
}
// The owner of the file and the creator of the share
// can always delete the share
if ( $share -> getShareOwner () === $this -> currentUser ||
$share -> getSharedBy () === $this -> currentUser
) {
return true ;
}
return false ;
}
/**
* Does the user have delete permission on the share
* This differs from the canDeleteShare function as it only
* remove the share for the current user . It does NOT
* completely delete the share but only the mount point .
* It can then be restored from the deleted shares section .
*
* @ param \OCP\Share\IShare $share the share to check
* @ return boolean
*
* @ suppress PhanUndeclaredClassMethod
*/
protected function canDeleteShareFromSelf ( \OCP\Share\IShare $share ) : bool {
if ( $share -> getShareType () !== Share :: SHARE_TYPE_GROUP &&
$share -> getShareType () !== Share :: SHARE_TYPE_ROOM
) {
return false ;
}
if ( $share -> getShareOwner () === $this -> currentUser ||
$share -> getSharedBy () === $this -> currentUser
) {
// Delete the whole share, not just for self
return false ;
}
// If in the recipient group, you can delete the share from self
if ( $share -> getShareType () === Share :: SHARE_TYPE_GROUP ) {
$sharedWith = $this -> groupManager -> get ( $share -> getSharedWith ());
$user = $this -> userManager -> get ( $this -> currentUser );
if ( $user !== null && $sharedWith !== null && $sharedWith -> inGroup ( $user )) {
return true ;
}
}
if ( $share -> getShareType () === Share :: SHARE_TYPE_ROOM ) {
try {
return $this -> getRoomShareHelper () -> canAccessShare ( $share , $this -> currentUser );
} catch ( QueryException $e ) {
return false ;
}
}
return false ;
}
2015-12-15 11:54:50 +03:00
/**
* Make sure that the passed date is valid ISO 8601
* So YYYY - MM - DD
* If not throw an exception
*
* @ param string $expireDate
*
* @ throws \Exception
* @ return \DateTime
*/
2018-04-23 21:31:57 +03:00
private function parseDate ( string $expireDate ) : \DateTime {
2015-12-15 11:54:50 +03:00
try {
$date = new \DateTime ( $expireDate );
} catch ( \Exception $e ) {
throw new \Exception ( 'Invalid date. Format must be YYYY-MM-DD' );
}
if ( $date === false ) {
throw new \Exception ( 'Invalid date. Format must be YYYY-MM-DD' );
}
2016-09-21 18:35:09 +03:00
$date -> setTime ( 0 , 0 , 0 );
2015-12-15 11:54:50 +03:00
return $date ;
}
2016-03-07 18:10:27 +03:00
/**
* Since we have multiple providers but the OCS Share API v1 does
* not support this we need to check all backends .
*
* @ param string $id
* @ return \OCP\Share\IShare
* @ throws ShareNotFound
*/
2018-04-23 21:31:57 +03:00
private function getShareById ( string $id ) : IShare {
2016-03-07 18:10:27 +03:00
$share = null ;
// First check if it is an internal share.
try {
Fix getting the information of group share as a sharee
When the receiver of a group share modifies it (for example, by moving
it to a different folder) the original share is not modified, but a
"ghost" share that keeps track of the changes made by that specific user
is used instead.
By default, the method "getShareById" in the share provider returns the
share from the point of view of the sharer, but it can be used too to
get the share from the point of view of a sharee by providing the
"recipient" parameter (and if the sharee is not found then the share is
returned from the point of view of the sharer).
The "ShareAPIController" always formats the share from the point of view
of the current user, but when getting the information of a specific
share the "recipient" parameter was not given, so it was always returned
from the point of view of the sharer, even if the current user was a
sharee. Now the "recipient" parameter is set to the current user, and
thus the information of the share is returned from the point of view of
the current user, be it the sharer or a sharee.
Note that this special behaviour of "getShareById" happens only with
group shares; with other types of shares the share is the same for the
sharer and the sharee, and thus the parameter is ignored; it was added
for them too just for consistency.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2018-06-28 13:34:04 +03:00
$share = $this -> shareManager -> getShareById ( 'ocinternal:' . $id , $this -> currentUser );
2016-07-29 16:38:31 +03:00
return $share ;
} catch ( ShareNotFound $e ) {
// Do nothing, just try the other share type
}
2017-03-17 22:48:33 +03:00
try {
2018-06-13 15:19:59 +03:00
if ( $this -> shareManager -> shareProviderExists ( Share :: SHARE_TYPE_CIRCLE )) {
Fix getting the information of group share as a sharee
When the receiver of a group share modifies it (for example, by moving
it to a different folder) the original share is not modified, but a
"ghost" share that keeps track of the changes made by that specific user
is used instead.
By default, the method "getShareById" in the share provider returns the
share from the point of view of the sharer, but it can be used too to
get the share from the point of view of a sharee by providing the
"recipient" parameter (and if the sharee is not found then the share is
returned from the point of view of the sharer).
The "ShareAPIController" always formats the share from the point of view
of the current user, but when getting the information of a specific
share the "recipient" parameter was not given, so it was always returned
from the point of view of the sharer, even if the current user was a
sharee. Now the "recipient" parameter is set to the current user, and
thus the information of the share is returned from the point of view of
the current user, be it the sharer or a sharee.
Note that this special behaviour of "getShareById" happens only with
group shares; with other types of shares the share is the same for the
sharer and the sharee, and thus the parameter is ignored; it was added
for them too just for consistency.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2018-06-28 13:34:04 +03:00
$share = $this -> shareManager -> getShareById ( 'ocCircleShare:' . $id , $this -> currentUser );
2017-03-17 22:48:33 +03:00
return $share ;
}
} catch ( ShareNotFound $e ) {
// Do nothing, just try the other share type
}
2016-07-29 16:38:31 +03:00
try {
2018-06-13 15:19:59 +03:00
if ( $this -> shareManager -> shareProviderExists ( Share :: SHARE_TYPE_EMAIL )) {
Fix getting the information of group share as a sharee
When the receiver of a group share modifies it (for example, by moving
it to a different folder) the original share is not modified, but a
"ghost" share that keeps track of the changes made by that specific user
is used instead.
By default, the method "getShareById" in the share provider returns the
share from the point of view of the sharer, but it can be used too to
get the share from the point of view of a sharee by providing the
"recipient" parameter (and if the sharee is not found then the share is
returned from the point of view of the sharer).
The "ShareAPIController" always formats the share from the point of view
of the current user, but when getting the information of a specific
share the "recipient" parameter was not given, so it was always returned
from the point of view of the sharer, even if the current user was a
sharee. Now the "recipient" parameter is set to the current user, and
thus the information of the share is returned from the point of view of
the current user, be it the sharer or a sharee.
Note that this special behaviour of "getShareById" happens only with
group shares; with other types of shares the share is the same for the
sharer and the sharee, and thus the parameter is ignored; it was added
for them too just for consistency.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2018-06-28 13:34:04 +03:00
$share = $this -> shareManager -> getShareById ( 'ocMailShare:' . $id , $this -> currentUser );
2016-10-27 13:27:09 +03:00
return $share ;
2016-03-07 18:10:27 +03:00
}
2016-10-27 13:27:09 +03:00
} catch ( ShareNotFound $e ) {
// Do nothing, just try the other share type
}
2016-03-07 18:10:27 +03:00
2018-06-29 14:22:26 +03:00
try {
$share = $this -> shareManager -> getShareById ( 'ocRoomShare:' . $id , $this -> currentUser );
return $share ;
} catch ( ShareNotFound $e ) {
// Do nothing, just try the other share type
}
2016-10-27 13:27:09 +03:00
if ( ! $this -> shareManager -> outgoingServer2ServerSharesAllowed ()) {
throw new ShareNotFound ();
2016-03-07 18:10:27 +03:00
}
Fix getting the information of group share as a sharee
When the receiver of a group share modifies it (for example, by moving
it to a different folder) the original share is not modified, but a
"ghost" share that keeps track of the changes made by that specific user
is used instead.
By default, the method "getShareById" in the share provider returns the
share from the point of view of the sharer, but it can be used too to
get the share from the point of view of a sharee by providing the
"recipient" parameter (and if the sharee is not found then the share is
returned from the point of view of the sharer).
The "ShareAPIController" always formats the share from the point of view
of the current user, but when getting the information of a specific
share the "recipient" parameter was not given, so it was always returned
from the point of view of the sharer, even if the current user was a
sharee. Now the "recipient" parameter is set to the current user, and
thus the information of the share is returned from the point of view of
the current user, be it the sharer or a sharee.
Note that this special behaviour of "getShareById" happens only with
group shares; with other types of shares the share is the same for the
sharer and the sharee, and thus the parameter is ignored; it was added
for them too just for consistency.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
2018-06-28 13:34:04 +03:00
$share = $this -> shareManager -> getShareById ( 'ocFederatedSharing:' . $id , $this -> currentUser );
2016-03-07 18:10:27 +03:00
return $share ;
}
2016-07-20 11:11:01 +03:00
/**
* Lock a Node
2016-09-21 18:35:09 +03:00
*
2016-07-20 11:11:01 +03:00
* @ param \OCP\Files\Node $node
2018-04-23 21:31:57 +03:00
* @ throws LockedException
2016-07-20 11:11:01 +03:00
*/
private function lock ( \OCP\Files\Node $node ) {
$node -> lock ( ILockingProvider :: LOCK_SHARED );
$this -> lockedNode = $node ;
}
/**
* Cleanup the remaining locks
2018-04-23 21:31:57 +03:00
* @ throws @ LockedException
2016-07-20 11:11:01 +03:00
*/
public function cleanup () {
if ( $this -> lockedNode !== null ) {
$this -> lockedNode -> unlock ( ILockingProvider :: LOCK_SHARED );
}
}
2018-06-29 14:22:26 +03:00
/**
* Returns the helper of ShareAPIController for room shares .
*
* If the Talk application is not enabled or the helper is not available
* a QueryException is thrown instead .
*
2019-09-05 16:32:58 +03:00
* @ return \OCA\Talk\Share\Helper\ShareAPIController
2018-06-29 14:22:26 +03:00
* @ throws QueryException
*/
private function getRoomShareHelper () {
if ( ! $this -> appManager -> isEnabledForUser ( 'spreed' )) {
throw new QueryException ();
}
2019-09-05 16:32:58 +03:00
return $this -> serverContainer -> query ( '\OCA\Talk\Share\Helper\ShareAPIController' );
2018-06-29 14:22:26 +03:00
}
2018-10-29 12:03:52 +03:00
/**
* Returns if we can find resharing rights in an IShare object for a specific user .
*
2018-11-01 15:41:19 +03:00
* @ suppress PhanUndeclaredClassMethod
*
2018-10-29 12:03:52 +03:00
* @ param string $userId
* @ param IShare $share
2018-11-01 15:41:19 +03:00
* @ param Node $node
2018-10-29 12:03:52 +03:00
* @ return bool
2018-11-01 15:41:19 +03:00
* @ throws NotFoundException
* @ throws \OCP\Files\InvalidPathException
2018-10-29 12:03:52 +03:00
*/
2018-11-01 17:01:01 +03:00
private function shareProviderResharingRights ( string $userId , IShare $share , $node ) : bool {
2018-10-29 12:03:52 +03:00
if ( $share -> getShareOwner () === $userId ) {
return true ;
}
2018-11-01 15:41:19 +03:00
// we check that current user have parent resharing rights on the current file
2018-11-01 17:01:01 +03:00
if ( $node !== null && ( $node -> getPermissions () & \OCP\Constants :: PERMISSION_SHARE ) !== 0 ) {
2018-11-01 15:41:19 +03:00
return true ;
}
2018-10-29 12:03:52 +03:00
if (( \OCP\Constants :: PERMISSION_SHARE & $share -> getPermissions ()) === 0 ) {
return false ;
}
if ( $share -> getShareType () === \OCP\Share :: SHARE_TYPE_USER && $share -> getSharedWith () === $userId ) {
return true ;
}
if ( $share -> getShareType () === \OCP\Share :: SHARE_TYPE_GROUP && $this -> groupManager -> isInGroup ( $userId , $share -> getSharedWith ())) {
return true ;
}
2019-08-06 11:22:32 +03:00
if ( $share -> getShareType () === \OCP\Share :: SHARE_TYPE_CIRCLE && \OC :: $server -> getAppManager () -> isEnabledForUser ( 'circles' )
&& class_exists ( '\OCA\Circles\Api\v1\Circles' )) {
2018-10-30 11:58:43 +03:00
$hasCircleId = ( substr ( $share -> getSharedWith (), - 1 ) === ']' );
$shareWithStart = ( $hasCircleId ? strrpos ( $share -> getSharedWith (), '[' ) + 1 : 0 );
$shareWithLength = ( $hasCircleId ? - 1 : strpos ( $share -> getSharedWith (), ' ' ));
if ( is_bool ( $shareWithLength )) {
$shareWithLength = - 1 ;
}
$sharedWith = substr ( $share -> getSharedWith (), $shareWithStart , $shareWithLength );
try {
$member = \OCA\Circles\Api\v1\Circles :: getMember ( $sharedWith , $userId , 1 );
2018-10-30 12:02:38 +03:00
if ( $member -> getLevel () >= 4 ) {
2018-10-30 11:58:43 +03:00
return true ;
}
2018-10-30 12:02:38 +03:00
return false ;
2018-10-30 11:58:43 +03:00
} catch ( QueryException $e ) {
return false ;
}
}
2018-10-29 12:03:52 +03:00
return false ;
}
2019-08-26 14:11:09 +03:00
2019-10-25 11:45:49 +03:00
/**
* Get all the shares for the current user
*
* @ param Node | null $path
* @ param boolean $reshares
* @ return void
*/
private function getAllShares ( ? Node $path = null , bool $reshares = false ) {
// Get all shares
$userShares = $this -> shareManager -> getSharesBy ( $this -> currentUser , Share :: SHARE_TYPE_USER , $path , $reshares , - 1 , 0 );
$groupShares = $this -> shareManager -> getSharesBy ( $this -> currentUser , Share :: SHARE_TYPE_GROUP , $path , $reshares , - 1 , 0 );
$linkShares = $this -> shareManager -> getSharesBy ( $this -> currentUser , Share :: SHARE_TYPE_LINK , $path , $reshares , - 1 , 0 );
// EMAIL SHARES
$mailShares = $this -> shareManager -> getSharesBy ( $this -> currentUser , Share :: SHARE_TYPE_EMAIL , $path , $reshares , - 1 , 0 );
// CIRCLE SHARES
$circleShares = $this -> shareManager -> getSharesBy ( $this -> currentUser , Share :: SHARE_TYPE_CIRCLE , $path , $reshares , - 1 , 0 );
// TALK SHARES
$roomShares = $this -> shareManager -> getSharesBy ( $this -> currentUser , Share :: SHARE_TYPE_ROOM , $path , $reshares , - 1 , 0 );
// FEDERATION
if ( $this -> shareManager -> outgoingServer2ServerSharesAllowed ()) {
$federatedShares = $this -> shareManager -> getSharesBy ( $this -> currentUser , Share :: SHARE_TYPE_REMOTE , $path , $reshares , - 1 , 0 );
} else {
$federatedShares = [];
}
if ( $this -> shareManager -> outgoingServer2ServerGroupSharesAllowed ()) {
$federatedGroupShares = $this -> shareManager -> getSharesBy ( $this -> currentUser , Share :: SHARE_TYPE_REMOTE_GROUP , $path , $reshares , - 1 , 0 );
} else {
$federatedGroupShares = [];
}
return array_merge ( $userShares , $groupShares , $linkShares , $mailShares , $circleShares , $roomShares , $federatedShares , $federatedGroupShares );
}
2015-10-30 15:10:08 +03:00
}