summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2019-09-27 15:15:46 +0200
committerJoas Schilling <coding@schilljs.com>2019-10-01 09:25:18 +0200
commit9c6415cf6ae2afad08922aa884aa5397a4025545 (patch)
tree27e33bbf6640ca06c38b1506f677aaf670331e7f /lib
parentbdb9b52cbfc2896b8e27884b6ea4f70f6665e420 (diff)
Merge the two controllers
Signed-off-by: Joas Schilling <coding@schilljs.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/Controller/FilesIntegrationController.php102
-rw-r--r--lib/Controller/PublicShareController.php148
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,
- ]);
- }
-
-}