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;
+ }
+}