From 85cffe779374db0ca09eaa9b66d747c5334cdb91 Mon Sep 17 00:00:00 2001 From: Hugo Renard <hugo.renard@protonmail.com> Date: Thu, 31 Oct 2024 15:49:08 +0100 Subject: [PATCH] chore: redirect to new repo --- .gitignore | 4 - .gitlab-ci.yml | 10 - .vscode/settings.json | 3 - LICENSE | 201 ------------- README.md | 105 +------ auto.sh | 4 - build.gradle | 28 -- docker-compose.yml | 33 -- docs/container.md | 15 - docs/dependencies.md | 14 - docs/img/event-listener-page.png | Bin 83173 -> 0 bytes docs/img/federation-provider-page.png | Bin 107002 -> 0 bytes docs/installation.md | 21 -- keycloak-scim.iml | 106 ------- .../sh/libre/scim/core/ScimDispatcher.java | 171 ----------- ...ntConfigurationStorageProviderFactory.java | 165 ---------- .../scim/core/ScrimEndPointConfiguration.java | 101 ------- .../InconsistentScimMappingException.java | 7 - ...alidResponseFromScimEndpointException.java | 29 -- .../core/exceptions/RollbackApproach.java | 55 ---- .../core/exceptions/RollbackStrategy.java | 22 -- .../core/exceptions/ScimExceptionHandler.java | 43 --- .../exceptions/ScimPropagationException.java | 12 - .../core/exceptions/SkipOrStopApproach.java | 59 ---- .../core/exceptions/SkipOrStopStrategy.java | 66 ---- .../UnexpectedScimDataException.java | 7 - .../core/service/AbstractScimService.java | 281 ------------------ .../core/service/EntityOnRemoteScimId.java | 6 - .../scim/core/service/GroupScimService.java | 131 -------- .../libre/scim/core/service/KeycloakDao.java | 81 ----- .../libre/scim/core/service/KeycloakId.java | 7 - .../libre/scim/core/service/ScimClient.java | 155 ---------- .../scim/core/service/ScimResourceType.java | 29 -- .../scim/core/service/UserScimService.java | 145 --------- .../ScimBackgroundGroupMembershipUpdater.java | 74 ----- .../scim/event/ScimEventListenerProvider.java | 247 --------------- .../ScimEventListenerProviderFactory.java | 36 --- .../sh/libre/scim/jpa/ScimResourceDao.java | 96 ------ .../sh/libre/scim/jpa/ScimResourceId.java | 83 ------ .../libre/scim/jpa/ScimResourceMapping.java | 89 ------ .../libre/scim/jpa/ScimResourceProvider.java | 29 -- .../scim/jpa/ScimResourceProviderFactory.java | 39 --- .../META-INF/jboss-deployment-structure.xml | 10 - .../META-INF/scim-resource-changelog.xml | 35 --- ...pa.entityprovider.JpaEntityProviderFactory | 1 - ...ycloak.events.EventListenerProviderFactory | 1 - ...eycloak.storage.UserStorageProviderFactory | 1 - 47 files changed, 1 insertion(+), 2856 deletions(-) delete mode 100644 .gitignore delete mode 100644 .gitlab-ci.yml delete mode 100644 .vscode/settings.json delete mode 100644 LICENSE delete mode 100755 auto.sh delete mode 100644 build.gradle delete mode 100644 docker-compose.yml delete mode 100644 docs/container.md delete mode 100644 docs/dependencies.md delete mode 100644 docs/img/event-listener-page.png delete mode 100644 docs/img/federation-provider-page.png delete mode 100644 docs/installation.md delete mode 100644 keycloak-scim.iml delete mode 100644 src/main/java/sh/libre/scim/core/ScimDispatcher.java delete mode 100644 src/main/java/sh/libre/scim/core/ScimEndpointConfigurationStorageProviderFactory.java delete mode 100644 src/main/java/sh/libre/scim/core/ScrimEndPointConfiguration.java delete mode 100644 src/main/java/sh/libre/scim/core/exceptions/InconsistentScimMappingException.java delete mode 100644 src/main/java/sh/libre/scim/core/exceptions/InvalidResponseFromScimEndpointException.java delete mode 100644 src/main/java/sh/libre/scim/core/exceptions/RollbackApproach.java delete mode 100644 src/main/java/sh/libre/scim/core/exceptions/RollbackStrategy.java delete mode 100644 src/main/java/sh/libre/scim/core/exceptions/ScimExceptionHandler.java delete mode 100644 src/main/java/sh/libre/scim/core/exceptions/ScimPropagationException.java delete mode 100644 src/main/java/sh/libre/scim/core/exceptions/SkipOrStopApproach.java delete mode 100644 src/main/java/sh/libre/scim/core/exceptions/SkipOrStopStrategy.java delete mode 100644 src/main/java/sh/libre/scim/core/exceptions/UnexpectedScimDataException.java delete mode 100644 src/main/java/sh/libre/scim/core/service/AbstractScimService.java delete mode 100644 src/main/java/sh/libre/scim/core/service/EntityOnRemoteScimId.java delete mode 100644 src/main/java/sh/libre/scim/core/service/GroupScimService.java delete mode 100644 src/main/java/sh/libre/scim/core/service/KeycloakDao.java delete mode 100644 src/main/java/sh/libre/scim/core/service/KeycloakId.java delete mode 100644 src/main/java/sh/libre/scim/core/service/ScimClient.java delete mode 100644 src/main/java/sh/libre/scim/core/service/ScimResourceType.java delete mode 100644 src/main/java/sh/libre/scim/core/service/UserScimService.java delete mode 100644 src/main/java/sh/libre/scim/event/ScimBackgroundGroupMembershipUpdater.java delete mode 100644 src/main/java/sh/libre/scim/event/ScimEventListenerProvider.java delete mode 100644 src/main/java/sh/libre/scim/event/ScimEventListenerProviderFactory.java delete mode 100644 src/main/java/sh/libre/scim/jpa/ScimResourceDao.java delete mode 100644 src/main/java/sh/libre/scim/jpa/ScimResourceId.java delete mode 100644 src/main/java/sh/libre/scim/jpa/ScimResourceMapping.java delete mode 100644 src/main/java/sh/libre/scim/jpa/ScimResourceProvider.java delete mode 100644 src/main/java/sh/libre/scim/jpa/ScimResourceProviderFactory.java delete mode 100644 src/main/resources/META-INF/jboss-deployment-structure.xml delete mode 100644 src/main/resources/META-INF/scim-resource-changelog.xml delete mode 100644 src/main/resources/META-INF/services/org.keycloak.connections.jpa.entityprovider.JpaEntityProviderFactory delete mode 100644 src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory delete mode 100644 src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 0a76f5b..0000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/build -/bin -/.idea -/.gradle \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 99347f1..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,10 +0,0 @@ -package: - image: - name: gradle:jdk17 - script: - - gradle jar shadowjar - artifacts: - paths: - - build/libs/keycloak-scim-1.0-SNAPSHOT.jar - - build/libs/keycloak-scim-1.0-SNAPSHOT-all.jar - - build/libs/keycloak-scim-1.0-SNAPSHOT-all-legacy.jar diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index e0f15db..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "java.configuration.updateBuildConfiguration": "automatic" -} \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index ff4ec16..0000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2022 libre.sh / scim - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md index 785758b..766de55 100644 --- a/README.md +++ b/README.md @@ -1,104 +1 @@ -# keycloak-scim-client - -This extension add [SCIM2](http://www.simplecloud.info) client capabilities to Keycloak. - -It allows to : - -* Declare SCIM endpoints (through the identity federation UI). Any tool implementing SCIM protocol can be wired to the - Keycloack instance through this declaration. -* Propagate users and groups from Keycloack to SCIM endpoints : when a user/group gets created or modified in Keycloack, - the modification is fowarded to all declared SCIM endpoints through SCIM calls within the transaction scope. If - propagation fails, changes can be rolled back or not according to a configurable rollback strategy. -* Import users and groups from SCIM endpoints (through the Keycloack synchronization mechanism). - -See [RFC7643](https://datatracker.ietf.org/doc/html/rfc7643) -and [RFC7644](https://datatracker.ietf.org/doc/html/rfc7644)) for further details - -## Overview - -### Motivation - -We want to build a unified collaborative platform based on multiple applications. To do that, we need a way to propagate -immediately changes made in Keycloak to all these applications. And we want to keep using OIDC or SAML as the -authentication protocol. - -This will allow users to collaborate seamlessly across the platform without requiring every user to have connected once -to each application. This will also ease GDRP compliance because deleting a user in Keycloak will delete the user from -every app. The SCIM protocol is standard, comprehensible and easy to implement. It's a perfect fit for our goal. - -We chose to build application extensions/plugins because it's easier to deploy and thus will benefit to a larger portion -of the FOSS community. - -#### Keycloak specific - -This extension uses 3 concepts in KeyCloack : - -- Event Listener : used to listen for changes within Keycloack (e.g. User creation, Group deletion...) and propagate - them to registered SCIM service providers through SCIM requests. -- Federation Provider : used to set up all the SCIM service providers endpoint without creating our own UI. -- JPA Entity Provider : used to save the mapping between the local IDs and the service providers IDs. - -## Usage - -### Development mode - -From the repository root : - -* Launch the docker-compose image (composed of a postgre and keycloack instance runing on localhost:8080) : - ``docker compose up -d`` -* Execute ``gradle jar shadowJar && docker compose restart keycloak`` to build extension and update the Keycloack - instance -* You can access extension logs through ``docker compose logs -f`` - -### Installation - -1. Download - the [latest version](https://lab.libreho.st/libre.sh/scim/keycloak-scim/-/jobs/artifacts/main/raw/build/libs/keycloak-scim-1.0-SNAPSHOT-all.jar?job=package) -2. Put it in `/opt/keycloak/providers/`. - -It's also possible to build your own custom image if you run Keycloak in a [container](/docs/container.md). - -Other [installation options](/docs/installation.md) are available. - -### Setup - -#### Enable SCIM Event listeners - -1. Go to `Admin Console > Events > Config`. -2. Add `scim` in `Event Listeners`. -3. Save. - - - -#### Register SCIM Service Providers - -1. Go to `Admin Console > Realm Settings > Events`. -2. Add `scim` to the list of event listers -3. Save - - - -### Configuration - -Add the endpoint - for a local set up you have to add the two containers in a docker network and use the container ip -see [here](https://docs.docker.com/engine/reference/commandline/network/) -If you use the [rocketchat app](https://lab.libreho.st/libre.sh/scim/rocketchat-scim) you get the endpoint from your -rocket Chat Scim Adapter App Details. -Endpoint content type is application/json. -Auth mode Bearer or None for local test setup. -Copy the bearer token from your app details in rocketchat. - -If you enable import during sync then you can choose between to following import actions: - -- Create Local - adds users to keycloak -- Nothing -- Delete Remote - deletes users from the remote application - -### Sync - -You can set up a periodic sync for all users or just changed users - it's not mandatory. You can either do: - -- Periodic Full Sync -- Periodic Changed User Sync - -**[License AGPL](/LICENSE)** +Moved to https://forge.libre.sh/libre.sh/keycloak-scim. \ No newline at end of file diff --git a/auto.sh b/auto.sh deleted file mode 100755 index 884ba67..0000000 --- a/auto.sh +++ /dev/null @@ -1,4 +0,0 @@ -gradle jar shadowjar -scp build/libs/keycloak-scim-1.0-SNAPSHOT-all.jar root@192.168.130.252:/var/www/html/keycloak-scim-1.0-SNAPSHOT-all.jar -scp build/libs/keycloak-scim-1.0-SNAPSHOT-all.jar root@192.168.130.252:/var/www/html/keycloak-scim-aws-1.0-SNAPSHOT-all.jar -k delete pod keycloak-keycloakx-0 -n keycloak diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 7897ff6..0000000 --- a/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -plugins { - id 'java' - id 'com.github.johnrengelman.shadow' version '8.1.1' - id "org.sonarqube" version "5.1.0.4882" - id "com.github.ben-manes.versions" version "0.51.0" -} - -group = 'sh.libre.scim' -version = '1.0-SNAPSHOT' -description = 'keycloak-scim' - -java.sourceCompatibility = JavaVersion.VERSION_17 - -repositories { - mavenLocal() - mavenCentral() -} - -dependencies { - compileOnly 'org.keycloak:keycloak-core:26.0.1' - compileOnly 'org.keycloak:keycloak-server-spi:26.0.1' - compileOnly 'org.keycloak:keycloak-server-spi-private:26.0.1' - compileOnly 'org.keycloak:keycloak-services:26.0.1' - compileOnly 'org.keycloak:keycloak-model-jpa:26.0.1' - implementation 'io.github.resilience4j:resilience4j-retry:2.2.0' - implementation 'de.captaingoldfish:scim-sdk-common:1.26.0' - implementation 'de.captaingoldfish:scim-sdk-client:1.26.0' -} diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 43e4f3a..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,33 +0,0 @@ -version: "3" - -services: - postgres: - image: postgres - volumes: - - db:/var/lib/postgresql/data - environment: - POSTGRES_USER: keycloak - POSTGRES_PASSWORD: keycloak - ports: - - 5432:5432 - keycloak: - image: quay.io/keycloak/keycloak:26.0.1 - build: . - command: start-dev - volumes: - - ./build/libs/keycloak-scim-1.0-SNAPSHOT-all.jar:/opt/keycloak/providers/keycloak-scim-1.0-SNAPSHOT-all.jar - environment: - KC_DB: postgres - KC_DB_URL_HOST: postgres - KC_DB_USERNAME: keycloak - KC_DB_PASSWORD: keycloak - KEYCLOAK_ADMIN: admin - KEYCLOAK_ADMIN_PASSWORD: admin - KC_LOG_LEVEL: INFO,sh.libre.scim:debug,de.captaingoldfish.scim:debug - ports: - - 127.0.0.1:8080:8080 - depends_on: - - postgres - -volumes: - db: diff --git a/docs/container.md b/docs/container.md deleted file mode 100644 index 086b87f..0000000 --- a/docs/container.md +++ /dev/null @@ -1,15 +0,0 @@ -# Container - -## Quarkus - -``` -FROM quay.io/keycloak/keycloak as builder -RUN curl "https://lab.libreho.st/libre.sh/scim/keycloak-scim/-/jobs/artifacts/main/raw/build/libs/keycloak-scim-1.0-SNAPSHOT-all.jar?job=package" -Lo /opt/keycloak/providers/keycloak-scim-1.0-SNAPSHOT-all.jar -RUN /opt/keycloak/bin/kc.sh build - -FROM quay.io/keycloak/keycloak -COPY --from=builder /opt/keycloak/ /opt/keycloak/ -WORKDIR /opt/keycloak -ENTRYPOINT ["/opt/keycloak/bin/kc.sh"] -CMD ["start"] -``` diff --git a/docs/dependencies.md b/docs/dependencies.md deleted file mode 100644 index 424136e..0000000 --- a/docs/dependencies.md +++ /dev/null @@ -1,14 +0,0 @@ -# Dependencies - -| Name | Version | Quarkus | Wildfly | Download | -| --- | --- | --- | --- | --- | -| io.github.resilience4j:resilience4j-retry | 1.7.1 | X | X | [link](https://repo1.maven.org/maven2/io/github/resilience4j/resilience4j-retry/1.7.1/resilience4j-retry-1.7.1.jar) | -| io.github.resilience4j:resilience4j-core | 1.7.1 | X | X | [link](https://repo1.maven.org/maven2/io/github/resilience4j/resilience4j-core/1.7.1/resilience4j-core-1.7.1.jar) | -| io.vavr:vavr | 0.10.2 | X | X | [link](https://repo1.maven.org/maven2/io/vavr/vavr/0.10.2/vavr-0.10.2.jar) | -| io.vavr:vavr-match | 0.10.2 | X | X | [link](https://repo1.maven.org/maven2/io/vavr/vavr-match/0.10.2/vavr-match-0.10.2.jar) | -| org.slf4j:slf4j-api | 1.7.30 | X | X | [link](https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar) | -| com.unboundid.product.scim2:scim2-sdk-client | 2.3.7 | X | X | [link](https://repo1.maven.org/maven2/com/unboundid/product/scim2/scim2-sdk-client/2.3.7/scim2-sdk-client-2.3.7.jar) | -| com.unboundid.product.scim2:scim2-sdk-common | 2.3.7 | X | X | [link](https://repo1.maven.org/maven2/com/unboundid/product/scim2/scim2-sdk-common/2.3.7/scim2-sdk-common-2.3.7.jar) | -| org.wildfly.client:wildfly-client-config | 1.0.1.Final | X | | [link](https://repo1.maven.org/maven2/org/wildfly/client/wildfly-client-config/1.0.1.Final/wildfly-client-config-1.0.1.Final.jar) | -| org.jboss.resteasy:resteasy-client | 4.7.6.Final | X | | [link](https://repo1.maven.org/maven2/org/jboss/resteasy/resteasy-client/4.7.6.Final/resteasy-client-4.7.6.Final.jar) | -| org.jboss.resteasy:resteasy-client-api | 4.7.6.Final | X | | [link](https://repo1.maven.org/maven2/org/jboss/resteasy/resteasy-client-api/4.7.6.Final/resteasy-client-api-4.7.6.Final.jar) | \ No newline at end of file diff --git a/docs/img/event-listener-page.png b/docs/img/event-listener-page.png deleted file mode 100644 index 5c45734c68fcc9ecfe558cd84fb571c8fcffb20f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83173 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%0ALz23~= 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 diff --git a/docs/img/federation-provider-page.png b/docs/img/federation-provider-page.png deleted file mode 100644 index 390128f581b6bca7ea04d272ab71299788a99f79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107002 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%0A>EGsKB0{T`dw_!;zKx<BW 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 ZrpIsX$1*sAv&nl>BrlwOdiv7M{{kbBmK^{9 diff --git a/docs/installation.md b/docs/installation.md deleted file mode 100644 index c79919c..0000000 --- a/docs/installation.md +++ /dev/null @@ -1,21 +0,0 @@ -# Installation (advanced) - -## 1. Download the jar files - -### All-in-one - -This [package](<(https://lab.libreho.st/libre.sh/scim/keycloak-scim/-/jobs/artifacts/main/raw/build/libs/keycloak-scim-1.0-SNAPSHOT-all.jar?job=package)>) contains the SCIM provider and it's dependencies. It's intended only for Quarkus distribution. - -### Separately - -You'll need the SCIM provider's [package](<(https://lab.libreho.st/libre.sh/scim/keycloak-scim/-/jobs/artifacts/main/raw/build/libs/keycloak-scim-1.0-SNAPSHOT.jar?job=package)>) and each of its [dependencies](dependencies.md). - -## 2. Install the jar files - -### Quarkus - -Copy the downloaded file in `/opt/keycloak/providers/`. For production use, build Keycloak before starting it. - -### Wildfly (legacy) - -Copy the downloaded file in `/opt/jboss/keycloak/standalone/deployments/`. diff --git a/keycloak-scim.iml b/keycloak-scim.iml deleted file mode 100644 index 414103a..0000000 --- a/keycloak-scim.iml +++ /dev/null @@ -1,106 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> - <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11"> - <output url="file://$MODULE_DIR$/target/classes" /> - <output-test url="file://$MODULE_DIR$/target/test-classes" /> - <content url="file://$MODULE_DIR$"> - <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> - <excludeFolder url="file://$MODULE_DIR$/target" /> - </content> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.keycloak:keycloak-core:16.1.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.keycloak:keycloak-common:16.1.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.bouncycastle:bcprov-jdk15on:1.68" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.68" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.keycloak:keycloak-server-spi:16.1.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.keycloak:keycloak-server-spi-private:16.1.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.github.ua-parser:uap-java:1.4.3" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.20" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.keycloak:keycloak-services:16.1.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.sun.mail:jakarta.mail:1.6.5" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.glassfish:jakarta.json:1.1.6" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.twitter4j:twitter4j-core:4.0.7" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec:2.0.1.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.spec.javax.transaction:jboss-transaction-api_1.3_spec:2.0.0.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20211018.2" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.google.zxing:javase:3.4.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.google.zxing:core:3.4.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.github.jai-imageio:jai-imageio-core:1.4.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.openshift:openshift-restclient-java:8.0.0.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.squareup.okhttp3:okhttp:3.14.2" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.squareup.okio:okio:1.17.2" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss:jboss-dmr:1.3.0.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-compress:1.18" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:slf4j-log4j12:1.6.4" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: log4j:log4j:1.2.16" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: commons-lang:commons-lang:2.6" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.webauthn4j:webauthn4j-core:0.12.0.RELEASE" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.webauthn4j:webauthn4j-util:0.12.0.RELEASE" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.kerby:kerby-asn1:2.0.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.11.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.keycloak:keycloak-model-jpa:16.1.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.liquibase:liquibase-core:3.5.5" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: jakarta.persistence:jakarta.persistence-api:2.2.3" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.hibernate:hibernate-core:5.3.20.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: javax.persistence:javax.persistence-api:2.2" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.javassist:javassist:3.23.2-GA" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: net.bytebuddy:byte-buddy:1.9.11" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: antlr:antlr:2.7.7" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss:jandex:2.0.5.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml:classmate:1.3.4" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.dom4j:dom4j:2.1.3" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.hibernate.common:hibernate-commons-annotations:5.0.4.Final" level="project" /> - <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" /> - <orderEntry type="library" name="Maven: com.unboundid.product.scim2:scim2-sdk-client:2.3.7" level="project" /> - <orderEntry type="library" name="Maven: com.unboundid.product.scim2:scim2-sdk-common:2.3.7" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: javax.ws.rs:javax.ws.rs-api:2.1.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: javax.xml.bind:jaxb-api:2.3.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-core:2.12.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.12.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.12.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.12.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.2" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: jakarta.activation:jakarta.activation-api:1.2.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.12.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.12.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:2.12.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.resteasy:resteasy-jaxrs:3.15.1.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.spec.javax.xml.bind:jboss-jaxb-api_2.3_spec:2.0.1.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: jakarta.validation:jakarta.validation-api:2.0.2" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec:2.0.1.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: commons-logging:commons-logging:1.2" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: commons-io:commons-io:2.5" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.github.stephenc.jcip:jcip-annotations:1.0-1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.resteasy:resteasy-multipart-provider:3.15.1.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.james:apache-mime4j:0.6" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.resteasy:resteasy-jackson2-provider:3.15.1.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.github.fge:json-patch:1.9" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.github.fge:jackson-coreutils:1.6" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.github.fge:msg-simple:1.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.github.fge:btf:1.2" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:28.1-jre" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.checkerframework:checker-qual:2.8.1" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.resteasy:resteasy-jaxb-provider:3.15.1.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.glassfish.jaxb:jaxb-runtime:2.3.3-b02" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.glassfish.jaxb:txw2:2.3.3-b02" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: com.sun.istack:istack-commons-runtime:3.0.10" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: org.jboss.resteasy:resteasy-client:3.15.1.Final" level="project" /> - <orderEntry type="library" scope="PROVIDED" name="Maven: commons-codec:commons-codec:1.15" level="project" /> - <orderEntry type="library" name="Maven: io.github.resilience4j:resilience4j-retry:1.7.0" level="project" /> - <orderEntry type="library" name="Maven: io.vavr:vavr:0.10.2" level="project" /> - <orderEntry type="library" name="Maven: io.vavr:vavr-match:0.10.2" level="project" /> - <orderEntry type="library" name="Maven: io.github.resilience4j:resilience4j-core:1.7.0" level="project" /> - </component> -</module> \ No newline at end of file diff --git a/src/main/java/sh/libre/scim/core/ScimDispatcher.java b/src/main/java/sh/libre/scim/core/ScimDispatcher.java deleted file mode 100644 index d3d6751..0000000 --- a/src/main/java/sh/libre/scim/core/ScimDispatcher.java +++ /dev/null @@ -1,171 +0,0 @@ -package sh.libre.scim.core; - -import org.jboss.logging.Logger; -import org.keycloak.component.ComponentModel; -import org.keycloak.models.KeycloakSession; -import sh.libre.scim.core.exceptions.ScimExceptionHandler; -import sh.libre.scim.core.exceptions.ScimPropagationException; -import sh.libre.scim.core.exceptions.SkipOrStopApproach; -import sh.libre.scim.core.exceptions.SkipOrStopStrategy; -import sh.libre.scim.core.service.AbstractScimService; -import sh.libre.scim.core.service.GroupScimService; -import sh.libre.scim.core.service.UserScimService; - -import java.util.ArrayList; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; - -/** - * In charge of sending SCIM Request to all registered Scim endpoints. - */ -public class ScimDispatcher { - - private static final Logger LOGGER = Logger.getLogger(ScimDispatcher.class); - - private final KeycloakSession session; - private final ScimExceptionHandler exceptionHandler; - private final SkipOrStopStrategy skipOrStopStrategy; - private boolean clientsInitialized = false; - private final List<UserScimService> userScimServices = new ArrayList<>(); - private final List<GroupScimService> groupScimServices = new ArrayList<>(); - - - public ScimDispatcher(KeycloakSession session) { - this.session = session; - this.exceptionHandler = new ScimExceptionHandler(session); - // By default, use a permissive Skip or Stop strategy - this.skipOrStopStrategy = SkipOrStopApproach.ALWAYS_SKIP_AND_CONTINUE; - } - - /** - * Lists all active ScimStorageProviderFactory and create new ScimClients for each of them - */ - public void refreshActiveScimEndpoints() { - // Step 1: close existing clients (as configuration may have changed) - groupScimServices.forEach(GroupScimService::close); - groupScimServices.clear(); - userScimServices.forEach(UserScimService::close); - userScimServices.clear(); - - // Step 2: Get All SCIM endpoints defined in Admin Console (enabled ScimStorageProviderFactory) - session.getContext().getRealm().getComponentsStream() - .filter(m -> ScimEndpointConfigurationStorageProviderFactory.ID.equals(m.getProviderId()) - && m.get("enabled", true)) - .forEach(scimEndpointConfigurationRaw -> { - try { - ScrimEndPointConfiguration scrimEndPointConfiguration = new ScrimEndPointConfiguration(scimEndpointConfigurationRaw); - - // Step 3 : create scim clients for each endpoint - if (scimEndpointConfigurationRaw.get(ScrimEndPointConfiguration.CONF_KEY_PROPAGATION_GROUP, false)) { - GroupScimService groupScimService = new GroupScimService(session, scrimEndPointConfiguration, skipOrStopStrategy); - groupScimServices.add(groupScimService); - } - if (scimEndpointConfigurationRaw.get(ScrimEndPointConfiguration.CONF_KEY_PROPAGATION_USER, false)) { - UserScimService userScimService = new UserScimService(session, scrimEndPointConfiguration, skipOrStopStrategy); - userScimServices.add(userScimService); - } - } catch (IllegalArgumentException e) { - if (skipOrStopStrategy.allowInvalidEndpointConfiguration()) { - LOGGER.warn("[SCIM] Invalid Endpoint configuration " + scimEndpointConfigurationRaw.getId(), e); - } else { - throw e; - } - } - }); - } - - public void dispatchUserModificationToAll(SCIMPropagationConsumer<UserScimService> operationToDispatch) { - initializeClientsIfNeeded(); - Set<UserScimService> servicesCorrectlyPropagated = new LinkedHashSet<>(); - userScimServices.forEach(userScimService -> { - try { - operationToDispatch.acceptThrows(userScimService); - servicesCorrectlyPropagated.add(userScimService); - } catch (ScimPropagationException e) { - exceptionHandler.handleException(userScimService.getConfiguration(), e); - } - }); - // TODO we could iterate on servicesCorrectlyPropagated to undo modification on already handled SCIM endpoints - LOGGER.infof("[SCIM] User operation dispatched to %d SCIM server", servicesCorrectlyPropagated.size()); - } - - public void dispatchGroupModificationToAll(SCIMPropagationConsumer<GroupScimService> operationToDispatch) { - initializeClientsIfNeeded(); - Set<GroupScimService> servicesCorrectlyPropagated = new LinkedHashSet<>(); - groupScimServices.forEach(groupScimService -> { - try { - operationToDispatch.acceptThrows(groupScimService); - servicesCorrectlyPropagated.add(groupScimService); - } catch (ScimPropagationException e) { - exceptionHandler.handleException(groupScimService.getConfiguration(), e); - } - }); - // TODO we could iterate on servicesCorrectlyPropagated to undo modification on already handled SCIM endpoints - LOGGER.infof("[SCIM] Group operation dispatched to %d SCIM server", servicesCorrectlyPropagated.size()); - } - - public void dispatchUserModificationToOne(ComponentModel scimServerConfiguration, SCIMPropagationConsumer<UserScimService> operationToDispatch) { - initializeClientsIfNeeded(); - // Scim client should already have been created - Optional<UserScimService> matchingClient = userScimServices.stream().filter(u -> u.getConfiguration().getId().equals(scimServerConfiguration.getId())).findFirst(); - if (matchingClient.isPresent()) { - try { - operationToDispatch.acceptThrows(matchingClient.get()); - LOGGER.infof("[SCIM] User operation dispatched to SCIM server %s", matchingClient.get().getConfiguration().getName()); - } catch (ScimPropagationException e) { - exceptionHandler.handleException(matchingClient.get().getConfiguration(), e); - } - } else { - LOGGER.error("[SCIM] Could not find a Scim Client matching User endpoint configuration" + scimServerConfiguration.getId()); - } - } - - - public void dispatchGroupModificationToOne(ComponentModel scimServerConfiguration, SCIMPropagationConsumer<GroupScimService> operationToDispatch) { - initializeClientsIfNeeded(); - // Scim client should already have been created - Optional<GroupScimService> matchingClient = groupScimServices.stream().filter(u -> u.getConfiguration().getId().equals(scimServerConfiguration.getId())).findFirst(); - if (matchingClient.isPresent()) { - try { - operationToDispatch.acceptThrows(matchingClient.get()); - LOGGER.infof("[SCIM] Group operation dispatched to SCIM server %s", matchingClient.get().getConfiguration().getName()); - } catch (ScimPropagationException e) { - exceptionHandler.handleException(matchingClient.get().getConfiguration(), e); - } - } else { - LOGGER.error("[SCIM] Could not find a Scim Client matching Group endpoint configuration" + scimServerConfiguration.getId()); - } - } - - public void close() { - for (GroupScimService c : groupScimServices) { - c.close(); - } - for (UserScimService c : userScimServices) { - c.close(); - } - groupScimServices.clear(); - userScimServices.clear(); - } - - private void initializeClientsIfNeeded() { - if (!clientsInitialized) { - clientsInitialized = true; - refreshActiveScimEndpoints(); - } - } - - /** - * A Consumer that throws ScimPropagationException. - * - * @param <T> An {@link AbstractScimService to call} - */ - @FunctionalInterface - public interface SCIMPropagationConsumer<T> { - - void acceptThrows(T elem) throws ScimPropagationException; - - } -} diff --git a/src/main/java/sh/libre/scim/core/ScimEndpointConfigurationStorageProviderFactory.java b/src/main/java/sh/libre/scim/core/ScimEndpointConfigurationStorageProviderFactory.java deleted file mode 100644 index b73df47..0000000 --- a/src/main/java/sh/libre/scim/core/ScimEndpointConfigurationStorageProviderFactory.java +++ /dev/null @@ -1,165 +0,0 @@ -package sh.libre.scim.core; - -import de.captaingoldfish.scim.sdk.common.constants.HttpHeader; -import jakarta.ws.rs.core.MediaType; -import org.apache.commons.lang3.BooleanUtils; -import org.jboss.logging.Logger; -import org.keycloak.component.ComponentModel; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.KeycloakSessionFactory; -import org.keycloak.models.RealmModel; -import org.keycloak.models.utils.KeycloakModelUtils; -import org.keycloak.provider.ProviderConfigProperty; -import org.keycloak.provider.ProviderConfigurationBuilder; -import org.keycloak.storage.UserStorageProvider; -import org.keycloak.storage.UserStorageProviderFactory; -import org.keycloak.storage.UserStorageProviderModel; -import org.keycloak.storage.user.ImportSynchronization; -import org.keycloak.storage.user.SynchronizationResult; -import sh.libre.scim.event.ScimBackgroundGroupMembershipUpdater; - -import java.util.Date; -import java.util.List; - -/** - * Allows to register and configure Scim endpoints through Admin console, using the provided config properties. - */ -public class ScimEndpointConfigurationStorageProviderFactory - implements UserStorageProviderFactory<ScimEndpointConfigurationStorageProviderFactory.ScimEndpointConfigurationStorageProvider>, ImportSynchronization { - public static final String ID = "scim"; - private static final Logger LOGGER = Logger.getLogger(ScimEndpointConfigurationStorageProviderFactory.class); - - @Override - public String getId() { - return ID; - } - - - @Override - public SynchronizationResult sync(KeycloakSessionFactory sessionFactory, String realmId, - UserStorageProviderModel model) { - // Manually Launch a synchronization between keycloack and the SCIM endpoint described in the given model - LOGGER.infof("[SCIM] Sync from ScimStorageProvider - Realm %s - Model %s", realmId, model.getName()); - SynchronizationResult result = new SynchronizationResult(); - KeycloakModelUtils.runJobInTransaction(sessionFactory, session -> { - RealmModel realm = session.realms().getRealm(realmId); - session.getContext().setRealm(realm); - ScimDispatcher dispatcher = new ScimDispatcher(session); - if (BooleanUtils.TRUE.equals(model.get(ScrimEndPointConfiguration.CONF_KEY_PROPAGATION_USER))) { - dispatcher.dispatchUserModificationToOne(model, client -> client.sync(result)); - } - if (BooleanUtils.TRUE.equals(model.get(ScrimEndPointConfiguration.CONF_KEY_PROPAGATION_GROUP))) { - dispatcher.dispatchGroupModificationToOne(model, client -> client.sync(result)); - } - dispatcher.close(); - }); - return result; - } - - @Override - public SynchronizationResult syncSince(Date lastSync, KeycloakSessionFactory sessionFactory, String realmId, - UserStorageProviderModel model) { - return this.sync(sessionFactory, realmId, model); - } - - @Override - public void postInit(KeycloakSessionFactory factory) { - ScimBackgroundGroupMembershipUpdater scimBackgroundGroupMembershipUpdater = new ScimBackgroundGroupMembershipUpdater(factory); - scimBackgroundGroupMembershipUpdater.startBackgroundUpdates(); - } - - @Override - public List<ProviderConfigProperty> getConfigProperties() { - // These Config Properties will be use to generate configuration page in Admin Console - return ProviderConfigurationBuilder.create() - .property() - .name(ScrimEndPointConfiguration.CONF_KEY_ENDPOINT) - .type(ProviderConfigProperty.STRING_TYPE) - .required(true) - .label("SCIM 2.0 endpoint") - .helpText("External SCIM 2.0 base " + - "URL (/ServiceProviderConfig /Schemas and /ResourcesTypes should be accessible)") - .add() - .property() - .name(ScrimEndPointConfiguration.CONF_KEY_CONTENT_TYPE) - .type(ProviderConfigProperty.LIST_TYPE) - .label("Endpoint content type") - .helpText("Only used when endpoint doesn't support application/scim+json") - .options(MediaType.APPLICATION_JSON, HttpHeader.SCIM_CONTENT_TYPE) - .defaultValue(HttpHeader.SCIM_CONTENT_TYPE) - .add() - .property() - .name(ScrimEndPointConfiguration.CONF_KEY_AUTH_MODE) - .type(ProviderConfigProperty.LIST_TYPE) - .label("Auth mode") - .helpText("Select the authorization mode") - .options("NONE", "BASIC_AUTH", "BEARER") - .defaultValue("NONE") - .add() - .property() - .name(ScrimEndPointConfiguration.CONF_KEY_AUTH_USER) - .type(ProviderConfigProperty.STRING_TYPE) - .label("Auth username") - .helpText("Required for basic authentication.") - .add() - .property() - .name(ScrimEndPointConfiguration.CONF_KEY_AUTH_PASSWORD) - .type(ProviderConfigProperty.PASSWORD) - .label("Auth password/token") - .helpText("Password or token required for basic or bearer authentication.") - .add() - .property() - .name(ScrimEndPointConfiguration.CONF_KEY_PROPAGATION_USER) - .type(ProviderConfigProperty.BOOLEAN_TYPE) - .label("Enable user propagation") - .helpText("Should operation on users be propagated to this provider?") - .defaultValue(BooleanUtils.TRUE) - .add() - .property() - .name(ScrimEndPointConfiguration.CONF_KEY_PROPAGATION_GROUP) - .type(ProviderConfigProperty.BOOLEAN_TYPE) - .label("Enable group propagation") - .helpText("Should operation on groups be propagated to this provider?") - .defaultValue(BooleanUtils.TRUE) - .add() - .property() - .name(ScrimEndPointConfiguration.CONF_KEY_SYNC_IMPORT) - .type(ProviderConfigProperty.BOOLEAN_TYPE) - .label("Enable import during sync") - .add() - .property() - .name(ScrimEndPointConfiguration.CONF_KEY_SYNC_IMPORT_ACTION) - .type(ProviderConfigProperty.LIST_TYPE) - .label("Import action") - .helpText("What to do when the user doesn't exists in Keycloak.") - .options("NOTHING", "CREATE_LOCAL", "DELETE_REMOTE") - .defaultValue("CREATE_LOCAL") - .add() - .property() - .name(ScrimEndPointConfiguration.CONF_KEY_SYNC_REFRESH) - .type(ProviderConfigProperty.BOOLEAN_TYPE) - .label("Enable refresh during sync") - .name(ScrimEndPointConfiguration.CONF_KEY_LOG_ALL_SCIM_REQUESTS) - .type(ProviderConfigProperty.BOOLEAN_TYPE) - .label("Log SCIM requests and responses") - .helpText("If true, all sent SCIM requests and responses will be logged") - .add() - .build(); - } - - - @Override - public ScimEndpointConfigurationStorageProvider create(KeycloakSession session, ComponentModel model) { - return new ScimEndpointConfigurationStorageProvider(); - } - - /** - * Empty implementation : we used this {@link ScimEndpointConfigurationStorageProviderFactory} to generate Admin Console page. - */ - public static final class ScimEndpointConfigurationStorageProvider implements UserStorageProvider { - @Override - public void close() { - // Nothing to close here - } - } -} diff --git a/src/main/java/sh/libre/scim/core/ScrimEndPointConfiguration.java b/src/main/java/sh/libre/scim/core/ScrimEndPointConfiguration.java deleted file mode 100644 index 6359b57..0000000 --- a/src/main/java/sh/libre/scim/core/ScrimEndPointConfiguration.java +++ /dev/null @@ -1,101 +0,0 @@ -package sh.libre.scim.core; - -import de.captaingoldfish.scim.sdk.client.http.BasicAuth; -import org.keycloak.component.ComponentModel; - -public class ScrimEndPointConfiguration { - // Configuration keys : also used in Admin Console page - public static final String CONF_KEY_AUTH_MODE = "auth-mode"; - public static final String CONF_KEY_AUTH_PASSWORD = "auth-pass"; - public static final String CONF_KEY_AUTH_USER = "auth-user"; - public static final String CONF_KEY_CONTENT_TYPE = "content-type"; - public static final String CONF_KEY_ENDPOINT = "endpoint"; - public static final String CONF_KEY_SYNC_IMPORT_ACTION = "sync-import-action"; - public static final String CONF_KEY_SYNC_IMPORT = "sync-import"; - public static final String CONF_KEY_SYNC_REFRESH = "sync-refresh"; - public static final String CONF_KEY_PROPAGATION_USER = "propagation-user"; - public static final String CONF_KEY_PROPAGATION_GROUP = "propagation-group"; - public static final String CONF_KEY_LOG_ALL_SCIM_REQUESTS = "log-all-scim-requests"; - - private final String endPoint; - private final String id; - private final String name; - private final String contentType; - private final String authorizationHeaderValue; - private final ImportAction importAction; - private final boolean pullFromScimSynchronisationActivated; - private final boolean pushToScimSynchronisationActivated; - private final boolean logAllScimRequests; - - public ScrimEndPointConfiguration(ComponentModel scimProviderConfiguration) { - try { - AuthMode authMode = AuthMode.valueOf(scimProviderConfiguration.get(CONF_KEY_AUTH_MODE)); - - authorizationHeaderValue = switch (authMode) { - case BEARER -> "Bearer " + scimProviderConfiguration.get(CONF_KEY_AUTH_PASSWORD); - case BASIC_AUTH -> { - BasicAuth basicAuth = BasicAuth.builder() - .username(scimProviderConfiguration.get(CONF_KEY_AUTH_USER)) - .password(scimProviderConfiguration.get(CONF_KEY_AUTH_PASSWORD)) - .build(); - yield basicAuth.getAuthorizationHeaderValue(); - } - case NONE -> ""; - }; - contentType = scimProviderConfiguration.get(CONF_KEY_CONTENT_TYPE, ""); - endPoint = scimProviderConfiguration.get(CONF_KEY_ENDPOINT, ""); - id = scimProviderConfiguration.getId(); - name = scimProviderConfiguration.getName(); - importAction = ImportAction.valueOf(scimProviderConfiguration.get(CONF_KEY_SYNC_IMPORT_ACTION)); - pullFromScimSynchronisationActivated = scimProviderConfiguration.get(CONF_KEY_SYNC_IMPORT, false); - pushToScimSynchronisationActivated = scimProviderConfiguration.get(CONF_KEY_SYNC_REFRESH, false); - logAllScimRequests = scimProviderConfiguration.get(CONF_KEY_LOG_ALL_SCIM_REQUESTS, false); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("authMode '" + scimProviderConfiguration.get(CONF_KEY_AUTH_MODE) + "' is not supported"); - } - } - - public boolean isPushToScimSynchronisationActivated() { - return pushToScimSynchronisationActivated; - } - - public boolean isPullFromScimSynchronisationActivated() { - return pullFromScimSynchronisationActivated; - } - - public String getContentType() { - return contentType; - } - - public String getAuthorizationHeaderValue() { - return authorizationHeaderValue; - } - - public String getId() { - return id; - } - - public String getName() { - return name; - } - - public ImportAction getImportAction() { - return importAction; - } - - public String getEndPoint() { - return endPoint; - } - - public boolean isLogAllScimRequests() { - return logAllScimRequests; - } - - public enum AuthMode { - BEARER, BASIC_AUTH, NONE - } - - public enum ImportAction { - CREATE_LOCAL, DELETE_REMOTE, NOTHING - } -} diff --git a/src/main/java/sh/libre/scim/core/exceptions/InconsistentScimMappingException.java b/src/main/java/sh/libre/scim/core/exceptions/InconsistentScimMappingException.java deleted file mode 100644 index 44f7eb4..0000000 --- a/src/main/java/sh/libre/scim/core/exceptions/InconsistentScimMappingException.java +++ /dev/null @@ -1,7 +0,0 @@ -package sh.libre.scim.core.exceptions; - -public class InconsistentScimMappingException extends ScimPropagationException { - public InconsistentScimMappingException(String message) { - super(message); - } -} diff --git a/src/main/java/sh/libre/scim/core/exceptions/InvalidResponseFromScimEndpointException.java b/src/main/java/sh/libre/scim/core/exceptions/InvalidResponseFromScimEndpointException.java deleted file mode 100644 index 0794436..0000000 --- a/src/main/java/sh/libre/scim/core/exceptions/InvalidResponseFromScimEndpointException.java +++ /dev/null @@ -1,29 +0,0 @@ -package sh.libre.scim.core.exceptions; - -import de.captaingoldfish.scim.sdk.client.response.ServerResponse; - -import java.util.Optional; - -public class InvalidResponseFromScimEndpointException extends ScimPropagationException { - - private final transient Optional<ServerResponse> response; - - public InvalidResponseFromScimEndpointException(ServerResponse response, String message) { - super(message); - this.response = Optional.of(response); - } - - public InvalidResponseFromScimEndpointException(String message, Exception e) { - super(message, e); - this.response = Optional.empty(); - } - - - /** - * Empty response can occur if a major exception was thrown while retrying the request. - */ - public Optional<ServerResponse> getResponse() { - return response; - } - -} diff --git a/src/main/java/sh/libre/scim/core/exceptions/RollbackApproach.java b/src/main/java/sh/libre/scim/core/exceptions/RollbackApproach.java deleted file mode 100644 index d1fb108..0000000 --- a/src/main/java/sh/libre/scim/core/exceptions/RollbackApproach.java +++ /dev/null @@ -1,55 +0,0 @@ -package sh.libre.scim.core.exceptions; - -import com.google.common.collect.Lists; -import sh.libre.scim.core.ScrimEndPointConfiguration; - -import java.util.ArrayList; - - -public enum RollbackApproach implements RollbackStrategy { - ALWAYS_ROLLBACK { - @Override - public boolean shouldRollback(ScrimEndPointConfiguration configuration, ScimPropagationException e) { - return true; - } - }, - NEVER_ROLLBACK { - @Override - public boolean shouldRollback(ScrimEndPointConfiguration configuration, ScimPropagationException e) { - return false; - } - }, - CRITICAL_ONLY_ROLLBACK { - @Override - public boolean shouldRollback(ScrimEndPointConfiguration configuration, ScimPropagationException e) { - if (e instanceof InconsistentScimMappingException) { - // Occurs when mapping between a SCIM resource and a keycloak user failed (missing, ambiguous..) - // Log can be sufficient here, no rollback required - return false; - } - if (e instanceof UnexpectedScimDataException) { - // Occurs when a SCIM endpoint sends invalid date (e.g. group with empty name, user without ids...) - // No rollback required : we cannot recover. This needs to be fixed in the SCIM endpoint data - return false; - } - if (e instanceof InvalidResponseFromScimEndpointException invalidResponseFromScimEndpointException) { - return shouldRollbackBecauseOfResponse(invalidResponseFromScimEndpointException); - } - // Should not occur - throw new IllegalStateException("Unkown ScimPropagationException", e); - } - - private boolean shouldRollbackBecauseOfResponse(InvalidResponseFromScimEndpointException e) { - // If we have a response - return e.getResponse().map(r -> { - // We consider that 404 are acceptable, otherwise rollback - ArrayList<Integer> acceptableStatus = Lists.newArrayList(200, 204, 404); - return !acceptableStatus.contains(r.getHttpStatus()); - }).orElse( - // Never got an answer, server was either misconfigured or unreachable - // No rollback in that case. - false - ); - } - } -} diff --git a/src/main/java/sh/libre/scim/core/exceptions/RollbackStrategy.java b/src/main/java/sh/libre/scim/core/exceptions/RollbackStrategy.java deleted file mode 100644 index 90d8593..0000000 --- a/src/main/java/sh/libre/scim/core/exceptions/RollbackStrategy.java +++ /dev/null @@ -1,22 +0,0 @@ -package sh.libre.scim.core.exceptions; - -import sh.libre.scim.core.ScrimEndPointConfiguration; - -/** - * In charge of deciding, when facing a SCIM-related issue during an operation (e.g User creation), - * whether we should : - * - Log the issue and let the operation succeed in Keycloack database (potentially unsynchronising - * Keycloack with the SCIM servers) - * - Rollback the whole operation - */ -public interface RollbackStrategy { - - /** - * Indicates whether we should rollback the whole transaction because of the given exception. - * - * @param configuration The SCIM Endpoint configuration for which the exception occured - * @param e the exception that we have to handle - * @return true if transaction should be rolled back, false if we should log and continue operation - */ - boolean shouldRollback(ScrimEndPointConfiguration configuration, ScimPropagationException e); -} diff --git a/src/main/java/sh/libre/scim/core/exceptions/ScimExceptionHandler.java b/src/main/java/sh/libre/scim/core/exceptions/ScimExceptionHandler.java deleted file mode 100644 index 78973d2..0000000 --- a/src/main/java/sh/libre/scim/core/exceptions/ScimExceptionHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -package sh.libre.scim.core.exceptions; - -import org.jboss.logging.Logger; -import org.keycloak.models.KeycloakSession; -import sh.libre.scim.core.ScrimEndPointConfiguration; - -/** - * In charge of dealing with SCIM exceptions by ignoring, logging or rollback transaction according to : - * - The context in which it occurs (sync, user creation...) - * - The related SCIM endpoint and its configuration - * - The thrown exception itself - */ -public class ScimExceptionHandler { - private static final Logger LOGGER = Logger.getLogger(ScimExceptionHandler.class); - - private final KeycloakSession session; - private final RollbackStrategy rollbackStrategy; - - public ScimExceptionHandler(KeycloakSession session) { - this(session, RollbackApproach.CRITICAL_ONLY_ROLLBACK); - } - - public ScimExceptionHandler(KeycloakSession session, RollbackStrategy rollbackStrategy) { - this.session = session; - this.rollbackStrategy = rollbackStrategy; - } - - /** - * Handles the given exception by loggin and/or rollback transaction. - * - * @param scimProviderConfiguration the configuration of the endpoint for which the propagation exception occured - * @param e the occuring exception - */ - public void handleException(ScrimEndPointConfiguration scimProviderConfiguration, ScimPropagationException e) { - String errorMessage = "[SCIM] Error while propagating to SCIM endpoint " + scimProviderConfiguration.getName(); - if (rollbackStrategy.shouldRollback(scimProviderConfiguration, e)) { - session.getTransactionManager().rollback(); - LOGGER.error("TRANSACTION ROLLBACK - " + errorMessage, e); - } else { - LOGGER.warn(errorMessage, e); - } - } -} diff --git a/src/main/java/sh/libre/scim/core/exceptions/ScimPropagationException.java b/src/main/java/sh/libre/scim/core/exceptions/ScimPropagationException.java deleted file mode 100644 index bee5ee1..0000000 --- a/src/main/java/sh/libre/scim/core/exceptions/ScimPropagationException.java +++ /dev/null @@ -1,12 +0,0 @@ -package sh.libre.scim.core.exceptions; - -public abstract class ScimPropagationException extends Exception { - - protected ScimPropagationException(String message) { - super(message); - } - - protected ScimPropagationException(String message, Exception e) { - super(message, e); - } -} diff --git a/src/main/java/sh/libre/scim/core/exceptions/SkipOrStopApproach.java b/src/main/java/sh/libre/scim/core/exceptions/SkipOrStopApproach.java deleted file mode 100644 index e0669d5..0000000 --- a/src/main/java/sh/libre/scim/core/exceptions/SkipOrStopApproach.java +++ /dev/null @@ -1,59 +0,0 @@ -package sh.libre.scim.core.exceptions; - -import sh.libre.scim.core.ScrimEndPointConfiguration; - - -public enum SkipOrStopApproach implements SkipOrStopStrategy { - ALWAYS_SKIP_AND_CONTINUE { - @Override - public boolean allowPartialSynchronizationWhenPushingToScim(ScrimEndPointConfiguration configuration) { - return false; - } - - @Override - public boolean allowPartialSynchronizationWhenPullingFromScim(ScrimEndPointConfiguration configuration) { - return false; - } - - @Override - public boolean allowMissingMembersWhenPushingGroupToScim(ScrimEndPointConfiguration configuration) { - return false; - } - - @Override - public boolean allowInvalidEndpointConfiguration() { - return false; - } - - @Override - public boolean skipInvalidDataFromScimEndpoint(ScrimEndPointConfiguration configuration) { - return false; - } - }, - ALWAYS_STOP { - @Override - public boolean allowPartialSynchronizationWhenPushingToScim(ScrimEndPointConfiguration configuration) { - return true; - } - - @Override - public boolean allowPartialSynchronizationWhenPullingFromScim(ScrimEndPointConfiguration configuration) { - return true; - } - - @Override - public boolean allowMissingMembersWhenPushingGroupToScim(ScrimEndPointConfiguration configuration) { - return true; - } - - @Override - public boolean allowInvalidEndpointConfiguration() { - return true; - } - - @Override - public boolean skipInvalidDataFromScimEndpoint(ScrimEndPointConfiguration configuration) { - return true; - } - } -} diff --git a/src/main/java/sh/libre/scim/core/exceptions/SkipOrStopStrategy.java b/src/main/java/sh/libre/scim/core/exceptions/SkipOrStopStrategy.java deleted file mode 100644 index 8ad46c7..0000000 --- a/src/main/java/sh/libre/scim/core/exceptions/SkipOrStopStrategy.java +++ /dev/null @@ -1,66 +0,0 @@ -package sh.libre.scim.core.exceptions; - -import sh.libre.scim.core.ScrimEndPointConfiguration; - -/** - * In charge of deciding, when facing a SCIM-related issue, whether we should : - * - log a warning, skip the problematic element and continue the rest of the operation - * - stop immediately the whole operation (typically, a synchronisation between SCIM and Keycloack) - */ -public interface SkipOrStopStrategy { - /** - * Indicates if, during a synchronisation from Keycloack to a SCIM endpoint, we should : - * - cancel the whole synchronisation if an element CRUD fail, or - * - keep on with synchronisation, allowing a partial synchronisation - * - * @param configuration the configuration of the endpoint in which the error occurred - * @return true if a partial synchronisation is allowed, - * false if we should stop the whole synchronisation at first issue - */ - boolean allowPartialSynchronizationWhenPushingToScim(ScrimEndPointConfiguration configuration); - - /** - * Indicates if, during a synchronisation from a SCIM endpoint to Keycloack, we should : - * - cancel the whole synchronisation if an element CRUD fail, or - * - keep on with synchronisation, allowing a partial synchronisation - * - * @param configuration the configuration of the endpoint in which the error occurred - * @return true if a partial synchronisation is allowed, - * false if we should interrupt the whole synchronisation at first issue - */ - boolean allowPartialSynchronizationWhenPullingFromScim(ScrimEndPointConfiguration configuration); - - - /** - * Indicates if, when we propagate a group creation or update to a SCIM endpoint and some - * of its members are not mapped to SCIM, we should allow partial group update or interrupt completely. - * - * @param configuration the configuration of the endpoint in which the error occurred - * @return true if a partial group update is allowed, - * false if we should interrupt the group update in case of any unmapped member - */ - boolean allowMissingMembersWhenPushingGroupToScim(ScrimEndPointConfiguration configuration); - - /** - * Indicates if, when facing an invalid SCIM endpoint configuration (resulting in a unreachable SCIM server), - * we should stop or ignore this configuration. - * - * @return true the invalid endpoint should be ignored, - * * false if we should interrupt the rest of the synchronisation - */ - boolean allowInvalidEndpointConfiguration(); - - /** - * Indicates if, when trying to pull User or Groups from a SCIM endpoint, - * we encounter a invalid data (e.g. group with empty name), we should : - * - Skip the invalid element pull and continue - * - Cancel the whole synchronisation - * - * @param configuration the configuration of the endpoint in which the error occurred - * @return true if we should skip the invalid data synchronisation and pursue, - * false if we should interrupt immediately the whole synchronisation - */ - boolean skipInvalidDataFromScimEndpoint(ScrimEndPointConfiguration configuration); - - -} diff --git a/src/main/java/sh/libre/scim/core/exceptions/UnexpectedScimDataException.java b/src/main/java/sh/libre/scim/core/exceptions/UnexpectedScimDataException.java deleted file mode 100644 index 918127e..0000000 --- a/src/main/java/sh/libre/scim/core/exceptions/UnexpectedScimDataException.java +++ /dev/null @@ -1,7 +0,0 @@ -package sh.libre.scim.core.exceptions; - -public class UnexpectedScimDataException extends ScimPropagationException { - public UnexpectedScimDataException(String message) { - super(message); - } -} diff --git a/src/main/java/sh/libre/scim/core/service/AbstractScimService.java b/src/main/java/sh/libre/scim/core/service/AbstractScimService.java deleted file mode 100644 index b22b6a9..0000000 --- a/src/main/java/sh/libre/scim/core/service/AbstractScimService.java +++ /dev/null @@ -1,281 +0,0 @@ -package sh.libre.scim.core.service; - -import de.captaingoldfish.scim.sdk.common.resources.ResourceNode; -import de.captaingoldfish.scim.sdk.common.resources.complex.Meta; -import org.jboss.logging.Logger; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.RoleMapperModel; -import org.keycloak.storage.user.SynchronizationResult; -import sh.libre.scim.core.ScrimEndPointConfiguration; -import sh.libre.scim.core.exceptions.InconsistentScimMappingException; -import sh.libre.scim.core.exceptions.InvalidResponseFromScimEndpointException; -import sh.libre.scim.core.exceptions.SkipOrStopStrategy; -import sh.libre.scim.core.exceptions.UnexpectedScimDataException; -import sh.libre.scim.jpa.ScimResourceDao; -import sh.libre.scim.jpa.ScimResourceMapping; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * A service in charge of synchronisation (CRUD) between - * a Keykloak Role (UserModel, GroupModel) and a SCIM Resource (User,Group). - * - * @param <K> The Keycloack Model (e.g. UserModel, GroupModel) - * @param <S> The SCIM Resource (e.g. User, Group) - */ -public abstract class AbstractScimService<K extends RoleMapperModel, S extends ResourceNode> implements AutoCloseable { - - private static final Logger LOGGER = Logger.getLogger(AbstractScimService.class); - - private final KeycloakSession keycloakSession; - protected final SkipOrStopStrategy skipOrStopStrategy; - private final ScrimEndPointConfiguration scimProviderConfiguration; - private final ScimResourceType type; - private final ScimClient<S> scimClient; - - protected AbstractScimService(KeycloakSession keycloakSession, ScrimEndPointConfiguration scimProviderConfiguration, ScimResourceType type, SkipOrStopStrategy skipOrStopStrategy) { - this.keycloakSession = keycloakSession; - this.scimProviderConfiguration = scimProviderConfiguration; - this.type = type; - this.scimClient = ScimClient.open(scimProviderConfiguration, type); - this.skipOrStopStrategy = skipOrStopStrategy; - } - - public void create(K roleMapperModel) throws InconsistentScimMappingException, InvalidResponseFromScimEndpointException { - if (isMarkedToIgnore(roleMapperModel)) { - // Silently return: resource is explicitly marked as to ignore - return; - } - // If mapping, then we are trying to recreate a user that was already created by import - KeycloakId id = getId(roleMapperModel); - if (findMappingById(id).isPresent()) { - throw new InconsistentScimMappingException("Trying to create user with id " + id + ": id already exists in Keycloak database"); - } - S scimForCreation = scimRequestBodyForCreate(roleMapperModel); - EntityOnRemoteScimId externalId = scimClient.create(id, scimForCreation); - createMapping(id, externalId); - } - - public void update(K roleMapperModel) throws InconsistentScimMappingException, InvalidResponseFromScimEndpointException { - if (isMarkedToIgnore(roleMapperModel)) { - // Silently return: resource is explicitly marked as to ignore - return; - } - KeycloakId keycloakId = getId(roleMapperModel); - EntityOnRemoteScimId entityOnRemoteScimId = findMappingById(keycloakId) - .map(ScimResourceMapping::getExternalIdAsEntityOnRemoteScimId) - .orElseThrow(() -> new InconsistentScimMappingException("Failed to find SCIM mapping for " + keycloakId)); - S scimForReplace = scimRequestBodyForUpdate(roleMapperModel, entityOnRemoteScimId); - scimClient.update(entityOnRemoteScimId, scimForReplace); - } - - protected abstract S scimRequestBodyForUpdate(K roleMapperModel, EntityOnRemoteScimId externalId) throws InconsistentScimMappingException; - - public void delete(KeycloakId id) throws InconsistentScimMappingException, InvalidResponseFromScimEndpointException { - ScimResourceMapping resource = findMappingById(id) - .orElseThrow(() -> new InconsistentScimMappingException("Failed to delete resource %s, scim mapping not found: ".formatted(id))); - EntityOnRemoteScimId externalId = resource.getExternalIdAsEntityOnRemoteScimId(); - scimClient.delete(externalId); - getScimResourceDao().delete(resource); - } - - public void pushAllResourcesToScim(SynchronizationResult syncRes) throws InvalidResponseFromScimEndpointException, InconsistentScimMappingException { - LOGGER.info("[SCIM] Push resources to endpoint " + this.getConfiguration().getEndPoint()); - try (Stream<K> resourcesStream = getResourceStream()) { - Set<K> resources = resourcesStream.collect(Collectors.toUnmodifiableSet()); - for (K resource : resources) { - KeycloakId id = getId(resource); - pushSingleResourceToScim(syncRes, resource, id); - } - } - } - - public void pullAllResourcesFromScim(SynchronizationResult syncRes) throws UnexpectedScimDataException, InconsistentScimMappingException, InvalidResponseFromScimEndpointException { - LOGGER.info("[SCIM] Pull resources from endpoint " + this.getConfiguration().getEndPoint()); - for (S resource : scimClient.listResources()) { - pullSingleResourceFromScim(syncRes, resource); - } - } - - private void pushSingleResourceToScim(SynchronizationResult syncRes, K resource, KeycloakId id) throws InvalidResponseFromScimEndpointException, InconsistentScimMappingException { - try { - LOGGER.infof("[SCIM] Reconciling local resource %s", id); - if (shouldIgnoreForScimSynchronization(resource)) { - LOGGER.infof("[SCIM] Skip local resource %s", id); - return; - } - if (findMappingById(id).isPresent()) { - LOGGER.info("[SCIM] Replacing it"); - update(resource); - } else { - LOGGER.info("[SCIM] Creating it"); - create(resource); - } - syncRes.increaseUpdated(); - } catch (InvalidResponseFromScimEndpointException e) { - if (skipOrStopStrategy.allowPartialSynchronizationWhenPushingToScim(this.getConfiguration())) { - LOGGER.warn("Error while syncing " + id + " to endpoint " + getConfiguration().getEndPoint(), e); - } else { - throw e; - } - } catch (InconsistentScimMappingException e) { - if (skipOrStopStrategy.allowPartialSynchronizationWhenPushingToScim(this.getConfiguration())) { - LOGGER.warn("Inconsistent data for element " + id + " and endpoint " + getConfiguration().getEndPoint(), e); - } else { - throw e; - } - } - } - - - private void pullSingleResourceFromScim(SynchronizationResult syncRes, S resource) throws UnexpectedScimDataException, InconsistentScimMappingException, InvalidResponseFromScimEndpointException { - try { - LOGGER.infof("[SCIM] Reconciling remote resource %s", resource); - EntityOnRemoteScimId externalId = resource.getId() - .map(EntityOnRemoteScimId::new) - .orElseThrow(() -> new UnexpectedScimDataException("Remote SCIM resource doesn't have an id, cannot import it in Keycloak")); - if (validMappingAlreadyExists(externalId)) return; - - // Here no keycloak user/group matching the SCIM external id exists - // Try to match existing keycloak resource by properties (username, email, name) - Optional<KeycloakId> mapped = matchKeycloakMappingByScimProperties(resource); - if (mapped.isPresent()) { - // If found a mapped, update - LOGGER.info("[SCIM] Matched SCIM resource " + externalId + " from properties with keycloak entity " + mapped.get()); - createMapping(mapped.get(), externalId); - syncRes.increaseUpdated(); - } else { - // If not, create it locally or deleting it remotely (according to the configured Import Action) - createLocalOrDeleteRemote(syncRes, resource, externalId); - } - } catch (UnexpectedScimDataException e) { - if (skipOrStopStrategy.skipInvalidDataFromScimEndpoint(getConfiguration())) { - LOGGER.warn("[SCIM] Skipping element synchronisation because of invalid Scim Data for element " + resource.getId() + " : " + e.getMessage(), e); - } else { - throw e; - } - } catch (InconsistentScimMappingException e) { - if (skipOrStopStrategy.allowPartialSynchronizationWhenPullingFromScim(getConfiguration())) { - LOGGER.warn("[SCIM] Skipping element synchronisation because of inconsistent mapping for element " + resource.getId() + " : " + e.getMessage(), e); - } else { - throw e; - } - } catch (InvalidResponseFromScimEndpointException e) { - // Can only occur in case of a DELETE_REMOTE conflict action - if (skipOrStopStrategy.allowPartialSynchronizationWhenPullingFromScim(getConfiguration())) { - LOGGER.warn("[SCIM] Could not delete SCIM resource " + resource.getId() + " during synchronisation", e); - } else { - throw e; - } - } - - } - - private boolean validMappingAlreadyExists(EntityOnRemoteScimId externalId) { - Optional<ScimResourceMapping> optionalMapping = getScimResourceDao().findByExternalId(externalId, type); - // If an existing mapping exists, delete potential dangling references - if (optionalMapping.isPresent()) { - ScimResourceMapping mapping = optionalMapping.get(); - if (entityExists(mapping.getIdAsKeycloakId())) { - LOGGER.info("[SCIM] Valid mapping found, skipping"); - return true; - } else { - LOGGER.info("[SCIM] Delete a dangling mapping"); - getScimResourceDao().delete(mapping); - } - } - return false; - } - - private void createLocalOrDeleteRemote(SynchronizationResult syncRes, S resource, EntityOnRemoteScimId externalId) throws UnexpectedScimDataException, InconsistentScimMappingException, InvalidResponseFromScimEndpointException { - switch (scimProviderConfiguration.getImportAction()) { - case CREATE_LOCAL -> { - LOGGER.info("[SCIM] Create local resource for SCIM resource " + externalId); - KeycloakId id = createEntity(resource); - createMapping(id, externalId); - syncRes.increaseAdded(); - } - case DELETE_REMOTE -> { - LOGGER.info("[SCIM] Delete remote resource " + externalId); - scimClient.delete(externalId); - } - case NOTHING -> LOGGER.info("[SCIM] Import action set to NOTHING"); - } - } - - - protected abstract S scimRequestBodyForCreate(K roleMapperModel) throws InconsistentScimMappingException; - - protected abstract KeycloakId getId(K roleMapperModel); - - protected abstract boolean isMarkedToIgnore(K roleMapperModel); - - private void createMapping(KeycloakId keycloakId, EntityOnRemoteScimId externalId) { - getScimResourceDao().create(keycloakId, externalId, type); - } - - protected ScimResourceDao getScimResourceDao() { - return ScimResourceDao.newInstance(getKeycloakSession(), scimProviderConfiguration.getId()); - } - - private Optional<ScimResourceMapping> findMappingById(KeycloakId keycloakId) { - return getScimResourceDao().findById(keycloakId, type); - } - - private KeycloakSession getKeycloakSession() { - return keycloakSession; - } - - - protected abstract boolean shouldIgnoreForScimSynchronization(K resource); - - protected abstract Stream<K> getResourceStream(); - - protected abstract KeycloakId createEntity(S resource) throws UnexpectedScimDataException, InconsistentScimMappingException; - - protected abstract Optional<KeycloakId> matchKeycloakMappingByScimProperties(S resource) throws InconsistentScimMappingException; - - protected abstract boolean entityExists(KeycloakId keycloakId); - - public void sync(SynchronizationResult syncRes) throws InconsistentScimMappingException, InvalidResponseFromScimEndpointException, UnexpectedScimDataException { - if (this.scimProviderConfiguration.isPullFromScimSynchronisationActivated()) { - this.pullAllResourcesFromScim(syncRes); - } - if (this.scimProviderConfiguration.isPushToScimSynchronisationActivated()) { - this.pushAllResourcesToScim(syncRes); - } - } - - protected Meta newMetaLocation(EntityOnRemoteScimId externalId) { - Meta meta = new Meta(); - URI uri = getUri(type, externalId); - meta.setLocation(uri.toString()); - return meta; - } - - protected URI getUri(ScimResourceType type, EntityOnRemoteScimId externalId) { - try { - return new URI("%s/%s".formatted(type.getEndpoint(), externalId.asString())); - } catch (URISyntaxException e) { - throw new IllegalStateException("should never occur: can not format URI for type %s and id %s".formatted(type, externalId), e); - } - } - - protected KeycloakDao getKeycloakDao() { - return new KeycloakDao(getKeycloakSession()); - } - - @Override - public void close() { - scimClient.close(); - } - - public ScrimEndPointConfiguration getConfiguration() { - return scimProviderConfiguration; - } -} diff --git a/src/main/java/sh/libre/scim/core/service/EntityOnRemoteScimId.java b/src/main/java/sh/libre/scim/core/service/EntityOnRemoteScimId.java deleted file mode 100644 index df96a12..0000000 --- a/src/main/java/sh/libre/scim/core/service/EntityOnRemoteScimId.java +++ /dev/null @@ -1,6 +0,0 @@ -package sh.libre.scim.core.service; - -public record EntityOnRemoteScimId( - String asString -) { -} diff --git a/src/main/java/sh/libre/scim/core/service/GroupScimService.java b/src/main/java/sh/libre/scim/core/service/GroupScimService.java deleted file mode 100644 index bd09f3e..0000000 --- a/src/main/java/sh/libre/scim/core/service/GroupScimService.java +++ /dev/null @@ -1,131 +0,0 @@ -package sh.libre.scim.core.service; - -import de.captaingoldfish.scim.sdk.common.resources.Group; -import de.captaingoldfish.scim.sdk.common.resources.complex.Meta; -import de.captaingoldfish.scim.sdk.common.resources.multicomplex.Member; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.StringUtils; -import org.jboss.logging.Logger; -import org.keycloak.models.GroupModel; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.UserModel; -import sh.libre.scim.core.ScrimEndPointConfiguration; -import sh.libre.scim.core.exceptions.InconsistentScimMappingException; -import sh.libre.scim.core.exceptions.SkipOrStopStrategy; -import sh.libre.scim.core.exceptions.UnexpectedScimDataException; -import sh.libre.scim.jpa.ScimResourceMapping; - -import java.net.URI; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.TreeSet; -import java.util.stream.Stream; - -public class GroupScimService extends AbstractScimService<GroupModel, Group> { - private static final Logger LOGGER = Logger.getLogger(GroupScimService.class); - - public GroupScimService(KeycloakSession keycloakSession, ScrimEndPointConfiguration scimProviderConfiguration, SkipOrStopStrategy skipOrStopStrategy) { - super(keycloakSession, scimProviderConfiguration, ScimResourceType.GROUP, skipOrStopStrategy); - } - - @Override - protected Stream<GroupModel> getResourceStream() { - return getKeycloakDao().getGroupsStream(); - } - - @Override - protected boolean entityExists(KeycloakId keycloakId) { - return getKeycloakDao().groupExists(keycloakId); - } - - @Override - protected Optional<KeycloakId> matchKeycloakMappingByScimProperties(Group resource) { - Set<String> names = new TreeSet<>(); - resource.getId().ifPresent(names::add); - resource.getDisplayName().ifPresent(names::add); - try (Stream<GroupModel> groupsStream = getKeycloakDao().getGroupsStream()) { - Optional<GroupModel> group = groupsStream - .filter(groupModel -> names.contains(groupModel.getName())) - .findFirst(); - return group - .map(GroupModel::getId) - .map(KeycloakId::new); - } - } - - @Override - protected KeycloakId createEntity(Group resource) throws UnexpectedScimDataException, InconsistentScimMappingException { - String displayName = resource.getDisplayName() - .filter(StringUtils::isNotBlank) - .orElseThrow(() -> new UnexpectedScimDataException("Remote Scim group has empty name, can't create. Resource id = %s".formatted(resource.getId()))); - GroupModel group = getKeycloakDao().createGroup(displayName); - List<Member> groupMembers = resource.getMembers(); - if (CollectionUtils.isNotEmpty(groupMembers)) { - for (Member groupMember : groupMembers) { - EntityOnRemoteScimId externalId = groupMember.getValue() - .map(EntityOnRemoteScimId::new) - .orElseThrow(() -> new UnexpectedScimDataException("can't create group member for group '%s' without id: ".formatted(displayName) + resource)); - KeycloakId userId = getScimResourceDao().findUserByExternalId(externalId) - .map(ScimResourceMapping::getIdAsKeycloakId) - .orElseThrow(() -> new InconsistentScimMappingException("can't find mapping for group member %s".formatted(externalId))); - UserModel userModel = getKeycloakDao().getUserById(userId); - userModel.joinGroup(group); - } - } - return new KeycloakId(group.getId()); - } - - @Override - protected boolean isMarkedToIgnore(GroupModel groupModel) { - return BooleanUtils.TRUE.equals(groupModel.getFirstAttribute("scim-skip")); - } - - @Override - protected KeycloakId getId(GroupModel groupModel) { - return new KeycloakId(groupModel.getId()); - } - - @Override - protected Group scimRequestBodyForCreate(GroupModel groupModel) throws InconsistentScimMappingException { - Set<KeycloakId> members = getKeycloakDao().getGroupMembers(groupModel); - Group group = new Group(); - group.setExternalId(groupModel.getId()); - group.setDisplayName(groupModel.getName()); - for (KeycloakId member : members) { - Member groupMember = new Member(); - Optional<ScimResourceMapping> optionalGroupMemberMapping = getScimResourceDao().findUserById(member); - if (optionalGroupMemberMapping.isPresent()) { - ScimResourceMapping groupMemberMapping = optionalGroupMemberMapping.get(); - EntityOnRemoteScimId externalIdAsEntityOnRemoteScimId = groupMemberMapping.getExternalIdAsEntityOnRemoteScimId(); - groupMember.setValue(externalIdAsEntityOnRemoteScimId.asString()); - URI ref = getUri(ScimResourceType.USER, externalIdAsEntityOnRemoteScimId); - groupMember.setRef(ref.toString()); - group.addMember(groupMember); - } else { - String message = "Unmapped member " + member + " for group " + groupModel.getId(); - if (skipOrStopStrategy.allowMissingMembersWhenPushingGroupToScim(this.getConfiguration())) { - LOGGER.warn(message); - } else { - throw new InconsistentScimMappingException(message); - } - } - } - return group; - } - - @Override - protected Group scimRequestBodyForUpdate(GroupModel groupModel, EntityOnRemoteScimId externalId) throws InconsistentScimMappingException { - Group group = scimRequestBodyForCreate(groupModel); - group.setId(externalId.asString()); - Meta meta = newMetaLocation(externalId); - group.setMeta(meta); - return group; - } - - @Override - protected boolean shouldIgnoreForScimSynchronization(GroupModel resource) { - return false; - } -} diff --git a/src/main/java/sh/libre/scim/core/service/KeycloakDao.java b/src/main/java/sh/libre/scim/core/service/KeycloakDao.java deleted file mode 100644 index f4c406c..0000000 --- a/src/main/java/sh/libre/scim/core/service/KeycloakDao.java +++ /dev/null @@ -1,81 +0,0 @@ -package sh.libre.scim.core.service; - -import org.keycloak.models.GroupModel; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.RealmModel; -import org.keycloak.models.UserModel; - -import java.util.Collections; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class KeycloakDao { - - private final KeycloakSession keycloakSession; - - public KeycloakDao(KeycloakSession keycloakSession) { - this.keycloakSession = keycloakSession; - } - - private KeycloakSession getKeycloakSession() { - return keycloakSession; - } - - private RealmModel getRealm() { - return getKeycloakSession().getContext().getRealm(); - } - - public boolean groupExists(KeycloakId groupId) { - GroupModel group = getKeycloakSession().groups().getGroupById(getRealm(), groupId.asString()); - return group != null; - } - - public boolean userExists(KeycloakId userId) { - UserModel user = getUserById(userId); - return user != null; - } - - public UserModel getUserById(KeycloakId userId) { - return getKeycloakSession().users().getUserById(getRealm(), userId.asString()); - } - - public GroupModel getGroupById(KeycloakId groupId) { - return getKeycloakSession().groups().getGroupById(getRealm(), groupId.asString()); - } - - - public Stream<GroupModel> getGroupsStream() { - return getKeycloakSession().groups().getGroupsStream(getRealm()); - } - - public GroupModel createGroup(String displayName) { - return getKeycloakSession().groups().createGroup(getRealm(), displayName); - } - - public Set<KeycloakId> getGroupMembers(GroupModel groupModel) { - return getKeycloakSession().users() - .getGroupMembersStream(getRealm(), groupModel) - .map(UserModel::getId) - .map(KeycloakId::new) - .collect(Collectors.toSet()); - } - - public Stream<UserModel> getUsersStream() { - return getKeycloakSession().users().searchForUserStream(getRealm(), Collections.emptyMap()); - } - - public UserModel getUserByUsername(String username) { - return getKeycloakSession().users().getUserByUsername(getRealm(), username); - } - - public UserModel getUserByEmail(String email) { - return getKeycloakSession().users().getUserByEmail(getRealm(), email); - } - - public UserModel addUser(String username) { - return getKeycloakSession().users().addUser(getRealm(), username); - } - - -} diff --git a/src/main/java/sh/libre/scim/core/service/KeycloakId.java b/src/main/java/sh/libre/scim/core/service/KeycloakId.java deleted file mode 100644 index 04bad47..0000000 --- a/src/main/java/sh/libre/scim/core/service/KeycloakId.java +++ /dev/null @@ -1,7 +0,0 @@ -package sh.libre.scim.core.service; - -public record KeycloakId( - String asString -) { - -} diff --git a/src/main/java/sh/libre/scim/core/service/ScimClient.java b/src/main/java/sh/libre/scim/core/service/ScimClient.java deleted file mode 100644 index de3b4d7..0000000 --- a/src/main/java/sh/libre/scim/core/service/ScimClient.java +++ /dev/null @@ -1,155 +0,0 @@ -package sh.libre.scim.core.service; - -import com.google.common.net.HttpHeaders; -import de.captaingoldfish.scim.sdk.client.ScimClientConfig; -import de.captaingoldfish.scim.sdk.client.ScimRequestBuilder; -import de.captaingoldfish.scim.sdk.client.response.ServerResponse; -import de.captaingoldfish.scim.sdk.common.resources.ResourceNode; -import de.captaingoldfish.scim.sdk.common.response.ListResponse; -import io.github.resilience4j.core.IntervalFunction; -import io.github.resilience4j.retry.Retry; -import io.github.resilience4j.retry.RetryConfig; -import io.github.resilience4j.retry.RetryRegistry; -import jakarta.ws.rs.ProcessingException; -import org.jboss.logging.Logger; -import sh.libre.scim.core.ScrimEndPointConfiguration; -import sh.libre.scim.core.exceptions.InvalidResponseFromScimEndpointException; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -public class ScimClient<S extends ResourceNode> implements AutoCloseable { - private static final Logger LOGGER = Logger.getLogger(ScimClient.class); - - private final RetryRegistry retryRegistry; - - private final ScimRequestBuilder scimRequestBuilder; - - private final ScimResourceType scimResourceType; - private final boolean logAllRequests; - - private ScimClient(ScimRequestBuilder scimRequestBuilder, ScimResourceType scimResourceType, boolean detailedLogs) { - this.scimRequestBuilder = scimRequestBuilder; - this.scimResourceType = scimResourceType; - RetryConfig retryConfig = RetryConfig.custom() - .maxAttempts(10) - .intervalFunction(IntervalFunction.ofExponentialBackoff()) - .retryExceptions(ProcessingException.class) - .build(); - retryRegistry = RetryRegistry.of(retryConfig); - this.logAllRequests = detailedLogs; - } - - public static <T extends ResourceNode> ScimClient<T> open(ScrimEndPointConfiguration scimProviderConfiguration, ScimResourceType scimResourceType) { - String scimApplicationBaseUrl = scimProviderConfiguration.getEndPoint(); - Map<String, String> httpHeaders = new HashMap<>(); - httpHeaders.put(HttpHeaders.AUTHORIZATION, scimProviderConfiguration.getAuthorizationHeaderValue()); - httpHeaders.put(HttpHeaders.CONTENT_TYPE, scimProviderConfiguration.getContentType()); - ScimClientConfig scimClientConfig = ScimClientConfig.builder() - .httpHeaders(httpHeaders) - .connectTimeout(5) - .requestTimeout(5) - .socketTimeout(5) - .build(); - ScimRequestBuilder scimRequestBuilder = - new ScimRequestBuilder( - scimApplicationBaseUrl, - scimClientConfig - ); - return new ScimClient<>(scimRequestBuilder, scimResourceType, scimProviderConfiguration.isLogAllScimRequests()); - } - - public EntityOnRemoteScimId create(KeycloakId id, S scimForCreation) throws InvalidResponseFromScimEndpointException { - Optional<String> scimForCreationId = scimForCreation.getId(); - if (scimForCreationId.isPresent()) { - throw new IllegalArgumentException( - "User to create should never have an existing id: %s %s".formatted(id, scimForCreationId.get()) - ); - } - try { - Retry retry = retryRegistry.retry("create-%s".formatted(id.asString())); - if (logAllRequests) { - LOGGER.info("[SCIM] Sending CREATE " + scimForCreation.toPrettyString() + "\n to " + getScimEndpoint()); - } - ServerResponse<S> response = retry.executeSupplier(() -> scimRequestBuilder - .create(getResourceClass(), getScimEndpoint()) - .setResource(scimForCreation) - .sendRequest() - ); - checkResponseIsSuccess(response); - S resource = response.getResource(); - return resource.getId() - .map(EntityOnRemoteScimId::new) - .orElseThrow(() -> new InvalidResponseFromScimEndpointException(response, "Created SCIM resource does not have id")); - - } catch (Exception e) { - LOGGER.warn(e); - throw new InvalidResponseFromScimEndpointException("Exception while retrying create " + e.getMessage(), e); - } - } - - private void checkResponseIsSuccess(ServerResponse<S> response) throws InvalidResponseFromScimEndpointException { - if (logAllRequests) { - LOGGER.info("[SCIM] Server response " + response.getHttpStatus() + "\n" + response.getResponseBody()); - } - if (!response.isSuccess()) { - throw new InvalidResponseFromScimEndpointException(response, "Server answered with status " + response.getResponseBody() + ": " + response.getResponseBody()); - } - } - - private String getScimEndpoint() { - return scimResourceType.getEndpoint(); - } - - private Class<S> getResourceClass() { - return scimResourceType.getResourceClass(); - } - - public void update(EntityOnRemoteScimId externalId, S scimForReplace) throws InvalidResponseFromScimEndpointException { - Retry retry = retryRegistry.retry("replace-%s".formatted(externalId.asString())); - try { - if (logAllRequests) { - LOGGER.info("[SCIM] Sending UPDATE " + scimForReplace.toPrettyString() + "\n to " + getScimEndpoint()); - } - ServerResponse<S> response = retry.executeSupplier(() -> scimRequestBuilder - .update(getResourceClass(), getScimEndpoint(), externalId.asString()) - .setResource(scimForReplace) - .sendRequest() - ); - checkResponseIsSuccess(response); - } catch (Exception e) { - LOGGER.warn(e); - throw new InvalidResponseFromScimEndpointException("Exception while retrying update " + e.getMessage(), e); - } - } - - public void delete(EntityOnRemoteScimId externalId) throws InvalidResponseFromScimEndpointException { - Retry retry = retryRegistry.retry("delete-%s".formatted(externalId.asString())); - if (logAllRequests) { - LOGGER.info("[SCIM] Sending DELETE to " + getScimEndpoint()); - } - try { - ServerResponse<S> response = retry.executeSupplier(() -> scimRequestBuilder - .delete(getResourceClass(), getScimEndpoint(), externalId.asString()) - .sendRequest() - ); - checkResponseIsSuccess(response); - } catch (Exception e) { - LOGGER.warn(e); - throw new InvalidResponseFromScimEndpointException("Exception while retrying delete " + e.getMessage(), e); - } - } - - @Override - public void close() { - scimRequestBuilder.close(); - } - - public List<S> listResources() { - ServerResponse<ListResponse<S>> response = scimRequestBuilder.list(getResourceClass(), getScimEndpoint()).get().sendRequest(); - ListResponse<S> resourceTypeListResponse = response.getResource(); - return resourceTypeListResponse.getListedResources(); - } -} diff --git a/src/main/java/sh/libre/scim/core/service/ScimResourceType.java b/src/main/java/sh/libre/scim/core/service/ScimResourceType.java deleted file mode 100644 index b90845b..0000000 --- a/src/main/java/sh/libre/scim/core/service/ScimResourceType.java +++ /dev/null @@ -1,29 +0,0 @@ -package sh.libre.scim.core.service; - -import de.captaingoldfish.scim.sdk.common.resources.Group; -import de.captaingoldfish.scim.sdk.common.resources.ResourceNode; -import de.captaingoldfish.scim.sdk.common.resources.User; - -public enum ScimResourceType { - - USER("/Users", User.class), - - GROUP("/Groups", Group.class); - - private final String endpoint; - - private final Class<? extends ResourceNode> resourceClass; - - ScimResourceType(String endpoint, Class<? extends ResourceNode> resourceClass) { - this.endpoint = endpoint; - this.resourceClass = resourceClass; - } - - public String getEndpoint() { - return endpoint; - } - - public <T extends ResourceNode> Class<T> getResourceClass() { - return (Class<T>) resourceClass; - } -} diff --git a/src/main/java/sh/libre/scim/core/service/UserScimService.java b/src/main/java/sh/libre/scim/core/service/UserScimService.java deleted file mode 100644 index c0262f3..0000000 --- a/src/main/java/sh/libre/scim/core/service/UserScimService.java +++ /dev/null @@ -1,145 +0,0 @@ -package sh.libre.scim.core.service; - -import de.captaingoldfish.scim.sdk.common.resources.User; -import de.captaingoldfish.scim.sdk.common.resources.complex.Meta; -import de.captaingoldfish.scim.sdk.common.resources.complex.Name; -import de.captaingoldfish.scim.sdk.common.resources.multicomplex.Email; -import de.captaingoldfish.scim.sdk.common.resources.multicomplex.MultiComplexNode; -import de.captaingoldfish.scim.sdk.common.resources.multicomplex.PersonRole; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.StringUtils; -import org.jboss.logging.Logger; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.RoleMapperModel; -import org.keycloak.models.RoleModel; -import org.keycloak.models.UserModel; -import sh.libre.scim.core.ScrimEndPointConfiguration; -import sh.libre.scim.core.exceptions.InconsistentScimMappingException; -import sh.libre.scim.core.exceptions.SkipOrStopStrategy; -import sh.libre.scim.core.exceptions.UnexpectedScimDataException; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Stream; - -public class UserScimService extends AbstractScimService<UserModel, User> { - private static final Logger LOGGER = Logger.getLogger(UserScimService.class); - - public UserScimService( - KeycloakSession keycloakSession, - ScrimEndPointConfiguration scimProviderConfiguration, - SkipOrStopStrategy skipOrStopStrategy) { - super(keycloakSession, scimProviderConfiguration, ScimResourceType.USER, skipOrStopStrategy); - } - - @Override - protected Stream<UserModel> getResourceStream() { - return getKeycloakDao().getUsersStream(); - } - - @Override - protected boolean entityExists(KeycloakId keycloakId) { - return getKeycloakDao().userExists(keycloakId); - } - - @Override - protected Optional<KeycloakId> matchKeycloakMappingByScimProperties(User resource) throws InconsistentScimMappingException { - Optional<KeycloakId> matchedByUsername = resource.getUserName() - .map(getKeycloakDao()::getUserByUsername) - .map(this::getId); - Optional<KeycloakId> matchedByEmail = resource.getEmails().stream() - .findFirst() - .flatMap(MultiComplexNode::getValue) - .map(getKeycloakDao()::getUserByEmail) - .map(this::getId); - if (matchedByUsername.isPresent() - && matchedByEmail.isPresent() - && !matchedByUsername.equals(matchedByEmail)) { - String inconstencyErrorMessage = "Found 2 possible users for remote user " + matchedByUsername.get() + " - " + matchedByEmail.get(); - LOGGER.warn(inconstencyErrorMessage); - throw new InconsistentScimMappingException(inconstencyErrorMessage); - } - if (matchedByUsername.isPresent()) { - return matchedByUsername; - } - return matchedByEmail; - } - - @Override - protected KeycloakId createEntity(User resource) throws UnexpectedScimDataException { - String username = resource.getUserName() - .filter(StringUtils::isNotBlank) - .orElseThrow(() -> new UnexpectedScimDataException("Remote Scim user has empty username, can't create. Resource id = %s".formatted(resource.getId()))); - UserModel user = getKeycloakDao().addUser(username); - resource.getEmails().stream() - .findFirst() - .flatMap(MultiComplexNode::getValue) - .ifPresent(user::setEmail); - boolean userEnabled = resource.isActive().orElse(false); - user.setEnabled(userEnabled); - return new KeycloakId(user.getId()); - } - - @Override - protected boolean isMarkedToIgnore(UserModel userModel) { - return BooleanUtils.TRUE.equals(userModel.getFirstAttribute("scim-skip")); - } - - @Override - protected KeycloakId getId(UserModel userModel) { - return new KeycloakId(userModel.getId()); - } - - @Override - protected User scimRequestBodyForCreate(UserModel roleMapperModel) { - String firstAndLastName = String.format("%s %s", - StringUtils.defaultString(roleMapperModel.getFirstName()), - StringUtils.defaultString(roleMapperModel.getLastName())).trim(); - String displayName = Objects.toString(firstAndLastName, roleMapperModel.getUsername()); - Stream<RoleModel> groupRoleModels = roleMapperModel.getGroupsStream().flatMap(RoleMapperModel::getRoleMappingsStream); - Stream<RoleModel> roleModels = roleMapperModel.getRoleMappingsStream(); - Stream<RoleModel> allRoleModels = Stream.concat(groupRoleModels, roleModels); - List<PersonRole> roles = allRoleModels - .filter(r -> BooleanUtils.TRUE.equals(r.getFirstAttribute("scim"))) - .map(RoleModel::getName) - .map(roleName -> { - PersonRole personRole = new PersonRole(); - personRole.setValue(roleName); - return personRole; - }) - .toList(); - User user = new User(); - user.setRoles(roles); - user.setExternalId(roleMapperModel.getId()); - user.setUserName(roleMapperModel.getUsername()); - user.setDisplayName(displayName); - Name name = new Name(); - name.setFamilyName(roleMapperModel.getLastName()); - name.setGivenName(roleMapperModel.getFirstName()); - user.setName(name); - List<Email> emails = new ArrayList<>(); - if (roleMapperModel.getEmail() != null) { - emails.add( - Email.builder().value(roleMapperModel.getEmail()).build()); - } - user.setEmails(emails); - user.setActive(roleMapperModel.isEnabled()); - return user; - } - - @Override - protected User scimRequestBodyForUpdate(UserModel userModel, EntityOnRemoteScimId externalId) { - User user = scimRequestBodyForCreate(userModel); - user.setId(externalId.asString()); - Meta meta = newMetaLocation(externalId); - user.setMeta(meta); - return user; - } - - @Override - protected boolean shouldIgnoreForScimSynchronization(UserModel userModel) { - return "admin".equals(userModel.getUsername()); - } -} diff --git a/src/main/java/sh/libre/scim/event/ScimBackgroundGroupMembershipUpdater.java b/src/main/java/sh/libre/scim/event/ScimBackgroundGroupMembershipUpdater.java deleted file mode 100644 index 4c49f74..0000000 --- a/src/main/java/sh/libre/scim/event/ScimBackgroundGroupMembershipUpdater.java +++ /dev/null @@ -1,74 +0,0 @@ -package sh.libre.scim.event; - -import org.jboss.logging.Logger; -import org.keycloak.models.GroupModel; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.KeycloakSessionFactory; -import org.keycloak.models.RealmModel; -import org.keycloak.models.utils.KeycloakModelUtils; -import org.keycloak.timer.TimerProvider; -import sh.libre.scim.core.ScimDispatcher; - -import java.time.Duration; - -/** - * In charge of making background checks and sent - * UPDATE requests from group for which membership information has changed. - * <p> - * This is required to avoid immediate group membership updates which could cause - * to incorrect group members list in case of concurrent group membership changes. - */ -public class ScimBackgroundGroupMembershipUpdater { - public static final String GROUP_DIRTY_SINCE_ATTRIBUTE_NAME = "scim-dirty-since"; - - private static final Logger LOGGER = Logger.getLogger(ScimBackgroundGroupMembershipUpdater.class); - // Update check loop will run every time this delay has passed - private static final long UPDATE_CHECK_DELAY_MS = 2000; - // If a group is marked dirty since less that this debounce delay, wait for the next update check loop - private static final long DEBOUNCE_DELAY_MS = 1200; - private final KeycloakSessionFactory sessionFactory; - - public ScimBackgroundGroupMembershipUpdater(KeycloakSessionFactory sessionFactory) { - this.sessionFactory = sessionFactory; - } - - public void startBackgroundUpdates() { - // Every UPDATE_CHECK_DELAY_MS, check for dirty groups and send updates if required - try (KeycloakSession keycloakSession = sessionFactory.create()) { - TimerProvider timer = keycloakSession.getProvider(TimerProvider.class); - timer.scheduleTask(taskSession -> { - for (RealmModel realm : taskSession.realms().getRealmsStream().toList()) { - dispatchDirtyGroupsUpdates(realm); - } - }, Duration.ofMillis(UPDATE_CHECK_DELAY_MS).toMillis(), "scim-background"); - } - } - - private void dispatchDirtyGroupsUpdates(RealmModel realm) { - KeycloakModelUtils.runJobInTransaction(sessionFactory, session -> { - session.getContext().setRealm(realm); - ScimDispatcher dispatcher = new ScimDispatcher(session); - // Identify groups marked as dirty by the ScimEventListenerProvider - for (GroupModel group : session.groups().getGroupsStream(realm) - .filter(this::isDirtyGroup).toList()) { - LOGGER.infof("[SCIM] Group %s is dirty, dispatch an update", group.getName()); - // If dirty : dispatch a group update to all clients and mark it clean - dispatcher.dispatchGroupModificationToAll(client -> client.update(group)); - group.removeAttribute(GROUP_DIRTY_SINCE_ATTRIBUTE_NAME); - } - dispatcher.close(); - }); - } - - private boolean isDirtyGroup(GroupModel g) { - String groupDirtySinceAttribute = g.getFirstAttribute(GROUP_DIRTY_SINCE_ATTRIBUTE_NAME); - try { - long groupDirtySince = Long.parseLong(groupDirtySinceAttribute); - // Must be dirty for more than DEBOUNCE_DELAY_MS - // (otherwise update will be dispatched in next scheduled loop) - return System.currentTimeMillis() - groupDirtySince > DEBOUNCE_DELAY_MS; - } catch (NumberFormatException e) { - return false; - } - } -} diff --git a/src/main/java/sh/libre/scim/event/ScimEventListenerProvider.java b/src/main/java/sh/libre/scim/event/ScimEventListenerProvider.java deleted file mode 100644 index 2c177b0..0000000 --- a/src/main/java/sh/libre/scim/event/ScimEventListenerProvider.java +++ /dev/null @@ -1,247 +0,0 @@ -package sh.libre.scim.event; - -import org.jboss.logging.Logger; -import org.keycloak.component.ComponentModel; -import org.keycloak.events.Event; -import org.keycloak.events.EventListenerProvider; -import org.keycloak.events.EventType; -import org.keycloak.events.admin.AdminEvent; -import org.keycloak.events.admin.OperationType; -import org.keycloak.events.admin.ResourceType; -import org.keycloak.models.GroupModel; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.UserModel; -import sh.libre.scim.core.ScimDispatcher; -import sh.libre.scim.core.ScimEndpointConfigurationStorageProviderFactory; -import sh.libre.scim.core.service.KeycloakDao; -import sh.libre.scim.core.service.KeycloakId; -import sh.libre.scim.core.service.ScimResourceType; - -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Stream; - -/** - * An Event listener reacting to Keycloak models modification - * (e.g. User creation, Group deletion, membership modifications, endpoint configuration change...) - * by propagating it to all registered Scim endpoints. - */ -public class ScimEventListenerProvider implements EventListenerProvider { - - private static final Logger LOGGER = Logger.getLogger(ScimEventListenerProvider.class); - - private final ScimDispatcher dispatcher; - - private final KeycloakSession session; - - private final KeycloakDao keycloakDao; - - private final Map<ResourceType, Pattern> listenedEventPathPatterns = Map.of( - ResourceType.USER, Pattern.compile("users/(.+)"), - ResourceType.GROUP, Pattern.compile("groups/([\\w-]+)(/children)?"), - ResourceType.GROUP_MEMBERSHIP, Pattern.compile("users/(.+)/groups/(.+)"), - ResourceType.REALM_ROLE_MAPPING, Pattern.compile("^(.+)/(.+)/role-mappings"), - ResourceType.COMPONENT, Pattern.compile("components/(.+)") - ); - - public ScimEventListenerProvider(KeycloakSession session) { - this.session = session; - this.keycloakDao = new KeycloakDao(session); - this.dispatcher = new ScimDispatcher(session); - } - - @Override - public void onEvent(Event event) { - // React to User-related event : creation, deletion, update - EventType eventType = event.getType(); - KeycloakId eventUserId = new KeycloakId(event.getUserId()); - switch (eventType) { - case REGISTER -> { - LOGGER.infof("[SCIM] Propagate User Registration - %s", eventUserId); - UserModel user = getUser(eventUserId); - dispatcher.dispatchUserModificationToAll(client -> client.create(user)); - } - case UPDATE_EMAIL, UPDATE_PROFILE -> { - LOGGER.infof("[SCIM] Propagate User %s - %s", eventType, eventUserId); - UserModel user = getUser(eventUserId); - dispatcher.dispatchUserModificationToAll(client -> client.update(user)); - } - case DELETE_ACCOUNT -> { - LOGGER.infof("[SCIM] Propagate User deletion - %s", eventUserId); - dispatcher.dispatchUserModificationToAll(client -> client.delete(eventUserId)); - } - default -> { - // No other event has to be propagated to Scim endpoints - } - } - } - - - @Override - public void onEvent(AdminEvent event, boolean includeRepresentation) { - // Step 1: check if event is relevant for propagation through SCIM - Pattern pattern = listenedEventPathPatterns.get(event.getResourceType()); - if (pattern == null) - return; - Matcher matcher = pattern.matcher(event.getResourcePath()); - if (!matcher.find()) - return; - - - // Step 2: propagate event (if needed) according to its resource type - switch (event.getResourceType()) { - case USER -> { - KeycloakId userId = new KeycloakId(matcher.group(1)); - handleUserEvent(event, userId); - } - case GROUP -> { - KeycloakId groupId = new KeycloakId(matcher.group(1)); - handleGroupEvent(event, groupId); - } - case GROUP_MEMBERSHIP -> { - KeycloakId userId = new KeycloakId(matcher.group(1)); - KeycloakId groupId = new KeycloakId(matcher.group(2)); - handleGroupMemberShipEvent(event, userId, groupId); - } - case REALM_ROLE_MAPPING -> { - String rawResourceType = matcher.group(1); - ScimResourceType type = switch (rawResourceType) { - case "users" -> ScimResourceType.USER; - case "groups" -> ScimResourceType.GROUP; - default -> throw new IllegalArgumentException("Unsupported resource type: " + rawResourceType); - }; - KeycloakId id = new KeycloakId(matcher.group(2)); - handleRoleMappingEvent(event, type, id); - } - case COMPONENT -> { - String id = matcher.group(1); - handleScimEndpointConfigurationEvent(event, id); - - } - default -> { - // No other resource modification has to be propagated to Scim endpoints - } - } - } - - - private void handleUserEvent(AdminEvent userEvent, KeycloakId userId) { - LOGGER.infof("[SCIM] Propagate User %s - %s", userEvent.getOperationType(), userId); - switch (userEvent.getOperationType()) { - case CREATE -> { - UserModel user = getUser(userId); - dispatcher.dispatchUserModificationToAll(client -> client.create(user)); - user.getGroupsStream().forEach(group -> - dispatcher.dispatchGroupModificationToAll(client -> client.update(group) - )); - } - case UPDATE -> { - UserModel user = getUser(userId); - dispatcher.dispatchUserModificationToAll(client -> client.update(user)); - } - case DELETE -> dispatcher.dispatchUserModificationToAll(client -> client.delete(userId)); - default -> { - // ACTION userEvent are not relevant, nothing to do - } - } - } - - /** - * Propagating the given group-related event to Scim endpoints. - * - * @param event the event to propagate - * @param groupId event target's id - */ - private void handleGroupEvent(AdminEvent event, KeycloakId groupId) { - LOGGER.infof("[SCIM] Propagate Group %s - %s", event.getOperationType(), groupId); - switch (event.getOperationType()) { - case CREATE -> { - GroupModel group = getGroup(groupId); - dispatcher.dispatchGroupModificationToAll(client -> client.create(group)); - } - case UPDATE -> { - GroupModel group = getGroup(groupId); - dispatcher.dispatchGroupModificationToAll(client -> client.update(group)); - } - case DELETE -> dispatcher.dispatchGroupModificationToAll(client -> client.delete(groupId)); - default -> { - // ACTION event are not relevant, nothing to do - } - } - } - - private void handleGroupMemberShipEvent(AdminEvent groupMemberShipEvent, KeycloakId userId, KeycloakId groupId) { - LOGGER.infof("[SCIM] Propagate GroupMemberShip %s - User %s Group %s", groupMemberShipEvent.getOperationType(), userId, groupId); - // Step 1: update USER immediately - GroupModel group = getGroup(groupId); - UserModel user = getUser(userId); - dispatcher.dispatchUserModificationToAll(client -> client.update(user)); - - // Step 2: delayed GROUP update : - // if several users are added to the group simultaneously in different Keycloack sessions - // update the group in the context of the current session may not reflect those other changes - // We trigger a delayed update by setting an attribute on the group (that will be handled by ScimBackgroundGroupMembershipUpdaters) - group.setSingleAttribute(ScimBackgroundGroupMembershipUpdater.GROUP_DIRTY_SINCE_ATTRIBUTE_NAME, "" + System.currentTimeMillis()); - } - - private void handleRoleMappingEvent(AdminEvent roleMappingEvent, ScimResourceType type, KeycloakId id) { - LOGGER.infof("[SCIM] Propagate RoleMapping %s - %s %s", roleMappingEvent.getOperationType(), type, id); - switch (type) { - case USER -> { - UserModel user = getUser(id); - dispatcher.dispatchUserModificationToAll(client -> client.update(user)); - } - case GROUP -> { - GroupModel group = getGroup(id); - session.users() - .getGroupMembersStream(session.getContext().getRealm(), group) - .forEach(user -> - dispatcher.dispatchUserModificationToAll(client -> client.update(user) - )); - } - default -> { - // No other type is relevant for propagation - } - } - } - - private void handleScimEndpointConfigurationEvent(AdminEvent event, String id) { - // In case of a component deletion - if (event.getOperationType() == OperationType.DELETE) { - // Check if it was a Scim endpoint configuration, and forward deletion if so - Stream<ComponentModel> scimEndpointConfigurationsWithDeletedId = session.getContext().getRealm().getComponentsStream() - .filter(m -> ScimEndpointConfigurationStorageProviderFactory.ID.equals(m.getProviderId()) - && id.equals(m.getId())); - if (scimEndpointConfigurationsWithDeletedId.iterator().hasNext()) { - LOGGER.infof("[SCIM] SCIM Endpoint configuration DELETE - %s ", id); - dispatcher.refreshActiveScimEndpoints(); - } - } else { - // In case of CREATE or UPDATE, we can directly use the string representation - // to check if it defines a SCIM endpoint (faster) - if (event.getRepresentation() != null - && event.getRepresentation().contains("\"providerId\":\"scim\"")) { - LOGGER.infof("[SCIM] SCIM Endpoint configuration CREATE - %s ", id); - dispatcher.refreshActiveScimEndpoints(); - } - } - - } - - - private UserModel getUser(KeycloakId id) { - return keycloakDao.getUserById(id); - } - - private GroupModel getGroup(KeycloakId id) { - return keycloakDao.getGroupById(id); - } - - @Override - public void close() { - dispatcher.close(); - } - - -} diff --git a/src/main/java/sh/libre/scim/event/ScimEventListenerProviderFactory.java b/src/main/java/sh/libre/scim/event/ScimEventListenerProviderFactory.java deleted file mode 100644 index c7b437a..0000000 --- a/src/main/java/sh/libre/scim/event/ScimEventListenerProviderFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package sh.libre.scim.event; - -import org.keycloak.Config.Scope; -import org.keycloak.events.EventListenerProvider; -import org.keycloak.events.EventListenerProviderFactory; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.KeycloakSessionFactory; - -public class ScimEventListenerProviderFactory implements EventListenerProviderFactory { - - @Override - public EventListenerProvider create(KeycloakSession session) { - return new ScimEventListenerProvider(session); - } - - @Override - public String getId() { - return "scim"; - } - - @Override - public void init(Scope config) { - // Nothing to initialize - } - - @Override - public void postInit(KeycloakSessionFactory factory) { - // Nothing to initialize - } - - @Override - public void close() { - // Nothing to close - } - -} diff --git a/src/main/java/sh/libre/scim/jpa/ScimResourceDao.java b/src/main/java/sh/libre/scim/jpa/ScimResourceDao.java deleted file mode 100644 index 4deec37..0000000 --- a/src/main/java/sh/libre/scim/jpa/ScimResourceDao.java +++ /dev/null @@ -1,96 +0,0 @@ -package sh.libre.scim.jpa; - -import jakarta.persistence.EntityManager; -import jakarta.persistence.NoResultException; -import jakarta.persistence.TypedQuery; -import org.keycloak.connections.jpa.JpaConnectionProvider; -import org.keycloak.models.KeycloakSession; -import sh.libre.scim.core.service.EntityOnRemoteScimId; -import sh.libre.scim.core.service.KeycloakId; -import sh.libre.scim.core.service.ScimResourceType; - -import java.util.Optional; - -public class ScimResourceDao { - - private final String realmId; - - private final String componentId; - - private final EntityManager entityManager; - - private ScimResourceDao(String realmId, String componentId, EntityManager entityManager) { - this.realmId = realmId; - this.componentId = componentId; - this.entityManager = entityManager; - } - - public static ScimResourceDao newInstance(KeycloakSession keycloakSession, String componentId) { - String realmId = keycloakSession.getContext().getRealm().getId(); - EntityManager entityManager = keycloakSession.getProvider(JpaConnectionProvider.class).getEntityManager(); - return new ScimResourceDao(realmId, componentId, entityManager); - } - - private EntityManager getEntityManager() { - return entityManager; - } - - private String getRealmId() { - return realmId; - } - - private String getComponentId() { - return componentId; - } - - public void create(KeycloakId id, EntityOnRemoteScimId externalId, ScimResourceType type) { - ScimResourceMapping entity = new ScimResourceMapping(); - entity.setType(type.name()); - entity.setExternalId(externalId.asString()); - entity.setComponentId(componentId); - entity.setRealmId(realmId); - entity.setId(id.asString()); - entityManager.persist(entity); - } - - private TypedQuery<ScimResourceMapping> getScimResourceTypedQuery(String queryName, String id, ScimResourceType type) { - return getEntityManager() - .createNamedQuery(queryName, ScimResourceMapping.class) - .setParameter("type", type.name()) - .setParameter("realmId", getRealmId()) - .setParameter("componentId", getComponentId()) - .setParameter("id", id); - } - - public Optional<ScimResourceMapping> findByExternalId(EntityOnRemoteScimId externalId, ScimResourceType type) { - try { - return Optional.of( - getScimResourceTypedQuery("findByExternalId", externalId.asString(), type).getSingleResult() - ); - } catch (NoResultException e) { - return Optional.empty(); - } - } - - public Optional<ScimResourceMapping> findById(KeycloakId keycloakId, ScimResourceType type) { - try { - return Optional.of( - getScimResourceTypedQuery("findById", keycloakId.asString(), type).getSingleResult() - ); - } catch (NoResultException e) { - return Optional.empty(); - } - } - - public Optional<ScimResourceMapping> findUserById(KeycloakId id) { - return findById(id, ScimResourceType.USER); - } - - public Optional<ScimResourceMapping> findUserByExternalId(EntityOnRemoteScimId externalId) { - return findByExternalId(externalId, ScimResourceType.USER); - } - - public void delete(ScimResourceMapping resource) { - entityManager.remove(resource); - } -} diff --git a/src/main/java/sh/libre/scim/jpa/ScimResourceId.java b/src/main/java/sh/libre/scim/jpa/ScimResourceId.java deleted file mode 100644 index d0abddf..0000000 --- a/src/main/java/sh/libre/scim/jpa/ScimResourceId.java +++ /dev/null @@ -1,83 +0,0 @@ -package sh.libre.scim.jpa; - -import org.apache.commons.lang3.StringUtils; - -import java.io.Serializable; -import java.util.Objects; - -public class ScimResourceId implements Serializable { - private String id; - private String realmId; - private String componentId; - private String type; - private String externalId; - - public ScimResourceId() { - } - - public ScimResourceId(String id, String realmId, String componentId, String type, String externalId) { - this.setId(id); - this.setRealmId(realmId); - this.setComponentId(componentId); - this.setType(type); - this.setExternalId(externalId); - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getRealmId() { - return realmId; - } - - public void setRealmId(String realmId) { - this.realmId = realmId; - } - - public String getComponentId() { - return componentId; - } - - public void setComponentId(String componentId) { - this.componentId = componentId; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getExternalId() { - return externalId; - } - - public void setExternalId(String externalId) { - this.externalId = externalId; - } - - @Override - public boolean equals(Object other) { - if (this == other) - return true; - if (!(other instanceof ScimResourceId o)) - return false; - return (StringUtils.equals(o.id, id) && - StringUtils.equals(o.realmId, realmId) && - StringUtils.equals(o.componentId, componentId) && - StringUtils.equals(o.type, type) && - StringUtils.equals(o.externalId, externalId)); - } - - @Override - public int hashCode() { - return Objects.hash(realmId, componentId, type, id, externalId); - } -} diff --git a/src/main/java/sh/libre/scim/jpa/ScimResourceMapping.java b/src/main/java/sh/libre/scim/jpa/ScimResourceMapping.java deleted file mode 100644 index ade6848..0000000 --- a/src/main/java/sh/libre/scim/jpa/ScimResourceMapping.java +++ /dev/null @@ -1,89 +0,0 @@ -package sh.libre.scim.jpa; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.IdClass; -import jakarta.persistence.NamedQueries; -import jakarta.persistence.NamedQuery; -import jakarta.persistence.Table; -import sh.libre.scim.core.service.EntityOnRemoteScimId; -import sh.libre.scim.core.service.KeycloakId; - -@Entity -@IdClass(ScimResourceId.class) -@Table(name = "SCIM_RESOURCE_MAPPING") -@NamedQueries({ - @NamedQuery(name = "findById", query = "from ScimResourceMapping where realmId = :realmId and componentId = :componentId and type = :type and id = :id"), - @NamedQuery(name = "findByExternalId", query = "from ScimResourceMapping where realmId = :realmId and componentId = :componentId and type = :type and externalId = :id") -}) -public class ScimResourceMapping { - - @Id - @Column(name = "ID", nullable = false) - private String id; - - @Id - @Column(name = "REALM_ID", nullable = false) - private String realmId; - - @Id - @Column(name = "COMPONENT_ID", nullable = false) - private String componentId; - - @Id - @Column(name = "TYPE", nullable = false) - private String type; - - @Id - @Column(name = "EXTERNAL_ID", nullable = false) - private String externalId; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getRealmId() { - return realmId; - } - - public void setRealmId(String realmId) { - this.realmId = realmId; - } - - public String getComponentId() { - return componentId; - } - - public void setComponentId(String componentId) { - this.componentId = componentId; - } - - public String getExternalId() { - return externalId; - } - - public void setExternalId(String externalId) { - this.externalId = externalId; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public KeycloakId getIdAsKeycloakId() { - return new KeycloakId(id); - } - - public EntityOnRemoteScimId getExternalIdAsEntityOnRemoteScimId() { - return new EntityOnRemoteScimId(externalId); - } -} diff --git a/src/main/java/sh/libre/scim/jpa/ScimResourceProvider.java b/src/main/java/sh/libre/scim/jpa/ScimResourceProvider.java deleted file mode 100644 index 6ef55a0..0000000 --- a/src/main/java/sh/libre/scim/jpa/ScimResourceProvider.java +++ /dev/null @@ -1,29 +0,0 @@ -package sh.libre.scim.jpa; - -import org.keycloak.connections.jpa.entityprovider.JpaEntityProvider; - -import java.util.Collections; -import java.util.List; - -public class ScimResourceProvider implements JpaEntityProvider { - - @Override - public List<Class<?>> getEntities() { - return Collections.singletonList(ScimResourceMapping.class); - } - - @Override - public String getChangelogLocation() { - return "META-INF/scim-resource-changelog.xml"; - } - - @Override - public void close() { - // Nothing to close - } - - @Override - public String getFactoryId() { - return ScimResourceProviderFactory.ID; - } -} \ No newline at end of file diff --git a/src/main/java/sh/libre/scim/jpa/ScimResourceProviderFactory.java b/src/main/java/sh/libre/scim/jpa/ScimResourceProviderFactory.java deleted file mode 100644 index 7f3cc32..0000000 --- a/src/main/java/sh/libre/scim/jpa/ScimResourceProviderFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -package sh.libre.scim.jpa; - -import org.keycloak.Config.Scope; -import org.keycloak.connections.jpa.entityprovider.JpaEntityProvider; -import org.keycloak.connections.jpa.entityprovider.JpaEntityProviderFactory; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.KeycloakSessionFactory; - -public class ScimResourceProviderFactory implements JpaEntityProviderFactory { - - static final String ID = "scim-resource"; - - @Override - public JpaEntityProvider create(KeycloakSession session) { - return new ScimResourceProvider(); - } - - @Override - public String getId() { - return ID; - } - - @Override - public void init(Scope scope) { - // Nothing to initialise - } - - @Override - public void postInit(KeycloakSessionFactory sessionFactory) { - // Nothing to do - } - - - @Override - public void close() { - // Nothing to close - } - -} diff --git a/src/main/resources/META-INF/jboss-deployment-structure.xml b/src/main/resources/META-INF/jboss-deployment-structure.xml deleted file mode 100644 index 42007fe..0000000 --- a/src/main/resources/META-INF/jboss-deployment-structure.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<jboss-deployment-structure> - <deployment> - <dependencies> - <module name="org.keycloak.keycloak-services" /> - <module name="org.keycloak.keycloak-model-jpa" /> - <module name="org.hibernate" /> - </dependencies> - </deployment> -</jboss-deployment-structure> diff --git a/src/main/resources/META-INF/scim-resource-changelog.xml b/src/main/resources/META-INF/scim-resource-changelog.xml deleted file mode 100644 index d3e2687..0000000 --- a/src/main/resources/META-INF/scim-resource-changelog.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> - <changeSet author="contact@indiehosters.net" id="scim-resource-1.0"> - - <createTable tableName="SCIM_RESOURCE_MAPPING"> - <column name="ID" type="VARCHAR(36)"> - <constraints nullable="false"/> - </column> - <column name="REALM_ID" type="VARCHAR(36)"> - <constraints nullable="false"/> - </column> - <column name="TYPE" type="VARCHAR(36)"> - <constraints nullable="false"/> - </column> - <column name="COMPONENT_ID" type="VARCHAR(36)"> - <constraints nullable="false"/> - </column> - <column name="EXTERNAL_ID" type="VARCHAR(36)"> - <constraints nullable="false"/> - </column> - </createTable> - - <addPrimaryKey constraintName="PK_SCIM_RESOURCE_MAPPING" tableName="SCIM_RESOURCE_MAPPING" - columnNames="ID,REALM_ID,TYPE,COMPONENT_ID,EXTERNAL_ID"/> - <addForeignKeyConstraint baseTableName="SCIM_RESOURCE_MAPPING" baseColumnNames="REALM_ID" - constraintName="FK_SCIM_RESOURCE_MAPPING_REALM" referencedTableName="REALM" - referencedColumnNames="ID" onDelete="CASCADE" onUpdate="CASCADE"/> - <addForeignKeyConstraint baseTableName="SCIM_RESOURCE_MAPPING" baseColumnNames="COMPONENT_ID" - constraintName="FK_SCIM_RESOURCE_MAPPING_COMPONENT" referencedTableName="COMPONENT" - referencedColumnNames="ID" onDelete="CASCADE" onUpdate="CASCADE"/> - </changeSet> - -</databaseChangeLog> \ No newline at end of file diff --git a/src/main/resources/META-INF/services/org.keycloak.connections.jpa.entityprovider.JpaEntityProviderFactory b/src/main/resources/META-INF/services/org.keycloak.connections.jpa.entityprovider.JpaEntityProviderFactory deleted file mode 100644 index b3cb1a1..0000000 --- a/src/main/resources/META-INF/services/org.keycloak.connections.jpa.entityprovider.JpaEntityProviderFactory +++ /dev/null @@ -1 +0,0 @@ -sh.libre.scim.jpa.ScimResourceProviderFactory diff --git a/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory b/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory deleted file mode 100644 index 7e2a6ed..0000000 --- a/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory +++ /dev/null @@ -1 +0,0 @@ -sh.libre.scim.event.ScimEventListenerProviderFactory diff --git a/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory b/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory deleted file mode 100644 index 308796c..0000000 --- a/src/main/resources/META-INF/services/org.keycloak.storage.UserStorageProviderFactory +++ /dev/null @@ -1 +0,0 @@ -sh.libre.scim.core.ScimEndpointConfigurationStorageProviderFactory -- GitLab