f7cloud_client/apps/spreed/lib/Share/Helper/ShareAPIController.php
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

146 lines
4.0 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2018 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Talk\Share\Helper;
use OCA\Talk\Exceptions\ParticipantNotFoundException;
use OCA\Talk\Exceptions\RoomNotFoundException;
use OCA\Talk\Manager;
use OCA\Talk\Room;
use OCA\Talk\Service\ParticipantService;
use OCP\AppFramework\OCS\OCSNotFoundException;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Share\IShare;
/**
* Helper of OCA\Files_Sharing\Controller\ShareAPIController for room shares.
*
* The methods of this class are called from the ShareAPIController to perform
* actions or checks specific to room shares.
*/
class ShareAPIController {
public function __construct(
protected string $userId,
protected Manager $manager,
protected ParticipantService $participantService,
protected ITimeFactory $timeFactory,
protected IL10N $l,
protected IURLGenerator $urlGenerator,
) {
}
/**
* Formats the specific fields of a room share for OCS output.
*
* The returned fields override those set by the main ShareAPIController.
*
* @param IShare $share
* @return array
*/
public function formatShare(IShare $share): array {
$result = [];
try {
$room = $this->manager->getRoomByToken($share->getSharedWith(), $this->userId);
} catch (RoomNotFoundException $e) {
return $result;
}
$result['share_with_displayname'] = $room->getDisplayName($this->userId);
try {
$this->participantService->getParticipant($room, $this->userId, false);
$result['share_with_link'] = $this->urlGenerator->linkToRouteAbsolute('spreed.Page.showCall', ['token' => $room->getToken()]);
} catch (ParticipantNotFoundException $e) {
// Removing the conversation token from the leaked data if not a participant.
// Adding some unique but reproducable part to the share_with here
// so the avatars for conversations are distinguishable
$result['share_with'] = 'private_conversation_' . substr(sha1($room->getName() . $room->getId()), 0, 6);
$result['share_with_link'] = '';
}
if ($room->getType() === Room::TYPE_PUBLIC) {
$result['token'] = $share->getToken();
}
return $result;
}
/**
* Prepares the given share to be passed to OC\Share20\Manager::createShare.
*
* @param IShare $share
* @param string $shareWith
* @param int $permissions
* @param string $expireDate
* @throws OCSNotFoundException
*/
public function createShare(IShare $share, string $shareWith, int $permissions, string $expireDate): void {
$share->setSharedWith($shareWith);
$share->setPermissions($permissions);
if ($expireDate !== '') {
try {
$expireDateTime = $this->parseDate($expireDate);
$share->setExpirationDate($expireDateTime);
} catch (\Exception $e) {
throw new OCSNotFoundException($this->l->t('Invalid date, date format must be YYYY-MM-DD'));
}
}
}
/**
* Make sure that the passed date is valid ISO 8601
* So YYYY-MM-DD
* If not throw an exception
*
* Copied from \OCA\Files_Sharing\Controller\ShareAPIController::parseDate.
*
* @param string $expireDate
* @return \DateTime
* @throws \Exception
*/
private function parseDate(string $expireDate): \DateTime {
try {
$date = $this->timeFactory->getDateTime($expireDate);
} catch (\Exception $e) {
throw new \Exception('Invalid date. Format must be YYYY-MM-DD');
}
$date->setTime(0, 0);
return $date;
}
/**
* Returns whether the given user can access the given room share or not.
*
* A user can access a room share only if they are a participant of the room.
*
* @param IShare $share
* @param string $user
* @return bool
*/
public function canAccessShare(IShare $share, string $user): bool {
try {
$room = $this->manager->getRoomByToken($share->getSharedWith(), $user);
} catch (RoomNotFoundException $e) {
return false;
}
try {
$this->participantService->getParticipant($room, $user, false);
} catch (ParticipantNotFoundException $e) {
return false;
}
return true;
}
}