From 2fc8c9fc65485967c5f65cfb7bcdf2846e981153 Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Sun, 4 Feb 2024 08:34:01 +0100 Subject: [PATCH] Updated KC client lib RED-8431 --- .../docker-compose.yaml | 2 +- build.gradle.kts | 22 ++++++--------- .../controller/ControllerAdvice.java | 7 ++--- .../external/UserPreferenceController.java | 4 +-- .../service/EmailService.java | 28 ++++++++++--------- .../service/TenantManagementService.java | 2 +- .../service/UserCacheBuilder.java | 5 ++-- .../service/UserService.java | 14 +++++----- .../testcontainers/KeyCloakTestContainer.java | 2 +- .../utils/TokenService.java | 3 +- 10 files changed, 42 insertions(+), 47 deletions(-) diff --git a/.dev/tenant-user-management-service/docker-compose.yaml b/.dev/tenant-user-management-service/docker-compose.yaml index 448bf05..679e346 100644 --- a/.dev/tenant-user-management-service/docker-compose.yaml +++ b/.dev/tenant-user-management-service/docker-compose.yaml @@ -2,7 +2,7 @@ version: '2' services: keycloak: - image: quay.io/keycloak/keycloak:20.0 + image: quay.io/keycloak/keycloak:latest command: start-dev environment: KEYCLOAK_ADMIN: admin diff --git a/build.gradle.kts b/build.gradle.kts index 1a18e3a..61cdc08 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id("org.springframework.boot") version "3.1.5" id("io.spring.dependency-management") version "1.1.0" id("org.sonarqube") version "4.0.0.2929" + id("io.freefair.lombok") version "8.4" pmd `maven-publish` checkstyle @@ -101,9 +102,9 @@ dependencies { implementation("net.logstash.logback:logstash-logback-encoder:7.4") implementation("ch.qos.logback:logback-classic") implementation("org.postgresql:postgresql:42.5.4") - implementation("com.google.guava:guava:31.1-jre") + implementation("com.google.guava:guava:33.0.0-jre") implementation("org.liquibase:liquibase-core:4.17.2") - implementation("org.keycloak:keycloak-admin-client:21.0.1") + implementation("org.keycloak:keycloak-admin-client:23.0.6") implementation("org.springframework.boot:spring-boot-starter-amqp") implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.springframework.retry:spring-retry") @@ -113,26 +114,21 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.apache.commons:commons-lang3:3.12.0") - implementation("commons-validator:commons-validator:1.7") + implementation("commons-validator:commons-validator:1.8.0") implementation("org.springframework.boot:spring-boot-configuration-processor") - implementation("com.iqser.red.commons:storage-commons:2.43.0") + implementation("com.iqser.red.commons:storage-commons:2.45.0") implementation("jakarta.mail:jakarta.mail-api:2.1.2") implementation("org.eclipse.angus:angus-mail:2.0.2") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.cloud:spring-cloud-starter-openfeign") - testImplementation("org.projectlombok:lombok") - compileOnly("org.projectlombok:lombok") developmentOnly("org.springframework.boot:spring-boot-devtools") annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") - annotationProcessor("org.projectlombok:lombok") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.springframework.amqp:spring-rabbit-test") - testImplementation("org.testcontainers:postgresql:1.18.3") - testImplementation("com.github.dasniko:testcontainers-keycloak:2.5.0") - testImplementation("org.testcontainers:testcontainers:1.19.0") - testImplementation("org.testcontainers:junit-jupiter:1.19.0") - testAnnotationProcessor("org.projectlombok:lombok") - + testImplementation("org.testcontainers:postgresql:1.19.4") + testImplementation("org.testcontainers:testcontainers:1.19.4") + testImplementation("org.testcontainers:junit-jupiter:1.19.4") + testImplementation("com.github.dasniko:testcontainers-keycloak:3.2.0") } extra["springCloudVersion"] = "2022.0.2" diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/ControllerAdvice.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/ControllerAdvice.java index 89b5872..7a4efb1 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/ControllerAdvice.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/ControllerAdvice.java @@ -1,8 +1,5 @@ package com.knecon.fforesight.tenantusermanagement.controller; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.ForbiddenException; -import javax.ws.rs.NotFoundException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -11,8 +8,10 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.server.ResponseStatusException; -import com.knecon.fforesight.keycloakcommons.security.KeycloakSecurity; import com.knecon.fforesight.tenantusermanagement.model.ErrorMessage; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.ForbiddenException; +import jakarta.ws.rs.NotFoundException; @RestControllerAdvice public class ControllerAdvice { diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/UserPreferenceController.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/UserPreferenceController.java index 4268bce..0b0dabb 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/UserPreferenceController.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/UserPreferenceController.java @@ -4,8 +4,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.ws.rs.ForbiddenException; -import javax.ws.rs.NotFoundException; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PathVariable; @@ -17,6 +15,8 @@ import com.knecon.fforesight.tenantusermanagement.api.external.UserPreferenceRes import com.knecon.fforesight.tenantusermanagement.permissions.UserManagementPermissions; import com.knecon.fforesight.tenantusermanagement.service.UserService; +import jakarta.ws.rs.ForbiddenException; +import jakarta.ws.rs.NotFoundException; import lombok.RequiredArgsConstructor; @RestController diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/EmailService.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/EmailService.java index dce6b25..c093519 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/EmailService.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/EmailService.java @@ -7,9 +7,12 @@ import java.util.Map; import java.util.Properties; import javax.net.ssl.SSLContext; -import javax.ws.rs.BadRequestException; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.stereotype.Service; +import org.springframework.util.ObjectUtils; +import org.springframework.web.server.ResponseStatusException; import com.knecon.fforesight.tenantusermanagement.model.SMTPResponse; @@ -25,8 +28,10 @@ import jakarta.mail.internet.MimeBodyPart; import jakarta.mail.internet.MimeMessage; import jakarta.mail.internet.MimeMultipart; import jakarta.mail.internet.MimeUtility; +import jakarta.ws.rs.BadRequestException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; @Slf4j @Service @@ -36,6 +41,7 @@ public class EmailService { private final String AUTHENTICATION_UNSUCCESSFUL = "Authentication unsuccessful"; private final String WRONG_USERNAME_PASSWORD = "Username and Password not accepted"; + public SMTPResponse.SMTPResponseBuilder send(Map config, String address, String subject, String textBody) { Transport transport = null; @@ -93,11 +99,11 @@ public class EmailService { msg.setReplyTo(new Address[]{toInternetAddress(from, fromDisplayName)}); - if (isNotBlank(replyTo)) { + if (StringUtils.isNotBlank(replyTo)) { msg.setReplyTo(new Address[]{toInternetAddress(replyTo, replyToDisplayName)}); } - if (isNotBlank(envelopeFrom)) { + if (StringUtils.isNotBlank(envelopeFrom)) { props.setProperty("mail.smtp.from", envelopeFrom); } @@ -121,9 +127,9 @@ public class EmailService { .statusCode(200); } catch (Exception e) { if (e.getMessage().contains(AUTHENTICATION_UNSUCCESSFUL) || e.getMessage().contains(WRONG_USERNAME_PASSWORD)) { - throw new BadRequestException(AUTHENTICATION_UNSUCCESSFUL); + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, AUTHENTICATION_UNSUCCESSFUL); } else { - throw new BadRequestException(e.getMessage()); + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage(), e); } } finally { if (transport != null) { @@ -136,13 +142,14 @@ public class EmailService { } } + protected InternetAddress toInternetAddress(String email, String displayName) throws UnsupportedEncodingException, AddressException, BadRequestException { - if (email == null || "".equals(email.trim())) { - throw new BadRequestException("Please provide a valid address"); + if (StringUtils.isBlank(email)) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Please provide a valid address"); } - if (displayName == null || "".equals(displayName.trim())) { + if (StringUtils.isBlank(displayName)) { return new InternetAddress(email); } @@ -163,9 +170,4 @@ public class EmailService { return null; } - public boolean isNotBlank(String str) { - - return str != null && !"".equals(str.trim()); - } - } diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/TenantManagementService.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/TenantManagementService.java index da7fa7d..30bd64e 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/TenantManagementService.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/TenantManagementService.java @@ -14,9 +14,9 @@ import java.util.UUID; import java.util.stream.Collectors; import javax.sql.DataSource; -import javax.ws.rs.NotFoundException; import com.knecon.fforesight.tenantcommons.model.UpdateDetailsRequest; +import jakarta.ws.rs.NotFoundException; import org.apache.commons.lang3.StringUtils; import org.keycloak.representations.idm.ClientRepresentation; import org.keycloak.representations.idm.CredentialRepresentation; diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserCacheBuilder.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserCacheBuilder.java index edc51d1..d8a2ae3 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserCacheBuilder.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserCacheBuilder.java @@ -1,11 +1,10 @@ package com.knecon.fforesight.tenantusermanagement.service; -import javax.annotation.PostConstruct; - import org.springframework.stereotype.Service; import com.knecon.fforesight.tenantcommons.TenantProvider; +import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -23,7 +22,7 @@ public class UserCacheBuilder { try { tenantManagementService.getTenants().forEach(tenant -> userService.getAllUsers(tenant.getTenantId())); - }catch (Exception e){ + } catch (Exception e) { log.debug("Cold start"); } } diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserService.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserService.java index a5bfbeb..1b0dc79 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserService.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/service/UserService.java @@ -8,11 +8,10 @@ import java.util.TreeSet; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import javax.ws.rs.ClientErrorException; -import javax.ws.rs.NotAuthorizedException; -import javax.ws.rs.NotFoundException; -import javax.ws.rs.core.Response; - +import jakarta.ws.rs.ClientErrorException; +import jakarta.ws.rs.NotAuthorizedException; +import jakarta.ws.rs.NotFoundException; +import jakarta.ws.rs.core.Response; import org.apache.commons.validator.routines.EmailValidator; import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl; @@ -23,6 +22,7 @@ import org.keycloak.admin.client.resource.UsersResource; import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.representations.idm.RoleRepresentation; import org.keycloak.representations.idm.UserRepresentation; + import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; @@ -334,7 +334,7 @@ public class UserService { try { getTenantUsersResource().get(userId).toRepresentation(); return true; - } catch (javax.ws.rs.NotFoundException e) { + } catch (NotFoundException e) { return false; } } @@ -487,7 +487,7 @@ public class UserService { realmRole = realmService.realm(TenantContext.getTenantId()).roles().get(role).toRepresentation(); } catch (NotFoundException e) { log.warn("The realm role {} is not found.", role); - throw new NotFoundException("The realm role " + role + " is not found.", e); + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "The realm role " + role + " is not found.", e); } return realmRole; } diff --git a/src/test/java/com/knecon/fforesight/tenantusermanagement/testcontainers/KeyCloakTestContainer.java b/src/test/java/com/knecon/fforesight/tenantusermanagement/testcontainers/KeyCloakTestContainer.java index d65a2e8..0cc86ad 100644 --- a/src/test/java/com/knecon/fforesight/tenantusermanagement/testcontainers/KeyCloakTestContainer.java +++ b/src/test/java/com/knecon/fforesight/tenantusermanagement/testcontainers/KeyCloakTestContainer.java @@ -11,7 +11,7 @@ import org.keycloak.representations.idm.RoleRepresentation; public final class KeyCloakTestContainer { - private static final String IMAGE_VERSION = "quay.io/keycloak/keycloak:21.0.0"; + private static final String IMAGE_VERSION = "quay.io/keycloak/keycloak:23.0.6"; private static KeycloakContainer keycloak; diff --git a/src/test/java/com/knecon/fforesight/tenantusermanagement/utils/TokenService.java b/src/test/java/com/knecon/fforesight/tenantusermanagement/utils/TokenService.java index c39fcd8..067ad27 100644 --- a/src/test/java/com/knecon/fforesight/tenantusermanagement/utils/TokenService.java +++ b/src/test/java/com/knecon/fforesight/tenantusermanagement/utils/TokenService.java @@ -4,13 +4,12 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.concurrent.TimeUnit; -import javax.ws.rs.BadRequestException; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.knecon.fforesight.tenantcommons.TenantContext; import com.knecon.fforesight.tenantusermanagement.properties.TenantUserManagementProperties; +import jakarta.ws.rs.BadRequestException; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils;