From e043aa01eff3be2d66a6f5d2132d8b05b761e7d3 Mon Sep 17 00:00:00 2001 From: codewithvk Date: Tue, 11 Feb 2025 18:29:49 +0530 Subject: [PATCH 1/2] fix: send etag for settings URLs and update etag on file changes - Replace timestamp with the folder etag in settings generation. - Update the folder etag when files are created or deleted. - Refactor folder retrieval logic into helper methods for consistency. Signed-off-by: codewithvk --- lib/Controller/WopiController.php | 4 +-- lib/Service/SettingsService.php | 43 ++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/lib/Controller/WopiController.php b/lib/Controller/WopiController.php index 4ee52e29fb..4399b221e5 100644 --- a/lib/Controller/WopiController.php +++ b/lib/Controller/WopiController.php @@ -177,7 +177,6 @@ public function checkFileInfo(string $fileId, string $access_token): JSONRespons ]; if ($this->capabilitiesService->hasSettingIframeSupport()) { - if (!$isPublic) { $response['UserSettings'] = $this->generateSettings($userId, 'userconfig'); } @@ -993,9 +992,10 @@ private function generateSettingToken(string $userId): string { private function generateSettings(string $userId, string $type): array { $nextcloudUrl = $this->appConfig->getNextcloudUrl() ?: trim($this->urlGenerator->getAbsoluteURL(''), '/'); $uri = $nextcloudUrl . '/index.php/apps/richdocuments/wopi/settings' . '?type=' . $type . '&access_token=' . $this->generateSettingToken($userId) . '&fileId=' . '-1'; + $etag = $this->settingsService->getFolderEtag($type); return [ 'uri' => $uri, - 'stamp' => time() + 'stamp' => $etag ]; } } diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php index 6bff30f31e..cf36a27424 100644 --- a/lib/Service/SettingsService.php +++ b/lib/Service/SettingsService.php @@ -97,6 +97,7 @@ public function uploadFile(SettingsUrl $settingsUrl, string $fileData, string $u $fileName = $settingsUrl->getFileName(); $newFile = $categoryFolder->newFile($fileName, $fileData); $fileUri = $this->generateFileUri($settingsUrl->getType(), $settingsUrl->getCategory(), $fileName, $userId); + $this->refreshFolderEtag($settingsUrl->getType()); return [ 'stamp' => $newFile->getETag(), @@ -154,6 +155,15 @@ public function generateIframeToken(string $type, string $userId): array { throw $e; } } + + /** + * + * @param string $type + * @return string + */ + public function getFolderEtag($type) : string { + return $this->getTypeFolder($type)->getEtag(); + } /** * generate setting config @@ -210,12 +220,7 @@ private function getAllCategories(string $type): array { */ private function getCategoryDirFolderList(string $type) : array { try { - $instanceId = $this->config->getSystemValue('instanceid', null); - if ($instanceId === null) { - throw new NotFoundException('Instance ID not found'); - } - $rootFolder = $this->rootFolder; - $folder = $rootFolder->get('appdata_' . $instanceId . '/richdocuments' . '/' . $type); + $folder = $this->getTypeFolder($type); if (!$folder instanceof Folder) { return []; } @@ -225,6 +230,31 @@ private function getCategoryDirFolderList(string $type) : array { } } + /** + * extract folder of $type + * + * @param string $type + * @return Folder + */ + private function getTypeFolder($type) { + $instanceId = $this->config->getSystemValue('instanceid', null); + if ($instanceId === null) { + throw new NotFoundException('Instance ID not found'); + } + $rootFolder = $this->rootFolder; + $folder = $rootFolder->get('appdata_' . $instanceId . '/richdocuments' . '/' . $type); + return $folder; + } + + /** + * + * @param string $type + */ + private function refreshFolderEtag($type) { + $folder = $this->getTypeFolder($type); + $folder->getStorage()->getCache()->update($folder->getId(), [ 'etag' => uniqid() ]); + } + /** * Generate file URL. * @@ -314,6 +344,7 @@ public function deleteSettingsFile(string $type, string $category, string $name, throw new NotFoundException("File '{$name}' not found in category '{$category}' for type '{$type}'."); } $categoryFolder->getFile($name)->delete(); + $this->refreshFolderEtag($type); } catch (NotFoundException $e) { throw $e; } catch (NotPermittedException $e) { From c9b774de793c21fe3e1e3caeb45f16506e7e4624 Mon Sep 17 00:00:00 2001 From: codewithvk Date: Wed, 12 Feb 2025 17:49:19 +0530 Subject: [PATCH 2/2] fix(settings): create missing type folder if not found Signed-off-by: codewithvk --- lib/Service/SettingsService.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php index cf36a27424..0c944d7e31 100644 --- a/lib/Service/SettingsService.php +++ b/lib/Service/SettingsService.php @@ -242,7 +242,12 @@ private function getTypeFolder($type) { throw new NotFoundException('Instance ID not found'); } $rootFolder = $this->rootFolder; - $folder = $rootFolder->get('appdata_' . $instanceId . '/richdocuments' . '/' . $type); + try { + $folder = $rootFolder->get('appdata_' . $instanceId . '/richdocuments' . '/' . $type); + } catch (NotFoundException $e) { + $baseFolder = $this->appData->newFolder($type); + $folder = $rootFolder->get('appdata_' . $instanceId . '/richdocuments' . '/' . $type); + } return $folder; }