diff --git a/apps/files_external/lib/Controller/StoragesController.php b/apps/files_external/lib/Controller/StoragesController.php index a0e120e28dd..aeb6e385bc3 100644 --- a/apps/files_external/lib/Controller/StoragesController.php +++ b/apps/files_external/lib/Controller/StoragesController.php @@ -236,7 +236,7 @@ abstract class StoragesController extends Controller { } catch (StorageNotAvailableException $e) { $storage->setStatus( (int)$e->getCode(), - $this->l10n->t('%s', [$e->getMessage()]) + $e->getMessage(), ); } catch (\Exception $e) { // FIXME: convert storage exceptions to StorageNotAvailableException diff --git a/apps/files_external/lib/Service/BackendService.php b/apps/files_external/lib/Service/BackendService.php index c3837ff02fc..63d73c6ee6b 100644 --- a/apps/files_external/lib/Service/BackendService.php +++ b/apps/files_external/lib/Service/BackendService.php @@ -263,7 +263,7 @@ class BackendService { * @param Backend $backend * @return bool */ - protected function isAllowedUserBackend(Backend $backend): bool { + public function isAllowedUserBackend(Backend $backend): bool { return ($this->isUserMountingAllowed() && array_intersect($backend->getIdentifierAliases(), $this->userMountingBackends)); } diff --git a/apps/files_external/lib/Settings/Admin.php b/apps/files_external/lib/Settings/Admin.php index 685094adca6..c3f8e175c72 100644 --- a/apps/files_external/lib/Settings/Admin.php +++ b/apps/files_external/lib/Settings/Admin.php @@ -27,14 +27,14 @@ class Admin implements ISettings { private IInitialState $initialState, private IURLGenerator $urlGenerator, ) { + $this->visibility = BackendService::VISIBILITY_ADMIN; } /** * @return TemplateResponse */ public function getForm() { - // Shared settings (user & admin) - $this->setInitialState(BackendService::VISIBILITY_ADMIN); + $this->setInitialState(); // Admin specific $backends = $this->backendService->getAvailableBackends(); @@ -42,16 +42,6 @@ class Admin implements ISettings { $this->initialState->provideInitialState('user-mounting', [ 'allowUserMounting' => $this->backendService->isUserMountingAllowed(), 'allowedBackends' => array_values(array_map(fn (Backend $backend) => $backend->getIdentifier(), $allowedBackends)), - 'backends' => array_values( - array_map( - fn (Backend $backend) => [ - 'id' => $backend->getIdentifier(), - 'displayName' => $backend->getText(), - 'deprecated' => $backend->getDeprecateTo()?->getIdentifier(), - ], - $backends, - ), - ), ]); $this->loadScriptsAndStyles(); diff --git a/apps/files_external/lib/Settings/CommonSettingsTrait.php b/apps/files_external/lib/Settings/CommonSettingsTrait.php index dd5d7fa3796..03193374c05 100644 --- a/apps/files_external/lib/Settings/CommonSettingsTrait.php +++ b/apps/files_external/lib/Settings/CommonSettingsTrait.php @@ -12,28 +12,28 @@ use OCA\Files_External\Lib\Auth\Password\GlobalAuth; use OCA\Files_External\Lib\Backend\Backend; use OCA\Files_External\Service\BackendService; use OCP\AppFramework\Services\IInitialState; +use OCP\Encryption\IManager; use OCP\IURLGenerator; use OCP\Util; trait CommonSettingsTrait { private BackendService $backendService; - + private IManager $encryptionManager; private IInitialState $initialState; - private IURLGenerator $urlGenerator; - private GlobalAuth $globalAuth; + private int $visibility; private ?string $userId = null; + /** @var Backend[]|null */ + private ?array $backends = null; /** * Set the initial state for the user / admin settings - * - * @param int $visibilityType The visibility type used to determine which options to show (admin vs user settings) */ - protected function setInitialState(int $visibilityType) { + protected function setInitialState() { $allowUserMounting = $this->backendService->isUserMountingAllowed(); - $isAdmin = $visibilityType === BackendService::VISIBILITY_ADMIN; + $isAdmin = $this->visibility === BackendService::VISIBILITY_ADMIN; $canCreateMounts = $isAdmin || $allowUserMounting; $this->initialState->provideInitialState('settings', [ @@ -43,6 +43,7 @@ trait CommonSettingsTrait { 'dependencyIssues' => $canCreateMounts ? $this->dependencyMessage() : null, /** Is this the admin settings or just user settings */ 'isAdmin' => $isAdmin, + 'hasEncryption' => $this->encryptionManager->isEnabled(), ]); $this->initialState->provideInitialState( @@ -54,24 +55,42 @@ trait CommonSettingsTrait { $this->globalAuth->getAuth($this->userId ?? ''), ), ); + + $this->initialState->provideInitialState( + 'allowedBackends', + array_map(fn (Backend $backend) => $backend->getIdentifier(), $this->getAvailableBackends()), + ); + $this->initialState->provideInitialState( + 'backends', + array_values($this->backendService->getAvailableBackends()), + ); + $this->initialState->provideInitialState( + 'authMechanisms', + array_values($this->backendService->getAuthMechanisms()), + ); } /** * Load the frontend script including the custom backend dependencies */ protected function loadScriptsAndStyles() { + Util::addStyle('files_external', 'init_settings'); + Util::addInitScript('files_external', 'init_settings'); + Util::addScript('files_external', 'settings'); Util::addStyle('files_external', 'settings'); // load custom JS foreach ($this->backendService->getAvailableBackends() as $backend) { foreach ($backend->getCustomJs() as $script) { + Util::addStyle('files_external', $script); Util::addScript('files_external', $script); } } - + foreach ($this->backendService->getAuthMechanisms() as $authMechanism) { foreach ($authMechanism->getCustomJs() as $script) { + Util::addStyle('files_external', $script); Util::addScript('files_external', $script); } } @@ -86,7 +105,7 @@ trait CommonSettingsTrait { $dependencyGroups = []; // Try all backends and check their dependencies - foreach ($this->backendService->getAvailableBackends() as $backend) { + foreach ($this->getAvailableBackends() as $backend) { foreach ($backend->checkDependencies() as $dependency) { $dependencyMessage = $dependency->getMessage(); if ($dependencyMessage !== null) { @@ -108,4 +127,15 @@ trait CommonSettingsTrait { 'modules' => $missingModules, ]; } + + private function getAvailableBackends(): array { + if ($this->backends === null) { + $backends = $this->backendService->getAvailableBackends(); + if ($this->visibility === BackendService::VISIBILITY_PERSONAL) { + $backends = array_filter($backends, $this->backendService->isAllowedUserBackend(...)); + } + $this->backends = array_values($backends); + } + return $this->backends; + } } diff --git a/apps/files_external/lib/Settings/Personal.php b/apps/files_external/lib/Settings/Personal.php index b84f5969fed..af38c6bff58 100644 --- a/apps/files_external/lib/Settings/Personal.php +++ b/apps/files_external/lib/Settings/Personal.php @@ -10,6 +10,7 @@ use OCA\Files_External\Lib\Auth\Password\GlobalAuth; use OCA\Files_External\Service\BackendService; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Services\IInitialState; +use OCP\Encryption\IManager; use OCP\IURLGenerator; use OCP\Settings\ISettings; @@ -22,23 +23,26 @@ class Personal implements ISettings { private GlobalAuth $globalAuth, private IInitialState $initialState, private IURLGenerator $urlGenerator, + private IManager $encryptionManager, ) { $this->userId = $userId; + $this->visibility = BackendService::VISIBILITY_PERSONAL; } /** * @return TemplateResponse */ public function getForm() { - $this->setInitialState(BackendService::VISIBILITY_PERSONAL); + $this->setInitialState(); $this->loadScriptsAndStyles(); return new TemplateResponse('files_external', 'settings', renderAs: ''); } - /** - * @return string the section ID, e.g. 'sharing' - */ public function getSection() { + if (!$this->backendService->isUserMountingAllowed()) { + return null; + } + return 'externalstorages'; } diff --git a/apps/files_external/src/components/UserMountSettings.vue b/apps/files_external/src/components/UserMountSettings.vue index d96e056ccb1..2e5d84b4b18 100644 --- a/apps/files_external/src/components/UserMountSettings.vue +++ b/apps/files_external/src/components/UserMountSettings.vue @@ -3,6 +3,8 @@ - SPDX-License-Identifier: AGPL-3.0-or-later -->