diff --git a/appinfo/info.xml b/appinfo/info.xml index 90febffd..1442bcf7 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -36,5 +36,6 @@ OCA\UserOIDC\Command\UpsertProvider OCA\UserOIDC\Command\DeleteProvider + OCA\UserOIDC\Command\ListProviders diff --git a/lib/Command/ListProviders.php b/lib/Command/ListProviders.php new file mode 100644 index 00000000..02966341 --- /dev/null +++ b/lib/Command/ListProviders.php @@ -0,0 +1,85 @@ +setName('user_oidc:providers') + ->setDescription('List all providers and print their configuration') + ->addOption('sensitive', 's', InputOption::VALUE_NONE, 'Obfuscate sensitive values like the client ID and the discovery endpoint domain name'); + $this->defaultOutputFormat = self::OUTPUT_FORMAT_JSON_PRETTY; + parent::configure(); + } + + protected function execute(InputInterface $input, OutputInterface $output) { + $outputFormat = $input->getOption('output') ?? 'json_pretty'; + $sensitive = $input->getOption('sensitive'); + + $providers = $this->providerMapper->getProviders(); + + $providersWithSettings = array_map(function ($provider) use ($sensitive) { + $providerSettings = $this->providerService->getSettings($provider->getId()); + $serializedProvider = $provider->jsonSerialize(); + if ($sensitive) { + $serializedProvider['clientId'] = '********'; + $serializedProvider['clientSecret'] = '********'; + try { + $discoveryDomainName = parse_url($serializedProvider['discoveryEndpoint'], PHP_URL_HOST); + $serializedProvider['discoveryEndpoint'] = str_replace($discoveryDomainName, '********', $serializedProvider['discoveryEndpoint']); + } catch (\Exception|\Throwable) { + } + } else { + $serializedProvider['clientSecret'] = $this->crypto->decrypt($provider->getClientSecret()); + } + return array_merge($serializedProvider, ['settings' => $providerSettings]); + }, $providers); + + if ($outputFormat === 'json') { + foreach ($providersWithSettings as $provider) { + $output->writeln(json_encode($provider, JSON_THROW_ON_ERROR)); + } + return 0; + } + + if ($outputFormat === 'json_pretty') { + foreach ($providersWithSettings as $provider) { + $output->writeln(json_encode($provider, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT)); + } + return 0; + } + + $output->writeln( + 'Only "' . self::OUTPUT_FORMAT_JSON . '" and "' . self::OUTPUT_FORMAT_JSON_PRETTY . '" output formats are supported.', + ); + + $output->writeln( + 'Use "--output=' . self::OUTPUT_FORMAT_JSON . '" or "--output=' . self::OUTPUT_FORMAT_JSON_PRETTY . '" ' + . '(default format is "' . self::OUTPUT_FORMAT_JSON_PRETTY . '")', + ); + return 0; + } +}