From 4fc5eaeff0c7ecc03a3ae407b9bda74a30d427fc 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 585fb8e1d97..836b6610199 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->isEnabledForAnyone('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()); } }