From 8d509ae45815e05d29ac9c07c2eefa3728d3e791 Mon Sep 17 00:00:00 2001 From: Florian Wagner Date: Wed, 10 Jun 2026 21:40:10 +0200 Subject: [PATCH 1/3] feat(capabilities): dynamic mimetype discovery from wopi xml Signed-off-by: Florian Wagner --- lib/Capabilities.php | 6 ++++-- lib/Service/DiscoveryService.php | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/lib/Capabilities.php b/lib/Capabilities.php index 6db67c301a..cf7417f380 100644 --- a/lib/Capabilities.php +++ b/lib/Capabilities.php @@ -9,6 +9,7 @@ namespace OCA\Richdocuments; use OCA\Richdocuments\Service\CapabilitiesService; +use OCA\Richdocuments\Service\DiscoveryService; use OCP\App\IAppManager; use OCP\Capabilities\ICapability; use OCP\IURLGenerator; @@ -97,6 +98,7 @@ public function __construct( private IAppManager $appManager, private ?string $userId, private IURLGenerator $urlGenerator, + private DiscoveryService $discoveryService, ) { } @@ -141,7 +143,7 @@ public function getCapabilities() { * @return list */ public function getDefaultMimetypes(): array { - $defaultMimetypes = self::MIMETYPES; + $defaultMimetypes = $this->discoveryService->getSupportedMimeTypes() ?: self::MIMETYPES; if (!$this->capabilitiesService->hasOtherOOXMLApps()) { array_push($defaultMimetypes, ...self::MIMETYPES_MSOFFICE); @@ -151,7 +153,7 @@ public function getDefaultMimetypes(): array { $defaultMimetypes[] = 'application/pdf'; } - return $defaultMimetypes; + return array_unique($defaultMimetypes); } /** diff --git a/lib/Service/DiscoveryService.php b/lib/Service/DiscoveryService.php index 9a001b39a8..433582d7f2 100644 --- a/lib/Service/DiscoveryService.php +++ b/lib/Service/DiscoveryService.php @@ -127,4 +127,35 @@ private function getParsed(): SimpleXMLElement { throw new \Exception('Could not parse discovery XML'); } } + + /** + * Dynamically get all supported mime types out of the discovery XML + * @todo Currently no categories given from endpoint + * + * @return array + * @throws \Exception + */ + public function getSupportedMimeTypes(): array + { + $mimeTypes = []; + + try { + $parsed = $this->getParsed(); + } catch (\Exception $e) { + // @todo fallback to a default set instead of empty array + return $mimeTypes; + } + + foreach ($parsed->xpath('//net-zone/app') as $app) { + $mimeTypeName = (string)$app['name']; // (e.g. "application/pdf") + + // Filter (Settings, Capabilities, etc.) + if (!str_contains($mimeTypeName, '/')) { + continue; + } + $mimeTypes[] = $mimeTypeName; + } + + return array_unique($mimeTypes); + } } From a73273b1dc62cd1b710147b1f0ab3fd420405a6b Mon Sep 17 00:00:00 2001 From: Florian Wagner Date: Thu, 11 Jun 2026 13:05:33 +0200 Subject: [PATCH 2/3] feat(capabilities): fix object vs array return type for json_encode Signed-off-by: Florian Wagner --- lib/Capabilities.php | 2 +- lib/Service/DiscoveryService.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Capabilities.php b/lib/Capabilities.php index cf7417f380..1d21bdef7c 100644 --- a/lib/Capabilities.php +++ b/lib/Capabilities.php @@ -153,7 +153,7 @@ public function getDefaultMimetypes(): array { $defaultMimetypes[] = 'application/pdf'; } - return array_unique($defaultMimetypes); + return array_values(array_unique($defaultMimetypes)); } /** diff --git a/lib/Service/DiscoveryService.php b/lib/Service/DiscoveryService.php index 433582d7f2..053da0df5d 100644 --- a/lib/Service/DiscoveryService.php +++ b/lib/Service/DiscoveryService.php @@ -156,6 +156,6 @@ public function getSupportedMimeTypes(): array $mimeTypes[] = $mimeTypeName; } - return array_unique($mimeTypes); + return array_values(array_unique($mimeTypes)); } } From b3827c32ab1ca8b1c30c15cf78457e07e52ec769 Mon Sep 17 00:00:00 2001 From: Florian Wagner Date: Fri, 12 Jun 2026 10:51:40 +0200 Subject: [PATCH 3/3] chore feat(capabilities): run cs:fix Signed-off-by: Florian Wagner --- lib/Capabilities.php | 2 +- lib/Service/DiscoveryService.php | 59 ++++++++++++++++---------------- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/lib/Capabilities.php b/lib/Capabilities.php index 1d21bdef7c..243ca7d0be 100644 --- a/lib/Capabilities.php +++ b/lib/Capabilities.php @@ -98,7 +98,7 @@ public function __construct( private IAppManager $appManager, private ?string $userId, private IURLGenerator $urlGenerator, - private DiscoveryService $discoveryService, + private DiscoveryService $discoveryService, ) { } diff --git a/lib/Service/DiscoveryService.php b/lib/Service/DiscoveryService.php index 053da0df5d..6b47620bc0 100644 --- a/lib/Service/DiscoveryService.php +++ b/lib/Service/DiscoveryService.php @@ -128,34 +128,33 @@ private function getParsed(): SimpleXMLElement { } } - /** - * Dynamically get all supported mime types out of the discovery XML - * @todo Currently no categories given from endpoint - * - * @return array - * @throws \Exception - */ - public function getSupportedMimeTypes(): array - { - $mimeTypes = []; - - try { - $parsed = $this->getParsed(); - } catch (\Exception $e) { - // @todo fallback to a default set instead of empty array - return $mimeTypes; - } - - foreach ($parsed->xpath('//net-zone/app') as $app) { - $mimeTypeName = (string)$app['name']; // (e.g. "application/pdf") - - // Filter (Settings, Capabilities, etc.) - if (!str_contains($mimeTypeName, '/')) { - continue; - } - $mimeTypes[] = $mimeTypeName; - } - - return array_values(array_unique($mimeTypes)); - } + /** + * Dynamically get all supported mime types out of the discovery XML + * @todo Currently no categories given from endpoint + * + * @return array + * @throws \Exception + */ + public function getSupportedMimeTypes(): array { + $mimeTypes = []; + + try { + $parsed = $this->getParsed(); + } catch (\Exception $e) { + // @todo fallback to a default set instead of empty array + return $mimeTypes; + } + + foreach ($parsed->xpath('//net-zone/app') as $app) { + $mimeTypeName = (string)$app['name']; // (e.g. "application/pdf") + + // Filter (Settings, Capabilities, etc.) + if (!str_contains($mimeTypeName, '/')) { + continue; + } + $mimeTypes[] = $mimeTypeName; + } + + return array_values(array_unique($mimeTypes)); + } }