diff options
author | Joas Schilling <coding@schilljs.com> | 2019-09-27 15:15:46 +0200 |
---|---|---|
committer | Joas Schilling <coding@schilljs.com> | 2019-10-01 09:25:18 +0200 |
commit | 9c6415cf6ae2afad08922aa884aa5397a4025545 (patch) | |
tree | 27e33bbf6640ca06c38b1506f677aaf670331e7f /lib | |
parent | bdb9b52cbfc2896b8e27884b6ea4f70f6665e420 (diff) |
Merge the two controllers
Signed-off-by: Joas Schilling <coding@schilljs.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Controller/FilesIntegrationController.php | 102 | ||||
-rw-r--r-- | lib/Controller/PublicShareController.php | 148 |
2 files changed, 100 insertions, 150 deletions
diff --git a/lib/Controller/FilesIntegrationController.php b/lib/Controller/FilesIntegrationController.php index cd5d60b73..9444cd349 100644 --- a/lib/Controller/FilesIntegrationController.php +++ b/lib/Controller/FilesIntegrationController.php @@ -26,6 +26,8 @@ namespace OCA\Talk\Controller; use OCA\Talk\Exceptions\RoomNotFoundException; use OCA\Talk\Files\Util; use OCA\Talk\Manager; +use OCA\Talk\TalkSession; +use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\AppFramework\OCSController; @@ -33,6 +35,11 @@ use OCP\Files\FileInfo; use OCP\Files\NotFoundException; use OCP\IL10N; use OCP\IRequest; +use OCP\ISession; +use OCP\IUser; +use OCP\IUserSession; +use OCP\Share\Exceptions\ShareNotFound; +use OCP\Share\IManager as IShareManager; use OCP\Share\IShare; class FilesIntegrationController extends OCSController { @@ -41,6 +48,14 @@ class FilesIntegrationController extends OCSController { private $currentUser; /** @var Manager */ private $manager; + /** @var IShareManager */ + private $shareManager; + /** @var ISession */ + private $session; + /** @var IUserSession */ + private $userSession; + /** @var TalkSession */ + private $talkSession; /** @var Util */ private $util; /** @var IL10N */ @@ -51,12 +66,20 @@ class FilesIntegrationController extends OCSController { IRequest $request, string $userId, Manager $manager, + IShareManager $shareManager, + ISession $session, + IUserSession $userSession, + TalkSession $talkSession, Util $util, IL10N $l10n ) { parent::__construct($appName, $request); $this->currentUser = $userId; $this->manager = $manager; + $this->shareManager = $shareManager; + $this->session = $session; + $this->userSession = $userSession; + $this->talkSession = $talkSession; $this->util = $util; $this->l = $l10n; } @@ -66,7 +89,7 @@ class FilesIntegrationController extends OCSController { * * Returns the token of the room associated to the given file id. * - * This is the counterpart of PublicShareController::getRoom() for file ids + * This is the counterpart of self::getRoomByShareToken() for file ids * instead of share tokens, although both return the same room token if the * given file id and share token refer to the same file. * @@ -91,7 +114,7 @@ class FilesIntegrationController extends OCSController { * or "404 Not found" if the given file id was invalid. * @throws OCSNotFoundException */ - public function getRoom(string $fileId): DataResponse { + public function getRoomByFileId(string $fileId): DataResponse { $share = $this->util->getAnyPublicShareOfFileOwnedByUserOrAnyDirectShareOfFileAccessibleByUser($fileId, $this->currentUser); $groupFolder = null; if (!$share) { @@ -122,6 +145,81 @@ class FilesIntegrationController extends OCSController { } /** + * @PublicPage + * @UseSession + * + * Returns the token of the room associated to the file id of the given + * share token. + * + * This is the counterpart of self::getRoomByFileId() for share tokens + * instead of file ids, although both return the same room token if the + * given file id and share token refer to the same file. + * + * If there is no room associated to the file id of the given share token a + * new room is created; the new room is a public room associated with a + * "file" object with the file id of the given share token. Unlike normal + * rooms in which the owner is the user that created the room these are + * special rooms without owner (although self joined users with direct + * access to the file become persistent participants automatically when they + * join until they explicitly leave or no longer have access to the file). + * + * In any case, to create or even get the token of the room, the file must + * be publicly shared (like a link share, for example); an error is returned + * otherwise. + * + * Besides the token of the room this also returns the current user ID and + * display name, if any; this is needed by the Talk sidebar to know the + * actual current user, as the public share page uses the incognito mode and + * thus logged in users as seen as guests. + * + * @param string $shareToken + * @return DataResponse the status code is "200 OK" if a room is returned, + * or "404 Not found" if the given share token was invalid. + */ + public function getRoomByShareToken(string $shareToken): DataResponse { + try { + $share = $this->shareManager->getShareByToken($shareToken); + if ($share->getPassword() !== null) { + $shareId = $this->session->get('public_link_authenticated'); + if ($share->getId() !== $shareId) { + throw new ShareNotFound(); + } + } + } catch (ShareNotFound $e) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } + + try { + if ($share->getNodeType() !== FileInfo::TYPE_FILE) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } + + $fileId = (string)$share->getNodeId(); + + try { + $room = $this->manager->getRoomByObject('file', $fileId); + } catch (RoomNotFoundException $e) { + $name = $share->getNode()->getName(); + $room = $this->manager->createPublicRoom($name, 'file', $fileId); + } + } catch (NotFoundException $e) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } + + $this->talkSession->setFileShareTokenForRoom($room->getToken(), $shareToken); + + $currentUser = $this->userSession->getUser(); + $currentUserId = $currentUser instanceof IUser ? $currentUser->getUID() : ''; + $currentUserDisplayName = $currentUser instanceof IUser ? $currentUser->getDisplayName() : ''; + + return new DataResponse([ + 'token' => $room->getToken(), + 'userId' => $currentUserId, + 'userDisplayName' => $currentUserDisplayName, + ]); + } + + /** * Returns the name of the file in the share. * * If the given share itself is a file its name is returned; otherwise the diff --git a/lib/Controller/PublicShareController.php b/lib/Controller/PublicShareController.php deleted file mode 100644 index a555ae86d..000000000 --- a/lib/Controller/PublicShareController.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php -declare(strict_types=1); - -/** - * - * @copyright Copyright (c) 2019, Daniel Calviño Sánchez (danxuliu@gmail.com) - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * 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 - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -namespace OCA\Talk\Controller; - -use OCA\Talk\Exceptions\RoomNotFoundException; -use OCA\Talk\Manager; -use OCA\Talk\TalkSession; -use OCP\AppFramework\Http; -use OCP\AppFramework\Http\DataResponse; -use OCP\AppFramework\OCSController; -use OCP\Files\FileInfo; -use OCP\Files\NotFoundException; -use OCP\IRequest; -use OCP\IUser; -use OCP\IUserManager; -use OCP\ISession; -use OCP\Share\Exceptions\ShareNotFound; -use OCP\Share\IManager as ShareManager; -use OCP\Share\IShare; - -class PublicShareController extends OCSController { - - /** @var string|null */ - private $userId; - /** @var IUserManager */ - private $userManager; - /** @var ShareManager */ - private $shareManager; - /** @var ISession */ - private $session; - /** @var TalkSession */ - private $talkSession; - /** @var Manager */ - private $manager; - - public function __construct( - $appName, - ?string $UserId, - IRequest $request, - IUserManager $userManager, - ShareManager $shareManager, - ISession $session, - TalkSession $talkSession, - Manager $manager - ) { - parent::__construct($appName, $request); - $this->userId = $UserId; - $this->userManager = $userManager; - $this->shareManager = $shareManager; - $this->session = $session; - $this->talkSession = $talkSession; - $this->manager = $manager; - } - - /** - * @PublicPage - * @UseSession - * - * Returns the token of the room associated to the file id of the given - * share token. - * - * This is the counterpart of FilesController::getRoom() for share tokens - * instead of file ids, although both return the same room token if the - * given file id and share token refer to the same file. - * - * If there is no room associated to the file id of the given share token a - * new room is created; the new room is a public room associated with a - * "file" object with the file id of the given share token. Unlike normal - * rooms in which the owner is the user that created the room these are - * special rooms without owner (although self joined users with direct - * access to the file become persistent participants automatically when they - * join until they explicitly leave or no longer have access to the file). - * - * In any case, to create or even get the token of the room, the file must - * be publicly shared (like a link share, for example); an error is returned - * otherwise. - * - * Besides the token of the room this also returns the current user ID and - * display name, if any; this is needed by the Talk sidebar to know the - * actual current user, as the public share page uses the incognito mode and - * thus logged in users as seen as guests. - * - * @param string $shareToken - * @return DataResponse the status code is "200 OK" if a room is returned, - * or "404 Not found" if the given share token was invalid. - */ - public function getRoom(string $shareToken) { - try { - $share = $this->shareManager->getShareByToken($shareToken); - if ($share->getPassword() !== null) { - $shareId = $this->session->get('public_link_authenticated'); - if ($share->getId() !== $shareId) { - throw new ShareNotFound(); - } - } - } catch (ShareNotFound $e) { - return new DataResponse([], Http::STATUS_NOT_FOUND); - } - - if ($share->getNodeType() !== FileInfo::TYPE_FILE) { - return new DataResponse([], Http::STATUS_NOT_FOUND); - } - - $fileId = (string)$share->getNodeId(); - - try { - $room = $this->manager->getRoomByObject('file', $fileId); - } catch (RoomNotFoundException $e) { - $name = $share->getNode()->getName(); - $room = $this->manager->createPublicRoom($name, 'file', $fileId); - } - - $this->talkSession->setFileShareTokenForRoom($room->getToken(), $shareToken); - - $currentUser = $this->userManager->get($this->userId); - $currentUserId = $currentUser instanceof IUser ? $currentUser->getUID() : ''; - $currentUserDisplayName = $currentUser instanceof IUser ? $currentUser->getDisplayName() : ''; - - return new DataResponse([ - 'token' => $room->getToken(), - 'userId' => $currentUserId, - 'userDisplayName' => $currentUserDisplayName, - ]); - } - -} |