From 655d0fcdcb6d33f67ae49920e0cff287016bfdc1 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 24 Apr 2025 12:08:57 +0200 Subject: [PATCH] fix(federation): Allow federation file sharing when federation app is disabled The app id might be misleading, the federation app is for syncing addressbooks with trusted servers. It is not always enabled and show not have to be. Signed-off-by: Joas Schilling --- apps/cloud_federation_api/lib/Config.php | 3 +++ .../lib/Controller/RequestHandlerController.php | 2 +- .../lib/OCM/CloudFederationProviderFiles.php | 16 +++++++++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/apps/cloud_federation_api/lib/Config.php b/apps/cloud_federation_api/lib/Config.php index cb3f4a2ae76..f7c14a75c37 100644 --- a/apps/cloud_federation_api/lib/Config.php +++ b/apps/cloud_federation_api/lib/Config.php @@ -6,6 +6,7 @@ namespace OCA\CloudFederationAPI; use OCP\Federation\ICloudFederationProviderManager; +use Psr\Log\LoggerInterface; /** * Class config @@ -18,6 +19,7 @@ class Config { public function __construct( private ICloudFederationProviderManager $cloudFederationProviderManager, + private LoggerInterface $logger, ) { } @@ -32,6 +34,7 @@ class Config { $provider = $this->cloudFederationProviderManager->getCloudFederationProvider($resourceType); return $provider->getSupportedShareTypes(); } catch (\Exception $e) { + $this->logger->error('Failed to create federation provider', ['exception' => $e]); return []; } } diff --git a/apps/cloud_federation_api/lib/Controller/RequestHandlerController.php b/apps/cloud_federation_api/lib/Controller/RequestHandlerController.php index 86af7924e6f..cbd66f52382 100644 --- a/apps/cloud_federation_api/lib/Controller/RequestHandlerController.php +++ b/apps/cloud_federation_api/lib/Controller/RequestHandlerController.php @@ -452,7 +452,7 @@ class RequestHandlerController extends Controller { */ private function getHostFromFederationId(string $entry): string { if (!str_contains($entry, '@')) { - throw new IncomingRequestException('entry ' . $entry . ' does not contains @'); + throw new IncomingRequestException('entry ' . $entry . ' does not contain @'); } $rightPart = substr($entry, strrpos($entry, '@') + 1); diff --git a/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php b/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php index d5082eafc56..3c669a226b4 100644 --- a/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php +++ b/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php @@ -67,7 +67,6 @@ class CloudFederationProviderFiles implements ISignedCloudFederationProvider { private LoggerInterface $logger, private IFilenameValidator $filenameValidator, private readonly IProviderFactory $shareProviderFactory, - private TrustedServers $trustedServers, ) { } @@ -156,6 +155,17 @@ class CloudFederationProviderFiles implements ISignedCloudFederationProvider { // get DisplayName about the owner of the share $ownerDisplayName = $this->getUserDisplayName($ownerFederatedId); + $trustedServers = null; + if ($this->appManager->isInstalled('federation') + && class_exists(TrustedServers::class)) { + try { + $trustedServers = Server::get(TrustedServers::class); + } catch (\Throwable $e) { + $this->logger->debug('Failed to create TrustedServers', ['exception' => $e]); + } + } + + if ($shareType === IShare::TYPE_USER) { $event = $this->activityManager->generateEvent(); $event->setApp('files_sharing') @@ -167,7 +177,7 @@ class CloudFederationProviderFiles implements ISignedCloudFederationProvider { $this->notifyAboutNewShare($shareWith, $shareId, $ownerFederatedId, $sharedByFederatedId, $name, $ownerDisplayName); // If auto-accept is enabled, accept the share - if ($this->federatedShareProvider->isFederatedTrustedShareAutoAccept() && $this->trustedServers->isTrustedServer($remote)) { + if ($this->federatedShareProvider->isFederatedTrustedShareAutoAccept() && $trustedServers?->isTrustedServer($remote) === true) { $this->externalShareManager->acceptShare($shareId, $shareWith); } } else { @@ -183,7 +193,7 @@ class CloudFederationProviderFiles implements ISignedCloudFederationProvider { $this->notifyAboutNewShare($user->getUID(), $shareId, $ownerFederatedId, $sharedByFederatedId, $name, $ownerDisplayName); // If auto-accept is enabled, accept the share - if ($this->federatedShareProvider->isFederatedTrustedShareAutoAccept() && $this->trustedServers->isTrustedServer($remote)) { + if ($this->federatedShareProvider->isFederatedTrustedShareAutoAccept() && $trustedServers?->isTrustedServer($remote) === true) { $this->externalShareManager->acceptShare($shareId, $user->getUID()); } }