From a31d9b2fd61cbe1277d88c27f3525903bb9515df Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Thu, 5 Feb 2026 16:21:15 +0100 Subject: [PATCH] perf: Use getFirstNodeById instead of getById And a bunch of other cleanups Signed-off-by: Carl Schwan --- lib/Controller/DocumentController.php | 159 ++++++++------------------ lib/Controller/OCSController.php | 82 +++---------- lib/Controller/WopiController.php | 50 ++++---- lib/Helper.php | 11 +- lib/TemplateManager.php | 17 ++- lib/TokenManager.php | 108 ++++------------- 6 files changed, 125 insertions(+), 302 deletions(-) diff --git a/lib/Controller/DocumentController.php b/lib/Controller/DocumentController.php index 3f4a8086..e6d5e8f7 100644 --- a/lib/Controller/DocumentController.php +++ b/lib/Controller/DocumentController.php @@ -15,6 +15,9 @@ use OCA\Officeonline\TokenManager; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\Attribute\PublicPage; use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\TemplateResponse; @@ -35,81 +38,28 @@ use Psr\Log\LoggerInterface; class DocumentController extends Controller { - /** @var string */ - private $uid; - /** @var IL10N */ - private $l10n; - /** @var IConfig */ - private $settings; - /** @var AppConfig */ - private $appConfig; - /** @var LoggerInterface */ - private $logger; - /** @var IManager */ - private $shareManager; - /** @var TokenManager */ - private $tokenManager; - /** @var ISession */ - private $session; - /** @var IRootFolder */ - private $rootFolder; - /** @var \OCA\Officeonline\TemplateManager */ - private $templateManager; - /** @var FederationService */ - private $federationService; - /** @var Helper */ - private $helper; - public const ODT_TEMPLATE_PATH = '/assets/odttemplate.odt'; - /** - * @param string $appName - * @param IRequest $request - * @param IConfig $settings - * @param AppConfig $appConfig - * @param IL10N $l10n - * @param IManager $shareManager - * @param TokenManager $tokenManager - * @param IRootFolder $rootFolder - * @param ISession $session - * @param string $UserId - * @param LoggerInterface $logger - */ public function __construct( - $appName, + string $appName, IRequest $request, - IConfig $settings, - AppConfig $appConfig, - IL10N $l10n, - IManager $shareManager, - TokenManager $tokenManager, - IRootFolder $rootFolder, - ISession $session, - $UserId, - LoggerInterface $logger, - \OCA\Officeonline\TemplateManager $templateManager, - FederationService $federationService, - Helper $helper, + private IConfig $settings, + private AppConfig $appConfig, + private IL10N $l10n, + private IManager $shareManager, + private TokenManager $tokenManager, + private IRootFolder $rootFolder, + private ISession $session, + private ?string $userId, + private LoggerInterface $logger, + private \OCA\Officeonline\TemplateManager $templateManager, + private FederationService $federationService, + private Helper $helper, ) { parent::__construct($appName, $request); - $this->uid = $UserId; - $this->l10n = $l10n; - $this->settings = $settings; - $this->appConfig = $appConfig; - $this->shareManager = $shareManager; - $this->tokenManager = $tokenManager; - $this->rootFolder = $rootFolder; - $this->session = $session; - $this->logger = $logger; - $this->templateManager = $templateManager; - $this->federationService = $federationService; - $this->helper = $helper; } /** - * @PublicPage - * @NoCSRFRequired - * * Returns the access_token and urlsrc for WOPI access for given $fileId * Requests is accepted only when a secret_token is provided set by admin in * settings page @@ -117,6 +67,8 @@ public function __construct( * @param string $fileId * @return array access_token, urlsrc */ + #[PublicPage] + #[NoCSRFRequired] public function extAppGetData($fileId) { $secretToken = $this->request->getParam('secret_token'); $apps = array_filter(explode(',', $this->appConfig->getAppValue('external_apps'))); @@ -129,8 +81,8 @@ public function extAppGetData($fileId) { 'fileId' => $fileId ]); try { - $folder = $this->rootFolder->getUserFolder($this->uid); - $item = $folder->getById($fileId)[0]; + $folder = $this->rootFolder->getUserFolder($this->userId); + $item = $folder->getFirstNodeById($fileId); if (!($item instanceof Node)) { throw new \Exception(); } @@ -168,14 +120,13 @@ private function domainOnly($url) { /** * Redirect to the files app with proper CSP headers set for federated editing * This is a workaround since we cannot set a nonce for allowing dynamic URLs in the richdocument iframe - * - * @NoAdminRequired - * @NoCSRFRequired */ - public function open($fileId) { + #[NoAdminRequired] + #[NoCSRFRequired] + public function open(int $fileId) { try { - $folder = $this->rootFolder->getUserFolder($this->uid); - $item = $folder->getById($fileId)[0]; + $folder = $this->rootFolder->getUserFolder($this->userId); + $item = $folder->getFirstNodeById($fileId); if (!($item instanceof File)) { throw new \Exception('Node is not a file'); } @@ -205,21 +156,15 @@ public function open($fileId) { return new TemplateResponse('core', '403', [], 'guest'); } - /** - * @NoAdminRequired - * - * @param string $fileId - * @param string|null $path - * @return RedirectResponse|TemplateResponse - */ - public function index($fileId, $path = null) { + #[NoAdminRequired] + public function index(int $fileId, ?string $path = null): RedirectResponse|TemplateResponse { try { - $folder = $this->rootFolder->getUserFolder($this->uid); + $folder = $this->rootFolder->getUserFolder($this->userId); if ($path !== null) { $item = $folder->get($path); } else { - $item = $folder->getById($fileId)[0]; + $item = $folder->getFirstNodeById($fileId); } if (!($item instanceof File)) { @@ -248,7 +193,7 @@ public function index($fileId, $path = null) { 'path' => $folder->getRelativePath($item->getPath()), 'instanceId' => $this->settings->getSystemValue('instanceid'), 'canonical_webroot' => $this->appConfig->getAppValue('canonical_webroot'), - 'userId' => $this->uid + 'userId' => $this->userId ]; $encryptionManager = \OC::$server->getEncryptionManager(); @@ -275,8 +220,6 @@ public function index($fileId, $path = null) { } /** - * @NoAdminRequired - * * Create a new file from a template * * @param int $templateId @@ -287,12 +230,13 @@ public function index($fileId, $path = null) { * @throws NotPermittedException * @throws \OCP\Files\InvalidPathException */ + #[NoAdminRequired] public function createFromTemplate($templateId, $fileName, $dir) { if (!$this->templateManager->isTemplate($templateId)) { return new TemplateResponse('core', '403', [], 'guest'); } - $userFolder = $this->rootFolder->getUserFolder($this->uid); + $userFolder = $this->rootFolder->getUserFolder($this->userId); try { $folder = $userFolder->get($dir); } catch (NotFoundException $e) { @@ -306,7 +250,7 @@ public function createFromTemplate($templateId, $fileName, $dir) { $file = $folder->newFile($fileName); $template = $this->templateManager->get($templateId); - [$urlSrc, $wopi] = $this->tokenManager->getTokenForTemplate($template, $this->uid, $file->getId()); + [$urlSrc, $wopi] = $this->tokenManager->getTokenForTemplate($template, $this->userId, $file->getId()); $wopiFileId = $template->getId() . '-' . $file->getId() . '_' . $this->settings->getSystemValue('instanceid'); $wopiFileId = $wopi->getFileid() . '_' . $this->settings->getSystemValue('instanceid'); @@ -320,22 +264,18 @@ public function createFromTemplate($templateId, $fileName, $dir) { 'path' => $userFolder->getRelativePath($file->getPath()), 'instanceId' => $this->settings->getSystemValue('instanceid'), 'canonical_webroot' => $this->appConfig->getAppValue('canonical_webroot'), - 'userId' => $this->uid + 'userId' => $this->userId ]; return new TemplateResponse('officeonline', 'documents', $params, 'base'); } /** - * @PublicPage - * @NoCSRFRequired - * - * @param string $shareToken - * @param string $fileName - * @return TemplateResponse * @throws \Exception */ - public function publicPage($shareToken, $fileName, $fileId) { + #[PublicPage] + #[NoCSRFRequired] + public function publicPage(string $shareToken, string $fileName, int $fileId): TemplateResponse { try { $share = $this->shareManager->getShareByToken($shareToken); // not authenticated ? @@ -349,7 +289,7 @@ public function publicPage($shareToken, $fileName, $fileId) { $node = $share->getNode(); if ($node instanceof Folder) { - $item = $node->getById($fileId)[0]; + $item = $node->getFirstNodeById($fileId); } else { $item = $node; } @@ -361,11 +301,11 @@ public function publicPage($shareToken, $fileName, $fileId) { 'path' => '/', 'instanceId' => $this->settings->getSystemValue('instanceid'), 'canonical_webroot' => $this->appConfig->getAppValue('canonical_webroot'), - 'userId' => $this->uid, + 'userId' => $this->userId, ]; - if ($this->uid !== null || ($share->getPermissions() & \OCP\Constants::PERMISSION_UPDATE) === 0 || $this->helper->getGuestName() !== null) { - [$urlSrc, $token] = $this->tokenManager->getToken($item->getId(), $shareToken, $this->uid); + if ($this->userId !== null || ($share->getPermissions() & \OCP\Constants::PERMISSION_UPDATE) === 0 || $this->helper->getGuestName() !== null) { + [$urlSrc, $token] = $this->tokenManager->getToken($item->getId(), $shareToken, $this->userId); $params['token'] = $token; $params['urlsrc'] = $urlSrc; } @@ -380,16 +320,15 @@ public function publicPage($shareToken, $fileName, $fileId) { } /** - * @PublicPage - * @NoCSRFRequired - * * @param string $shareToken * @param $remoteServer * @param $remoteServerToken * @param null $filePath * @return TemplateResponse */ - public function remote($shareToken, $remoteServer, $remoteServerToken, $filePath = null) { + #[PublicPage] + #[NoCSRFRequired] + public function remote(string $shareToken, $remoteServer, $remoteServerToken, $filePath = null) { try { $share = $this->shareManager->getShareByToken($shareToken); // not authenticated ? @@ -407,7 +346,7 @@ public function remote($shareToken, $remoteServer, $remoteServerToken, $filePath } if ($node instanceof Node) { - [$urlSrc, $token, $wopi] = $this->tokenManager->getToken($node->getId(), $shareToken, $this->uid); + [$urlSrc, $token, $wopi] = $this->tokenManager->getToken($node->getId(), $shareToken, $this->userId); $remoteWopi = $this->federationService->getRemoteFileDetails($remoteServer, $remoteServerToken); $this->tokenManager->updateToRemoteToken($wopi, $shareToken, $remoteServer, $remoteServerToken, $remoteWopi); @@ -444,8 +383,6 @@ public function remote($shareToken, $remoteServer, $remoteServerToken, $filePath } /** - * @NoAdminRequired - * * @param string $mimetype * @param string $filename * @param string $dir @@ -453,10 +390,11 @@ public function remote($shareToken, $remoteServer, $remoteServerToken, $filePath * @throws NotPermittedException * @throws GenericFileException */ + #[NoAdminRequired] public function create($mimetype, $filename, $dir = '/') { - $root = $this->rootFolder->getUserFolder($this->uid); + $root = $this->rootFolder->getUserFolder($this->userId); try { /** @var Folder $folder */ $folder = $root->get($dir); @@ -518,6 +456,7 @@ public function create($mimetype, } $content = ''; + if (class_exists(TemplateManager::class)) { $manager = \OC_Helper::getFileTemplateManager(); $content = $manager->getTemplate($mimetype); @@ -531,7 +470,7 @@ public function create($mimetype, ]); } - private function renderErrorPage($message) { + private function renderErrorPage(string $message): TemplateResponse { $params = [ 'errors' => [['error' => $message]] ]; diff --git a/lib/Controller/OCSController.php b/lib/Controller/OCSController.php index 1c70a521..5a5d91de 100644 --- a/lib/Controller/OCSController.php +++ b/lib/Controller/OCSController.php @@ -7,8 +7,8 @@ namespace OCA\Officeonline\Controller; use OCA\Officeonline\Db\DirectMapper; -use OCA\Officeonline\Service\FederationService; use OCA\Officeonline\TemplateManager; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCS\OCSBadRequestException; use OCP\AppFramework\OCS\OCSNotFoundException; @@ -19,74 +19,33 @@ use OCP\IURLGenerator; class OCSController extends \OCP\AppFramework\OCSController { - - /** @var IRootFolder */ - private $rootFolder; - - /** @var string */ - private $userId; - - /** @var DirectMapper */ - private $directMapper; - - /** @var IURLGenerator */ - private $urlGenerator; - - /** @var TemplateManager */ - private $manager; - - /** @var FederationService */ - private $federationService; - - /** - * OCS controller - * - * @param string $appName - * @param IRequest $request - * @param IRootFolder $rootFolder - * @param string $userId - * @param DirectMapper $directMapper - * @param IURLGenerator $urlGenerator - * @param TemplateManager $manager - */ - public function __construct(string $appName, + public function __construct( + string $appName, IRequest $request, - IRootFolder $rootFolder, - $userId, - DirectMapper $directMapper, - IURLGenerator $urlGenerator, - TemplateManager $manager, - FederationService $federationService, + private IRootFolder $rootFolder, + private string $userId, + private DirectMapper $directMapper, + private IURLGenerator $urlGenerator, + private TemplateManager $manager, ) { parent::__construct($appName, $request); - - $this->rootFolder = $rootFolder; - $this->userId = $userId; - $this->directMapper = $directMapper; - $this->urlGenerator = $urlGenerator; - $this->manager = $manager; - $this->federationService = $federationService; } /** - * @NoAdminRequired - * * Init an editing session * - * @param int $fileId - * @return DataResponse * @throws OCSNotFoundException|OCSBadRequestException */ - public function create($fileId) { + #[NoAdminRequired] + public function create(int $fileId): DataResponse { try { $userFolder = $this->rootFolder->getUserFolder($this->userId); - $nodes = $userFolder->getById($fileId); + $node = $userFolder->getFirstNodeById($fileId); - if ($nodes === []) { + if ($node === null) { throw new OCSNotFoundException(); } - $node = $nodes[0]; if ($node instanceof Folder) { throw new OCSBadRequestException('Cannot view folder'); } @@ -104,13 +63,11 @@ public function create($fileId) { } /** - * @NoAdminRequired - * * @param string $type The template type - * @return DataResponse * @throws OCSBadRequestException */ - public function getTemplates($type) { + #[NoAdminRequired] + public function getTemplates(string $type): DataResponse { if (array_key_exists($type, TemplateManager::$tplTypes)) { $templates = $this->manager->getAllFormatted($type); return new DataResponse($templates); @@ -119,12 +76,11 @@ public function getTemplates($type) { } /** - * @NoAdminRequired - * - * @param string $path Where to create the document - * @param int $template The template id + * @param ?string $path Where to create the document + * @param ?int $template The template id */ - public function createFromTemplate($path, $template) { + #[NoAdminRequired] + public function createFromTemplate(?string $path, ?int $template): DataResponse { if ($path === null || $template === null) { throw new OCSBadRequestException('path and template must be set'); } @@ -153,7 +109,7 @@ public function createFromTemplate($path, $template) { } } - private function mb_pathinfo($filepath) { + private function mb_pathinfo(string $filepath): array { $result = []; preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', ltrim('/' . $filepath), $matches); if ($matches[1]) { diff --git a/lib/Controller/WopiController.php b/lib/Controller/WopiController.php index 0910f14e..ab38c5eb 100755 --- a/lib/Controller/WopiController.php +++ b/lib/Controller/WopiController.php @@ -24,6 +24,9 @@ use OCP\AppFramework\Controller; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\Attribute\PublicPage; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Http\StreamResponse; @@ -152,17 +155,13 @@ public function __construct( /** * Returns general info about a file. * - * @NoAdminRequired - * @NoCSRFRequired - * @PublicPage - * - * @param string $fileId - * @param string $access_token - * @return JSONResponse * @throws InvalidPathException * @throws NotFoundException */ - public function checkFileInfo($fileId, $access_token) { + #[PublicPage] + #[NoCSRFRequired] + #[NoAdminRequired] + public function checkFileInfo(string $fileId, string $access_token): JSONResponse { try { [$fileId, , $version] = Helper::parseFileId($fileId); @@ -218,7 +217,7 @@ public function checkFileInfo($fileId, $access_token) { if ($wopi->isTemplateToken()) { $userFolder = $this->rootFolder->getUserFolder($wopi->getOwnerUid()); - $file = $userFolder->getById($wopi->getTemplateDestination())[0]; + $file = $userFolder->getFirstNodeById($wopi->getTemplateDestination()); $response['TemplateSaveAs'] = $file->getName(); } @@ -263,9 +262,6 @@ private function setFederationFileInfo($wopi, $response) { * Given an access token and a fileId, returns the contents of the file. * Expects a valid token in access_token parameter. * - * @PublicPage - * @NoCSRFRequired - * * @param string $fileId * @param string $access_token * @return Http\Response @@ -273,6 +269,8 @@ private function setFederationFileInfo($wopi, $response) { * @throws NotFoundException * @throws NotPermittedException */ + #[PublicPage] + #[NoCSRFRequired] public function getFile($fileId, $access_token) { [$fileId, , $version] = Helper::parseFileId($fileId); @@ -515,13 +513,12 @@ private function getLock(Wopi $wopi): JSONResponse { * Given an access token and a fileId, replaces the files with the request body. * Expects a valid token in access_token parameter. * - * @PublicPage - * @NoCSRFRequired - * * @param string $fileId * @param string $access_token * @return JSONResponse */ + #[PublicPage] + #[NoCSRFRequired] public function putFile($fileId, $access_token) { [$fileId, ,] = Helper::parseFileId($fileId); @@ -638,13 +635,12 @@ public function putFile($fileId, * * FIXME Cleanup this code as is a lot of shared logic between putFile and putRelativeFile * - * @PublicPage - * @NoCSRFRequired - * * @param string $fileId * @param string $access_token * @return JSONResponse|DataResponse */ + #[PublicPage] + #[NoCSRFRequired] public function postFile($fileId, $access_token) { [$fileId, ,] = Helper::parseFileId($fileId); $wopi = $this->wopiMapper->getWopiForToken($access_token); @@ -712,7 +708,7 @@ public function postFile($fileId, $access_token) { if ($wopi->isTemplateToken()) { $this->templateManager->setUserId($wopi->getOwnerUid()); - $file = $userFolder->getById($wopi->getTemplateDestination())[0]; + $file = $userFolder->getFirstNodeById($wopi->getTemplateDestination()); } else { $file = $this->getFileForWopiToken($wopi); if (empty($file)) { @@ -870,12 +866,11 @@ private function getFileForWopiToken(Wopi $wopi) { $share = $this->shareManager->getShareByToken($wopi->getEditorUid()); $node = $share->getNode(); if ($node instanceof Folder) { - $file = $node->getById($wopi->getFileid())[0]; + $file = $node->getFirstNodeById($wopi->getFileid()); } else { $file = $node; } - } catch (ShareNotFound $e) { - } catch (NotFoundException $e) { + } catch (ShareNotFound|NotFoundException) { } } else { // Group folders requires an active user to be set in order to apply the proper acl permissions as for anonymous requests it requires share permissions for read access @@ -884,10 +879,8 @@ private function getFileForWopiToken(Wopi $wopi) { // Unless the editor is empty (public link) we modify the files as the current editor // TODO: add related share token to the wopi table so we can obtain the $userFolder = $this->rootFolder->getUserFolder($wopi->getUserForFileAccess()); - $files = $userFolder->getById($wopi->getFileid()); - if (isset($files[0]) && $files[0] instanceof File) { - $file = $files[0]; - } else { + $file = $userFolder->getFirstNodeById($wopi->getFileid()); + if (!$file instanceof File) { throw new NotFoundException('No valid file found for wopi token'); } } @@ -897,13 +890,12 @@ private function getFileForWopiToken(Wopi $wopi) { /** * Endpoint to return the template file that is requested by collabora to create a new document * - * @PublicPage - * @NoCSRFRequired - * * @param $fileId * @param $access_token * @return JSONResponse|StreamResponse */ + #[PublicPage] + #[NoCSRFRequired] public function getTemplate($fileId, $access_token) { $wopi = $this->wopiMapper->getWopiForToken($access_token); diff --git a/lib/Helper.php b/lib/Helper.php index 5343bbcd..de833870 100755 --- a/lib/Helper.php +++ b/lib/Helper.php @@ -14,19 +14,16 @@ class Helper { - /** @var string|null */ - private $userId; - - public function __construct($userId) { - $this->userId = $userId; + public function __construct( + private ?string $userId, + ) { } /** - * @param string $fileId * @return array * @throws \Exception */ - public static function parseFileId($fileId) { + public static function parseFileId(string $fileId): array { $arr = explode('_', $fileId); $templateId = null; if (count($arr) === 1) { diff --git a/lib/TemplateManager.php b/lib/TemplateManager.php index aaac4637..04c0bf38 100644 --- a/lib/TemplateManager.php +++ b/lib/TemplateManager.php @@ -142,17 +142,14 @@ public function setUserId($userId) { } /** - * Get template ISimpleFile|Node - * - * @param int $fileId - * @return File + * Get template file */ - public function get($fileId) { + public function get(int $fileId): File { // is this a global template ? $files = $this->getEmptyTemplateDir()->getDirectoryListing(); foreach ($files as $file) { - if ($file->getId() === $fileId) { + if ($file->getId() === $fileId && $file instanceof File) { return $file; } } @@ -161,16 +158,16 @@ public function get($fileId) { $files = $this->getSystemTemplateDir()->getDirectoryListing(); foreach ($files as $file) { - if ($file->getId() === $fileId) { + if ($file->getId() === $fileId && $file instanceof File) { return $file; } } $templateDir = $this->getUserTemplateDir(); // finally get the template file - $files = $templateDir->getById($fileId); - if ($files !== []) { - return $files[0]; + $file = $templateDir->getFirstNodeById($fileId); + if ($file instanceof File) { + return $file; } throw new NotFoundException(); diff --git a/lib/TokenManager.php b/lib/TokenManager.php index db0d7568..029d9b90 100755 --- a/lib/TokenManager.php +++ b/lib/TokenManager.php @@ -20,79 +20,30 @@ use OCP\IUserManager; use OCP\Share\IManager; use OCP\Util; +use Psr\Log\LoggerInterface; class TokenManager { - /** @var IRootFolder */ - private $rootFolder; - /** @var IManager */ - private $shareManager; - /** @var IURLGenerator */ - private $urlGenerator; - /** @var Parser */ - private $wopiParser; - /** @var AppConfig */ - private $appConfig; - /** @var string */ - private $userId; - /** @var WopiMapper */ - private $wopiMapper; - /** @var IL10N */ - private $trans; - /** @var IUserManager */ - private $userManager; - /** @var IGroupManager */ - private $groupManager; - /** @var CapabilitiesService */ - private $capabilitiesService; - /** @var Helper */ - private $helper; - - /** - * @param IRootFolder $rootFolder - * @param IManager $shareManager - * @param IURLGenerator $urlGenerator - * @param Parser $wopiParser - * @param AppConfig $appConfig - * @param string $UserId - * @param WopiMapper $wopiMapper - * @param IL10N $trans - */ public function __construct( - IRootFolder $rootFolder, - IManager $shareManager, - IURLGenerator $urlGenerator, - Parser $wopiParser, - CapabilitiesService $capabilitiesService, - AppConfig $appConfig, - $UserId, - WopiMapper $wopiMapper, - IL10N $trans, - IUserManager $userManager, - IGroupManager $groupManager, - Helper $helper, + private IRootFolder $rootFolder, + private IManager $shareManager, + private IURLGenerator $urlGenerator, + private Parser $wopiParser, + private CapabilitiesService $capabilitiesService, + private AppConfig $appConfig, + private ?string $userId, + private WopiMapper $wopiMapper, + private IL10N $trans, + private IUserManager $userManager, + private IGroupManager $groupManager, + private Helper $helper, + private LoggerInterface $logger, ) { - $this->rootFolder = $rootFolder; - $this->shareManager = $shareManager; - $this->urlGenerator = $urlGenerator; - $this->wopiParser = $wopiParser; - $this->capabilitiesService = $capabilitiesService; - $this->appConfig = $appConfig; - $this->trans = $trans; - $this->userId = $UserId; - $this->wopiMapper = $wopiMapper; - $this->userManager = $userManager; - $this->groupManager = $groupManager; - $this->helper = $helper; } /** - * @param string $fileId - * @param string $shareToken - * @param string $editoruid - * @return array * @throws \Exception */ - public function getToken($fileId, $shareToken = null, $editoruid = null, $direct = false, $isRemoteToken = false) { + public function getToken(string $fileId, ?string $shareToken = null, ?string $editoruid = null, bool $direct = false, bool $isRemoteToken = false): array { [$fileId, , $version] = Helper::parseFileId($fileId); $owneruid = null; $hideDownload = false; @@ -107,9 +58,9 @@ public function getToken($fileId, $shareToken = null, $editoruid = null, $direct } elseif ($this->userId !== null) { try { $editoruid = $this->userId; - $rootFolder = $this->rootFolder->getUserFolder($editoruid); + $userFolder = $this->rootFolder->getUserFolder($editoruid); - $files = $rootFolder->getById((int)$fileId); + $files = $userFolder->getById((int)$fileId); $updatable = false; foreach ($files as $file) { if ($file->isUpdateable()) { @@ -142,14 +93,14 @@ public function getToken($fileId, $shareToken = null, $editoruid = null, $direct // no active user login while generating the token // this is required during WopiPutRelativeFile if (is_null($editoruid)) { - \OC::$server->getLogger()->warning('Generating token for SaveAs without editoruid'); + $this->logger->warning('Generating token for SaveAs without editoruid'); $updatable = true; } else { // Make sure we use the user folder if available since fetching all files by id from the root might be expensive - $rootFolder = $this->rootFolder->getUserFolder($editoruid); + $userFolder = $this->rootFolder->getUserFolder($editoruid); $updatable = false; - $files = $rootFolder->getById($fileId); + $files = $userFolder->getById($fileId); foreach ($files as $file) { if ($file->isUpdateable()) { @@ -160,7 +111,7 @@ public function getToken($fileId, $shareToken = null, $editoruid = null, $direct } } /** @var File $file */ - $file = $rootFolder->getById($fileId)[0]; + $file = $rootFolder->getFirstNodeById($fileId); // If its a public share, use the owner from the share, otherwise check the file object if (is_null($owneruid)) { $owner = $file->getOwner(); @@ -216,9 +167,8 @@ public function getTokenForTemplate(File $templateFile, $userId, $targetFileId, $editoruid = $userId; $rootFolder = $this->rootFolder->getUserFolder($editoruid); /** @var File $targetFile */ - $targetFile = $rootFolder->getById($targetFileId); - $targetFile = $targetFile[0] ?? null; - if (!$targetFile) { + $targetFile = $rootFolder->getFirstNodeById($targetFileId); + if ($targetFile === null) { // TODO: Exception return null; } @@ -255,11 +205,7 @@ public function getTokenForTemplate(File $templateFile, $userId, $targetFileId, ]; } - /** - * @param Node $node - * @return Wopi - */ - public function getRemoteToken(Node $node) { + public function getRemoteToken(Node $node): Wopi { [$urlSrc, $token, $wopi] = $this->getToken($node->getId(), null, null, false, true); $wopi->setIsRemoteToken(true); $wopi->setRemoteServer($node->getStorage()->getRemote()); @@ -268,11 +214,7 @@ public function getRemoteToken(Node $node) { return $wopi; } - /** - * @param Node $node - * @return Wopi - */ - public function getRemoteTokenFromDirect(Node $node, $editorUid) { + public function getRemoteTokenFromDirect(Node $node, $editorUid): Wopi { [$urlSrc, $token, $wopi] = $this->getToken($node->getId(), null, $editorUid, true, true); $wopi->setIsRemoteToken(true); $wopi->setRemoteServer($node->getStorage()->getRemote());