123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-only
- */
- namespace OCA\Files_Sharing\Controller;
- use OCA\Files_Sharing\External\Manager;
- use OCA\Files_Sharing\ResponseDefinitions;
- use OCP\AppFramework\Http;
- use OCP\AppFramework\Http\Attribute\NoAdminRequired;
- use OCP\AppFramework\Http\DataResponse;
- use OCP\AppFramework\OCS\OCSForbiddenException;
- use OCP\AppFramework\OCS\OCSNotFoundException;
- use OCP\AppFramework\OCSController;
- use OCP\IRequest;
- use Psr\Log\LoggerInterface;
- /**
- * @psalm-import-type Files_SharingRemoteShare from ResponseDefinitions
- */
- class RemoteController extends OCSController {
- /**
- * Remote constructor.
- *
- * @param string $appName
- * @param IRequest $request
- * @param Manager $externalManager
- */
- public function __construct(
- $appName,
- IRequest $request,
- private Manager $externalManager,
- private LoggerInterface $logger,
- ) {
- parent::__construct($appName, $request);
- }
- /**
- * Get list of pending remote shares
- *
- * @return DataResponse<Http::STATUS_OK, Files_SharingRemoteShare[], array{}>
- *
- * 200: Pending remote shares returned
- */
- #[NoAdminRequired]
- public function getOpenShares() {
- return new DataResponse($this->externalManager->getOpenShares());
- }
- /**
- * Accept a remote share
- *
- * @param int $id ID of the share
- * @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
- * @throws OCSNotFoundException Share not found
- *
- * 200: Share accepted successfully
- */
- #[NoAdminRequired]
- public function acceptShare($id) {
- if ($this->externalManager->acceptShare($id)) {
- return new DataResponse();
- }
- $this->logger->error('Could not accept federated share with id: ' . $id,
- ['app' => 'files_sharing']);
- throw new OCSNotFoundException('wrong share ID, share does not exist.');
- }
- /**
- * Decline a remote share
- *
- * @param int $id ID of the share
- * @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
- * @throws OCSNotFoundException Share not found
- *
- * 200: Share declined successfully
- */
- #[NoAdminRequired]
- public function declineShare($id) {
- if ($this->externalManager->declineShare($id)) {
- return new DataResponse();
- }
- // Make sure the user has no notification for something that does not exist anymore.
- $this->externalManager->processNotification($id);
- throw new OCSNotFoundException('wrong share ID, share does not exist.');
- }
- /**
- * @param array $share Share with info from the share_external table
- * @return array enriched share info with data from the filecache
- */
- private static function extendShareInfo($share) {
- $view = new \OC\Files\View('/' . \OC_User::getUser() . '/files/');
- $info = $view->getFileInfo($share['mountpoint']);
- if ($info === false) {
- return $share;
- }
- $share['mimetype'] = $info->getMimetype();
- $share['mtime'] = $info->getMTime();
- $share['permissions'] = $info->getPermissions();
- $share['type'] = $info->getType();
- $share['file_id'] = $info->getId();
- return $share;
- }
- /**
- * Get a list of accepted remote shares
- *
- * @return DataResponse<Http::STATUS_OK, Files_SharingRemoteShare[], array{}>
- *
- * 200: Accepted remote shares returned
- */
- #[NoAdminRequired]
- public function getShares() {
- $shares = $this->externalManager->getAcceptedShares();
- $shares = array_map('self::extendShareInfo', $shares);
- return new DataResponse($shares);
- }
- /**
- * Get info of a remote share
- *
- * @param int $id ID of the share
- * @return DataResponse<Http::STATUS_OK, Files_SharingRemoteShare, array{}>
- * @throws OCSNotFoundException Share not found
- *
- * 200: Share returned
- */
- #[NoAdminRequired]
- public function getShare($id) {
- $shareInfo = $this->externalManager->getShare($id);
- if ($shareInfo === false) {
- throw new OCSNotFoundException('share does not exist');
- } else {
- $shareInfo = self::extendShareInfo($shareInfo);
- return new DataResponse($shareInfo);
- }
- }
- /**
- * Unshare a remote share
- *
- * @param int $id ID of the share
- * @return DataResponse<Http::STATUS_OK, array<empty>, array{}>
- * @throws OCSNotFoundException Share not found
- * @throws OCSForbiddenException Unsharing is not possible
- *
- * 200: Share unshared successfully
- */
- #[NoAdminRequired]
- public function unshare($id) {
- $shareInfo = $this->externalManager->getShare($id);
- if ($shareInfo === false) {
- throw new OCSNotFoundException('Share does not exist');
- }
- $mountPoint = '/' . \OC_User::getUser() . '/files' . $shareInfo['mountpoint'];
- if ($this->externalManager->removeShare($mountPoint) === true) {
- return new DataResponse();
- } else {
- throw new OCSForbiddenException('Could not unshare');
- }
- }
- }
|