From 74ed7d5bd6bba0d89fa3b815317753a263df57b2 Mon Sep 17 00:00:00 2001 From: Steve Hawkins Date: Tue, 14 Apr 2026 15:58:31 -0400 Subject: [PATCH 1/3] fix: minimizing the dependencies for the rest module closes: #48114 Signed-off-by: Steve Hawkins --- .../common/constants/KeycloakOpenAPI.java | 65 +++++++++++ integration/client-cli/admin-cli/pom.xml | 3 +- js/pom.xml | 2 +- operator/pom.xml | 4 - quarkus/runtime/pom.xml | 11 ++ rest/admin-v2/api/pom.xml | 82 ++++++++++++++ .../internal/openapi/OASModelFilter.java | 2 +- .../ClientSecretNotBlankValidator.java | 4 +- .../{ => impl}/ClientUuidProvider.java | 2 +- .../ProtocolUnmodifiedValidator.java | 3 +- .../validation/{ => impl}/UuidProvider.java | 2 +- .../{ => impl}/UuidUnmodifiedValidator.java | 17 ++- .../rest}/admin/api/DefaultAdminApi.java | 10 +- .../rest}/admin/api/DefaultAdminRootV2.java | 4 +- .../admin/api/client/DefaultClientApi.java | 3 +- .../admin/api/client/DefaultClientsApi.java | 4 +- .../java/org/keycloak/services/PatchType.java | 2 + .../services/client/DefaultClientService.java | 2 +- .../services/client/NewClientService.java | 2 +- .../jakarta.validation.ConstraintValidator | 3 + rest/admin-v2/rest/pom.xml | 105 +++--------------- .../keycloak/admin/api}/PatchTypeNames.java | 2 +- .../keycloak/admin/api/client/ClientApi.java | 2 +- .../keycloak/admin/api/client/ClientsApi.java | 2 +- .../admin/v2/BaseClientRepresentation.java | 7 +- .../admin/v2/BaseRepresentation.java | 0 .../admin/v2/OIDCClientRepresentation.java | 0 .../admin/v2/RepresentationWithUuid.java | 0 .../admin/v2/SAMLClientRepresentation.java | 0 .../v2/validation/ClientSecretNotBlank.java | 3 +- .../admin/v2/validation/CreateClient.java | 0 .../admin/v2/validation/PatchClient.java | 0 .../v2/validation/ProtocolUnmodified.java | 2 +- .../admin/v2/validation/PutClient.java | 0 .../admin/v2/validation/UuidUnmodified.java | 6 +- .../admin/client/v2/AdminEventV2Test.java | 2 +- .../v2/ClientApiV2AuthorizationTest.java | 2 +- .../admin/client/v2/ClientApiV2Test.java | 2 +- .../admin/client/v2/ClientPoliciesV2Test.java | 2 +- .../validation/PatchClientValidationTest.java | 2 +- .../services/resources/KeycloakOpenAPI.java | 43 +------ 41 files changed, 232 insertions(+), 177 deletions(-) create mode 100644 common/src/main/java/org/keycloak/common/constants/KeycloakOpenAPI.java rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java (99%) rename rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/{ => impl}/ClientSecretNotBlankValidator.java (91%) rename rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/{ => impl}/ClientUuidProvider.java (93%) rename rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/{ => impl}/ProtocolUnmodifiedValidator.java (89%) rename rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/{ => impl}/UuidProvider.java (89%) rename rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/{ => impl}/UuidUnmodifiedValidator.java (77%) rename rest/admin-v2/{rest/src/main/java/org/keycloak => api/src/main/java/org/keycloak/rest}/admin/api/DefaultAdminApi.java (86%) rename rest/admin-v2/{rest/src/main/java/org/keycloak => api/src/main/java/org/keycloak/rest}/admin/api/DefaultAdminRootV2.java (89%) rename rest/admin-v2/{rest/src/main/java/org/keycloak => api/src/main/java/org/keycloak/rest}/admin/api/client/DefaultClientApi.java (97%) rename rest/admin-v2/{rest/src/main/java/org/keycloak => api/src/main/java/org/keycloak/rest}/admin/api/client/DefaultClientsApi.java (93%) create mode 100644 rest/admin-v2/api/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator rename rest/admin-v2/{api/src/main/java/org/keycloak/services => rest/src/main/java/org/keycloak/admin/api}/PatchTypeNames.java (77%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java (94%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/BaseRepresentation.java (100%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/OIDCClientRepresentation.java (100%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/RepresentationWithUuid.java (100%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/SAMLClientRepresentation.java (100%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java (87%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/validation/CreateClient.java (100%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/validation/PatchClient.java (100%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java (90%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/validation/PutClient.java (100%) rename rest/admin-v2/{api => rest}/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java (83%) diff --git a/common/src/main/java/org/keycloak/common/constants/KeycloakOpenAPI.java b/common/src/main/java/org/keycloak/common/constants/KeycloakOpenAPI.java new file mode 100644 index 000000000000..034bfb745ab7 --- /dev/null +++ b/common/src/main/java/org/keycloak/common/constants/KeycloakOpenAPI.java @@ -0,0 +1,65 @@ +/* + * Copyright 2023 Red Hat, Inc. and/or its affiliates + * and other contributors as indicated by the @author tags. + * + * 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. + */ + +package org.keycloak.common.constants; + +/** + * Class of constants relating to the OpenAPI annotations in Keycloak and the Keycloak Admin REST API + */ +public class KeycloakOpenAPI { + + protected KeycloakOpenAPI() { } + public static class Profiles { + + public static final String ADMIN = "x-smallrye-profile-admin"; + + private Profiles() { } + } + + public static class Admin { + + private Admin() { } + + public static class Tags { + public static final String ATTACK_DETECTION = "Attack Detection"; + public static final String AUTHENTICATION_MANAGEMENT = "Authentication Management"; + public static final String CLIENTS = "Clients"; + public static final String CLIENTS_V2 = "Clients (v2)"; + public static final String CLIENT_ATTRIBUTE_CERTIFICATE = "Client Attribute Certificate"; + public static final String CLIENT_INITIAL_ACCESS = "Client Initial Access"; + public static final String CLIENT_REGISTRATION_POLICY = "Client Registration Policy"; + public static final String CLIENT_ROLE_MAPPINGS = "Client Role Mappings"; + public static final String CLIENT_SCOPES = "Client Scopes"; + public static final String COMPONENT = "Component"; + public static final String GROUPS = "Groups"; + public static final String IDENTITY_PROVIDERS = "Identity Providers"; + public static final String KEY = "Key"; + public static final String PROTOCOL_MAPPERS = "Protocol Mappers"; + public static final String REALMS_ADMIN = "Realms Admin"; + public static final String ROLES = "Roles"; + public static final String ROLES_BY_ID = "Roles (by ID)"; + public static final String ROLE_MAPPER = "Role Mapper"; + public static final String ROOT = "Root"; + public static final String SCOPE_MAPPINGS = "Scope Mappings"; + public static final String USERS = "Users"; + public static final String ORGANIZATIONS = "Organizations"; + public static final String WORKFLOWS = "Workflows"; + private Tags() { } + } + + } +} diff --git a/integration/client-cli/admin-cli/pom.xml b/integration/client-cli/admin-cli/pom.xml index dcaff48225de..24322ce45239 100755 --- a/integration/client-cli/admin-cli/pom.xml +++ b/integration/client-cli/admin-cli/pom.xml @@ -54,8 +54,7 @@ org.keycloak - keycloak-admin-v2-rest - ${project.version} + keycloak-admin-v2-api provided diff --git a/js/pom.xml b/js/pom.xml index 446299f00b42..9f6b0238056c 100644 --- a/js/pom.xml +++ b/js/pom.xml @@ -27,7 +27,7 @@ org.keycloak - keycloak-admin-v2-rest + keycloak-admin-v2-api provided diff --git a/operator/pom.xml b/operator/pom.xml index 2bf215ca174a..214b0970763d 100644 --- a/operator/pom.xml +++ b/operator/pom.xml @@ -119,10 +119,6 @@ org.keycloak keycloak-admin-client - - org.keycloak - keycloak-admin-v2-api - org.keycloak keycloak-admin-v2-rest diff --git a/quarkus/runtime/pom.xml b/quarkus/runtime/pom.xml index 428326440431..118a593894fe 100644 --- a/quarkus/runtime/pom.xml +++ b/quarkus/runtime/pom.xml @@ -432,6 +432,17 @@ + + + org.keycloak + keycloak-admin-v2-api + + + * + * + + + org.keycloak diff --git a/rest/admin-v2/api/pom.xml b/rest/admin-v2/api/pom.xml index 9e7420e52484..8db686fb2342 100644 --- a/rest/admin-v2/api/pom.xml +++ b/rest/admin-v2/api/pom.xml @@ -17,6 +17,8 @@ 17 17 UTF-8 + + 4.2.4 @@ -55,6 +57,17 @@ jakarta.enterprise jakarta.enterprise.cdi-api + + org.keycloak + keycloak-admin-v2-rest + + + + io.smallrye + jandex + provided + true + @@ -68,6 +81,75 @@ + + io.smallrye + smallrye-open-api-maven-plugin + + org.keycloak.representations.admin.v2,org.keycloak.admin.api + org.keycloak.admin.internal.openapi.OASModelFilter + ${project.build.directory} + ALL + Keycloak API + ${project.version} + + PARENT_ONLY + METHOD + FAIL + + + + + process-classes + + generate-schema + + + + + + maven-resources-plugin + + + copy-openapi-to-jar + process-classes + + copy-resources + + + + ${project.build.directory}/classes/META-INF + + + ${project.build.directory} + + openapi.json + openapi.yaml + + + + + + + copy-openapi-to-js-client + process-classes + + copy-resources + + + ${maven.multiModuleProjectDirectory}/js/libs/keycloak-admin-client + + + ${project.build.directory} + + openapi.yaml + + false + + + + + + \ No newline at end of file diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java b/rest/admin-v2/api/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java similarity index 99% rename from rest/admin-v2/rest/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java rename to rest/admin-v2/api/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java index 1ebcf7929531..99cc607b4269 100644 --- a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java @@ -35,7 +35,7 @@ import org.jboss.jandex.Type; import org.jboss.logging.Logger; -import static org.keycloak.services.PatchTypeNames.JSON_MERGE; +import static org.keycloak.admin.api.PatchTypeNames.JSON_MERGE; import static org.keycloak.utils.StringUtil.isNullOrEmpty; public class OASModelFilter implements OASFilter { diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlankValidator.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientSecretNotBlankValidator.java similarity index 91% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlankValidator.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientSecretNotBlankValidator.java index b523fe1bc398..0c8ddbc820c9 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlankValidator.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientSecretNotBlankValidator.java @@ -1,4 +1,4 @@ -package org.keycloak.representations.admin.v2.validation; +package org.keycloak.representations.admin.v2.validation.impl; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; @@ -6,6 +6,7 @@ import org.keycloak.authentication.authenticators.client.ClientIdAndSecretAuthenticator; import org.keycloak.authentication.authenticators.client.JWTClientSecretAuthenticator; import org.keycloak.representations.admin.v2.OIDCClientRepresentation; +import org.keycloak.representations.admin.v2.validation.ClientSecretNotBlank; import org.keycloak.utils.StringUtil; /** @@ -32,4 +33,5 @@ public static boolean isClientSecret(String method) { return ClientIdAndSecretAuthenticator.PROVIDER_ID.equals(method) || JWTClientSecretAuthenticator.PROVIDER_ID.equals(method); } + } diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientUuidProvider.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientUuidProvider.java similarity index 93% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientUuidProvider.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientUuidProvider.java index 783884e8e139..7165be7e50ba 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientUuidProvider.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientUuidProvider.java @@ -1,4 +1,4 @@ -package org.keycloak.representations.admin.v2.validation; +package org.keycloak.representations.admin.v2.validation.impl; import java.util.Optional; diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodifiedValidator.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ProtocolUnmodifiedValidator.java similarity index 89% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodifiedValidator.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ProtocolUnmodifiedValidator.java index 380fb97903d8..de85a59b5116 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodifiedValidator.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ProtocolUnmodifiedValidator.java @@ -1,4 +1,4 @@ -package org.keycloak.representations.admin.v2.validation; +package org.keycloak.representations.admin.v2.validation.impl; import java.util.Optional; @@ -7,6 +7,7 @@ import org.keycloak.models.ClientModel; import org.keycloak.representations.admin.v2.BaseClientRepresentation; +import org.keycloak.representations.admin.v2.validation.ProtocolUnmodified; import org.keycloak.validation.jakarta.ValidationContext; public class ProtocolUnmodifiedValidator implements ConstraintValidator { diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidProvider.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidProvider.java similarity index 89% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidProvider.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidProvider.java index 25aebb1acd6d..52299bf3e754 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidProvider.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidProvider.java @@ -1,4 +1,4 @@ -package org.keycloak.representations.admin.v2.validation; +package org.keycloak.representations.admin.v2.validation.impl; import org.keycloak.representations.admin.v2.RepresentationWithUuid; import org.keycloak.validation.jakarta.ValidationContext; diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodifiedValidator.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidUnmodifiedValidator.java similarity index 77% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodifiedValidator.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidUnmodifiedValidator.java index d2bdee23d04b..98f885d3f167 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodifiedValidator.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidUnmodifiedValidator.java @@ -1,9 +1,11 @@ -package org.keycloak.representations.admin.v2.validation; +package org.keycloak.representations.admin.v2.validation.impl; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; +import org.keycloak.representations.admin.v2.BaseClientRepresentation; import org.keycloak.representations.admin.v2.RepresentationWithUuid; +import org.keycloak.representations.admin.v2.validation.UuidUnmodified; import org.keycloak.validation.jakarta.ValidationContext; /** @@ -23,10 +25,11 @@ public class UuidUnmodifiedValidator implements ConstraintValidator type = constraintAnnotation.type(); + if (type == BaseClientRepresentation.class) { + uuidProvider = new ClientUuidProvider(); + } else { + throw new AssertionError("Not Uuid Provider defined for " + type); } } @@ -41,7 +44,9 @@ public boolean isValid(RepresentationWithUuid representation, ConstraintValidato String persistedUuid = uuidProvider.getPersistedUuid(validationContext, representation); if (persistedUuid != null) { // resource exists - if (persistedUuid.equals(providedUuid)) return true; + if (persistedUuid.equals(providedUuid)) { + return true; + } } else if (!uuidProvider.uuidExists(validationContext, providedUuid)) { // additional check for PUT create to check the resource was just not renamed return true; } diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/DefaultAdminApi.java b/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/DefaultAdminApi.java similarity index 86% rename from rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/DefaultAdminApi.java rename to rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/DefaultAdminApi.java index 5486f2de9f43..91ef6c7a2c88 100644 --- a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/DefaultAdminApi.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/DefaultAdminApi.java @@ -1,14 +1,13 @@ -package org.keycloak.admin.api; +package org.keycloak.rest.admin.api; import jakarta.ws.rs.NotFoundException; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; +import org.keycloak.admin.api.AdminApi; import org.keycloak.admin.api.client.ClientsApi; -import org.keycloak.admin.api.client.DefaultClientsApi; import org.keycloak.models.KeycloakSession; import org.keycloak.models.RealmModel; import org.keycloak.protocol.oidc.TokenManager; +import org.keycloak.rest.admin.api.client.DefaultClientsApi; import org.keycloak.services.resources.admin.AdminRoot; import org.keycloak.services.resources.admin.RealmAdminResource; import org.keycloak.services.resources.admin.RealmsAdminResource; @@ -32,9 +31,8 @@ public DefaultAdminApi(KeycloakSession session, String realmName) { this.realmAdminResource = new RealmsAdminResource(session, authInfo, new TokenManager()).getRealmAdmin(realmName); } - @Path("clients/{version:v\\d+}") @Override - public ClientsApi clients(@PathParam("version") String version) { + public ClientsApi clients(String version) { return switch (version) { case "v2" -> new DefaultClientsApi(session, realm, permissions, realmAdminResource); default -> throw new NotFoundException(); diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/DefaultAdminRootV2.java b/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/DefaultAdminRootV2.java similarity index 89% rename from rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/DefaultAdminRootV2.java rename to rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/DefaultAdminRootV2.java index a5c0eaa104e3..2ca3f1d98803 100644 --- a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/DefaultAdminRootV2.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/DefaultAdminRootV2.java @@ -1,10 +1,12 @@ -package org.keycloak.admin.api; +package org.keycloak.rest.admin.api; import jakarta.ws.rs.NotFoundException; import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.Response; import jakarta.ws.rs.ext.Provider; +import org.keycloak.admin.api.AdminApi; +import org.keycloak.admin.api.AdminRootV2; import org.keycloak.common.Profile; import org.keycloak.models.KeycloakSession; import org.keycloak.services.resources.admin.AdminCorsPreflightService; diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/DefaultClientApi.java b/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientApi.java similarity index 97% rename from rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/DefaultClientApi.java rename to rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientApi.java index 4a983987c437..bf6c4b07a737 100644 --- a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/DefaultClientApi.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientApi.java @@ -1,4 +1,4 @@ -package org.keycloak.admin.api.client; +package org.keycloak.rest.admin.api.client; import java.io.InputStream; @@ -12,6 +12,7 @@ import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.Response; +import org.keycloak.admin.api.client.ClientApi; import org.keycloak.models.KeycloakSession; import org.keycloak.models.RealmModel; import org.keycloak.representations.admin.v2.BaseClientRepresentation; diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/DefaultClientsApi.java b/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientsApi.java similarity index 93% rename from rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/DefaultClientsApi.java rename to rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientsApi.java index cb01f977e697..d72bbc5e71d8 100644 --- a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/DefaultClientsApi.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientsApi.java @@ -1,4 +1,4 @@ -package org.keycloak.admin.api.client; +package org.keycloak.rest.admin.api.client; import java.util.stream.Stream; @@ -10,6 +10,8 @@ import jakarta.ws.rs.PathParam; import jakarta.ws.rs.core.Response; +import org.keycloak.admin.api.client.ClientApi; +import org.keycloak.admin.api.client.ClientsApi; import org.keycloak.models.KeycloakSession; import org.keycloak.models.RealmModel; import org.keycloak.representations.admin.v2.BaseClientRepresentation; diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/PatchType.java b/rest/admin-v2/api/src/main/java/org/keycloak/services/PatchType.java index d55a89bee686..598415d4ee1f 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/services/PatchType.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/services/PatchType.java @@ -4,6 +4,8 @@ import jakarta.ws.rs.core.MediaType; +import org.keycloak.admin.api.PatchTypeNames; + public enum PatchType { JSON_MERGE(PatchTypeNames.JSON_MERGE); diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/client/DefaultClientService.java b/rest/admin-v2/api/src/main/java/org/keycloak/services/client/DefaultClientService.java index e0f7fcac6954..825099dc69fc 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/services/client/DefaultClientService.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/services/client/DefaultClientService.java @@ -59,7 +59,7 @@ import org.apache.http.HttpEntity; import org.apache.http.util.EntityUtils; -import static org.keycloak.representations.admin.v2.validation.ClientSecretNotBlankValidator.isClientSecret; +import static org.keycloak.representations.admin.v2.validation.impl.ClientSecretNotBlankValidator.isClientSecret; /** * Legacy implementation of ClientService for Admin API v2 that uses Admin API v1 under hood. diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/client/NewClientService.java b/rest/admin-v2/api/src/main/java/org/keycloak/services/client/NewClientService.java index 8d3fd6bbc435..8f4e0d99dc5b 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/services/client/NewClientService.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/services/client/NewClientService.java @@ -41,7 +41,7 @@ import org.keycloak.validation.jakarta.JakartaValidatorProvider; import org.keycloak.validation.jakarta.ValidationContext; -import static org.keycloak.representations.admin.v2.validation.ClientSecretNotBlankValidator.isClientSecret; +import static org.keycloak.representations.admin.v2.validation.impl.ClientSecretNotBlankValidator.isClientSecret; import static org.keycloak.utils.StringUtil.isBlank; /** diff --git a/rest/admin-v2/api/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator b/rest/admin-v2/api/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator new file mode 100644 index 000000000000..63483d676d8c --- /dev/null +++ b/rest/admin-v2/api/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator @@ -0,0 +1,3 @@ +org.keycloak.representations.admin.v2.validation.impl.ClientSecretNotBlankValidator +org.keycloak.representations.admin.v2.validation.impl.ProtocolUnmodifiedValidator +org.keycloak.representations.admin.v2.validation.impl.UuidUnmodifiedValidator \ No newline at end of file diff --git a/rest/admin-v2/rest/pom.xml b/rest/admin-v2/rest/pom.xml index d9c69a3bd028..fe705c100f2b 100644 --- a/rest/admin-v2/rest/pom.xml +++ b/rest/admin-v2/rest/pom.xml @@ -17,113 +17,38 @@ 17 17 UTF-8 - - 4.2.4 org.keycloak - keycloak-core + keycloak-common - org.keycloak - keycloak-admin-v2-api + jakarta.ws.rs + jakarta.ws.rs-api - org.keycloak - keycloak-server-spi - provided + jakarta.validation + jakarta.validation-api - jakarta.ws.rs - jakarta.ws.rs-api + com.fasterxml.jackson.core + jackson-annotations - org.keycloak - keycloak-services - provided + com.fasterxml.jackson.core + jackson-databind + + + org.eclipse.microprofile.openapi + microprofile-openapi-api - - io.smallrye - jandex + org.hibernate.validator + hibernate-validator provided - true - - - - io.smallrye - smallrye-open-api-maven-plugin - - org.keycloak.representations.admin.v2,org.keycloak.admin.api - org.keycloak.admin.internal.openapi.OASModelFilter - ${project.build.directory} - ALL - Keycloak API - ${project.version} - - PARENT_ONLY - METHOD - FAIL - - - - - process-classes - - generate-schema - - - - - - maven-resources-plugin - - - copy-openapi-to-jar - process-classes - - copy-resources - - - - ${project.build.directory}/classes/META-INF - - - ${project.build.directory} - - openapi.json - openapi.yaml - - - - - - - copy-openapi-to-js-client - process-classes - - copy-resources - - - ${maven.multiModuleProjectDirectory}/js/libs/keycloak-admin-client - - - ${project.build.directory} - - openapi.yaml - - false - - - - - - - - \ No newline at end of file diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/PatchTypeNames.java b/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/PatchTypeNames.java similarity index 77% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/PatchTypeNames.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/PatchTypeNames.java index ef3d76753c2d..a488762d44dd 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/services/PatchTypeNames.java +++ b/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/PatchTypeNames.java @@ -1,4 +1,4 @@ -package org.keycloak.services; +package org.keycloak.admin.api; public class PatchTypeNames { public static final String JSON_MERGE = "application/merge-patch+json"; diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientApi.java b/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientApi.java index af3ae7125c19..4fb7680a5628 100644 --- a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientApi.java +++ b/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientApi.java @@ -12,8 +12,8 @@ import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; +import org.keycloak.admin.api.PatchTypeNames; import org.keycloak.representations.admin.v2.BaseClientRepresentation; -import org.keycloak.services.PatchTypeNames; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.enums.SchemaType; diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientsApi.java b/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientsApi.java index b1793f8e5d34..fd1ad7914c98 100644 --- a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientsApi.java +++ b/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientsApi.java @@ -12,8 +12,8 @@ import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; +import org.keycloak.common.constants.KeycloakOpenAPI; import org.keycloak.representations.admin.v2.BaseClientRepresentation; -import org.keycloak.services.resources.KeycloakOpenAPI; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.enums.SchemaType; diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java similarity index 94% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java index 588a300d1464..c8ab2bdb08c5 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java +++ b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java @@ -6,7 +6,6 @@ import jakarta.validation.constraints.NotBlank; -import org.keycloak.representations.admin.v2.validation.ClientUuidProvider; import org.keycloak.representations.admin.v2.validation.PatchClient; import org.keycloak.representations.admin.v2.validation.ProtocolUnmodified; import org.keycloak.representations.admin.v2.validation.PutClient; @@ -30,7 +29,7 @@ @JsonSubTypes.Type(value = OIDCClientRepresentation.class, name = OIDCClientRepresentation.PROTOCOL), @JsonSubTypes.Type(value = SAMLClientRepresentation.class, name = SAMLClientRepresentation.PROTOCOL) }) -@UuidUnmodified(uuidProvider = ClientUuidProvider.class, groups = {PutClient.class, PatchClient.class}) +@UuidUnmodified(type = BaseClientRepresentation.class, groups = {PutClient.class, PatchClient.class}) @ProtocolUnmodified(groups = {PutClient.class, PatchClient.class}) @ValidRedirectUris public abstract class BaseClientRepresentation extends BaseRepresentation implements RepresentationWithUuid { @@ -141,7 +140,9 @@ void setProtocol(String protocol) { @Override public boolean equals(Object o) { - if (!(o instanceof BaseClientRepresentation that)) return false; + if (!(o instanceof BaseClientRepresentation that)) { + return false; + } return Objects.equals(uuid, that.uuid) && Objects.equals(clientId, that.clientId) && Objects.equals(displayName, that.displayName) && Objects.equals(description, that.description) && Objects.equals(enabled, that.enabled) && Objects.equals(appUrl, that.appUrl) && Objects.equals(redirectUris, that.redirectUris) && Objects.equals(roles, that.roles); } diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseRepresentation.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/BaseRepresentation.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseRepresentation.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/BaseRepresentation.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/OIDCClientRepresentation.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/OIDCClientRepresentation.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/OIDCClientRepresentation.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/OIDCClientRepresentation.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/RepresentationWithUuid.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/RepresentationWithUuid.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/RepresentationWithUuid.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/RepresentationWithUuid.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/SAMLClientRepresentation.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/SAMLClientRepresentation.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/SAMLClientRepresentation.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/SAMLClientRepresentation.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java similarity index 87% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java index 178f83d6e390..4bbbf5e0549e 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java +++ b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java @@ -15,11 +15,10 @@ * Validation constraint that requires the {@link OIDCClientRepresentation.Auth#getSecret()} is not blank * when {@link OIDCClientRepresentation.Auth#getMethod()} is the (JWT) client secret. * - * @see ClientSecretNotBlankValidator#isClientSecret(String) */ @Target(TYPE) @Retention(RUNTIME) -@Constraint(validatedBy = ClientSecretNotBlankValidator.class) +@Constraint(validatedBy = {}) public @interface ClientSecretNotBlank { String message() default "Client secret must not be blank"; diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/CreateClient.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/CreateClient.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/CreateClient.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/CreateClient.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/PatchClient.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/PatchClient.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/PatchClient.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/PatchClient.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java similarity index 90% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java index 54c4cd893212..ecf5b891db3c 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java +++ b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java @@ -11,8 +11,8 @@ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) -@Constraint(validatedBy = {ProtocolUnmodifiedValidator.class}) @Documented +@Constraint(validatedBy = {}) public @interface ProtocolUnmodified { String message() default "protocol cannot be changed for an existing client"; Class[] groups() default {}; diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/PutClient.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/PutClient.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/PutClient.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/PutClient.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java similarity index 83% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java rename to rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java index 1162f13972d3..1ddcdef60181 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java +++ b/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java @@ -9,6 +9,8 @@ import jakarta.validation.Constraint; import jakarta.validation.Payload; +import org.keycloak.representations.admin.v2.RepresentationWithUuid; + /** * Constraint annotation for validating that UUID was not modified by the user. * @@ -16,11 +18,11 @@ */ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) -@Constraint(validatedBy = {UuidUnmodifiedValidator.class}) @Documented +@Constraint(validatedBy = {}) public @interface UuidUnmodified { String message() default "UUID is server-managed and must not be user-specified"; Class[] groups() default {}; Class[] payload() default {}; - Class uuidProvider(); + Class type(); } diff --git a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/AdminEventV2Test.java b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/AdminEventV2Test.java index 8de806c82882..f96d6ccb0049 100644 --- a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/AdminEventV2Test.java +++ b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/AdminEventV2Test.java @@ -22,6 +22,7 @@ import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; +import org.keycloak.admin.api.PatchTypeNames; import org.keycloak.authentication.authenticators.client.ClientIdAndSecretAuthenticator; import org.keycloak.common.Profile; import org.keycloak.events.admin.OperationType; @@ -29,7 +30,6 @@ import org.keycloak.representations.admin.v2.SAMLClientRepresentation; import org.keycloak.representations.idm.AdminEventRepresentation; import org.keycloak.representations.idm.RealmEventsConfigRepresentation; -import org.keycloak.services.PatchTypeNames; import org.keycloak.testframework.annotations.InjectHttpClient; import org.keycloak.testframework.annotations.InjectRealm; import org.keycloak.testframework.annotations.KeycloakIntegrationTest; diff --git a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientApiV2AuthorizationTest.java b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientApiV2AuthorizationTest.java index 5fd98bfd0da4..683506b8c87f 100644 --- a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientApiV2AuthorizationTest.java +++ b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientApiV2AuthorizationTest.java @@ -10,6 +10,7 @@ import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; +import org.keycloak.admin.api.PatchTypeNames; import org.keycloak.admin.client.Keycloak; import org.keycloak.authorization.fgap.AdminPermissionsSchema; import org.keycloak.common.Profile; @@ -21,7 +22,6 @@ import org.keycloak.representations.idm.authorization.Logic; import org.keycloak.representations.idm.authorization.ScopePermissionRepresentation; import org.keycloak.representations.idm.authorization.UserPolicyRepresentation; -import org.keycloak.services.PatchTypeNames; import org.keycloak.services.client.ClientServiceHelper; import org.keycloak.testframework.admin.AdminClientFactory; import org.keycloak.testframework.annotations.InjectAdminClientFactory; diff --git a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientApiV2Test.java b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientApiV2Test.java index ced988c90264..114bd7b5c489 100644 --- a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientApiV2Test.java +++ b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientApiV2Test.java @@ -27,6 +27,7 @@ import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; +import org.keycloak.admin.api.PatchTypeNames; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.wrapper.Clients; import org.keycloak.authentication.authenticators.client.ClientIdAndSecretAuthenticator; @@ -36,7 +37,6 @@ import org.keycloak.representations.admin.v2.BaseClientRepresentation; import org.keycloak.representations.admin.v2.OIDCClientRepresentation; import org.keycloak.representations.admin.v2.SAMLClientRepresentation; -import org.keycloak.services.PatchTypeNames; import org.keycloak.services.error.ViolationExceptionResponse; import org.keycloak.testframework.annotations.InjectAdminClient; import org.keycloak.testframework.annotations.InjectClient; diff --git a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientPoliciesV2Test.java b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientPoliciesV2Test.java index f9c8b9a5b6fc..68e2711118ff 100644 --- a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientPoliciesV2Test.java +++ b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/ClientPoliciesV2Test.java @@ -26,6 +26,7 @@ import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; +import org.keycloak.admin.api.PatchTypeNames; import org.keycloak.admin.client.Keycloak; import org.keycloak.authentication.authenticators.client.ClientIdAndSecretAuthenticator; import org.keycloak.authentication.authenticators.client.JWTClientAuthenticator; @@ -40,7 +41,6 @@ import org.keycloak.representations.idm.ClientPolicyRepresentation; import org.keycloak.representations.idm.ClientProfileRepresentation; import org.keycloak.representations.idm.ClientProfilesRepresentation; -import org.keycloak.services.PatchTypeNames; import org.keycloak.services.client.ClientServiceHelper; import org.keycloak.services.clientpolicy.ClientPolicyEvent; import org.keycloak.services.clientpolicy.condition.AnyClientConditionFactory; diff --git a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/validation/PatchClientValidationTest.java b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/validation/PatchClientValidationTest.java index b63a59548cd3..85f79adf558a 100644 --- a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/validation/PatchClientValidationTest.java +++ b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/validation/PatchClientValidationTest.java @@ -1,8 +1,8 @@ package org.keycloak.tests.admin.client.v2.validation; +import org.keycloak.admin.api.PatchTypeNames; import org.keycloak.representations.admin.v2.OIDCClientRepresentation; import org.keycloak.representations.admin.v2.SAMLClientRepresentation; -import org.keycloak.services.PatchTypeNames; import org.keycloak.services.error.ViolationExceptionResponse; import org.keycloak.testframework.annotations.KeycloakIntegrationTest; diff --git a/services/src/main/java/org/keycloak/services/resources/KeycloakOpenAPI.java b/services/src/main/java/org/keycloak/services/resources/KeycloakOpenAPI.java index 0a0f1c71873f..6f32d5afeeed 100644 --- a/services/src/main/java/org/keycloak/services/resources/KeycloakOpenAPI.java +++ b/services/src/main/java/org/keycloak/services/resources/KeycloakOpenAPI.java @@ -17,49 +17,8 @@ package org.keycloak.services.resources; -/** - * Class of constants relating to the OpenAPI annotations in Keycloak and the Keycloak Admin REST API - */ -public class KeycloakOpenAPI { +public class KeycloakOpenAPI extends org.keycloak.common.constants.KeycloakOpenAPI { private KeycloakOpenAPI() { } - public static class Profiles { - - public static final String ADMIN = "x-smallrye-profile-admin"; - - private Profiles() { } - } - - public static class Admin { - - private Admin() { } - - public static class Tags { - public static final String ATTACK_DETECTION = "Attack Detection"; - public static final String AUTHENTICATION_MANAGEMENT = "Authentication Management"; - public static final String CLIENTS = "Clients"; - public static final String CLIENTS_V2 = "Clients (v2)"; - public static final String CLIENT_ATTRIBUTE_CERTIFICATE = "Client Attribute Certificate"; - public static final String CLIENT_INITIAL_ACCESS = "Client Initial Access"; - public static final String CLIENT_REGISTRATION_POLICY = "Client Registration Policy"; - public static final String CLIENT_ROLE_MAPPINGS = "Client Role Mappings"; - public static final String CLIENT_SCOPES = "Client Scopes"; - public static final String COMPONENT = "Component"; - public static final String GROUPS = "Groups"; - public static final String IDENTITY_PROVIDERS = "Identity Providers"; - public static final String KEY = "Key"; - public static final String PROTOCOL_MAPPERS = "Protocol Mappers"; - public static final String REALMS_ADMIN = "Realms Admin"; - public static final String ROLES = "Roles"; - public static final String ROLES_BY_ID = "Roles (by ID)"; - public static final String ROLE_MAPPER = "Role Mapper"; - public static final String ROOT = "Root"; - public static final String SCOPE_MAPPINGS = "Scope Mappings"; - public static final String USERS = "Users"; - public static final String ORGANIZATIONS = "Organizations"; - public static final String WORKFLOWS = "Workflows"; - private Tags() { } - } - } } From e7ed9c7e9c89b990f6fa25b4687e2ceb62749a5f Mon Sep 17 00:00:00 2001 From: Steve Hawkins Date: Wed, 15 Apr 2026 15:12:43 -0400 Subject: [PATCH 2/3] renaming the modules also remove jsonnode logic from the oas filter and the databind dependency Signed-off-by: Steve Hawkins --- distribution/api-docs-dist/pom.xml | 2 +- integration/admin-client/pom.xml | 2 +- integration/client-cli/admin-cli/pom.xml | 2 +- js/pom.xml | 2 +- operator/pom.xml | 2 +- pom.xml | 2 +- quarkus/runtime/pom.xml | 13 +- rest/admin-v2/api/pom.xml | 129 ++------------- .../java/org/keycloak/admin/api/AdminApi.java | 0 .../org/keycloak/admin/api/AdminRootV2.java | 0 .../keycloak/admin/api/PatchTypeNames.java | 0 .../keycloak/admin/api/client/ClientApi.java | 0 .../keycloak/admin/api/client/ClientsApi.java | 0 .../admin/v2/BaseClientRepresentation.java | 0 .../admin/v2/BaseRepresentation.java | 0 .../admin/v2/OIDCClientRepresentation.java | 0 .../admin/v2/RepresentationWithUuid.java | 0 .../admin/v2/SAMLClientRepresentation.java | 0 .../v2/validation/ClientSecretNotBlank.java | 0 .../admin/v2/validation/CreateClient.java | 0 .../admin/v2/validation/PatchClient.java | 0 .../v2/validation/ProtocolUnmodified.java | 0 .../admin/v2/validation/PutClient.java | 0 .../admin/v2/validation/UuidUnmodified.java | 0 .../v2/validation/ValidRedirectUris.java | 2 +- .../jakarta.validation.ConstraintValidator | 3 - rest/admin-v2/pom.xml | 2 +- rest/admin-v2/rest/pom.xml | 54 ------ rest/admin-v2/services/pom.xml | 155 ++++++++++++++++++ .../internal/openapi/OASModelFilter.java | 59 ------- .../events/admin/v2/AdminEventV2Builder.java | 0 .../models/mapper/BaseClientModelMapper.java | 0 .../models/mapper/ClientModelMapper.java | 0 .../mapper/ClientModelMapperFactory.java | 0 .../models/mapper/ClientModelMapperSpi.java | 0 .../models/mapper/OIDCClientModelMapper.java | 0 .../mapper/OIDCClientModelMapperFactory.java | 0 .../models/mapper/RepModelMapper.java | 0 .../models/mapper/SAMLClientModelMapper.java | 0 .../mapper/SAMLClientModelMapperFactory.java | 0 .../models/utils/StripSecretsUtilsV2.java | 0 .../ClientSecretNotBlankValidator.java | 3 +- .../v2/validators}/ClientUuidProvider.java | 2 +- .../ProtocolUnmodifiedValidator.java | 2 +- .../admin/v2/validators}/UuidProvider.java | 2 +- .../validators}/UuidUnmodifiedValidator.java | 2 +- .../ValidRedirectUrisValidator.java | 3 +- .../rest/admin/api/DefaultAdminApi.java | 0 .../rest/admin/api/DefaultAdminRootV2.java | 0 .../admin/api/client/DefaultClientApi.java | 0 .../admin/api/client/DefaultClientsApi.java | 0 .../java/org/keycloak/services/PatchType.java | 0 .../org/keycloak/services/RolesService.java | 0 .../java/org/keycloak/services/Service.java | 0 .../keycloak/services/ServiceException.java | 0 .../services/ServiceExceptionMapper.java | 0 .../services/client/ClientService.java | 0 .../services/client/ClientServiceHelper.java | 0 .../services/client/DefaultClientService.java | 2 +- .../services/client/NewClientService.java | 2 +- .../error/ValidationExceptionHandler.java | 0 .../error/ViolationExceptionResponse.java | 0 .../jakarta/HibernateValidatorProvider.java | 0 .../jakarta/JakartaValidatorProvider.java | 0 .../validation/jakarta/ValidationContext.java | 0 .../src/main/resources/META-INF/beans.xml | 0 .../jakarta.validation.ConstraintValidator | 4 + ...oak.models.mapper.ClientModelMapperFactory | 0 .../services/org.keycloak.provider.Spi | 0 .../validation/RedirectUriValidationTest.java | 2 +- 70 files changed, 190 insertions(+), 263 deletions(-) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/admin/api/AdminApi.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/admin/api/AdminRootV2.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/admin/api/PatchTypeNames.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/admin/api/client/ClientApi.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/admin/api/client/ClientsApi.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/BaseRepresentation.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/OIDCClientRepresentation.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/RepresentationWithUuid.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/SAMLClientRepresentation.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/validation/CreateClient.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/validation/PatchClient.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/validation/PutClient.java (100%) rename rest/admin-v2/{rest => api}/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java (100%) delete mode 100644 rest/admin-v2/api/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator delete mode 100644 rest/admin-v2/rest/pom.xml create mode 100644 rest/admin-v2/services/pom.xml rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java (83%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/events/admin/v2/AdminEventV2Builder.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/models/mapper/BaseClientModelMapper.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/models/mapper/ClientModelMapper.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/models/mapper/ClientModelMapperFactory.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/models/mapper/ClientModelMapperSpi.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/models/mapper/OIDCClientModelMapper.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/models/mapper/OIDCClientModelMapperFactory.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/models/mapper/RepModelMapper.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/models/mapper/SAMLClientModelMapper.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/models/mapper/SAMLClientModelMapperFactory.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/models/utils/StripSecretsUtilsV2.java (100%) rename rest/admin-v2/{api/src/main/java/org/keycloak/representations/admin/v2/validation/impl => services/src/main/java/org/keycloak/representations/admin/v2/validators}/ClientSecretNotBlankValidator.java (96%) rename rest/admin-v2/{api/src/main/java/org/keycloak/representations/admin/v2/validation/impl => services/src/main/java/org/keycloak/representations/admin/v2/validators}/ClientUuidProvider.java (93%) rename rest/admin-v2/{api/src/main/java/org/keycloak/representations/admin/v2/validation/impl => services/src/main/java/org/keycloak/representations/admin/v2/validators}/ProtocolUnmodifiedValidator.java (95%) rename rest/admin-v2/{api/src/main/java/org/keycloak/representations/admin/v2/validation/impl => services/src/main/java/org/keycloak/representations/admin/v2/validators}/UuidProvider.java (89%) rename rest/admin-v2/{api/src/main/java/org/keycloak/representations/admin/v2/validation/impl => services/src/main/java/org/keycloak/representations/admin/v2/validators}/UuidUnmodifiedValidator.java (97%) rename rest/admin-v2/{api/src/main/java/org/keycloak/representations/admin/v2/validation => services/src/main/java/org/keycloak/representations/admin/v2/validators}/ValidRedirectUrisValidator.java (96%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/rest/admin/api/DefaultAdminApi.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/rest/admin/api/DefaultAdminRootV2.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientApi.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientsApi.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/PatchType.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/RolesService.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/Service.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/ServiceException.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/ServiceExceptionMapper.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/client/ClientService.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/client/ClientServiceHelper.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/client/DefaultClientService.java (99%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/client/NewClientService.java (99%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/error/ValidationExceptionHandler.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/services/error/ViolationExceptionResponse.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/validation/jakarta/HibernateValidatorProvider.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/validation/jakarta/JakartaValidatorProvider.java (100%) rename rest/admin-v2/{api => services}/src/main/java/org/keycloak/validation/jakarta/ValidationContext.java (100%) rename rest/admin-v2/{rest => services}/src/main/resources/META-INF/beans.xml (100%) create mode 100644 rest/admin-v2/services/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator rename rest/admin-v2/{api => services}/src/main/resources/META-INF/services/org.keycloak.models.mapper.ClientModelMapperFactory (100%) rename rest/admin-v2/{api => services}/src/main/resources/META-INF/services/org.keycloak.provider.Spi (100%) diff --git a/distribution/api-docs-dist/pom.xml b/distribution/api-docs-dist/pom.xml index eee393315dc4..02ded5c98c0d 100755 --- a/distribution/api-docs-dist/pom.xml +++ b/distribution/api-docs-dist/pom.xml @@ -104,7 +104,7 @@ org.keycloak:keycloak-operator - org.keycloak:keycloak-admin-v2-rest + org.keycloak:keycloak-admin-v2-api diff --git a/integration/admin-client/pom.xml b/integration/admin-client/pom.xml index b9c149d0445e..459769e5a1d2 100755 --- a/integration/admin-client/pom.xml +++ b/integration/admin-client/pom.xml @@ -61,7 +61,7 @@ org.keycloak - keycloak-admin-v2-rest + keycloak-admin-v2-api * diff --git a/integration/client-cli/admin-cli/pom.xml b/integration/client-cli/admin-cli/pom.xml index 24322ce45239..16dac769b347 100755 --- a/integration/client-cli/admin-cli/pom.xml +++ b/integration/client-cli/admin-cli/pom.xml @@ -54,7 +54,7 @@ org.keycloak - keycloak-admin-v2-api + keycloak-admin-v2-services provided diff --git a/js/pom.xml b/js/pom.xml index 9f6b0238056c..659acdb3671c 100644 --- a/js/pom.xml +++ b/js/pom.xml @@ -27,7 +27,7 @@ org.keycloak - keycloak-admin-v2-api + keycloak-admin-v2-services provided diff --git a/operator/pom.xml b/operator/pom.xml index 214b0970763d..3030c3635395 100644 --- a/operator/pom.xml +++ b/operator/pom.xml @@ -121,7 +121,7 @@ org.keycloak - keycloak-admin-v2-rest + keycloak-admin-v2-api diff --git a/pom.xml b/pom.xml index 27ead9028588..fe1fb6cdccad 100644 --- a/pom.xml +++ b/pom.xml @@ -1121,7 +1121,7 @@ org.keycloak - keycloak-admin-v2-rest + keycloak-admin-v2-services ${project.version} diff --git a/quarkus/runtime/pom.xml b/quarkus/runtime/pom.xml index 118a593894fe..e3c3238b07b2 100644 --- a/quarkus/runtime/pom.xml +++ b/quarkus/runtime/pom.xml @@ -424,7 +424,7 @@ org.keycloak - keycloak-admin-v2-rest + keycloak-admin-v2-services * @@ -433,17 +433,6 @@ - - org.keycloak - keycloak-admin-v2-api - - - * - * - - - - org.keycloak keycloak-scim-services diff --git a/rest/admin-v2/api/pom.xml b/rest/admin-v2/api/pom.xml index 8db686fb2342..7937bc3c2587 100644 --- a/rest/admin-v2/api/pom.xml +++ b/rest/admin-v2/api/pom.xml @@ -10,146 +10,41 @@ keycloak-admin-v2-api - Keycloak Admin API v2 Interfaces + Keycloak Admin API v2 APIs 17 17 17 UTF-8 - - 4.2.4 org.keycloak - keycloak-services - provided - - - org.keycloak - keycloak-server-spi - provided - - - org.keycloak - keycloak-server-spi-private - provided + keycloak-common - org.keycloak - keycloak-core + jakarta.ws.rs + jakarta.ws.rs-api - org.hibernate.validator - hibernate-validator + jakarta.validation + jakarta.validation-api com.fasterxml.jackson.core - jackson-databind - - - jakarta.ws.rs - jakarta.ws.rs-api + jackson-annotations - jakarta.enterprise - jakarta.enterprise.cdi-api + org.eclipse.microprofile.openapi + microprofile-openapi-api - org.keycloak - keycloak-admin-v2-rest - - - - io.smallrye - jandex + org.hibernate.validator + hibernate-validator provided - true - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - -AgeneratedTranslationFilesPath=${project.build.directory}/generated-translation-files - - - - - io.smallrye - smallrye-open-api-maven-plugin - - org.keycloak.representations.admin.v2,org.keycloak.admin.api - org.keycloak.admin.internal.openapi.OASModelFilter - ${project.build.directory} - ALL - Keycloak API - ${project.version} - - PARENT_ONLY - METHOD - FAIL - - - - - process-classes - - generate-schema - - - - - - maven-resources-plugin - - - copy-openapi-to-jar - process-classes - - copy-resources - - - - ${project.build.directory}/classes/META-INF - - - ${project.build.directory} - - openapi.json - openapi.yaml - - - - - - - copy-openapi-to-js-client - process-classes - - copy-resources - - - ${maven.multiModuleProjectDirectory}/js/libs/keycloak-admin-client - - - ${project.build.directory} - - openapi.yaml - - false - - - - - - - - + \ No newline at end of file diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/AdminApi.java b/rest/admin-v2/api/src/main/java/org/keycloak/admin/api/AdminApi.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/AdminApi.java rename to rest/admin-v2/api/src/main/java/org/keycloak/admin/api/AdminApi.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/AdminRootV2.java b/rest/admin-v2/api/src/main/java/org/keycloak/admin/api/AdminRootV2.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/AdminRootV2.java rename to rest/admin-v2/api/src/main/java/org/keycloak/admin/api/AdminRootV2.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/PatchTypeNames.java b/rest/admin-v2/api/src/main/java/org/keycloak/admin/api/PatchTypeNames.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/PatchTypeNames.java rename to rest/admin-v2/api/src/main/java/org/keycloak/admin/api/PatchTypeNames.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientApi.java b/rest/admin-v2/api/src/main/java/org/keycloak/admin/api/client/ClientApi.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientApi.java rename to rest/admin-v2/api/src/main/java/org/keycloak/admin/api/client/ClientApi.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientsApi.java b/rest/admin-v2/api/src/main/java/org/keycloak/admin/api/client/ClientsApi.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/admin/api/client/ClientsApi.java rename to rest/admin-v2/api/src/main/java/org/keycloak/admin/api/client/ClientsApi.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/BaseRepresentation.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseRepresentation.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/BaseRepresentation.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseRepresentation.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/OIDCClientRepresentation.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/OIDCClientRepresentation.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/OIDCClientRepresentation.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/OIDCClientRepresentation.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/RepresentationWithUuid.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/RepresentationWithUuid.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/RepresentationWithUuid.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/RepresentationWithUuid.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/SAMLClientRepresentation.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/SAMLClientRepresentation.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/SAMLClientRepresentation.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/SAMLClientRepresentation.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ClientSecretNotBlank.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/CreateClient.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/CreateClient.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/CreateClient.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/CreateClient.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/PatchClient.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/PatchClient.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/PatchClient.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/PatchClient.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ProtocolUnmodified.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/PutClient.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/PutClient.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/PutClient.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/PutClient.java diff --git a/rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java similarity index 100% rename from rest/admin-v2/rest/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java rename to rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ValidRedirectUris.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ValidRedirectUris.java index bdb040802aa2..755671ef7b68 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ValidRedirectUris.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ValidRedirectUris.java @@ -25,7 +25,7 @@ */ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) -@Constraint(validatedBy = {ValidRedirectUrisValidator.class}) +@Constraint(validatedBy = {}) @Documented public @interface ValidRedirectUris { String message() default "Invalid redirect URI"; diff --git a/rest/admin-v2/api/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator b/rest/admin-v2/api/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator deleted file mode 100644 index 63483d676d8c..000000000000 --- a/rest/admin-v2/api/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator +++ /dev/null @@ -1,3 +0,0 @@ -org.keycloak.representations.admin.v2.validation.impl.ClientSecretNotBlankValidator -org.keycloak.representations.admin.v2.validation.impl.ProtocolUnmodifiedValidator -org.keycloak.representations.admin.v2.validation.impl.UuidUnmodifiedValidator \ No newline at end of file diff --git a/rest/admin-v2/pom.xml b/rest/admin-v2/pom.xml index 89ac6da1413e..b6e770e71e61 100644 --- a/rest/admin-v2/pom.xml +++ b/rest/admin-v2/pom.xml @@ -14,8 +14,8 @@ pom - rest api + services tests \ No newline at end of file diff --git a/rest/admin-v2/rest/pom.xml b/rest/admin-v2/rest/pom.xml deleted file mode 100644 index fe705c100f2b..000000000000 --- a/rest/admin-v2/rest/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - org.keycloak - keycloak-admin-v2-parent - 999.0.0-SNAPSHOT - - - keycloak-admin-v2-rest - Keycloak Admin API v2 REST Layer - - - 17 - 17 - 17 - UTF-8 - - - - - org.keycloak - keycloak-common - - - jakarta.ws.rs - jakarta.ws.rs-api - - - jakarta.validation - jakarta.validation-api - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-databind - - - org.eclipse.microprofile.openapi - microprofile-openapi-api - - - org.hibernate.validator - hibernate-validator - provided - - - - \ No newline at end of file diff --git a/rest/admin-v2/services/pom.xml b/rest/admin-v2/services/pom.xml new file mode 100644 index 000000000000..25b27009299c --- /dev/null +++ b/rest/admin-v2/services/pom.xml @@ -0,0 +1,155 @@ + + + 4.0.0 + + org.keycloak + keycloak-admin-v2-parent + 999.0.0-SNAPSHOT + + + keycloak-admin-v2-services + Keycloak Admin API v2 Services + + + 17 + 17 + 17 + UTF-8 + + 4.2.4 + + + + + org.keycloak + keycloak-services + provided + + + org.keycloak + keycloak-server-spi + provided + + + org.keycloak + keycloak-server-spi-private + provided + + + org.keycloak + keycloak-core + + + org.hibernate.validator + hibernate-validator + + + com.fasterxml.jackson.core + jackson-databind + + + jakarta.ws.rs + jakarta.ws.rs-api + + + jakarta.enterprise + jakarta.enterprise.cdi-api + + + org.keycloak + keycloak-admin-v2-api + + + + io.smallrye + jandex + provided + true + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + -AgeneratedTranslationFilesPath=${project.build.directory}/generated-translation-files + + + + + io.smallrye + smallrye-open-api-maven-plugin + + org.keycloak.representations.admin.v2,org.keycloak.admin.api + org.keycloak.admin.internal.openapi.OASModelFilter + ${project.build.directory} + ALL + Keycloak API + ${project.version} + + PARENT_ONLY + METHOD + FAIL + + + + + process-classes + + generate-schema + + + + + + maven-resources-plugin + + + copy-openapi-to-jar + process-classes + + copy-resources + + + + ${project.build.directory}/classes/META-INF + + + ${project.build.directory} + + openapi.json + openapi.yaml + + + + + + + copy-openapi-to-js-client + process-classes + + copy-resources + + + ${maven.multiModuleProjectDirectory}/js/libs/keycloak-admin-client + + + ${project.build.directory} + + openapi.yaml + + false + + + + + + + + + \ No newline at end of file diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java b/rest/admin-v2/services/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java similarity index 83% rename from rest/admin-v2/api/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java rename to rest/admin-v2/services/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java index 99cc607b4269..0f9ee8b90d0b 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java +++ b/rest/admin-v2/services/src/main/java/org/keycloak/admin/internal/openapi/OASModelFilter.java @@ -16,7 +16,6 @@ import com.fasterxml.jackson.annotation.JsonPropertyDescription; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.JsonNode; import org.eclipse.microprofile.openapi.OASFactory; import org.eclipse.microprofile.openapi.OASFilter; import org.eclipse.microprofile.openapi.models.OpenAPI; @@ -28,14 +27,10 @@ import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.AnnotationValue; import org.jboss.jandex.ClassInfo; -import org.jboss.jandex.DotName; import org.jboss.jandex.FieldInfo; import org.jboss.jandex.IndexView; -import org.jboss.jandex.MethodInfo; -import org.jboss.jandex.Type; import org.jboss.logging.Logger; -import static org.keycloak.admin.api.PatchTypeNames.JSON_MERGE; import static org.keycloak.utils.StringUtil.isNullOrEmpty; public class OASModelFilter implements OASFilter { @@ -44,7 +39,6 @@ public class OASModelFilter implements OASFilter { private final Map simpleNameToClassInfoMap = new HashMap<>(); public static final String REF_PREFIX = "#/components/schemas/"; - private static final DotName JSON_NODE = DotName.createSimple(JsonNode.class); public OASModelFilter(IndexView indexView) { log.debug("Index size: " + indexView.getKnownClasses().size()); @@ -70,8 +64,6 @@ public void filterOpenAPI(OpenAPI openAPI) { removeSchemaAndRefs(openAPI, "BaseRepresentation"); - fixJsonMergePatchRequestObject(openAPI); - Map> discriminatorPropertiesToBeAdded = new HashMap<>(); // Follows https://swagger.io/docs/specification/v3_0/data-models/inheritance-and-polymorphism/ @@ -129,57 +121,6 @@ private void filterRef(Supplier> getter, Consumer> set setter.accept(filtered.isEmpty() ? null : filtered); } - /** - * Currently, if endpoint consumes 'application/merge-patch+json' and the request object is 'JsonNode', - * SmallRye OpenAPI generates array type schema for the endpoint. - * See issue 2494 for more context. - * What we need is either no schema, or an object with additional properties, so that the generated client - * doesn't have empty body. This method removes schema. - */ - private void fixJsonMergePatchRequestObject(OpenAPI openAPI) { - if (openAPI.getPaths() == null) { - return; - } - - openAPI.getPaths().getPathItems().forEach((path, pathItem) -> { - if (pathItem.getPATCH() != null && pathItem.getPATCH().getRequestBody() != null) { - var patchOp = pathItem.getPATCH(); - var requestBody = patchOp.getRequestBody(); - - if (requestBody.getContent() != null && requestBody.getContent().getMediaType(JSON_MERGE) != null - && hasJsonNodeParameter(patchOp.getOperationId())) { - var mediaTypeObject = requestBody.getContent().getMediaType(JSON_MERGE); - mediaTypeObject.setSchema(null); - log.debugf("Removed request body schema from PATCH path '%s' operation '%s' using content type '%s'", path, patchOp.getOperationId(), JSON_MERGE); - } - } - }); - } - - /** - * Detects REST interface method which name matches the operation name. - */ - private boolean hasJsonNodeParameter(String operationId) { - if (operationId == null) { - return false; - } - - for (ClassInfo classInfo : simpleNameToClassInfoMap.values()) { - for (MethodInfo method : classInfo.methods()) { - if (method.name().equals(operationId)) { - for (Type paramType : method.parameterTypes()) { - if (JSON_NODE.equals(paramType.name())) { - log.debugf("Method '%s#%s' has parameter with type '%s'", classInfo.name(), method.name()); - return true; - } - } - } - } - } - - return false; - } - /** * Adds discriminator and oneOf references to parent schemas that have Jackson @JsonTypeInfo * and @JsonSubTypes annotations. This enables OpenAPI generators to create proper class diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/events/admin/v2/AdminEventV2Builder.java b/rest/admin-v2/services/src/main/java/org/keycloak/events/admin/v2/AdminEventV2Builder.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/events/admin/v2/AdminEventV2Builder.java rename to rest/admin-v2/services/src/main/java/org/keycloak/events/admin/v2/AdminEventV2Builder.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/BaseClientModelMapper.java b/rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/BaseClientModelMapper.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/BaseClientModelMapper.java rename to rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/BaseClientModelMapper.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/ClientModelMapper.java b/rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/ClientModelMapper.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/ClientModelMapper.java rename to rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/ClientModelMapper.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/ClientModelMapperFactory.java b/rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/ClientModelMapperFactory.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/ClientModelMapperFactory.java rename to rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/ClientModelMapperFactory.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/ClientModelMapperSpi.java b/rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/ClientModelMapperSpi.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/ClientModelMapperSpi.java rename to rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/ClientModelMapperSpi.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/OIDCClientModelMapper.java b/rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/OIDCClientModelMapper.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/OIDCClientModelMapper.java rename to rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/OIDCClientModelMapper.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/OIDCClientModelMapperFactory.java b/rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/OIDCClientModelMapperFactory.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/OIDCClientModelMapperFactory.java rename to rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/OIDCClientModelMapperFactory.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/RepModelMapper.java b/rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/RepModelMapper.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/RepModelMapper.java rename to rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/RepModelMapper.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/SAMLClientModelMapper.java b/rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/SAMLClientModelMapper.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/SAMLClientModelMapper.java rename to rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/SAMLClientModelMapper.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/SAMLClientModelMapperFactory.java b/rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/SAMLClientModelMapperFactory.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/models/mapper/SAMLClientModelMapperFactory.java rename to rest/admin-v2/services/src/main/java/org/keycloak/models/mapper/SAMLClientModelMapperFactory.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/models/utils/StripSecretsUtilsV2.java b/rest/admin-v2/services/src/main/java/org/keycloak/models/utils/StripSecretsUtilsV2.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/models/utils/StripSecretsUtilsV2.java rename to rest/admin-v2/services/src/main/java/org/keycloak/models/utils/StripSecretsUtilsV2.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientSecretNotBlankValidator.java b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ClientSecretNotBlankValidator.java similarity index 96% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientSecretNotBlankValidator.java rename to rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ClientSecretNotBlankValidator.java index 0c8ddbc820c9..0ec3e28f90f6 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientSecretNotBlankValidator.java +++ b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ClientSecretNotBlankValidator.java @@ -1,4 +1,4 @@ -package org.keycloak.representations.admin.v2.validation.impl; +package org.keycloak.representations.admin.v2.validators; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; @@ -33,5 +33,4 @@ public static boolean isClientSecret(String method) { return ClientIdAndSecretAuthenticator.PROVIDER_ID.equals(method) || JWTClientSecretAuthenticator.PROVIDER_ID.equals(method); } - } diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientUuidProvider.java b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ClientUuidProvider.java similarity index 93% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientUuidProvider.java rename to rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ClientUuidProvider.java index 7165be7e50ba..3ab5e1f56f10 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ClientUuidProvider.java +++ b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ClientUuidProvider.java @@ -1,4 +1,4 @@ -package org.keycloak.representations.admin.v2.validation.impl; +package org.keycloak.representations.admin.v2.validators; import java.util.Optional; diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ProtocolUnmodifiedValidator.java b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ProtocolUnmodifiedValidator.java similarity index 95% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ProtocolUnmodifiedValidator.java rename to rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ProtocolUnmodifiedValidator.java index de85a59b5116..170e57712d26 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/ProtocolUnmodifiedValidator.java +++ b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ProtocolUnmodifiedValidator.java @@ -1,4 +1,4 @@ -package org.keycloak.representations.admin.v2.validation.impl; +package org.keycloak.representations.admin.v2.validators; import java.util.Optional; diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidProvider.java b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/UuidProvider.java similarity index 89% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidProvider.java rename to rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/UuidProvider.java index 52299bf3e754..c181526342cf 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidProvider.java +++ b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/UuidProvider.java @@ -1,4 +1,4 @@ -package org.keycloak.representations.admin.v2.validation.impl; +package org.keycloak.representations.admin.v2.validators; import org.keycloak.representations.admin.v2.RepresentationWithUuid; import org.keycloak.validation.jakarta.ValidationContext; diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidUnmodifiedValidator.java b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/UuidUnmodifiedValidator.java similarity index 97% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidUnmodifiedValidator.java rename to rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/UuidUnmodifiedValidator.java index 98f885d3f167..00056e95f94a 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/impl/UuidUnmodifiedValidator.java +++ b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/UuidUnmodifiedValidator.java @@ -1,4 +1,4 @@ -package org.keycloak.representations.admin.v2.validation.impl; +package org.keycloak.representations.admin.v2.validators; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ValidRedirectUrisValidator.java b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ValidRedirectUrisValidator.java similarity index 96% rename from rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ValidRedirectUrisValidator.java rename to rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ValidRedirectUrisValidator.java index 3aa850cc757b..6bfd83b0bf61 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/ValidRedirectUrisValidator.java +++ b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/ValidRedirectUrisValidator.java @@ -1,4 +1,4 @@ -package org.keycloak.representations.admin.v2.validation; +package org.keycloak.representations.admin.v2.validators; import java.util.Set; import java.util.regex.Pattern; @@ -7,6 +7,7 @@ import jakarta.validation.ConstraintValidatorContext; import org.keycloak.representations.admin.v2.BaseClientRepresentation; +import org.keycloak.representations.admin.v2.validation.ValidRedirectUris; /** * Validates redirect URIs according to Keycloak's redirect URI rules. diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/DefaultAdminApi.java b/rest/admin-v2/services/src/main/java/org/keycloak/rest/admin/api/DefaultAdminApi.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/DefaultAdminApi.java rename to rest/admin-v2/services/src/main/java/org/keycloak/rest/admin/api/DefaultAdminApi.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/DefaultAdminRootV2.java b/rest/admin-v2/services/src/main/java/org/keycloak/rest/admin/api/DefaultAdminRootV2.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/DefaultAdminRootV2.java rename to rest/admin-v2/services/src/main/java/org/keycloak/rest/admin/api/DefaultAdminRootV2.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientApi.java b/rest/admin-v2/services/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientApi.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientApi.java rename to rest/admin-v2/services/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientApi.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientsApi.java b/rest/admin-v2/services/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientsApi.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientsApi.java rename to rest/admin-v2/services/src/main/java/org/keycloak/rest/admin/api/client/DefaultClientsApi.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/PatchType.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/PatchType.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/PatchType.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/PatchType.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/RolesService.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/RolesService.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/RolesService.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/RolesService.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/Service.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/Service.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/Service.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/Service.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/ServiceException.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/ServiceException.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/ServiceException.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/ServiceException.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/ServiceExceptionMapper.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/ServiceExceptionMapper.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/ServiceExceptionMapper.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/ServiceExceptionMapper.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/client/ClientService.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/client/ClientService.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/client/ClientService.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/client/ClientService.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/client/ClientServiceHelper.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/client/ClientServiceHelper.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/client/ClientServiceHelper.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/client/ClientServiceHelper.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/client/DefaultClientService.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/client/DefaultClientService.java similarity index 99% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/client/DefaultClientService.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/client/DefaultClientService.java index 825099dc69fc..e14a34546771 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/services/client/DefaultClientService.java +++ b/rest/admin-v2/services/src/main/java/org/keycloak/services/client/DefaultClientService.java @@ -59,7 +59,7 @@ import org.apache.http.HttpEntity; import org.apache.http.util.EntityUtils; -import static org.keycloak.representations.admin.v2.validation.impl.ClientSecretNotBlankValidator.isClientSecret; +import static org.keycloak.representations.admin.v2.validators.ClientSecretNotBlankValidator.isClientSecret; /** * Legacy implementation of ClientService for Admin API v2 that uses Admin API v1 under hood. diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/client/NewClientService.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/client/NewClientService.java similarity index 99% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/client/NewClientService.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/client/NewClientService.java index 8f4e0d99dc5b..a12f32e3bf4b 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/services/client/NewClientService.java +++ b/rest/admin-v2/services/src/main/java/org/keycloak/services/client/NewClientService.java @@ -41,7 +41,7 @@ import org.keycloak.validation.jakarta.JakartaValidatorProvider; import org.keycloak.validation.jakarta.ValidationContext; -import static org.keycloak.representations.admin.v2.validation.impl.ClientSecretNotBlankValidator.isClientSecret; +import static org.keycloak.representations.admin.v2.validators.ClientSecretNotBlankValidator.isClientSecret; import static org.keycloak.utils.StringUtil.isBlank; /** diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/error/ValidationExceptionHandler.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/error/ValidationExceptionHandler.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/error/ValidationExceptionHandler.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/error/ValidationExceptionHandler.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/services/error/ViolationExceptionResponse.java b/rest/admin-v2/services/src/main/java/org/keycloak/services/error/ViolationExceptionResponse.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/services/error/ViolationExceptionResponse.java rename to rest/admin-v2/services/src/main/java/org/keycloak/services/error/ViolationExceptionResponse.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/validation/jakarta/HibernateValidatorProvider.java b/rest/admin-v2/services/src/main/java/org/keycloak/validation/jakarta/HibernateValidatorProvider.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/validation/jakarta/HibernateValidatorProvider.java rename to rest/admin-v2/services/src/main/java/org/keycloak/validation/jakarta/HibernateValidatorProvider.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/validation/jakarta/JakartaValidatorProvider.java b/rest/admin-v2/services/src/main/java/org/keycloak/validation/jakarta/JakartaValidatorProvider.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/validation/jakarta/JakartaValidatorProvider.java rename to rest/admin-v2/services/src/main/java/org/keycloak/validation/jakarta/JakartaValidatorProvider.java diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/validation/jakarta/ValidationContext.java b/rest/admin-v2/services/src/main/java/org/keycloak/validation/jakarta/ValidationContext.java similarity index 100% rename from rest/admin-v2/api/src/main/java/org/keycloak/validation/jakarta/ValidationContext.java rename to rest/admin-v2/services/src/main/java/org/keycloak/validation/jakarta/ValidationContext.java diff --git a/rest/admin-v2/rest/src/main/resources/META-INF/beans.xml b/rest/admin-v2/services/src/main/resources/META-INF/beans.xml similarity index 100% rename from rest/admin-v2/rest/src/main/resources/META-INF/beans.xml rename to rest/admin-v2/services/src/main/resources/META-INF/beans.xml diff --git a/rest/admin-v2/services/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator b/rest/admin-v2/services/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator new file mode 100644 index 000000000000..1c45996b45a4 --- /dev/null +++ b/rest/admin-v2/services/src/main/resources/META-INF/services/jakarta.validation.ConstraintValidator @@ -0,0 +1,4 @@ +org.keycloak.representations.admin.v2.validators.ClientSecretNotBlankValidator +org.keycloak.representations.admin.v2.validators.ProtocolUnmodifiedValidator +org.keycloak.representations.admin.v2.validators.UuidUnmodifiedValidator +org.keycloak.representations.admin.v2.validators.ValidRedirectUrisValidator \ No newline at end of file diff --git a/rest/admin-v2/api/src/main/resources/META-INF/services/org.keycloak.models.mapper.ClientModelMapperFactory b/rest/admin-v2/services/src/main/resources/META-INF/services/org.keycloak.models.mapper.ClientModelMapperFactory similarity index 100% rename from rest/admin-v2/api/src/main/resources/META-INF/services/org.keycloak.models.mapper.ClientModelMapperFactory rename to rest/admin-v2/services/src/main/resources/META-INF/services/org.keycloak.models.mapper.ClientModelMapperFactory diff --git a/rest/admin-v2/api/src/main/resources/META-INF/services/org.keycloak.provider.Spi b/rest/admin-v2/services/src/main/resources/META-INF/services/org.keycloak.provider.Spi similarity index 100% rename from rest/admin-v2/api/src/main/resources/META-INF/services/org.keycloak.provider.Spi rename to rest/admin-v2/services/src/main/resources/META-INF/services/org.keycloak.provider.Spi diff --git a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/validation/RedirectUriValidationTest.java b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/validation/RedirectUriValidationTest.java index 2b662d084601..15f3c88e9292 100644 --- a/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/validation/RedirectUriValidationTest.java +++ b/rest/admin-v2/tests/src/test/java/org/keycloak/tests/admin/client/v2/validation/RedirectUriValidationTest.java @@ -1,6 +1,6 @@ package org.keycloak.tests.admin.client.v2.validation; -import org.keycloak.representations.admin.v2.validation.ValidRedirectUrisValidator; +import org.keycloak.representations.admin.v2.validators.ValidRedirectUrisValidator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; From 195f9c7e4a02e861a500206332891d20de880726 Mon Sep 17 00:00:00 2001 From: Steve Hawkins Date: Thu, 16 Apr 2026 08:16:21 -0400 Subject: [PATCH 3/3] addressing review comments Signed-off-by: Steve Hawkins --- quarkus/runtime/pom.xml | 2 +- .../KcUnmatchedArgumentException.java | 7 +------ .../admin/v2/BaseClientRepresentation.java | 2 +- .../admin/v2/validation/UuidUnmodified.java | 3 --- rest/admin-v2/services/pom.xml | 2 +- .../v2/validators/UuidUnmodifiedValidator.java | 16 ++++++---------- 6 files changed, 10 insertions(+), 22 deletions(-) diff --git a/quarkus/runtime/pom.xml b/quarkus/runtime/pom.xml index e3c3238b07b2..98ac66c79733 100644 --- a/quarkus/runtime/pom.xml +++ b/quarkus/runtime/pom.xml @@ -432,7 +432,7 @@ - + org.keycloak keycloak-scim-services diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/KcUnmatchedArgumentException.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/KcUnmatchedArgumentException.java index 65adcad42050..0a1e5a62c0e2 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/KcUnmatchedArgumentException.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/KcUnmatchedArgumentException.java @@ -19,8 +19,6 @@ import java.util.List; -import org.keycloak.quarkus.runtime.configuration.mappers.PropertyMappers; - import picocli.CommandLine; /** @@ -38,9 +36,6 @@ public KcUnmatchedArgumentException(CommandLine.UnmatchedArgumentException ex) { @Override public List getSuggestions() { - // filter out disabled mappers - return super.getSuggestions().stream() - .filter(f -> PropertyMappers.getKcKeyFromCliKey(f).filter(PropertyMappers::isDisabledMapper).isEmpty()) - .toList(); + return super.getSuggestions(); } } diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java index c8ab2bdb08c5..36bcc35a10c0 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/BaseClientRepresentation.java @@ -29,7 +29,7 @@ @JsonSubTypes.Type(value = OIDCClientRepresentation.class, name = OIDCClientRepresentation.PROTOCOL), @JsonSubTypes.Type(value = SAMLClientRepresentation.class, name = SAMLClientRepresentation.PROTOCOL) }) -@UuidUnmodified(type = BaseClientRepresentation.class, groups = {PutClient.class, PatchClient.class}) +@UuidUnmodified(groups = {PutClient.class, PatchClient.class}) @ProtocolUnmodified(groups = {PutClient.class, PatchClient.class}) @ValidRedirectUris public abstract class BaseClientRepresentation extends BaseRepresentation implements RepresentationWithUuid { diff --git a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java index 1ddcdef60181..dd1c200fcc33 100644 --- a/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java +++ b/rest/admin-v2/api/src/main/java/org/keycloak/representations/admin/v2/validation/UuidUnmodified.java @@ -9,8 +9,6 @@ import jakarta.validation.Constraint; import jakarta.validation.Payload; -import org.keycloak.representations.admin.v2.RepresentationWithUuid; - /** * Constraint annotation for validating that UUID was not modified by the user. * @@ -24,5 +22,4 @@ String message() default "UUID is server-managed and must not be user-specified"; Class[] groups() default {}; Class[] payload() default {}; - Class type(); } diff --git a/rest/admin-v2/services/pom.xml b/rest/admin-v2/services/pom.xml index 25b27009299c..8022856377c8 100644 --- a/rest/admin-v2/services/pom.xml +++ b/rest/admin-v2/services/pom.xml @@ -69,7 +69,7 @@ true - + diff --git a/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/UuidUnmodifiedValidator.java b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/UuidUnmodifiedValidator.java index 00056e95f94a..7041790d26f0 100644 --- a/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/UuidUnmodifiedValidator.java +++ b/rest/admin-v2/services/src/main/java/org/keycloak/representations/admin/v2/validators/UuidUnmodifiedValidator.java @@ -21,20 +21,16 @@ */ public class UuidUnmodifiedValidator implements ConstraintValidator { - private UuidProvider uuidProvider; - @Override - public void initialize(UuidUnmodified constraintAnnotation) { - Class type = constraintAnnotation.type(); - if (type == BaseClientRepresentation.class) { + public boolean isValid(RepresentationWithUuid representation, ConstraintValidatorContext context) { + Class type = representation.getClass(); + UuidProvider uuidProvider = null; + if (BaseClientRepresentation.class.isAssignableFrom(type)) { uuidProvider = new ClientUuidProvider(); } else { - throw new AssertionError("Not Uuid Provider defined for " + type); + throw new AssertionError("No UuidProvider defined for " + type); } - } - - @Override - public boolean isValid(RepresentationWithUuid representation, ConstraintValidatorContext context) { + String providedUuid = representation.getUuid(); if (providedUuid == null || providedUuid.isEmpty()) { // no UUID provided, so nothing to validate return true;