From 4c94643491cba96d5ed2843a4d828cee09e937d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Wed, 21 Feb 2024 12:48:08 +0100 Subject: [PATCH] fix: Allow to unlock through separate endpoint for edit locally MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- appinfo/routes.php | 1 + lib/Controller/DocumentAPIController.php | 29 +++++++++++++++++++++++- src/mixins/openLocal.js | 8 ++----- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index b563180375..056e37b4b3 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -77,6 +77,7 @@ 'ocs' => [ // Public pages: new file creation ['name' => 'documentAPI#create', 'url' => '/api/v1/file', 'verb' => 'POST'], + ['name' => 'documentAPI#openLocal', 'url' => '/api/v1/local', 'verb' => 'POST'], // Client API endpoints ['name' => 'OCS#createDirect', 'url' => '/api/v1/document', 'verb' => 'POST'], diff --git a/lib/Controller/DocumentAPIController.php b/lib/Controller/DocumentAPIController.php index 33c28d586e..4bff72cd3b 100644 --- a/lib/Controller/DocumentAPIController.php +++ b/lib/Controller/DocumentAPIController.php @@ -30,11 +30,17 @@ use OCA\Richdocuments\Helper; use OCA\Richdocuments\TemplateManager; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\JSONResponse; use OCP\Files\Folder; use OCP\Files\IRootFolder; +use OCP\Files\Lock\ILock; +use OCP\Files\Lock\ILockManager; +use OCP\Files\Lock\LockContext; +use OCP\Files\Lock\NoLockProviderException; use OCP\IL10N; use OCP\IRequest; +use OCP\PreConditionNotMetException; use OCP\Share\IManager; use Psr\Log\LoggerInterface; use Throwable; @@ -45,15 +51,17 @@ class DocumentAPIController extends \OCP\AppFramework\OCSController { private $templateManager; private $l10n; private $logger; + private $lockManager; private $userId; - public function __construct(IRequest $request, IRootFolder $rootFolder, IManager $shareManager, TemplateManager $templateManager, IL10N $l10n, LoggerInterface $logger, $userId) { + public function __construct(IRequest $request, IRootFolder $rootFolder, IManager $shareManager, TemplateManager $templateManager, IL10N $l10n, LoggerInterface $logger, ILockManager $lockManager, $userId) { parent::__construct(Application::APPNAME, $request); $this->rootFolder = $rootFolder; $this->shareManager = $shareManager; $this->templateManager = $templateManager; $this->l10n = $l10n; $this->logger = $logger; + $this->lockManager = $lockManager; $this->userId = $userId; } @@ -147,4 +155,23 @@ public function create(string $mimeType, string $fileName, string $directoryPath 'data' => \OCA\Files\Helper::formatFileInfo($file->getFileInfo()) ]); } + + #[Http\Attribute\NoAdminRequired] + public function openLocal(int $fileId): DataResponse { + try { + $files = $this->rootFolder->getUserFolder($this->userId)->getById($fileId); + $file = array_shift($files); + $this->lockManager->unlock(new LockContext( + $file, + ILock::TYPE_APP, + Application::APPNAME + )); + return new DataResponse([]); + } catch (NoLockProviderException|PreConditionNotMetException $e) { + return new DataResponse([], Http::STATUS_BAD_REQUEST); + } catch (\Exception $e) { + return new DataResponse([], Http::STATUS_INTERNAL_SERVER_ERROR); + } + + } } diff --git a/src/mixins/openLocal.js b/src/mixins/openLocal.js index c2388ef56b..e1cc43a257 100644 --- a/src/mixins/openLocal.js +++ b/src/mixins/openLocal.js @@ -22,7 +22,7 @@ import { getCurrentUser } from '@nextcloud/auth' import axios from '@nextcloud/axios' import { encodePath } from '@nextcloud/paths' -import { getRootUrl, generateOcsUrl } from '@nextcloud/router' +import { generateOcsUrl } from '@nextcloud/router' import { getNextcloudUrl } from '../helpers/url.js' // FIXME: Migrate to vue component @@ -92,11 +92,7 @@ export default { }, unlockFile() { - const unlockUrl = getRootUrl() + '/index.php/apps/richdocuments/wopi/files/' + this.fileid - const unlockConfig = { - headers: { 'X-WOPI-Override': 'UNLOCK' }, - } - return axios.post(unlockUrl, { access_token: this.formData.accessToken }, unlockConfig) + return axios.post(generateOcsUrl('apps/richdocuments/api/v1/local'), { fileId: this.fileid }) }, openLocally() {