2014-11-24 09:31:52 -05:00
< ? php
/**
2016-07-21 10:49:16 -04:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
*
2017-11-06 09:56:42 -05:00
* @ author Bjoern Schiessle < bjoern @ schiessle . org >
2016-05-26 13:56:05 -04:00
* @ author Björn Schießle < bjoern @ schiessle . org >
2021-06-04 15:52:51 -04:00
* @ author Christoph Wurst < christoph @ winzerhof - wurst . at >
2016-07-21 10:49:16 -04:00
* @ author Joas Schilling < coding @ schilljs . com >
2015-03-26 06:44:34 -04:00
* @ author Morris Jobke < hey @ morrisjobke . de >
2017-11-06 09:56:42 -05:00
* @ author Robin Appelman < robin @ icewind . nl >
* @ author Roeland Jago Douma < roeland @ famdouma . nl >
2015-02-26 05:37:37 -05:00
*
2015-03-26 06:44:34 -04:00
* @ license AGPL - 3.0
2014-11-24 09:31:52 -05:00
*
2015-03-26 06:44:34 -04:00
* 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 .
2014-11-24 09:31:52 -05:00
*
2015-03-26 06:44:34 -04:00
* This program is distributed in the hope that it will be useful ,
2014-11-24 09:31:52 -05:00
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
2015-03-26 06:44:34 -04:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
2014-11-24 09:31:52 -05:00
*
2015-03-26 06:44:34 -04:00
* You should have received a copy of the GNU Affero General Public License , version 3 ,
2019-12-03 13:57:53 -05:00
* along with this program . If not , see < http :// www . gnu . org / licenses />
2014-11-24 09:31:52 -05:00
*
*/
2016-08-19 06:01:13 -04:00
namespace OCA\FederatedFileSharing\Controller ;
2014-11-24 09:31:52 -05:00
2016-08-19 06:01:13 -04:00
use OCA\FederatedFileSharing\AddressHandler ;
use OCA\FederatedFileSharing\FederatedShareProvider ;
use OCA\FederatedFileSharing\Notifications ;
2016-05-04 09:26:30 -04:00
use OCP\AppFramework\Http ;
2016-08-19 06:01:13 -04:00
use OCP\AppFramework\OCS\OCSBadRequestException ;
use OCP\AppFramework\OCS\OCSException ;
use OCP\AppFramework\OCS\OCSForbiddenException ;
use OCP\AppFramework\OCSController ;
2016-05-04 09:26:30 -04:00
use OCP\Constants ;
2022-03-16 10:17:55 -04:00
use OCP\EventDispatcher\IEventDispatcher ;
2018-04-30 05:49:24 -04:00
use OCP\Federation\Exceptions\ProviderCouldNotAddShareException ;
use OCP\Federation\Exceptions\ProviderDoesNotExistsException ;
use OCP\Federation\ICloudFederationFactory ;
use OCP\Federation\ICloudFederationProviderManager ;
2017-01-27 06:52:17 -05:00
use OCP\Federation\ICloudIdManager ;
2016-05-04 06:16:02 -04:00
use OCP\IDBConnection ;
2016-05-04 09:26:30 -04:00
use OCP\IRequest ;
use OCP\IUserManager ;
2022-03-16 10:17:55 -04:00
use OCP\Log\Audit\CriticalActionPerformedEvent ;
2016-05-04 09:26:30 -04:00
use OCP\Share ;
2018-06-07 08:40:12 -04:00
use OCP\Share\Exceptions\ShareNotFound ;
2021-03-09 14:42:47 -05:00
use Psr\Log\LoggerInterface ;
2015-07-02 06:27:58 -04:00
2016-08-19 06:01:13 -04:00
class RequestHandlerController extends OCSController {
2014-11-24 09:31:52 -05:00
2016-04-18 12:17:08 -04:00
/** @var FederatedShareProvider */
private $federatedShareProvider ;
2016-05-04 06:16:02 -04:00
/** @var IDBConnection */
private $connection ;
2016-05-04 09:26:30 -04:00
/** @var Share\IManager */
private $shareManager ;
/** @var Notifications */
private $notifications ;
/** @var AddressHandler */
private $addressHandler ;
/** @var IUserManager */
private $userManager ;
2016-05-04 06:16:02 -04:00
/** @var string */
private $shareTable = 'share' ;
2016-04-18 12:17:08 -04:00
2017-03-09 10:49:40 -05:00
/** @var ICloudIdManager */
2017-01-27 06:52:17 -05:00
private $cloudIdManager ;
2021-03-09 14:42:47 -05:00
/** @var LoggerInterface */
2018-04-23 04:44:49 -04:00
private $logger ;
2018-04-30 05:49:24 -04:00
/** @var ICloudFederationFactory */
private $cloudFederationFactory ;
/** @var ICloudFederationProviderManager */
private $cloudFederationProviderManager ;
2022-03-16 10:17:55 -04:00
/** @var IEventDispatcher */
private $eventDispatcher ;
2021-03-09 14:42:47 -05:00
public function __construct ( string $appName ,
2016-08-19 06:01:13 -04:00
IRequest $request ,
FederatedShareProvider $federatedShareProvider ,
2016-05-04 09:26:30 -04:00
IDBConnection $connection ,
Share\IManager $shareManager ,
Notifications $notifications ,
AddressHandler $addressHandler ,
2017-01-27 06:52:17 -05:00
IUserManager $userManager ,
2018-04-23 04:44:49 -04:00
ICloudIdManager $cloudIdManager ,
2021-03-09 14:42:47 -05:00
LoggerInterface $logger ,
2018-04-30 05:49:24 -04:00
ICloudFederationFactory $cloudFederationFactory ,
2022-03-16 10:17:55 -04:00
ICloudFederationProviderManager $cloudFederationProviderManager ,
IEventDispatcher $eventDispatcher
2016-05-04 09:26:30 -04:00
) {
2016-08-19 06:01:13 -04:00
parent :: __construct ( $appName , $request );
2016-04-18 12:17:08 -04:00
$this -> federatedShareProvider = $federatedShareProvider ;
2016-05-04 06:16:02 -04:00
$this -> connection = $connection ;
2016-05-04 09:26:30 -04:00
$this -> shareManager = $shareManager ;
$this -> notifications = $notifications ;
$this -> addressHandler = $addressHandler ;
$this -> userManager = $userManager ;
2017-01-27 06:52:17 -05:00
$this -> cloudIdManager = $cloudIdManager ;
2018-04-23 04:44:49 -04:00
$this -> logger = $logger ;
2018-04-30 05:49:24 -04:00
$this -> cloudFederationFactory = $cloudFederationFactory ;
$this -> cloudFederationProviderManager = $cloudFederationProviderManager ;
2022-03-16 10:17:55 -04:00
$this -> eventDispatcher = $eventDispatcher ;
2016-04-18 12:17:08 -04:00
}
2014-11-24 09:31:52 -05:00
/**
2016-08-19 06:01:13 -04:00
* @ NoCSRFRequired
* @ PublicPage
*
2014-11-24 09:31:52 -05:00
* create a new share
*
2016-08-19 06:01:13 -04:00
* @ return Http\DataResponse
* @ throws OCSException
2014-11-24 09:31:52 -05:00
*/
2016-08-19 06:01:13 -04:00
public function createShare () {
2014-11-24 09:31:52 -05:00
$remote = isset ( $_POST [ 'remote' ]) ? $_POST [ 'remote' ] : null ;
$token = isset ( $_POST [ 'token' ]) ? $_POST [ 'token' ] : null ;
$name = isset ( $_POST [ 'name' ]) ? $_POST [ 'name' ] : null ;
$owner = isset ( $_POST [ 'owner' ]) ? $_POST [ 'owner' ] : null ;
2016-05-04 09:26:30 -04:00
$sharedBy = isset ( $_POST [ 'sharedBy' ]) ? $_POST [ 'sharedBy' ] : null ;
2014-11-24 09:31:52 -05:00
$shareWith = isset ( $_POST [ 'shareWith' ]) ? $_POST [ 'shareWith' ] : null ;
2014-12-04 13:51:04 -05:00
$remoteId = isset ( $_POST [ 'remoteId' ]) ? ( int ) $_POST [ 'remoteId' ] : null ;
2016-05-04 09:26:30 -04:00
$sharedByFederatedId = isset ( $_POST [ 'sharedByFederatedId' ]) ? $_POST [ 'sharedByFederatedId' ] : null ;
$ownerFederatedId = isset ( $_POST [ 'ownerFederatedId' ]) ? $_POST [ 'ownerFederatedId' ] : null ;
2014-11-24 09:31:52 -05:00
2018-04-30 05:49:24 -04:00
if ( $ownerFederatedId === null ) {
$ownerFederatedId = $this -> cloudIdManager -> getCloudId ( $owner , $this -> cleanupRemote ( $remote )) -> getId ();
}
// if the owner of the share and the initiator are the same user
// we also complete the federated share ID for the initiator
if ( $sharedByFederatedId === null && $owner === $sharedBy ) {
$sharedByFederatedId = $ownerFederatedId ;
}
2015-09-01 11:59:01 -04:00
2018-04-30 05:49:24 -04:00
$share = $this -> cloudFederationFactory -> getCloudFederationShare (
$shareWith ,
$name ,
'' ,
$remoteId ,
$ownerFederatedId ,
$owner ,
$sharedByFederatedId ,
$sharedBy ,
2018-05-28 11:13:19 -04:00
$token ,
2018-04-30 05:49:24 -04:00
'user' ,
'file'
);
2015-09-01 11:59:01 -04:00
2018-04-30 05:49:24 -04:00
try {
$provider = $this -> cloudFederationProviderManager -> getCloudFederationProvider ( 'file' );
$provider -> shareReceived ( $share );
2022-03-16 10:17:55 -04:00
if ( $sharedByFederatedId === $ownerFederatedId ) {
$this -> eventDispatcher -> dispatchTyped ( new CriticalActionPerformedEvent ( 'A new federated share with "%s" was created by "%s" and shared with "%s"' , [ $name , $ownerFederatedId , $shareWith ]));
} else {
$this -> eventDispatcher -> dispatchTyped ( new CriticalActionPerformedEvent ( 'A new federated share with "%s" was shared by "%s" (resource owner is: "%s") and shared with "%s"' , [ $name , $sharedByFederatedId , $ownerFederatedId , $shareWith ]));
}
2018-04-30 05:49:24 -04:00
} catch ( ProviderDoesNotExistsException $e ) {
throw new OCSException ( 'Server does not support federated cloud sharing' , 503 );
} catch ( ProviderCouldNotAddShareException $e ) {
2018-06-11 09:29:51 -04:00
throw new OCSException ( $e -> getMessage (), 400 );
2018-04-30 05:49:24 -04:00
} catch ( \Exception $e ) {
throw new OCSException ( 'internal server error, was not able to add share from ' . $remote , 500 );
2014-11-24 09:31:52 -05:00
}
2018-04-30 05:49:24 -04:00
return new Http\DataResponse ();
2014-11-24 09:31:52 -05:00
}
2016-05-04 09:26:30 -04:00
/**
2016-08-19 06:01:13 -04:00
* @ NoCSRFRequired
* @ PublicPage
*
2016-05-04 09:26:30 -04:00
* create re - share on behalf of another user
*
2016-08-19 06:01:13 -04:00
* @ param int $id
* @ return Http\DataResponse
* @ throws OCSBadRequestException
2018-06-07 08:40:12 -04:00
* @ throws OCSException
2016-08-19 06:01:13 -04:00
* @ throws OCSForbiddenException
2016-05-04 09:26:30 -04:00
*/
2016-08-19 06:01:13 -04:00
public function reShare ( $id ) {
2016-05-04 09:26:30 -04:00
$token = $this -> request -> getParam ( 'token' , null );
$shareWith = $this -> request -> getParam ( 'shareWith' , null );
$permission = ( int ) $this -> request -> getParam ( 'permission' , null );
$remoteId = ( int ) $this -> request -> getParam ( 'remoteId' , null );
if ( $id === null ||
$token === null ||
$shareWith === null ||
$permission === null ||
$remoteId === null
) {
2016-08-19 06:01:13 -04:00
throw new OCSBadRequestException ();
2016-05-04 09:26:30 -04:00
}
2018-06-04 06:16:03 -04:00
$notification = [
'sharedSecret' => $token ,
'shareWith' => $shareWith ,
'senderId' => $remoteId ,
'message' => 'Recipient of a share ask the owner to reshare the file'
];
2016-05-04 09:26:30 -04:00
2018-06-04 06:16:03 -04:00
try {
$provider = $this -> cloudFederationProviderManager -> getCloudFederationProvider ( 'file' );
2021-01-12 04:15:48 -05:00
[ $newToken , $localId ] = $provider -> notificationReceived ( 'REQUEST_RESHARE' , $id , $notification );
2018-06-04 06:16:03 -04:00
return new Http\DataResponse ([
'token' => $newToken ,
'remoteId' => $localId
]);
} catch ( ProviderDoesNotExistsException $e ) {
throw new OCSException ( 'Server does not support federated cloud sharing' , 503 );
2018-06-07 08:40:12 -04:00
} catch ( ShareNotFound $e ) {
2021-03-09 14:42:47 -05:00
$this -> logger -> debug ( 'Share not found: ' . $e -> getMessage (), [ 'exception' => $e ]);
2018-06-04 06:16:03 -04:00
} catch ( \Exception $e ) {
2021-03-09 14:42:47 -05:00
$this -> logger -> debug ( 'internal server error, can not process notification: ' . $e -> getMessage (), [ 'exception' => $e ]);
2016-05-04 09:26:30 -04:00
}
2016-08-19 06:01:13 -04:00
throw new OCSBadRequestException ();
2016-05-04 09:26:30 -04:00
}
2018-06-04 06:16:03 -04:00
2014-11-24 09:31:52 -05:00
/**
2016-08-19 06:01:13 -04:00
* @ NoCSRFRequired
* @ PublicPage
*
2014-11-24 09:31:52 -05:00
* accept server - to - server share
*
2016-08-19 06:01:13 -04:00
* @ param int $id
* @ return Http\DataResponse
* @ throws OCSException
2018-06-07 08:40:12 -04:00
* @ throws ShareNotFound
2021-06-29 19:20:33 -04:00
* @ throws \OCP\HintException
2014-11-24 09:31:52 -05:00
*/
2016-08-19 06:01:13 -04:00
public function acceptShare ( $id ) {
2014-11-24 09:31:52 -05:00
$token = isset ( $_POST [ 'token' ]) ? $_POST [ 'token' ] : null ;
2016-05-04 09:26:30 -04:00
2018-05-29 10:21:13 -04:00
$notification = [
'sharedSecret' => $token ,
'message' => 'Recipient accept the share'
];
2016-05-04 09:26:30 -04:00
2018-05-29 10:21:13 -04:00
try {
$provider = $this -> cloudFederationProviderManager -> getCloudFederationProvider ( 'file' );
$provider -> notificationReceived ( 'SHARE_ACCEPTED' , $id , $notification );
2022-03-16 10:17:55 -04:00
$this -> eventDispatcher -> dispatchTyped ( new CriticalActionPerformedEvent ( 'Federated share with id "%s" was accepted' , [ $id ]));
2018-05-29 10:21:13 -04:00
} catch ( ProviderDoesNotExistsException $e ) {
throw new OCSException ( 'Server does not support federated cloud sharing' , 503 );
2018-06-07 08:40:12 -04:00
} catch ( ShareNotFound $e ) {
2021-03-09 14:42:47 -05:00
$this -> logger -> debug ( 'Share not found: ' . $e -> getMessage (), [ 'exception' => $e ]);
2018-05-29 10:21:13 -04:00
} catch ( \Exception $e ) {
2021-03-09 14:42:47 -05:00
$this -> logger -> debug ( 'internal server error, can not process notification: ' . $e -> getMessage (), [ 'exception' => $e ]);
2014-11-24 09:31:52 -05:00
}
2016-08-19 06:01:13 -04:00
return new Http\DataResponse ();
2014-11-24 09:31:52 -05:00
}
/**
2016-08-19 06:01:13 -04:00
* @ NoCSRFRequired
* @ PublicPage
*
2014-11-24 09:31:52 -05:00
* decline server - to - server share
*
2016-08-19 06:01:13 -04:00
* @ param int $id
* @ return Http\DataResponse
* @ throws OCSException
2014-11-24 09:31:52 -05:00
*/
2016-08-19 06:01:13 -04:00
public function declineShare ( $id ) {
2014-11-24 09:31:52 -05:00
$token = isset ( $_POST [ 'token' ]) ? $_POST [ 'token' ] : null ;
2018-05-30 11:44:08 -04:00
$notification = [
'sharedSecret' => $token ,
'message' => 'Recipient declined the share'
];
2016-05-04 09:26:30 -04:00
2018-05-30 11:44:08 -04:00
try {
$provider = $this -> cloudFederationProviderManager -> getCloudFederationProvider ( 'file' );
$provider -> notificationReceived ( 'SHARE_DECLINED' , $id , $notification );
2022-03-16 10:17:55 -04:00
$this -> eventDispatcher -> dispatchTyped ( new CriticalActionPerformedEvent ( 'Federated share with id "%s" was declined' , [ $id ]));
2018-05-30 11:44:08 -04:00
} catch ( ProviderDoesNotExistsException $e ) {
throw new OCSException ( 'Server does not support federated cloud sharing' , 503 );
2018-06-07 08:40:12 -04:00
} catch ( ShareNotFound $e ) {
2021-03-09 14:42:47 -05:00
$this -> logger -> debug ( 'Share not found: ' . $e -> getMessage (), [ 'exception' => $e ]);
2018-05-30 11:44:08 -04:00
} catch ( \Exception $e ) {
2021-03-09 14:42:47 -05:00
$this -> logger -> debug ( 'internal server error, can not process notification: ' . $e -> getMessage (), [ 'exception' => $e ]);
2016-05-04 09:26:30 -04:00
}
2014-11-24 09:31:52 -05:00
2016-08-19 06:01:13 -04:00
return new Http\DataResponse ();
2016-05-04 09:26:30 -04:00
}
2014-11-24 09:31:52 -05:00
/**
2016-08-19 06:01:13 -04:00
* @ NoCSRFRequired
* @ PublicPage
*
2014-11-24 09:31:52 -05:00
* remove server - to - server share if it was unshared by the owner
*
2016-08-19 06:01:13 -04:00
* @ param int $id
* @ return Http\DataResponse
* @ throws OCSException
2014-11-24 09:31:52 -05:00
*/
2016-08-19 06:01:13 -04:00
public function unshare ( $id ) {
2014-11-24 09:31:52 -05:00
if ( ! $this -> isS2SEnabled ()) {
2016-08-19 06:01:13 -04:00
throw new OCSException ( 'Server does not support federated cloud sharing' , 503 );
2014-11-24 09:31:52 -05:00
}
$token = isset ( $_POST [ 'token' ]) ? $_POST [ 'token' ] : null ;
2018-06-04 10:36:37 -04:00
try {
$provider = $this -> cloudFederationProviderManager -> getCloudFederationProvider ( 'file' );
$notification = [ 'sharedSecret' => $token ];
$provider -> notificationReceived ( 'SHARE_UNSHARED' , $id , $notification );
2022-03-16 10:17:55 -04:00
$this -> eventDispatcher -> dispatchTyped ( new CriticalActionPerformedEvent ( 'Federated share with id "%s" was unshared' , [ $id ]));
2018-06-04 10:36:37 -04:00
} catch ( \Exception $e ) {
2021-03-09 14:42:47 -05:00
$this -> logger -> debug ( 'processing unshare notification failed: ' . $e -> getMessage (), [ 'exception' => $e ]);
2014-11-24 09:31:52 -05:00
}
2016-08-19 06:01:13 -04:00
return new Http\DataResponse ();
2014-11-24 09:31:52 -05:00
}
2014-12-04 13:51:04 -05:00
private function cleanupRemote ( $remote ) {
$remote = substr ( $remote , strpos ( $remote , '://' ) + 3 );
return rtrim ( $remote , '/' );
}
2016-05-04 09:26:30 -04:00
/**
2016-08-19 06:01:13 -04:00
* @ NoCSRFRequired
* @ PublicPage
*
2016-05-04 09:26:30 -04:00
* federated share was revoked , either by the owner or the re - sharer
*
2016-08-19 06:01:13 -04:00
* @ param int $id
* @ return Http\DataResponse
* @ throws OCSBadRequestException
2016-05-04 09:26:30 -04:00
*/
2016-08-19 06:01:13 -04:00
public function revoke ( $id ) {
2016-05-04 09:26:30 -04:00
$token = $this -> request -> getParam ( 'token' );
2017-03-09 10:49:40 -05:00
2018-06-04 10:36:37 -04:00
try {
$provider = $this -> cloudFederationProviderManager -> getCloudFederationProvider ( 'file' );
2018-06-05 13:43:57 -04:00
$notification = [ 'sharedSecret' => $token ];
2018-06-05 11:21:51 -04:00
$provider -> notificationReceived ( 'RESHARE_UNDO' , $id , $notification );
2016-08-19 06:01:13 -04:00
return new Http\DataResponse ();
2018-06-04 10:36:37 -04:00
} catch ( \Exception $e ) {
throw new OCSBadRequestException ();
2016-05-04 09:26:30 -04:00
}
}
2017-03-09 10:49:40 -05:00
2014-11-24 09:31:52 -05:00
/**
* check if server - to - server sharing is enabled
*
* @ param bool $incoming
* @ return bool
*/
private function isS2SEnabled ( $incoming = false ) {
$result = \OCP\App :: isEnabled ( 'files_sharing' );
if ( $incoming ) {
2016-04-18 12:17:08 -04:00
$result = $result && $this -> federatedShareProvider -> isIncomingServer2serverShareEnabled ();
2014-11-24 09:31:52 -05:00
} else {
2016-04-18 12:17:08 -04:00
$result = $result && $this -> federatedShareProvider -> isOutgoingServer2serverShareEnabled ();
2014-11-24 09:31:52 -05:00
}
return $result ;
}
2016-05-04 09:26:30 -04:00
/**
2016-08-19 06:01:13 -04:00
* @ NoCSRFRequired
* @ PublicPage
*
2016-05-04 09:26:30 -04:00
* update share information to keep federated re - shares in sync
2016-05-13 14:36:42 -04:00
*
2016-08-19 06:01:13 -04:00
* @ param int $id
* @ return Http\DataResponse
* @ throws OCSBadRequestException
2016-05-04 09:26:30 -04:00
*/
2016-08-19 06:01:13 -04:00
public function updatePermissions ( $id ) {
2016-05-04 09:26:30 -04:00
$token = $this -> request -> getParam ( 'token' , null );
2018-06-05 13:43:57 -04:00
$ncPermissions = $this -> request -> getParam ( 'permissions' , null );
2016-05-04 09:26:30 -04:00
try {
2018-06-05 13:43:57 -04:00
$provider = $this -> cloudFederationProviderManager -> getCloudFederationProvider ( 'file' );
$ocmPermissions = $this -> ncPermissions2ocmPermissions (( int ) $ncPermissions );
$notification = [ 'sharedSecret' => $token , 'permission' => $ocmPermissions ];
$provider -> notificationReceived ( 'RESHARE_CHANGE_PERMISSION' , $id , $notification );
2022-03-16 10:17:55 -04:00
$this -> eventDispatcher -> dispatchTyped ( new CriticalActionPerformedEvent ( 'Federated share with id "%s" has updated permissions "%s"' , [ $id , implode ( ', ' , $ocmPermissions )]));
2018-06-05 13:43:57 -04:00
} catch ( \Exception $e ) {
2021-03-09 14:42:47 -05:00
$this -> logger -> debug ( $e -> getMessage (), [ 'exception' => $e ]);
2016-08-19 06:01:13 -04:00
throw new OCSBadRequestException ();
2016-05-04 09:26:30 -04:00
}
2016-08-19 06:01:13 -04:00
return new Http\DataResponse ();
2016-05-04 09:26:30 -04:00
}
2016-05-13 14:36:42 -04:00
/**
2018-06-05 13:43:57 -04:00
* translate Nextcloud permissions to OCM Permissions
2016-05-13 14:36:42 -04:00
*
2018-06-05 13:43:57 -04:00
* @ param $ncPermissions
* @ return array
2016-05-13 14:36:42 -04:00
*/
2018-06-05 13:43:57 -04:00
protected function ncPermissions2ocmPermissions ( $ncPermissions ) {
$ocmPermissions = [];
if ( $ncPermissions & Constants :: PERMISSION_SHARE ) {
$ocmPermissions [] = 'share' ;
}
if ( $ncPermissions & Constants :: PERMISSION_READ ) {
$ocmPermissions [] = 'read' ;
}
if (( $ncPermissions & Constants :: PERMISSION_CREATE ) ||
( $ncPermissions & Constants :: PERMISSION_UPDATE )) {
$ocmPermissions [] = 'write' ;
}
return $ocmPermissions ;
2016-05-13 14:36:42 -04:00
}
2017-03-09 10:49:40 -05:00
/**
* @ NoCSRFRequired
* @ PublicPage
*
* change the owner of a server - to - server share
*
* @ param int $id
* @ return Http\DataResponse
* @ throws \InvalidArgumentException
* @ throws OCSException
*/
public function move ( $id ) {
if ( ! $this -> isS2SEnabled ()) {
throw new OCSException ( 'Server does not support federated cloud sharing' , 503 );
}
$token = $this -> request -> getParam ( 'token' );
$remote = $this -> request -> getParam ( 'remote' );
$newRemoteId = $this -> request -> getParam ( 'remote_id' , $id );
$cloudId = $this -> cloudIdManager -> resolveCloudId ( $remote );
$qb = $this -> connection -> getQueryBuilder ();
$query = $qb -> update ( 'share_external' )
-> set ( 'remote' , $qb -> createNamedParameter ( $cloudId -> getRemote ()))
-> set ( 'owner' , $qb -> createNamedParameter ( $cloudId -> getUser ()))
-> set ( 'remote_id' , $qb -> createNamedParameter ( $newRemoteId ))
-> where ( $qb -> expr () -> eq ( 'remote_id' , $qb -> createNamedParameter ( $id )))
-> andWhere ( $qb -> expr () -> eq ( 'share_token' , $qb -> createNamedParameter ( $token )));
2021-05-05 04:35:25 -04:00
$affected = $query -> executeStatement ();
2017-03-09 10:49:40 -05:00
if ( $affected > 0 ) {
return new Http\DataResponse ([ 'remote' => $cloudId -> getRemote (), 'owner' => $cloudId -> getUser ()]);
} else {
throw new OCSBadRequestException ( 'Share not found or token invalid' );
}
}
2014-11-24 09:31:52 -05:00
}