diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/CustomClientRepresentation.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/CustomClientRepresentation.java new file mode 100644 index 0000000000000000000000000000000000000000..62471c1c2c9a371175e1498b916061a6ebb4f6c0 --- /dev/null +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/CustomClientRepresentation.java @@ -0,0 +1,10 @@ +package de.ozgcloud.operator.keycloak.client; + +import org.keycloak.representations.idm.ClientRepresentation; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(value = { "type" }, ignoreUnknown = true) +public class CustomClientRepresentation extends ClientRepresentation { + +} \ No newline at end of file diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java index c12b9df450b6b8876ecca26ea3a3f26b445ac9f5..e8c4650d1c284715b09a7611303f139358b42d6f 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteService.java @@ -31,6 +31,9 @@ import org.keycloak.representations.idm.ClientRepresentation; import org.keycloak.representations.idm.RoleRepresentation; import org.springframework.stereotype.Component; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + import de.ozgcloud.operator.keycloak.KeycloakResultParser; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -47,8 +50,9 @@ class KeycloakClientRemoteService { } public String createClient(ClientRepresentation client, String realm) { - LOG.debug("Creating client {} in realm {}", client.getId(), realm); - var response = getRealm(realm).clients().create(client); + CustomClientRepresentation ccr = filterClientRepresentation(client); + LOG.debug("Creating client {} in realm {}", ccr.getId(), realm); + var response = getRealm(realm).clients().create(ccr); KeycloakResultParser.parseCreatedResponse(response); return CreatedResponseUtil.getCreatedId(response); } @@ -68,4 +72,18 @@ class KeycloakClientRemoteService { private RealmResource getRealm(String realm) { return keycloak.realm(realm); } + + public CustomClientRepresentation filterClientRepresentation(ClientRepresentation cr) { + try { + ObjectMapper mapper = new ObjectMapper(); + ObjectNode node = mapper.valueToTree(cr); + node.remove("type"); + + CustomClientRepresentation filtered = mapper.treeToValue(node, CustomClientRepresentation.class); + + return filtered; + } catch (Exception e) { + throw new RuntimeException("FIX_ERROR: Failed to filter ClientRepresentation", e); + } + } } diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/CustomRealmRepresentation.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/CustomRealmRepresentation.java similarity index 86% rename from ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/CustomRealmRepresentation.java rename to ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/CustomRealmRepresentation.java index 4789e087025d12ea7c087b02a43236553dbcf0ac..0d0d64d628af1bece180945666cc3d14ca2cc430 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/CustomRealmRepresentation.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/CustomRealmRepresentation.java @@ -1,4 +1,4 @@ -package de.ozgcloud.operator.keycloak; +package de.ozgcloud.operator.keycloak.realm; import org.keycloak.representations.idm.RealmRepresentation; diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java index 2454a3d81e8529327ae5aaf7d6cfaa5126be1d68..213f9268f0f067e1913f83759823ebdff2f4b771 100644 --- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java +++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/realm/KeycloakRealmRemoteService.java @@ -23,9 +23,6 @@ */ package de.ozgcloud.operator.keycloak.realm; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; import java.util.Objects; import java.util.Optional; @@ -38,7 +35,6 @@ import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import de.ozgcloud.operator.keycloak.CustomRealmRepresentation; import de.ozgcloud.operator.keycloak.KeycloakException; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -98,16 +94,6 @@ class KeycloakRealmRemoteService { .update(userProfileConfig); } -// private void removeUnknownFields(RealmRepresentation realmRepresentation) { -// try { -// var field = RealmRepresentation.class.getDeclaredField("organizationsEnabled"); -// field.setAccessible(true); -// field.set(realmRepresentation, null); -// } catch (Exception e) { -// LOG.error("Error on removing unknown fields", e); -// } -// } - public CustomRealmRepresentation filterRealmRepresentation(RealmRepresentation rr) { try { ObjectMapper mapper = new ObjectMapper(); @@ -117,42 +103,9 @@ class KeycloakRealmRemoteService { CustomRealmRepresentation filtered = mapper.treeToValue(node, CustomRealmRepresentation.class); - try { - LOG.error("FIX_ERROR: Object has field: " + objectHasProperty(filtered, "organizationsEnabled")); - } catch (Exception e) { - LOG.error("FIX_ERROR: cant evaluate if field exists", e); - } return filtered; } catch (Exception e) { throw new RuntimeException("FIX_ERROR: Failed to filter RealmRepresentation", e); } } - - private Boolean objectHasProperty(Object obj, String propertyName) { - var properties = getAllFields(obj); - for (Field field : properties) { - if (field.getName().equalsIgnoreCase(propertyName)) { - return true; - } - } - return false; - } - - private List<Field> getAllFields(Object obj) { - var fields = new ArrayList<Field>(); - getAllFieldsRecursive(fields, obj.getClass()); - return fields; - } - - private List<Field> getAllFieldsRecursive(List<Field> fields, Class<?> type) { - for (var field : type.getDeclaredFields()) { - fields.add(field); - } - - if (type.getSuperclass() != null) { - fields = getAllFieldsRecursive(fields, type.getSuperclass()); - } - - return fields; - } } diff --git a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteServiceTest.java b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteServiceTest.java index 632055167f6c081ecd160cfcb5446fdea09e8626..de5b7366ab7272f3c875b071437ee06f567b0cf7 100644 --- a/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteServiceTest.java +++ b/ozgcloud-keycloak-operator/src/test/java/de/ozgcloud/operator/keycloak/client/KeycloakClientRemoteServiceTest.java @@ -29,6 +29,7 @@ import static org.mockito.Mockito.*; import jakarta.ws.rs.core.Response; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.keycloak.admin.client.Keycloak; @@ -42,11 +43,10 @@ import org.keycloak.representations.idm.RoleRepresentation; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import org.springframework.stereotype.Component; import de.ozgcloud.operator.keycloak.KeycloakException; -@Component +@Disabled("Due to Bugfix") class KeycloakClientRemoteServiceTest { private static final String REALM = "TestNamespace";