From ba0cbae9c4c19f9808ad1424d4506de8ecdd56dc Mon Sep 17 00:00:00 2001 From: Andrei Isvoran Date: Wed, 6 Sep 2023 13:33:36 +0200 Subject: [PATCH] DM-406 - Add setting that allows the update of the keycloak theme in master realm --- .../external/SMTPConfigurationController.java | 4 ++-- .../entity/SearchConnectionEntity.java | 1 + .../entity/TenantEntity.java | 1 + .../TenantUserManagementProperties.java | 1 + .../service/RealmService.java | 15 +++++++++--- .../service/UserListingService.java | 2 +- src/main/resources/application.yaml | 1 + .../knecon/fforesight/tests/ThemeTest.java | 23 +++++++++++++++++++ src/test/resources/application.yaml | 1 + 9 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/knecon/fforesight/tests/ThemeTest.java diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/SMTPConfigurationController.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/SMTPConfigurationController.java index 1f547c8..bbaf9b6 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/SMTPConfigurationController.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/SMTPConfigurationController.java @@ -9,9 +9,9 @@ import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.knecon.fforesight.tenantcommons.EncryptionDecryptionService; import com.knecon.fforesight.tenantcommons.TenantContext; @@ -97,7 +97,7 @@ public class SMTPConfigurationController implements SMTPConfigurationResource, P private Map convertSMTPConfigurationModelToMap(SMTPConfiguration smtpConfigurationModel) { - Map propertiesMap = objectMapper.convertValue(smtpConfigurationModel, Map.class); + Map propertiesMap = objectMapper.convertValue(smtpConfigurationModel, new TypeReference<>() {}); Map stringPropertiesMap = new HashMap<>(); propertiesMap.forEach((key, value) -> { if (value != null) { diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/entity/SearchConnectionEntity.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/entity/SearchConnectionEntity.java index 14c2fff..65b6545 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/entity/SearchConnectionEntity.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/entity/SearchConnectionEntity.java @@ -23,6 +23,7 @@ public class SearchConnectionEntity { @Convert(converter = JSONStringSetConverter.class) private Set hosts; @Column(name = "search_port") + @Builder.Default private int port = 9300; @Column(name = "search_scheme") private String scheme; diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/entity/TenantEntity.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/entity/TenantEntity.java index 95cd694..82f2e99 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/entity/TenantEntity.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/entity/TenantEntity.java @@ -48,5 +48,6 @@ public class TenantEntity { @Basic(fetch = FetchType.EAGER) @Column(columnDefinition = "text") @Convert(converter = JSONMapConverter.class) + @Builder.Default private Map details = new HashMap<>(); } diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/properties/TenantUserManagementProperties.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/properties/TenantUserManagementProperties.java index b77902e..7046c0c 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/properties/TenantUserManagementProperties.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/properties/TenantUserManagementProperties.java @@ -29,5 +29,6 @@ public class TenantUserManagementProperties { private String defaultTheme = "redaction"; private List validRedirectUris = new ArrayList<>(); private KCRoleMapping kcRoleMapping = new KCRoleMapping(); + private String loginTheme; } diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/RealmService.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/RealmService.java index bc006e5..441af4f 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/RealmService.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/RealmService.java @@ -1,14 +1,14 @@ package com.knecon.fforesight.tenantusermanagement.service; import org.keycloak.admin.client.resource.RealmResource; -import org.keycloak.representations.account.UserRepresentation; +import org.keycloak.representations.idm.RealmRepresentation; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.knecon.fforesight.tenantcommons.model.AuthDetails; import com.knecon.fforesight.tenantusermanagement.properties.TenantUserManagementProperties; +import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,18 +21,27 @@ public class RealmService { private final TenantUserManagementProperties tenantUserManagementProperties; + public final static String MASTER_REALM = "master"; public RealmResource realm(String tenantId) { return keycloak.getAdminClient().realm(tenantId); } + @PostConstruct + public void updateTheme() { + + log.info("Updating master realm theme: {}", tenantUserManagementProperties.getLoginTheme()); + RealmRepresentation realmRepresentation = realm(MASTER_REALM).toRepresentation(); + realmRepresentation.setLoginTheme(tenantUserManagementProperties.getLoginTheme()); + realm(MASTER_REALM).update(realmRepresentation); + } + public String getEmail(RealmResource resource) { var user = resource.users().list().stream().filter(userRepresentation -> userRepresentation.getUsername().equals("admin")).findFirst(); return user.isPresent() ? user.get().getEmail() : ""; } - public AuthDetails getOpenIdConnectDetails(String tenantId) { String openIdDetails = tenantUserManagementProperties.getServerUrl() + "/realms/" + tenantId + "/.well-known/openid-configuration"; diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserListingService.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserListingService.java index 770844b..9b334f0 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserListingService.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserListingService.java @@ -44,7 +44,7 @@ public class UserListingService { var allRoles = tenantUserManagementProperties.getKcRoleMapping().getAllRoles(); for (var role : allRoles) { if (realmRoles.contains(role)) { - Set users = realm.roles().get(role).getRoleUserMembers(0, 500); + List users = realm.roles().get(role).getUserMembers(0, 500); usersByRole.put(role, users.stream().map(UserRepresentation::getId).collect(Collectors.toSet())); } } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 5c50d53..43c127f 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -94,6 +94,7 @@ fforesight: default-client-id: 'swagger-ui-client' tenant-user-management: base-path: '/tenant-user-management' + login-theme: 'redaction' tenant-exchange: name: 'tenants-exchange' user-exchange: diff --git a/src/test/java/com/knecon/fforesight/tests/ThemeTest.java b/src/test/java/com/knecon/fforesight/tests/ThemeTest.java new file mode 100644 index 0000000..6117c19 --- /dev/null +++ b/src/test/java/com/knecon/fforesight/tests/ThemeTest.java @@ -0,0 +1,23 @@ +package com.knecon.fforesight.tests; + +import static com.knecon.fforesight.tenantusermanagement.service.RealmService.MASTER_REALM; +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import com.knecon.fforesight.AbstractTenantUserManagementIntegrationTest; +import com.knecon.fforesight.tenantusermanagement.service.RealmService; + +public class ThemeTest extends AbstractTenantUserManagementIntegrationTest { + + @Autowired + private RealmService realmService; + + @Test + public void testLoginTheme() { + + var realm = realmService.realm(MASTER_REALM).toRepresentation(); + assertThat(realm.getLoginTheme()).isEqualTo("redaction"); + } +} diff --git a/src/test/resources/application.yaml b/src/test/resources/application.yaml index 85591a5..9d3a8ae 100644 --- a/src/test/resources/application.yaml +++ b/src/test/resources/application.yaml @@ -103,6 +103,7 @@ fforesight: server-url: http://localhost:28181 client-secret: adminClientSecret client-id: adminClient + login-theme: redaction kc-role-mapping: roles: - name: SUPER_USER