mirror of
https://github.com/nextcloud/server.git
synced 2026-02-19 02:38:40 -05:00
The occ files_external_backends command is supposed to list available backends along with their configuration options. For the SMB backend, only the timeout option is currently shown, while options like host, share, root, and domain are missing. This makes configuring external storage via occ complicated. Since the timeout option is marked as hidden but still shown, while the other options are not, the logic needs to be inverted so that all relevant configuration options are displayed correctly. Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
104 lines
3.4 KiB
PHP
104 lines
3.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
|
|
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
namespace OCA\Files_External\Command;
|
|
|
|
use OC\Core\Command\Base;
|
|
use OCA\Files_External\Lib\Auth\AuthMechanism;
|
|
use OCA\Files_External\Lib\Backend\Backend;
|
|
use OCA\Files_External\Lib\DefinitionParameter;
|
|
use OCA\Files_External\Service\BackendService;
|
|
use Symfony\Component\Console\Input\InputArgument;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
|
|
class Backends extends Base {
|
|
public function __construct(
|
|
private BackendService $backendService,
|
|
) {
|
|
parent::__construct();
|
|
}
|
|
|
|
protected function configure(): void {
|
|
$this
|
|
->setName('files_external:backends')
|
|
->setDescription('Show available authentication and storage backends')
|
|
->addArgument(
|
|
'type',
|
|
InputArgument::OPTIONAL,
|
|
'only show backends of a certain type. Possible values are "authentication" or "storage"'
|
|
)->addArgument(
|
|
'backend',
|
|
InputArgument::OPTIONAL,
|
|
'only show information of a specific backend'
|
|
);
|
|
parent::configure();
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output): int {
|
|
$authBackends = $this->backendService->getAuthMechanisms();
|
|
$storageBackends = $this->backendService->getBackends();
|
|
|
|
$data = [
|
|
'authentication' => array_map([$this, 'serializeAuthBackend'], $authBackends),
|
|
'storage' => array_map([$this, 'serializeAuthBackend'], $storageBackends)
|
|
];
|
|
|
|
$type = $input->getArgument('type');
|
|
$backend = $input->getArgument('backend');
|
|
if ($type) {
|
|
if (!isset($data[$type])) {
|
|
$output->writeln('<error>Invalid type "' . $type . '". Possible values are "authentication" or "storage"</error>');
|
|
return self::FAILURE;
|
|
}
|
|
$data = $data[$type];
|
|
|
|
if ($backend) {
|
|
if (!isset($data[$backend])) {
|
|
$output->writeln('<error>Unknown backend "' . $backend . '" of type "' . $type . '"</error>');
|
|
return self::FAILURE;
|
|
}
|
|
$data = $data[$backend];
|
|
}
|
|
}
|
|
|
|
$this->writeArrayInOutputFormat($input, $output, $data);
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
private function serializeAuthBackend(\JsonSerializable $backend): array {
|
|
$data = $backend->jsonSerialize();
|
|
$result = [
|
|
'name' => $data['name'],
|
|
'identifier' => $data['identifier'],
|
|
'configuration' => $this->formatConfiguration($data['configuration'])
|
|
];
|
|
if ($backend instanceof Backend) {
|
|
$result['storage_class'] = $backend->getStorageClass();
|
|
$authBackends = $this->backendService->getAuthMechanismsByScheme(array_keys($backend->getAuthSchemes()));
|
|
$result['supported_authentication_backends'] = array_keys($authBackends);
|
|
$authConfig = array_map(function (AuthMechanism $auth) {
|
|
return $this->serializeAuthBackend($auth)['configuration'];
|
|
}, $authBackends);
|
|
$result['authentication_configuration'] = array_combine(array_keys($authBackends), $authConfig);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* @param DefinitionParameter[] $parameters
|
|
* @return string[]
|
|
*/
|
|
private function formatConfiguration(array $parameters): array {
|
|
$configuration = array_filter($parameters, function (DefinitionParameter $parameter) {
|
|
return !$parameter->isFlagSet(DefinitionParameter::FLAG_HIDDEN);
|
|
});
|
|
return array_map(function (DefinitionParameter $parameter) {
|
|
return $parameter->getTypeName();
|
|
}, $configuration);
|
|
}
|
|
}
|