From c1c8251e687fd5d39e23c6e585b997cdbf4fbfa6 Mon Sep 17 00:00:00 2001 From: Yvo Brevoort Date: Fri, 31 Jan 2025 11:07:38 +0100 Subject: [PATCH 1/2] add list of registered clients --- solid/css/settings-admin.css | 4 +- solid/lib/BaseServerConfig.php | 112 ++++++++++++++++++++++++++++++ solid/lib/ServerConfig.php | 102 --------------------------- solid/lib/Settings/SolidAdmin.php | 5 +- solid/templates/admin.php | 17 +++++ 5 files changed, 135 insertions(+), 105 deletions(-) diff --git a/solid/css/settings-admin.css b/solid/css/settings-admin.css index e370ac6f..f2e88225 100644 --- a/solid/css/settings-admin.css +++ b/solid/css/settings-admin.css @@ -4,10 +4,10 @@ display: block; } #solid-admin input { - width: 480px; + width: 500px; } #solid-admin textarea { - width: 480px; + width: 500px; height: 240px; font-size: 12px; font-family: monospace; diff --git a/solid/lib/BaseServerConfig.php b/solid/lib/BaseServerConfig.php index a932b76f..071d0244 100644 --- a/solid/lib/BaseServerConfig.php +++ b/solid/lib/BaseServerConfig.php @@ -66,4 +66,116 @@ private function generateKeySet() { ); return $result; } + + /** + * @param string $clientId + * @return array|null + */ + public function getClientConfigById($clientId) { + $clients = (array)$this->config->getAppValue('solid','clients'); + if (array_key_exists($clientId, $clients)) { + return $clients[$clientId]; + } + return null; + } + + /** + * @return array|null + */ + public function getClients() { + $configKeys = (array)$this->config->getAppKeys('solid'); + $clients = []; + foreach ($configKeys as $key) { + if (preg_match("/^client-([a-z0-9]+)$/", $key, $matches)) { + $clientRegistration = json_decode($this->config->getAppValue('solid', $key, '{}'), true); + $clients[] = [ + "clientId" => $matches[1], + "clientName" => $clientRegistration['client_name'] + ]; + } + } + return $clients; + } + + /** + * @param array $clientConfig + * @return string + */ + public function saveClientConfig($clientId, $clientConfig) { + $clients = (array)$this->config->getAppValue('solid', 'clients'); + $clients[$clientId] = $clientConfig; + $this->config->setAppValue('solid','clients', $clients); + return $clientId; + } + + /** + * @param string $clientId + * @param array $scopes + */ + public function addScopesToClient($clientId, $scopes) { + $clientScopes = $this->getClientScopes($clientId); + $clientScopes = array_unique(array_merge($clientScopes, $scopes)); + $this->setClientScopes($clientId, $clientScopes); + } + + /** + * @param string $clientId + * @param array $scopes + */ + public function setClientScopes($clientId, $scopes) { + $clientScopes = (array)$this->config->getAppValue('solid', 'clientScopes'); + $clientScopes[$clientId] = $scopes; + $this->config->setAppValue('solid', 'clientScopes', $clientScopes); + } + + /** + * @param string $clientId + * @return array + */ + public function getClientScopes($clientId) { + $clientScopes = (array)$this->config->getAppValue('solid', 'clientScopes'); + if (array_key_exists($clientId, $clientScopes)) { + return $clientScopes[$clientId]; + } + return []; + } + + /** + * @param string $clientId + */ + public function removeClientConfig($clientId) { + $clients = (array)$this->config->getAppValue('solid', 'clients'); + unset($clients[$clientId]); + $this->config->setAppValue('solid','clients', $clients); + $scopes = (array)$this->config->getAppValue('solid', 'clientScopes'); + unset($scopes[$clientId]); + $this->config->setAppValue('solid', 'clientScopes', $scopes); + } + + public function saveClientRegistration($origin, $clientData) { + $originHash = md5($origin); + $existingRegistration = $this->getClientRegistration($originHash); + if ($existingRegistration && isset($existingRegistration['redirect_uris'])) { + foreach ($existingRegistration['redirect_uris'] as $uri) { + $clientData['redirect_uris'][] = $uri; + } + $clientData['redirect_uris'] = array_unique($clientData['redirect_uris']); + } + + $clientData['client_name'] = $origin; + $clientData['client_secret'] = md5(random_bytes(32)); + $this->config->setAppValue('solid', "client-" . $originHash, json_encode($clientData)); + $this->config->setAppValue('solid', "client-" . $origin, json_encode($clientData)); + $this->saveClientConfig($originHash, $clientData); + return $originHash; + } + + public function removeClientRegistration($clientId) { + $this->config->deleteAppValue('solid', "client-" . $clientId); + } + + public function getClientRegistration($clientId) { + $data = $this->config->getAppValue('solid', "client-" . $clientId, "{}"); + return json_decode($data, true); + } } diff --git a/solid/lib/ServerConfig.php b/solid/lib/ServerConfig.php index 7536f2cf..8313b1f8 100644 --- a/solid/lib/ServerConfig.php +++ b/solid/lib/ServerConfig.php @@ -26,81 +26,6 @@ public function __construct(IConfig $config, IUrlGenerator $urlGenerator, IUserM parent::__construct($config); } - /** - * @param string $clientId - * @return array|null - */ - public function getClientConfigById($clientId) { - $clients = (array)$this->config->getAppValue('solid','clients'); - if (array_key_exists($clientId, $clients)) { - return $clients[$clientId]; - } - return null; - } - - /** - * @return array|null - */ - public function getClients() { - $clients = (array)$this->config->getAppKeys('solid'); - return $clients; - } - - /** - * @param array $clientConfig - * @return string - */ - public function saveClientConfig($clientConfig) { - $clients = (array)$this->config->getAppValue('solid', 'clients'); - $clientId = uuidv4(); - $clients[$clientId] = $clientConfig; - $this->config->setAppValue('solid','clients', $clients); - return $clientId; - } - - /** - * @param string $clientId - * @param array $scopes - */ - public function addScopesToClient($clientId, $scopes) { - $clientScopes = $this->getClientScopes($clientId); - $clientScopes = array_unique(array_merge($clientScopes, $scopes)); - $this->setClientScopes($clientId, $clientScopes); - } - - /** - * @param string $clientId - * @param array $scopes - */ - public function setClientScopes($clientId, $scopes) { - $clientScopes = (array)$this->config->getAppValue('solid', 'clientScopes'); - $clientScopes[$clientId] = $scopes; - $this->config->setAppValue('solid', 'clientScopes', $clientScopes); - } - - /** - * @param string $clientId - * @return array - */ - public function getClientScopes($clientId) { - $clientScopes = (array)$this->config->getAppValue('solid', 'clientScopes'); - if (array_key_exists($clientId, $clientScopes)) { - return $clientScopes[$clientId]; - } - return []; - } - - /** - * @param string $clientId - */ - public function removeClientConfig($clientId) { - $clients = (array)$this->config->getAppValue('solid', 'clients'); - unset($clients[$clientId]); - $this->config->setAppValue('solid','clients', $clients); - $scopes = (array)$this->config->getAppValue('solid', 'clientScopes'); - unset($scopes[$clientId]); - $this->config->setAppValue('solid', 'clientScopes', $scopes); - } public function getAllowedClients($userId) { return json_decode($this->config->getUserValue($userId, 'solid', "allowedClients", "[]"), true); } @@ -116,33 +41,6 @@ public function removeAllowedClient($userId, $clientId) { $this->config->setUserValue($userId, "solid", "allowedClients", json_encode($allowedClients)); } - public function saveClientRegistration($origin, $clientData) { - $originHash = md5($origin); - $existingRegistration = $this->getClientRegistration($originHash); - if ($existingRegistration && isset($existingRegistration['redirect_uris'])) { - foreach ($existingRegistration['redirect_uris'] as $uri) { - $clientData['redirect_uris'][] = $uri; - } - $clientData['redirect_uris'] = array_unique($clientData['redirect_uris']); - } - - $clientData['client_name'] = $origin; - $clientData['client_secret'] = md5(random_bytes(32)); - $this->config->setAppValue('solid', "client-" . $originHash, json_encode($clientData)); - - $this->config->setAppValue('solid', "client-" . $origin, json_encode($clientData)); - return $originHash; - } - - public function removeClientRegistration($clientId) { - $this->config->deleteAppValue('solid', "client-" . $clientId); - } - - public function getClientRegistration($clientId) { - $data = $this->config->getAppValue('solid', "client-" . $clientId, "{}"); - return json_decode($data, true); - } - public function getProfileData($userId) { return $this->config->getUserValue($userId, "solid", "profileData", ""); } diff --git a/solid/lib/Settings/SolidAdmin.php b/solid/lib/Settings/SolidAdmin.php index 78701e95..2fc684f8 100644 --- a/solid/lib/Settings/SolidAdmin.php +++ b/solid/lib/Settings/SolidAdmin.php @@ -22,9 +22,12 @@ public function __construct(IConfig $config, IL10N $l) { * @return TemplateResponse */ public function getForm() { + $allClients = $this->serverConfig->getClients(); + $parameters = [ 'privateKey' => $this->serverConfig->getPrivateKey(), - 'encryptionKey' => $this->serverConfig->getEncryptionKey() + 'encryptionKey' => $this->serverConfig->getEncryptionKey(), + 'clients' => $allClients ]; return new TemplateResponse('solid', 'admin', $parameters, ''); diff --git a/solid/templates/admin.php b/solid/templates/admin.php index b892e131..a7ff1bd9 100644 --- a/solid/templates/admin.php +++ b/solid/templates/admin.php @@ -16,4 +16,21 @@

+

t('Solid Client Registrations')); ?>

+ + + + + + + + + $registration) { ?> + + + + + + +
Client IDClient name
\ No newline at end of file From 9f0f5471a7868ceda4ffebc41c57a4f34b358c6d Mon Sep 17 00:00:00 2001 From: Yvo Brevoort Date: Fri, 31 Jan 2025 11:11:26 +0100 Subject: [PATCH 2/2] only generate the secret once to make it stable --- solid/lib/BaseServerConfig.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/solid/lib/BaseServerConfig.php b/solid/lib/BaseServerConfig.php index 071d0244..5e29015c 100644 --- a/solid/lib/BaseServerConfig.php +++ b/solid/lib/BaseServerConfig.php @@ -161,9 +161,10 @@ public function saveClientRegistration($origin, $clientData) { } $clientData['redirect_uris'] = array_unique($clientData['redirect_uris']); } - + if (!$existingRegistration) { + $clientData['client_secret'] = md5(random_bytes(32)); + } $clientData['client_name'] = $origin; - $clientData['client_secret'] = md5(random_bytes(32)); $this->config->setAppValue('solid', "client-" . $originHash, json_encode($clientData)); $this->config->setAppValue('solid', "client-" . $origin, json_encode($clientData)); $this->saveClientConfig($originHash, $clientData);