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('Invalid type "' . $type . '". Possible values are "authentication" or "storage"'); return self::FAILURE; } $data = $data[$type]; if ($backend) { if (!isset($data[$backend])) { $output->writeln('Unknown backend "' . $backend . '" of type "' . $type . '"'); 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->getType() !== DefinitionParameter::VALUE_HIDDEN; }); return array_map(function (DefinitionParameter $parameter) { return $parameter->getTypeName(); }, $configuration); } }