From f0b1b48332604e21a048a148c5c4815332c77df3 Mon Sep 17 00:00:00 2001
From: Martin <git@mail.de>
Date: Fri, 4 Apr 2025 12:57:11 +0200
Subject: [PATCH] OZG-7922 remove unknown field from json

---
 .../operator/keycloak/CustomObjectMapper.java | 12 ++++++++++
 .../operator/keycloak/KeycloakClient.java     |  7 ++++++
 .../realm/KeycloakRealmRemoteService.java     | 24 +++++++++++++++----
 3 files changed, 39 insertions(+), 4 deletions(-)
 create mode 100644 ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/CustomObjectMapper.java

diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/CustomObjectMapper.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/CustomObjectMapper.java
new file mode 100644
index 0000000..e9ddc72
--- /dev/null
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/CustomObjectMapper.java
@@ -0,0 +1,12 @@
+package de.ozgcloud.operator.keycloak;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+class CustomObjectMapper {
+	public static ObjectMapper createObjectMapper() {
+		ObjectMapper mapper = new ObjectMapper();
+		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		return mapper;
+	}
+}
diff --git a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java
index 2ada3f4..e562c74 100644
--- a/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java
+++ b/ozgcloud-keycloak-operator/src/main/java/de/ozgcloud/operator/keycloak/KeycloakClient.java
@@ -31,6 +31,8 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Scope;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 import io.fabric8.kubernetes.api.model.Secret;
 import io.fabric8.kubernetes.client.KubernetesClient;
 import io.fabric8.kubernetes.client.dsl.Resource;
@@ -83,4 +85,9 @@ public class KeycloakClient {
 	private String decodeBase64(String base64String) {
 		return new String(Base64.getDecoder().decode(base64String));
 	}
+
+	@Bean
+	public ObjectMapper objectMapper() {
+		return CustomObjectMapper.createObjectMapper();
+	}
 }
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 b7eaf46..531d1bf 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
@@ -34,23 +34,27 @@ import org.springframework.stereotype.Component;
 
 import de.ozgcloud.operator.keycloak.KeycloakException;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 @RequiredArgsConstructor
 @Component
 class KeycloakRealmRemoteService {
 
 	private final Keycloak keycloak;
 
-	public void createRealm(RealmRepresentation realm) {
-		keycloak.realms().create(realm);
+	public void createRealm(RealmRepresentation realmRepresentation) {
+		removeUnknownFields(realmRepresentation);
+		keycloak.realms().create(realmRepresentation);
 	}
 
 	public void deleteRealm(String realmName) {
 		keycloak.realm(realmName).remove();
 	}
 
-	public void updateRealm(RealmRepresentation realm) {
-		keycloak.realm(realm.getRealm()).update(realm);
+	public void updateRealm(RealmRepresentation realmRepresentation) {
+		removeUnknownFields(realmRepresentation);
+		keycloak.realm(realmRepresentation.getRealm()).update(realmRepresentation);
 	}
 
 	public Optional<RoleRepresentation> getRealmRole(String roleName, String realmName) {
@@ -71,6 +75,7 @@ class KeycloakRealmRemoteService {
 	}
 
 	UPConfig getUserProfileConfig(RealmRepresentation realmRepresentation) {
+		removeUnknownFields(realmRepresentation);
 		return keycloak.realm(realmRepresentation.getRealm())
 				.users()
 				.userProfile()
@@ -78,9 +83,20 @@ class KeycloakRealmRemoteService {
 	}
 
 	void updateUserProfileConfig(RealmRepresentation realmRepresentation, UPConfig userProfileConfig) {
+		removeUnknownFields(realmRepresentation);
 		keycloak.realm(realmRepresentation.getRealm())
 				.users()
 				.userProfile()
 				.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);
+		}
+	}
 }
-- 
GitLab