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')); ?>
+
+
+
+ | Client ID |
+ Client name |
+
+
+
+ $registration) { ?>
+
+ |
+ |
+
+
+
+
\ 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);