diff --git a/cypress/e2e/direct.spec.js b/cypress/e2e/direct.spec.js index c93b070a8c..b0120cc536 100644 --- a/cypress/e2e/direct.spec.js +++ b/cypress/e2e/direct.spec.js @@ -2,6 +2,22 @@ * SPDX-FileCopyrightText: 2023 Julius Härtl * SPDX-License-Identifier: AGPL-3.0-or-later */ +const getTemplates = (user, type) => { + return cy.request({ + method: 'GET', + url: `${Cypress.env('baseUrl')}/ocs/v2.php/apps/richdocuments/api/v1/templates/${type}?format=json`, + auth: { user: user.userId, pass: user.password }, + headers: { + 'OCS-ApiRequest': 'true', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + }).then(response => { + cy.log(response) + const templates = response.body?.ocs?.data + cy.wrap(templates) + }) +} + const createDirectEditingLink = (user, fileId) => { cy.login(user) return cy.request({ @@ -24,6 +40,28 @@ const createDirectEditingLink = (user, fileId) => { }) } +const createNewFileDirectEditingLink = (user, path, template) => { + cy.login(user) + return cy.request({ + method: 'POST', + url: `${Cypress.env('baseUrl')}/ocs/v2.php/apps/richdocuments/api/v1/templates/new?format=json`, + form: true, + body: { + path, template, + }, + // auth: { user: user.userId, pass: user.password }, + headers: { + 'OCS-ApiRequest': 'true', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + }).then(response => { + cy.log(response) + const token = response.body?.ocs?.data?.url + cy.log(`Created direct editing token for ${user.userId}`, token) + cy.wrap(token) + }) +} + const createDirectEditingLinkForShareToken = (shareToken, host = undefined, path = '', password = undefined) => { cy.logout() return cy.request({ @@ -75,6 +113,21 @@ describe('Direct editing (legacy)', function() { }) }) + it('Open an new file', function() { + getTemplates(randUser, 'document') + .then((templates) => { + const emptyTemplate = templates.find((template) => template.name === 'Empty') + cy.nextcloudTestingAppConfigSet('richdocuments', 'uiDefaults-UIMode', 'classic') + createNewFileDirectEditingLink(randUser, 'mynewfile.odt', emptyTemplate.id) + .then((token) => { + cy.logout() + cy.visit(token) + cy.waitForCollabora(false) + cy.screenshot('direct-new') + }) + }) + }) + it('Open an existing file on a share link', function() { cy.shareLink(randUser, '/document.odt').then((token) => { createDirectEditingLinkForShareToken(token) diff --git a/lib/Controller/DirectViewController.php b/lib/Controller/DirectViewController.php index ccb8e80ca3..5aad835d24 100644 --- a/lib/Controller/DirectViewController.php +++ b/lib/Controller/DirectViewController.php @@ -19,6 +19,7 @@ use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\TemplateResponse; +use OCP\Files\File; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\Files\Node; @@ -80,7 +81,7 @@ public function show($token) { try { $item = $folder->getFirstNodeById($direct->getFileid()); - if (!($item instanceof Node)) { + if (!($item instanceof File)) { throw new \Exception(); } @@ -92,8 +93,17 @@ public function show($token) { return $response; } - $urlSrc = $this->tokenManager->getUrlSrc($item); - $wopi = $this->tokenManager->generateWopiToken($item->getId(), null, $direct->getUid(), true); + $wopi = null; + $template = $direct->getTemplateId() ? $this->templateManager->getTemplateSource($direct->getTemplateId()) : null; + + if ($template !== null) { + $wopi = $this->tokenManager->generateWopiTokenForTemplate($template, $direct->getUid(), $item->getId(), true); + } + + if ($wopi === null) { + $urlSrc = $this->tokenManager->getUrlSrc($item); + $wopi = $this->tokenManager->generateWopiToken($item->getId(), null, $direct->getUid(), true); + } } catch (\Exception $e) { $this->logger->error('Failed to generate token for existing file on direct editing', ['exception' => $e]); return $this->renderErrorPage('Failed to open the requested file.'); diff --git a/lib/Controller/OCSController.php b/lib/Controller/OCSController.php index edbbfd7820..0d9fd422f2 100644 --- a/lib/Controller/OCSController.php +++ b/lib/Controller/OCSController.php @@ -278,7 +278,7 @@ public function createFromTemplate($path, $template) { $name = $folder->getNonExistingName($info['basename']); $file = $folder->newFile($name); - $direct = $this->directMapper->newDirect($this->userId, $template, $file->getId()); + $direct = $this->directMapper->newDirect($this->userId, $file->getId(), $template); return new DataResponse([ 'url' => $this->urlGenerator->linkToRouteAbsolute('richdocuments.directView.show', [ diff --git a/lib/Db/DirectMapper.php b/lib/Db/DirectMapper.php index aba0ff5406..f5eb449c49 100644 --- a/lib/Db/DirectMapper.php +++ b/lib/Db/DirectMapper.php @@ -31,13 +31,13 @@ public function __construct( * @param int $destination * @return Direct */ - public function newDirect($uid, $fileid, $destination = null, $share = null, $initiatorHost = null, $initiatorToken = null) { + public function newDirect($uid, $fileid, $template = null, $share = null, $initiatorHost = null, $initiatorToken = null) { $direct = new Direct(); $direct->setUid($uid); $direct->setFileid($fileid); $direct->setToken($this->random->generate(64, ISecureRandom::CHAR_DIGITS . ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_UPPER)); $direct->setTimestamp($this->timeFactory->getTime()); - $direct->setTemplateDestination($destination); + $direct->setTemplateId($template); $direct->setShare($share); $direct->setInitiatorHost($initiatorHost); $direct->setInitiatorToken($initiatorToken);