aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/JsonApi
diff options
context:
space:
mode:
authorTill Glöggler <till@gundk.it>2025-06-25 23:40:10 +0200
committerTill Glöggler <till@gundk.it>2025-06-25 23:40:10 +0200
commit3e7179651cfee753606ad906c07c1e5214c66fd9 (patch)
tree0af39b5af7305a7a764a3b133a29134dc0c5533f /lib/classes/JsonApi
parent4f60c4922ed96d60c0fa3b77a590e355b21841ca (diff)
working on SSO SAMLissue-5663
Diffstat (limited to 'lib/classes/JsonApi')
-rw-r--r--lib/classes/JsonApi/RouteMap.php7
-rw-r--r--lib/classes/JsonApi/Routes/SAML/ConfigurationShow.php30
-rw-r--r--lib/classes/JsonApi/Routes/SAML/ConfigurationUpdate.php35
-rw-r--r--lib/classes/JsonApi/Routes/SAML/SetupInformation.php40
4 files changed, 112 insertions, 0 deletions
diff --git a/lib/classes/JsonApi/RouteMap.php b/lib/classes/JsonApi/RouteMap.php
index 86c6d92..530ae96 100644
--- a/lib/classes/JsonApi/RouteMap.php
+++ b/lib/classes/JsonApi/RouteMap.php
@@ -141,6 +141,7 @@ class RouteMap
$this->addAuthenticatedStudyAreasRoutes($group);
$this->addAuthenticatedUserFilterRoutes($group);
$this->addAuthenticatedWikiRoutes($group);
+ $this->addAuthenticatedSAMLRoutes($group);
}
/**
@@ -743,6 +744,12 @@ class RouteMap
}
+ private function addAuthenticatedSAMLRoutes(RouteCollectorProxy $group): void
+ {
+ $group->get('/saml/configuration', Routes\SAML\ConfigurationShow::class);
+ $group->patch('/saml/configuration', Routes\SAML\ConfigurationUpdate::class);
+ }
+
private function addRelationship(RouteCollectorProxy $group, string $url, string $handler): void
{
$group->map(['GET', 'PATCH', 'POST', 'DELETE'], $url, $handler);
diff --git a/lib/classes/JsonApi/Routes/SAML/ConfigurationShow.php b/lib/classes/JsonApi/Routes/SAML/ConfigurationShow.php
new file mode 100644
index 0000000..e3b9ce3
--- /dev/null
+++ b/lib/classes/JsonApi/Routes/SAML/ConfigurationShow.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace JsonApi\Routes\SAML;
+
+use JsonApi\Errors\AuthorizationFailedException;
+use JsonApi\Routes\Route;
+use Psr\Http\Message\ResponseInterface as Response;
+use Psr\Http\Message\ServerRequestInterface as Request;
+use Studip\SAML\SetupInformation;
+
+class ConfigurationShow extends Route
+{
+ public function __invoke(Request $request, Response $response, array $args): Response
+ {
+ if (!$GLOBALS['perm']->have_perm('root')) {
+ throw new AuthorizationFailedException();
+ }
+
+ $setupInformation = $this->container->get(SetupInformation::class);
+ $config = $setupInformation->getConfiguration();
+
+ return $this->jsonResponse($response, [
+ 'data' => [
+ 'type' => 'saml-configuration',
+ 'id' => '1',
+ 'attributes' => $config,
+ ],
+ ]);
+ }
+} \ No newline at end of file
diff --git a/lib/classes/JsonApi/Routes/SAML/ConfigurationUpdate.php b/lib/classes/JsonApi/Routes/SAML/ConfigurationUpdate.php
new file mode 100644
index 0000000..7845d2d
--- /dev/null
+++ b/lib/classes/JsonApi/Routes/SAML/ConfigurationUpdate.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace JsonApi\Routes\SAML;
+
+use JsonApi\Errors\AuthorizationFailedException;
+use JsonApi\Routes\Route;
+use Psr\Http\Message\ResponseInterface as Response;
+use Psr\Http\Message\ServerRequestInterface as Request;
+use Studip\SAML\SetupInformation;
+
+class ConfigurationUpdate extends Route
+{
+ public function __invoke(Request $request, Response $response, array $args): Response
+ {
+ if (!$GLOBALS['perm']->have_perm('root')) {
+ throw new AuthorizationFailedException();
+ }
+
+ $data = $this->getJsonApiData($request);
+ $attributes = $data['attributes'] ?? [];
+
+ $setupInformation = $this->container->get(SetupInformation::class);
+ $setupInformation->updateConfiguration($attributes);
+
+ $updatedConfig = $setupInformation->getConfiguration();
+
+ return $this->jsonResponse($response, [
+ 'data' => [
+ 'type' => 'saml-configuration',
+ 'id' => '1',
+ 'attributes' => $updatedConfig,
+ ],
+ ]);
+ }
+} \ No newline at end of file
diff --git a/lib/classes/JsonApi/Routes/SAML/SetupInformation.php b/lib/classes/JsonApi/Routes/SAML/SetupInformation.php
new file mode 100644
index 0000000..6dc8f44
--- /dev/null
+++ b/lib/classes/JsonApi/Routes/SAML/SetupInformation.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Studip\SAML;
+
+use Config;
+
+class SetupInformation
+{
+ private const CONFIG_KEY = 'SAML_CONFIG';
+
+ public function getConfiguration(): array
+ {
+ $config = Config::get();
+ $samlConfig = json_decode($config->{self::CONFIG_KEY} ?? '{}', true);
+
+ return [
+ 'entityId' => $samlConfig['entityId'] ?? '',
+ 'assertionConsumerService' => $samlConfig['assertionConsumerService'] ?? '',
+ 'singleLogoutService' => $samlConfig['singleLogoutService'] ?? '',
+ 'nameIdFormat' => $samlConfig['nameIdFormat'] ?? '',
+ 'x509cert' => $samlConfig['x509cert'] ?? '',
+ 'privateKey' => $samlConfig['privateKey'] ?? '',
+ 'security' => [
+ 'authnRequestsSigned' => $samlConfig['security']['authnRequestsSigned'] ?? false,
+ 'wantMessagesSigned' => $samlConfig['security']['wantMessagesSigned'] ?? false,
+ 'wantAssertionsSigned' => $samlConfig['security']['wantAssertionsSigned'] ?? false,
+ ],
+ ];
+ }
+
+ public function updateConfiguration(array $config): void
+ {
+ $existingConfig = $this->getConfiguration();
+ $updatedConfig = array_merge($existingConfig, $config);
+
+ $configInstance = Config::get();
+ $configInstance->{self::CONFIG_KEY} = json_encode($updatedConfig);
+ $configInstance->store(self::CONFIG_KEY, $configInstance->{self::CONFIG_KEY});
+ }
+} \ No newline at end of file