mirror of
https://github.com/nextcloud/spreed.git
synced 2025-12-18 05:20:50 +01:00
Until now only the e-mail shares had support for sending the password by Talk. In Nextcloud 15 that feature was added to link shares too, so the room name and the notification sent for "share:password" rooms has to be adjusted accordingly. The display name of "share:password" rooms is generated from the raw name of the room (the e-mail for mail shares and the file name for link shares) each time the room information is sent by the server, so the display name was generalized to accomodate both types of raw names. Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com> Signed-off-by: Joas Schilling <coding@schilljs.com>
123 lines
3.6 KiB
PHP
123 lines
3.6 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
*
|
|
* @copyright Copyright (c) 2018, 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\Spreed\Controller;
|
|
|
|
use OCA\Spreed\Manager;
|
|
use OCA\Spreed\Participant;
|
|
use OCP\AppFramework\Http;
|
|
use OCP\AppFramework\Http\DataResponse;
|
|
use OCP\AppFramework\OCSController;
|
|
use OCP\IRequest;
|
|
use OCP\IUser;
|
|
use OCP\IUserManager;
|
|
use OCP\Share;
|
|
use OCP\Share\IManager as ShareManager;
|
|
use OCP\Share\Exceptions\ShareNotFound;
|
|
|
|
class PublicShareAuthController extends OCSController {
|
|
|
|
/** @var IUserManager */
|
|
private $userManager;
|
|
/** @var ShareManager */
|
|
private $shareManager;
|
|
/** @var Manager */
|
|
private $manager;
|
|
|
|
/**
|
|
* @param string $appName
|
|
* @param IRequest $request
|
|
* @param IUserManager $userManager
|
|
* @param ShareManager $shareManager
|
|
* @param Manager $manager
|
|
*/
|
|
public function __construct(
|
|
string $appName,
|
|
IRequest $request,
|
|
IUserManager $userManager,
|
|
ShareManager $shareManager,
|
|
Manager $manager
|
|
) {
|
|
parent::__construct($appName, $request);
|
|
$this->userManager = $userManager;
|
|
$this->shareManager = $shareManager;
|
|
$this->manager = $manager;
|
|
}
|
|
|
|
/**
|
|
* @PublicPage
|
|
*
|
|
* Creates a new room for requesting the password of a share.
|
|
*
|
|
* The new room is a public room associated with a "share:password" object
|
|
* with the ID of the share token. Unlike normal rooms in which the owner is
|
|
* the user that created the room these are special rooms always created by
|
|
* a guest or user on behalf of a registered user, the sharer, who will be
|
|
* the owner of the room.
|
|
*
|
|
* The share must have "send password by Talk" enabled; an error is returned
|
|
* otherwise.
|
|
*
|
|
* @param string $shareToken
|
|
* @return DataResponse the status code is "201 Created" if a new room is
|
|
* created, "200 OK" if an existing room is returned, or "404 Not
|
|
* found" if the given share was invalid.
|
|
*/
|
|
public function createRoom(string $shareToken): DataResponse {
|
|
try {
|
|
$share = $this->shareManager->getShareByToken($shareToken);
|
|
} catch (ShareNotFound $e) {
|
|
return new DataResponse([], Http::STATUS_NOT_FOUND);
|
|
}
|
|
|
|
if (!$share->getSendPasswordByTalk()) {
|
|
return new DataResponse([], Http::STATUS_NOT_FOUND);
|
|
}
|
|
|
|
$sharerUser = $this->userManager->get($share->getSharedBy());
|
|
|
|
if (!$sharerUser instanceof IUser) {
|
|
return new DataResponse([], Http::STATUS_NOT_FOUND);
|
|
}
|
|
|
|
if ($share->getShareType() === Share::SHARE_TYPE_EMAIL) {
|
|
$roomName = $share->getSharedWith();
|
|
} else {
|
|
$roomName = trim($share->getTarget(), '/');
|
|
}
|
|
|
|
// Create the room
|
|
$room = $this->manager->createPublicRoom($roomName, 'share:password', $shareToken);
|
|
$room->addUsers([
|
|
'userId' => $sharerUser->getUID(),
|
|
'participantType' => Participant::OWNER,
|
|
]);
|
|
|
|
return new DataResponse([
|
|
'token' => $room->getToken(),
|
|
'name' => $room->getName(),
|
|
'displayName' => $room->getName(),
|
|
], Http::STATUS_CREATED);
|
|
}
|
|
}
|