diff --git a/.github/workflows/dockerImage.yml b/.github/workflows/dockerImage.yml index d2cc4df..e92804f 100644 --- a/.github/workflows/dockerImage.yml +++ b/.github/workflows/dockerImage.yml @@ -27,7 +27,7 @@ jobs: - name: Setup JVM uses: actions/setup-java@v1 with: - java-version: 11.0.10 + java-version: 17 java-package: jdk architecture: x64 - name: Caching maven dependencies diff --git a/.github/workflows/feature-branch.yml b/.github/workflows/feature-branch.yml index efc6601..720c069 100644 --- a/.github/workflows/feature-branch.yml +++ b/.github/workflows/feature-branch.yml @@ -18,7 +18,7 @@ jobs: - name: Setup JVM uses: actions/setup-java@v1 with: - java-version: 11.0.10 + java-version: 17 java-package: jdk architecture: x64 diff --git a/Dockerfile b/Dockerfile index 790d48a..fc21402 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM adoptopenjdk/openjdk11 +FROM openjdk:17-oracle VOLUME ["/tmp","/log"] EXPOSE 8080 ARG JAR_FILE diff --git a/google_checks_light.xml b/google_checks_light.xml index 2d10a10..fcd77f6 100644 --- a/google_checks_light.xml +++ b/google_checks_light.xml @@ -19,6 +19,7 @@ + @@ -47,6 +48,10 @@ --> + + + + @@ -301,7 +306,7 @@ --> - + diff --git a/pom.xml b/pom.xml index e137828..32f0055 100644 --- a/pom.xml +++ b/pom.xml @@ -16,24 +16,49 @@ org.springframework.boot spring-boot-starter-parent - 2.7.11 + 3.3.8 UTF-8 UTF-8 - 11 + 17 17.0.0 2.16.0 - 6.2.1 - 4.1.1 + 7.11.0 + 4.19.0 + 6.2.8 4.9.1 - 3.0.0 - 5.7.5 - + 4.0.0 + + + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + 3.4.11 + + + net.sf.ehcache + ehcache + 2.10.9.2 + + + org.mockito + mockito-inline + 5.2.0 + + + org.springframework.security + spring-security-bom + ${spring.security.version} + import + pom + + + @@ -48,7 +73,14 @@ org.springframework.security spring-security-core - ${spring-security.version} + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-oauth2-resource-server org.springframework.boot @@ -65,7 +97,6 @@ org.hibernate.validator hibernate-validator - 6.1.6.Final net.sf.ehcache @@ -83,6 +114,17 @@ spring-boot-starter-actuator + + jakarta.ws.rs + jakarta.ws.rs-api + ${jakarta.ws.rs-api.version} + + + + org.apache.httpcomponents.client5 + httpclient5 + + org.openapitools @@ -110,19 +152,12 @@ com.fasterxml.jackson.core jackson-databind - 2.13.4.2 org.codehaus.plexus plexus-utils 3.3.0 - - - io.springfox - springfox-boot-starter - ${springfox-boot-starter.version} - @@ -147,12 +182,16 @@ lombok true + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.6.0 + org.apache.commons commons-lang3 - 3.11 @@ -172,7 +211,6 @@ commons-codec commons-codec - 1.15 @@ -198,7 +236,6 @@ org.liquibase liquibase-core - ${liquibase-core.version} org.mariadb.jdbc @@ -208,12 +245,10 @@ org.apache.logging.log4j log4j-api - ${log4j.version} org.apache.logging.log4j log4j-to-slf4j - ${log4j.version} @@ -247,17 +282,28 @@ test - powermock-module-junit4 - org.powermock + org.mockito + mockito-core test - 2.0.2 - powermock-api-mockito2 - org.powermock + org.mockito + mockito-junit-jupiter + 5.15.2 test - 2.0.2 + + + + + + + + + + + + com.github.fridujo rabbitmq-mock @@ -315,7 +361,7 @@ org.openapitools openapi-generator-maven-plugin - 5.1.1 + ${openapi.generator.maven.version} @@ -325,6 +371,7 @@ true / + true ${project.basedir}/api/uploadservice.yaml spring @@ -347,6 +394,7 @@ / resttemplate java8 + true ${project.basedir}/services/userservice.yaml java @@ -372,6 +420,7 @@ / resttemplate java8 + true ${project.basedir}/services/statisticsservice.yaml java @@ -394,13 +443,15 @@ / resttemplate java8 + true ${project.basedir}/services/tenantservice.yaml java true false false - ${project.groupId}.${project.artifactId}.tenantservice.generated.web + + ${project.groupId}.${project.artifactId}.tenantservice.generated.web ${project.groupId}.${project.artifactId}.tenantservice.generated.web.model @@ -419,8 +470,10 @@ / resttemplate java8 + true - @lombok.AllArgsConstructor @lombok.Builder @lombok.NoArgsConstructor + @lombok.AllArgsConstructor @lombok.Builder + ${project.basedir}/services/rocketchat.yaml java @@ -440,14 +493,13 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.1.1 + 3.6.0 validate validate google_checks_light.xml - UTF-8 true true true @@ -478,7 +530,21 @@ false - **/*Test.java + de/caritas/cob/uploadservice/api/tenant/TenantResolverServiceTest.java + + + de/caritas/cob/uploadservice/api/tenant/AccessTokenTenantResolverTest.java + + de/caritas/cob/uploadservice/api/tenant/SubdomainTenantResolverTest.java + + + de/caritas/cob/uploadservice/api/tenant/CustomHeaderTenantResolverTest.java + + + de/caritas/cob/uploadservice/api/tenant/TechnicalUserTenantResolverTest.java + + de/caritas/cob/uploadservice/filter/HttpTenantFilterTest.java + de/caritas/cob/uploadservice/filter/SubdomainExtractorTest.java @@ -491,12 +557,39 @@ false - **/*IT.* + de/caritas/cob/uploadservice/api/controller/ActuatorControllerIT.java + + + de/caritas/cob/uploadservice/api/service/LiveEventNotificationServiceIT.java + + + + com.diffplug.spotless + spotless-maven-plugin + 2.23.0 + + + + + 1.15.0 + + + + + + + + check + + compile + + + diff --git a/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/BadRequestException.java b/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/BadRequestException.java new file mode 100644 index 0000000..a735d0c --- /dev/null +++ b/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/BadRequestException.java @@ -0,0 +1,18 @@ +package de.caritas.cob.upload.api.exception.httpresponses; + +import de.caritas.cob.uploadservice.api.service.LogService; +import java.io.Serial; + +public class BadRequestException extends CustomHttpStatusException { + + @Serial private static final long serialVersionUID = -8047408802295905803L; + + /** + * BadRequest exception. + * + * @param message an additional message + */ + public BadRequestException(String message) { + super(message, LogService::logWarning); + } +} diff --git a/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/CustomHttpStatusException.java b/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/CustomHttpStatusException.java new file mode 100644 index 0000000..62e674f --- /dev/null +++ b/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/CustomHttpStatusException.java @@ -0,0 +1,30 @@ +package de.caritas.cob.upload.api.exception.httpresponses; + +import static java.util.Objects.nonNull; + +import java.io.Serial; +import java.util.function.Consumer; + +/** Custom HTTP status exception. */ +public abstract class CustomHttpStatusException extends RuntimeException { + + @Serial private static final long serialVersionUID = -3545035432045919306L; + private final Consumer loggingMethod; + + CustomHttpStatusException(String message, Consumer loggingMethod) { + super(message); + this.loggingMethod = loggingMethod; + } + + CustomHttpStatusException(String message, Exception ex, Consumer loggingMethod) { + super(message, ex); + this.loggingMethod = loggingMethod; + } + + /** Executes the non null logging method. */ + public void executeLogging() { + if (nonNull(this.loggingMethod)) { + this.loggingMethod.accept(this); + } + } +} diff --git a/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/InternalServerErrorException.java b/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/InternalServerErrorException.java new file mode 100644 index 0000000..77fc6fd --- /dev/null +++ b/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/InternalServerErrorException.java @@ -0,0 +1,40 @@ +package de.caritas.cob.upload.api.exception.httpresponses; + +import de.caritas.cob.uploadservice.api.service.LogService; +import java.io.Serial; +import java.util.function.Consumer; + +/** Represents the exception for an internal server error - status code 500. */ +public class InternalServerErrorException extends CustomHttpStatusException { + + @Serial private static final long serialVersionUID = 6051508644381775936L; + + /** + * InternalServerErrorException exception. + * + * @param message the message to be logged + */ + public InternalServerErrorException(String message) { + super(message, LogService::logInternalServerError); + } + + /** + * InternalServerErrorException exception. + * + * @param loggingMethod the method to be used for logging + * @param message the message to be logged + */ + public InternalServerErrorException(Consumer loggingMethod, String message) { + super(message, loggingMethod); + } + + /** + * InternalServerError exception. + * + * @param message the exception message + * @param ex the exception + */ + public InternalServerErrorException(String message, Exception ex) { + super(message, ex, LogService::logInternalServerError); + } +} diff --git a/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/NotFoundException.java b/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/NotFoundException.java new file mode 100644 index 0000000..facacb7 --- /dev/null +++ b/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/NotFoundException.java @@ -0,0 +1,7 @@ +package de.caritas.cob.upload.api.exception.httpresponses; + +import lombok.NoArgsConstructor; + +/** 404 - Not found http exception */ +@NoArgsConstructor +public class NotFoundException extends RuntimeException {} diff --git a/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/StatisticsDisabledException.java b/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/StatisticsDisabledException.java new file mode 100644 index 0000000..3784096 --- /dev/null +++ b/src/main/java/de/caritas/cob/upload/api/exception/httpresponses/StatisticsDisabledException.java @@ -0,0 +1,15 @@ +package de.caritas.cob.upload.api.exception.httpresponses; + +import lombok.Getter; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Getter +@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "statistics disabled") +public class StatisticsDisabledException extends AccessDeniedException { + + public StatisticsDisabledException(String msg) { + super(msg); + } +} diff --git a/src/main/java/de/caritas/cob/uploadservice/UploadServiceApplication.java b/src/main/java/de/caritas/cob/uploadservice/UploadServiceApplication.java index 0e79547..3127356 100644 --- a/src/main/java/de/caritas/cob/uploadservice/UploadServiceApplication.java +++ b/src/main/java/de/caritas/cob/uploadservice/UploadServiceApplication.java @@ -1,23 +1,18 @@ package de.caritas.cob.uploadservice; -import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; - +import com.google.common.collect.Lists; import de.caritas.cob.uploadservice.api.exception.KeycloakException; import de.caritas.cob.uploadservice.api.helper.AuthenticatedUser; import de.caritas.cob.uploadservice.media.MimeTypeDetector; import de.caritas.cob.uploadservice.media.TikaMimeTypeDetector; +import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.Executor; import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; import org.apache.tika.Tika; -import org.keycloak.KeycloakSecurityContext; -import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; -import org.keycloak.representations.AccessToken; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties; @@ -27,10 +22,7 @@ import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver; import org.springframework.boot.actuate.endpoint.web.EndpointMapping; import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes; -import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint; import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; -import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier; -import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @@ -40,8 +32,8 @@ import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.util.StringUtils; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.request.RequestContextHolder; @@ -76,90 +68,43 @@ public static void main(String[] args) { } /** - * Returns the @KeycloakAuthenticationToken which represents the token for a Keycloak - * authentication. - * - * @return KeycloakAuthenticationToken - */ - @Bean - @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) - public KeycloakAuthenticationToken getAccessToken() { - return (KeycloakAuthenticationToken) getRequest().getUserPrincipal(); - } - - /** - * Returns the @KeycloakSecurityContext. - * - * @return KeycloakSecurityContext - */ - @Bean - @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) - public KeycloakSecurityContext getKeycloakSecurityContext() { - return ((KeycloakAuthenticationToken) getRequest() - .getUserPrincipal()) - .getAccount() - .getKeycloakSecurityContext(); - } - - /** - * Returns the Keycloak user id of the authenticated user. + * Returns the currently authenticated user. * * @return {@link AuthenticatedUser} */ @Bean @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) - public AuthenticatedUser getAuthenticatedUser() { + AuthenticatedUser getAuthenticatedUser() { - // Get current KeycloakSecurityContext - KeycloakSecurityContext keycloakSecContext = - ((KeycloakAuthenticationToken) getRequest().getUserPrincipal()) - .getAccount() - .getKeycloakSecurityContext(); - - Map claimMap = keycloakSecContext.getToken().getOtherClaims(); + JwtAuthenticationToken authenticationToken = + (JwtAuthenticationToken) getRequest().getUserPrincipal(); + Map claimMap = authenticationToken.getToken().getClaims(); AuthenticatedUser authenticatedUser = new AuthenticatedUser(); + authenticatedUser.setAccessToken(authenticationToken.getToken().getTokenValue()); + authenticatedUser.setUserId(getUserAttribute(claimMap, CLAIM_NAME_USER_ID)); + authenticatedUser.setUsername(getUserAttribute(claimMap, CLAIM_NAME_USERNAME)); + authenticatedUser.setRoles( + extractRealmRoles(authenticationToken.getToken()).stream().collect(Collectors.toSet())); + return authenticatedUser; + } - if (claimMap.containsKey(CLAIM_NAME_USER_ID)) { - authenticatedUser.setUserId(claimMap.get(CLAIM_NAME_USER_ID).toString()); - } else { - throw new KeycloakException("Keycloak user attribute '" + CLAIM_NAME_USER_ID + "' not found."); - } - - if (claimMap.containsKey(CLAIM_NAME_USERNAME)) { - authenticatedUser.setUsername(claimMap.get(CLAIM_NAME_USERNAME).toString()); - } - - // Set user roles - AccessToken.Access realmAccess = - ((KeycloakAuthenticationToken) getRequest().getUserPrincipal()) - .getAccount() - .getKeycloakSecurityContext() - .getToken() - .getRealmAccess(); - Set roles = realmAccess.getRoles(); - if (isNotEmpty(roles)) { - authenticatedUser.setRoles(roles); - } else { - throw new KeycloakException( - authenticatedUser.getUserId()); + public Collection extractRealmRoles(Jwt jwt) { + Map realmAccess = (Map) jwt.getClaims().get("realm_access"); + if (realmAccess != null) { + var roles = (List) realmAccess.get("roles"); + if (roles != null) { + return roles; + } } + return Lists.newArrayList(); + } - // Set granted authorities - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - authenticatedUser.setGrantedAuthorities( - authentication.getAuthorities().stream() - .map(Object::toString) - .collect(Collectors.toSet())); - - // Set Keycloak token to authenticated user object - if (keycloakSecContext.getTokenString() != null) { - authenticatedUser.setAccessToken(keycloakSecContext.getTokenString()); - } else { - throw new KeycloakException("No valid Keycloak access token string found."); + private String getUserAttribute(Map claimMap, String claimValue) { + if (!claimMap.containsKey(claimValue)) { + throw new KeycloakException("Keycloak user attribute '" + claimValue + "' not found."); } - - return authenticatedUser; + return claimMap.get(claimValue).toString(); } private HttpServletRequest getRequest() { @@ -193,24 +138,29 @@ public MimeTypeDetector mimeTypeDetector() { return new TikaMimeTypeDetector(new Tika()); } - /* to fix actuator and springfox issue as described: - https://websparrow.org/spring/failed-to-start-bean-documentationpluginsbootstrapper-nested-exception-is-java-lang-nullpointerexception - */ @Bean public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping( - WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties, Environment environment) { - List> allEndpoints = new ArrayList<>(); - Collection webEndpoints = webEndpointsSupplier.getEndpoints(); - allEndpoints.addAll(webEndpoints); - allEndpoints.addAll(servletEndpointsSupplier.getEndpoints()); - allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints()); + WebEndpointsSupplier webEndpointsSupplier, + EndpointMediaTypes endpointMediaTypes, + CorsEndpointProperties corsProperties, + WebEndpointProperties webEndpointProperties, + Environment environment) { + + List> allEndpoints = new ArrayList<>(webEndpointsSupplier.getEndpoints()); + String basePath = webEndpointProperties.getBasePath(); EndpointMapping endpointMapping = new EndpointMapping(basePath); - boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath); - return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath), shouldRegisterLinksMapping, null); - } - - private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) { - return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT)); + boolean shouldRegisterLinksMapping = + webEndpointProperties.getDiscovery().isEnabled() + && (StringUtils.hasText(basePath) + || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT)); + + return new WebMvcEndpointHandlerMapping( + endpointMapping, + webEndpointsSupplier.getEndpoints(), + endpointMediaTypes, + corsProperties.toCorsConfiguration(), + new EndpointLinksResolver(allEndpoints, basePath), + shouldRegisterLinksMapping); } } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/ApiDefaultResponseEntityExceptionHandler.java b/src/main/java/de/caritas/cob/uploadservice/api/ApiDefaultResponseEntityExceptionHandler.java index eec13c3..58acebe 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/ApiDefaultResponseEntityExceptionHandler.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/ApiDefaultResponseEntityExceptionHandler.java @@ -1,13 +1,8 @@ package de.caritas.cob.uploadservice.api; -import de.caritas.cob.uploadservice.api.service.LogService; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.context.request.WebRequest; @ControllerAdvice @Order(Ordered.LOWEST_PRECEDENCE) @@ -22,11 +17,4 @@ public class ApiDefaultResponseEntityExceptionHandler { * @param request WebRequest * @return */ - @ExceptionHandler({RuntimeException.class}) - public ResponseEntity handleInternal(final RuntimeException ex, - final WebRequest request) { - LogService.logInternalServerError(ex); - - return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); - } } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/ApiResponseEntityExceptionHandler.java b/src/main/java/de/caritas/cob/uploadservice/api/ApiResponseEntityExceptionHandler.java index 96bed84..6bbc166 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/ApiResponseEntityExceptionHandler.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/ApiResponseEntityExceptionHandler.java @@ -7,8 +7,9 @@ import de.caritas.cob.uploadservice.api.exception.httpresponses.InternalServerErrorException; import de.caritas.cob.uploadservice.api.exception.httpresponses.QuotaReachedException; import de.caritas.cob.uploadservice.api.service.LogService; +import jakarta.validation.ConstraintViolationException; import java.net.UnknownHostException; -import javax.validation.ConstraintViolationException; +import java.util.Optional; import lombok.NoArgsConstructor; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; @@ -16,8 +17,10 @@ import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.lang.Nullable; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -25,7 +28,6 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.context.request.WebRequest; import org.springframework.web.multipart.MaxUploadSizeExceededException; -import org.springframework.web.multipart.MultipartException; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; /** @@ -37,20 +39,15 @@ @Order(Ordered.HIGHEST_PRECEDENCE) public class ApiResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { - /** - * Handles {@link MaxUploadSizeExceededException}. - * - * @param ex MaxUploadSizeExceededException - * @param request WebRequest - * @return a {@link ResponseEntity} instance - */ - @ExceptionHandler({MaxUploadSizeExceededException.class}) - public ResponseEntity handleCustomBadRequest( - final MaxUploadSizeExceededException ex, final WebRequest request) { + @Nullable + @Override + protected ResponseEntity handleMaxUploadSizeExceededException( + MaxUploadSizeExceededException ex, + HttpHeaders headers, + HttpStatusCode status, + WebRequest request) { LogService.logWarning(ex); - - return handleExceptionInternal( - ex, null, new HttpHeaders(), HttpStatus.PAYLOAD_TOO_LARGE, request); + return this.handleExceptionInternal(ex, (Object) null, headers, status, request); } /** @@ -69,21 +66,6 @@ public ResponseEntity handleCustomBadRequest( ex, null, new HttpHeaders(), HttpStatus.UNSUPPORTED_MEDIA_TYPE, request); } - /** - * Handles {@link MultipartException}. - * - * @param ex MultipartException - * @param request WebRequest - * @return a {@link ResponseEntity} instance - */ - @ExceptionHandler({MultipartException.class}) - public ResponseEntity handleCustomBadRequest( - final MultipartException ex, final WebRequest request) { - LogService.logWarning(ex); - - return handleExceptionInternal(ex, null, new HttpHeaders(), HttpStatus.BAD_REQUEST, request); - } - /** * Constraint violations. * @@ -104,7 +86,7 @@ public ResponseEntity handleBadRequest( * * @param ex HttpMessageNotReadableException * @param headers HttpHeaders - * @param status HttpStatus + * @param statusCode HttpStatusCode * @param request WebRequest * @return a ResponseEntity instance */ @@ -112,8 +94,10 @@ public ResponseEntity handleBadRequest( protected ResponseEntity handleHttpMessageNotReadable( final HttpMessageNotReadableException ex, final HttpHeaders headers, - final HttpStatus status, + final HttpStatusCode statusCode, final WebRequest request) { + HttpStatus status = + Optional.ofNullable(HttpStatus.resolve(statusCode.value())).orElse(HttpStatus.BAD_REQUEST); LogService.logWarning(status, ex); return handleExceptionInternal(null, null, headers, status, request); @@ -124,7 +108,7 @@ protected ResponseEntity handleHttpMessageNotReadable( * * @param ex MethodArgumentNotValidException * @param headers HttpHeaders - * @param status HttpStatus + * @param statusCode HttpStatusCode * @param request WebRequest * @return a ResponseEntity instance */ @@ -132,8 +116,10 @@ protected ResponseEntity handleHttpMessageNotReadable( protected ResponseEntity handleMethodArgumentNotValid( final MethodArgumentNotValidException ex, final HttpHeaders headers, - final HttpStatus status, + final HttpStatusCode statusCode, final WebRequest request) { + HttpStatus status = + Optional.ofNullable(HttpStatus.resolve(statusCode.value())).orElse(HttpStatus.BAD_REQUEST); LogService.logWarning(status, ex); return handleExceptionInternal(null, null, headers, status, request); @@ -164,7 +150,10 @@ protected ResponseEntity handleConflict( @ExceptionHandler({HttpClientErrorException.class}) protected ResponseEntity handleHttpClientException( final HttpClientErrorException ex, final WebRequest request) { - LogService.logWarning(ex.getStatusCode(), ex); + HttpStatus status = + Optional.ofNullable(HttpStatus.resolve(ex.getStatusCode().value())) + .orElse(HttpStatus.BAD_REQUEST); + LogService.logWarning(status, ex); return handleExceptionInternal(null, null, new HttpHeaders(), ex.getStatusCode(), request); } @@ -178,11 +167,11 @@ protected ResponseEntity handleHttpClientException( */ @ExceptionHandler( value = { - NullPointerException.class, - IllegalArgumentException.class, - IllegalStateException.class, - KeycloakException.class, - UnknownHostException.class + NullPointerException.class, + IllegalArgumentException.class, + IllegalStateException.class, + KeycloakException.class, + UnknownHostException.class }) public ResponseEntity handleInternal( final RuntimeException ex, final WebRequest request) { @@ -216,12 +205,11 @@ public ResponseEntity handleInternal( * @return a ResponseEntity instance */ @ExceptionHandler(QuotaReachedException.class) - public ResponseEntity handleInternal(final QuotaReachedException ex, - final WebRequest request) { + public ResponseEntity handleInternal( + final QuotaReachedException ex, final WebRequest request) { ex.executeLogging(); - return handleExceptionInternal(null, null, QUOTA_REACHED.buildHeader(), HttpStatus.FORBIDDEN, - request); + return handleExceptionInternal( + null, null, QUOTA_REACHED.buildHeader(), HttpStatus.FORBIDDEN, request); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/aspect/TempCleanupAspect.java b/src/main/java/de/caritas/cob/uploadservice/api/aspect/TempCleanupAspect.java index ab64d90..406d53c 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/aspect/TempCleanupAspect.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/aspect/TempCleanupAspect.java @@ -31,7 +31,7 @@ public void cleanUpTempFiles() { /** * Resolve {@link MultipartHttpServletRequest} from the current {@link - * javax.servlet.http.HttpServletRequest} + * jakarta.servlet.http.HttpServletRequest} * * @return a MultipartHttpServletRequest instance */ diff --git a/src/main/java/de/caritas/cob/uploadservice/api/authorization/Authority.java b/src/main/java/de/caritas/cob/uploadservice/api/authorization/Authority.java index ca48350..7091267 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/authorization/Authority.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/authorization/Authority.java @@ -14,13 +14,10 @@ import lombok.AllArgsConstructor; import lombok.Getter; -/** - * Definition of all authorities and of the role-authority-mapping - */ +/** Definition of all authorities and of the role-authority-mapping */ @Getter @AllArgsConstructor public enum Authority { - USER(UserRole.USER, singletonList(USER_DEFAULT)), CONSULTANT(UserRole.CONSULTANT, singletonList(CONSULTANT_DEFAULT)), U25_CONSULTANT(UserRole.PEER_CONSULTANT, singletonList(USE_FEEDBACK)), @@ -37,18 +34,17 @@ public enum Authority { * @return the related authorities */ public static List getAuthoritiesByUserRole(UserRole userRole) { - Optional authorityByUserRole = Stream.of(values()) - .filter(authority -> authority.userRole.equals(userRole)) - .findFirst(); + Optional authorityByUserRole = + Stream.of(values()).filter(authority -> authority.userRole.equals(userRole)).findFirst(); - return authorityByUserRole.isPresent() ? authorityByUserRole.get().getGrantedAuthorities() + return authorityByUserRole.isPresent() + ? authorityByUserRole.get().getGrantedAuthorities() : emptyList(); } public static final class AuthorityValue { - private AuthorityValue() { - } + private AuthorityValue() {} public static final String PREFIX = "AUTHORIZATION_"; @@ -57,7 +53,5 @@ private AuthorityValue() { public static final String USE_FEEDBACK = PREFIX + "USE_FEEDBACK"; public static final String TECHNICAL_DEFAULT = PREFIX + "TECHNICAL_DEFAULT"; public static final String ANONYMOUS_DEFAULT = PREFIX + "ANONYMOUS_DEFAULT"; - } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/authorization/RoleAuthorizationAuthorityMapper.java b/src/main/java/de/caritas/cob/uploadservice/api/authorization/RoleAuthorizationAuthorityMapper.java index f986225..aea8d99 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/authorization/RoleAuthorizationAuthorityMapper.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/authorization/RoleAuthorizationAuthorityMapper.java @@ -9,9 +9,7 @@ import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; import org.springframework.stereotype.Component; -/** - * Own implementation of the Spring GrantedAuthoritiesMapper. - */ +/** Own implementation of the Spring GrantedAuthoritiesMapper. */ @Component public class RoleAuthorizationAuthorityMapper implements GrantedAuthoritiesMapper { @@ -27,11 +25,10 @@ public Collection mapAuthorities( return mapAuthorities(roleNames); } - private Set mapAuthorities(Set roleNames) { + public Set mapAuthorities(Set roleNames) { return roleNames.parallelStream() .map(UserRole::getRoleByValue) - .filter(Optional::isPresent) - .map(Optional::get) + .flatMap(Optional::stream) .map(Authority::getAuthoritiesByUserRole) .flatMap(Collection::parallelStream) .map(SimpleGrantedAuthority::new) diff --git a/src/main/java/de/caritas/cob/uploadservice/api/controller/CustomSwaggerUiApiResourceController.java b/src/main/java/de/caritas/cob/uploadservice/api/controller/CustomSwaggerUiApiResourceController.java deleted file mode 100644 index ed83f85..0000000 --- a/src/main/java/de/caritas/cob/uploadservice/api/controller/CustomSwaggerUiApiResourceController.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.caritas.cob.uploadservice.api.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import springfox.documentation.annotations.ApiIgnore; -import springfox.documentation.swagger.web.ApiResourceController; -import springfox.documentation.swagger.web.SwaggerResourcesProvider; - -@Controller -@ApiIgnore -@RequestMapping(value = "${springfox.docuPath}" + "/swagger-resources") -public class CustomSwaggerUiApiResourceController extends ApiResourceController { - - public static final String SWAGGER_UI_BASE_URL = "/uploads/docs"; - - public CustomSwaggerUiApiResourceController(SwaggerResourcesProvider swaggerResources) { - super(swaggerResources, SWAGGER_UI_BASE_URL); - } - -} diff --git a/src/main/java/de/caritas/cob/uploadservice/api/controller/CustomSwaggerUiController.java b/src/main/java/de/caritas/cob/uploadservice/api/controller/CustomSwaggerUiController.java deleted file mode 100644 index 18f13dc..0000000 --- a/src/main/java/de/caritas/cob/uploadservice/api/controller/CustomSwaggerUiController.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.caritas.cob.uploadservice.api.controller; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import springfox.documentation.annotations.ApiIgnore; - -@Controller -@ApiIgnore -public class CustomSwaggerUiController { - @Value("${springfox.docuPath}") - private String docuPath; - - @RequestMapping(value = "${springfox.docuPath}") - public String index() { - return "redirect:" + docuPath + "/swagger-ui.html"; - } -} diff --git a/src/main/java/de/caritas/cob/uploadservice/api/controller/UploadController.java b/src/main/java/de/caritas/cob/uploadservice/api/controller/UploadController.java index 4dd630c..72e6246 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/controller/UploadController.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/controller/UploadController.java @@ -10,11 +10,8 @@ import de.caritas.cob.uploadservice.api.service.EncryptionService; import de.caritas.cob.uploadservice.api.service.LogService; import de.caritas.cob.uploadservice.generated.api.controller.UploadsApi; -import io.swagger.annotations.Api; -import java.util.Objects; -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -27,12 +24,10 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -/** - * Controller for upload requests. - */ +/** Controller for upload requests. */ @RestController +@Tag(name = "upload-controller") @RequiredArgsConstructor -@Api(tags = "upload-controller") public class UploadController implements UploadsApi { private final @NonNull UploadFacade uploadFacade; @@ -72,7 +67,7 @@ public ResponseEntity updateKey(@Valid @RequestBody MasterKeyDto masterKey @TempCleanup @Override public ResponseEntity uploadFileToRoom( - @PathVariable("roomId") String roomId, + @PathVariable String roomId, @RequestHeader String rcToken, @RequestHeader String rcUserId, @RequestPart MultipartFile file, @@ -100,8 +95,7 @@ public ResponseEntity uploadFileToRoom( rocketChatUploadParameter, parseBoolean(sendNotification), t, - fileHeader - ); + fileHeader); return new ResponseEntity<>(HttpStatus.CREATED); } @@ -122,7 +116,7 @@ public ResponseEntity uploadFileToRoom( @TempCleanup @Override public ResponseEntity uploadFileToFeedbackRoom( - @PathVariable("feedbackRoomId") String feedbackRoomId, + @PathVariable String feedbackRoomId, @RequestHeader String rcToken, @RequestHeader String rcUserId, @RequestPart MultipartFile file, @@ -150,8 +144,7 @@ public ResponseEntity uploadFileToFeedbackRoom( rocketChatUploadParameter, parseBoolean(sendNotification), t, - fileHeader - ); + fileHeader); return new ResponseEntity<>(HttpStatus.CREATED); } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/CustomCryptoException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/CustomCryptoException.java index a850a04..6bda532 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/CustomCryptoException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/CustomCryptoException.java @@ -1,8 +1,10 @@ package de.caritas.cob.uploadservice.api.exception; +import java.io.Serial; + public class CustomCryptoException extends Exception { - private static final long serialVersionUID = 1232112575979020932L; + @Serial private static final long serialVersionUID = 1232112575979020932L; /** * Exception when something with the encryption goes wrong. @@ -12,5 +14,4 @@ public class CustomCryptoException extends Exception { public CustomCryptoException(Exception ex) { super(ex); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/HelperException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/HelperException.java index 819d049..5d5684d 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/HelperException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/HelperException.java @@ -1,13 +1,12 @@ package de.caritas.cob.uploadservice.api.exception; +import java.io.Serial; + public class HelperException extends RuntimeException { - private static final long serialVersionUID = -1321906171569622899L; - /** - * - * Exception for helper errors - * - */ + @Serial private static final long serialVersionUID = -1321906171569622899L; + + /** Exception for helper errors */ public HelperException(String message, Exception exception) { super(message, exception); } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/InvalidFileTypeException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/InvalidFileTypeException.java index a82aabd..2812b70 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/InvalidFileTypeException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/InvalidFileTypeException.java @@ -2,9 +2,7 @@ import org.springframework.web.multipart.MultipartException; -/** - * Exception for wrong file type (upload) - */ +/** Exception for wrong file type (upload) */ public class InvalidFileTypeException extends MultipartException { public InvalidFileTypeException(String msg) { @@ -14,7 +12,7 @@ public InvalidFileTypeException(String msg) { /** * Exception for wrong file type (upload). * - * @param msg String + * @param msg String * @param cause Throwable */ public InvalidFileTypeException(String msg, Throwable cause) { diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/KeycloakException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/KeycloakException.java index 1a17875..25c6999 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/KeycloakException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/KeycloakException.java @@ -1,16 +1,17 @@ package de.caritas.cob.uploadservice.api.exception; +import java.io.Serial; + public class KeycloakException extends RuntimeException { - private static final long serialVersionUID = -5083156826149548581L; + @Serial private static final long serialVersionUID = -5083156826149548581L; /** * Keycloak 409 Conflict exception - * + * * @param message */ public KeycloakException(String message) { super(message); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/NoMasterKeyException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/NoMasterKeyException.java index bcd2c89..e7a366b 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/NoMasterKeyException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/NoMasterKeyException.java @@ -1,8 +1,10 @@ package de.caritas.cob.uploadservice.api.exception; +import java.io.Serial; + public class NoMasterKeyException extends Exception { - private static final long serialVersionUID = 362702101121444833L; + @Serial private static final long serialVersionUID = 362702101121444833L; /** * Exception, when no master-key is set @@ -12,5 +14,4 @@ public class NoMasterKeyException extends Exception { public NoMasterKeyException(String message) { super(message); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatLoginException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatLoginException.java index 2a64f62..127879c 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatLoginException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatLoginException.java @@ -1,12 +1,14 @@ package de.caritas.cob.uploadservice.api.exception; +import java.io.Serial; + public class RocketChatLoginException extends Exception { - private static final long serialVersionUID = 5198347832036308397L; + @Serial private static final long serialVersionUID = 5198347832036308397L; /** * Exception when login for technical user in Rocket.Chat fails - * + * * @param ex */ public RocketChatLoginException(Exception ex) { diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatPostMarkGroupAsReadException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatPostMarkGroupAsReadException.java index c41befd..4474017 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatPostMarkGroupAsReadException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatPostMarkGroupAsReadException.java @@ -1,16 +1,17 @@ package de.caritas.cob.uploadservice.api.exception; +import java.io.Serial; + public class RocketChatPostMarkGroupAsReadException extends Exception { - private static final long serialVersionUID = -5666387091852981692L; + @Serial private static final long serialVersionUID = -5666387091852981692L; /** * Exception, when a Rocket.Chat API call for marking a room as read fails - * + * * @param ex */ public RocketChatPostMarkGroupAsReadException(Exception ex) { super(ex); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatUserNotInitializedException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatUserNotInitializedException.java index aac8567..2319e52 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatUserNotInitializedException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/RocketChatUserNotInitializedException.java @@ -5,5 +5,4 @@ public class RocketChatUserNotInitializedException extends Exception { public RocketChatUserNotInitializedException(String message) { super(message); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/cutomheader/CustomHttpHeader.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/cutomheader/CustomHttpHeader.java index 7509da0..6c5d56f 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/cutomheader/CustomHttpHeader.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/cutomheader/CustomHttpHeader.java @@ -3,12 +3,9 @@ import lombok.AllArgsConstructor; import org.springframework.http.HttpHeaders; -/** - * Constants to build custom http headers. - */ +/** Constants to build custom http headers. */ @AllArgsConstructor public enum CustomHttpHeader { - QUOTA_REACHED("X-Reason", "QUOTA_REACHED"); private final String headerName; @@ -24,5 +21,4 @@ public HttpHeaders buildHeader() { headers.add(headerName, headerValue); return headers; } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/CustomHttpStatusException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/CustomHttpStatusException.java index 18fd52f..cccaf37 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/CustomHttpStatusException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/CustomHttpStatusException.java @@ -18,19 +18,16 @@ public abstract class CustomHttpStatusException extends RuntimeException { this.loggingMethod = loggingMethod; } - CustomHttpStatusException(String message, Exception exception, - Consumer loggingMethod) { + CustomHttpStatusException( + String message, Exception exception, Consumer loggingMethod) { super(message, exception); this.loggingMethod = loggingMethod; } - /** - * Executes the non null logging method. - */ + /** Executes the non null logging method. */ public void executeLogging() { if (nonNull(this.loggingMethod)) { this.loggingMethod.accept(this); } } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/InternalServerErrorException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/InternalServerErrorException.java index f7013ed..aff21ee 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/InternalServerErrorException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/InternalServerErrorException.java @@ -3,9 +3,7 @@ import de.caritas.cob.uploadservice.api.service.LogService; import java.util.function.Consumer; -/** - * Represents the status code 500 - Server Error. - */ +/** Represents the status code 500 - Server Error. */ public class InternalServerErrorException extends CustomHttpStatusException { /** @@ -14,8 +12,7 @@ public class InternalServerErrorException extends CustomHttpStatusException { * @param exception the caused exception * @param loggingMethod the method being used to log this exception */ - public InternalServerErrorException(Exception exception, - Consumer loggingMethod) { + public InternalServerErrorException(Exception exception, Consumer loggingMethod) { super(exception, loggingMethod); } @@ -26,8 +23,8 @@ public InternalServerErrorException(Exception exception, * @param exception the caused exception * @param loggingMethod the method being used to log this exception */ - public InternalServerErrorException(String message, Exception exception, - Consumer loggingMethod) { + public InternalServerErrorException( + String message, Exception exception, Consumer loggingMethod) { super(message, exception, loggingMethod); } @@ -35,7 +32,7 @@ public InternalServerErrorException(String message, Exception exception, * InternalServerError exception. * * @param message the exception message - * @param ex the exception + * @param ex the exception */ public InternalServerErrorException(String message, Exception ex) { super(message, ex, LogService::logInternalServerError); diff --git a/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/QuotaReachedException.java b/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/QuotaReachedException.java index 9c5e573..d7f3b83 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/QuotaReachedException.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/exception/httpresponses/QuotaReachedException.java @@ -2,9 +2,7 @@ import java.util.function.Consumer; -/** - * Custom exception to provide 403 - forbidden with custom quota header information. - */ +/** Custom exception to provide 403 - forbidden with custom quota header information. */ public class QuotaReachedException extends CustomHttpStatusException { /** @@ -15,5 +13,4 @@ public class QuotaReachedException extends CustomHttpStatusException { public QuotaReachedException(Consumer loggingMethod) { super(loggingMethod); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/facade/EmailNotificationFacade.java b/src/main/java/de/caritas/cob/uploadservice/api/facade/EmailNotificationFacade.java index 1528485..5f0df5f 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/facade/EmailNotificationFacade.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/facade/EmailNotificationFacade.java @@ -4,7 +4,6 @@ import de.caritas.cob.uploadservice.api.helper.EmailNotificationHelper; import de.caritas.cob.uploadservice.api.tenant.TenantContext; import java.util.Optional; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -23,7 +22,6 @@ public class EmailNotificationFacade { @Value("${user.service.api.new.feedback.message.notification}") private String userServiceApiSendNewFeedbackMessageNotificationUrl; - @Autowired public EmailNotificationFacade( EmailNotificationHelper emailNotificationHelper, AuthenticatedUser authenticatedUser) { this.emailNotificationHelper = emailNotificationHelper; @@ -52,6 +50,7 @@ public void sendEmailNotification(String rcGroupId) { public void sendFeedbackEmailNotification(String rcGroupId) { emailNotificationHelper.sendEmailFeedbackNotificationViaUserService( rcGroupId, - authenticatedUser.getAccessToken(), Optional.ofNullable(TenantContext.getCurrentTenant())); + authenticatedUser.getAccessToken(), + Optional.ofNullable(TenantContext.getCurrentTenant())); } } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/facade/UploadFacade.java b/src/main/java/de/caritas/cob/uploadservice/api/facade/UploadFacade.java index 7dbbf78..396254c 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/facade/UploadFacade.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/facade/UploadFacade.java @@ -54,20 +54,24 @@ public class UploadFacade { *

If the statistics function is enabled, the assignment of the enquired is processed as * statistical event. * - * @param rocketChatCredentials {@link RocketChatCredentials} container + * @param rocketChatCredentials {@link RocketChatCredentials} container * @param rocketChatUploadParameter {@link RocketChatUploadParameter} container */ public void uploadFileToRoom( RocketChatCredentials rocketChatCredentials, RocketChatUploadParameter rocketChatUploadParameter, - boolean sendNotification, String type, String fileHeader) { + boolean sendNotification, + String type, + String fileHeader) { this.uploadTrackingService.validateUploadLimit(rocketChatUploadParameter.getRoomId()); sanitizeAndEncryptParametersAndUploadToRocketChatRoom( rocketChatCredentials, rocketChatUploadParameter, type, fileHeader); - this.liveEventNotificationService.sendLiveEvent(rocketChatUploadParameter.getRoomId(), - authenticatedUser.getAccessToken(), TenantContext.getCurrentTenantOption()); + this.liveEventNotificationService.sendLiveEvent( + rocketChatUploadParameter.getRoomId(), + authenticatedUser.getAccessToken(), + TenantContext.getCurrentTenantOption()); this.uploadTrackingService.trackUploadedFileForUser(rocketChatUploadParameter.getRoomId()); if (sendNotification) { @@ -92,20 +96,24 @@ private UserRole resolveUserRole(AuthenticatedUser authenticatedUser) { * Upload a file with a message to a Rocket.Chat feedback room. The message and the description * are encrypted before it is sent to Rocket.Chat. * - * @param rocketChatCredentials {@link RocketChatCredentials} container + * @param rocketChatCredentials {@link RocketChatCredentials} container * @param rocketChatUploadParameter {@link RocketChatUploadParameter} container */ public void uploadFileToFeedbackRoom( RocketChatCredentials rocketChatCredentials, RocketChatUploadParameter rocketChatUploadParameter, - boolean sendNotification, String type, String fileHeader) { + boolean sendNotification, + String type, + String fileHeader) { this.uploadTrackingService.validateUploadLimit(rocketChatUploadParameter.getRoomId()); sanitizeAndEncryptParametersAndUploadToRocketChatRoom( rocketChatCredentials, rocketChatUploadParameter, type, fileHeader); - this.liveEventNotificationService.sendLiveEvent(rocketChatUploadParameter.getRoomId(), - authenticatedUser.getAccessToken(), TenantContext.getCurrentTenantOption()); + this.liveEventNotificationService.sendLiveEvent( + rocketChatUploadParameter.getRoomId(), + authenticatedUser.getAccessToken(), + TenantContext.getCurrentTenantOption()); this.uploadTrackingService.trackUploadedFileForUser(rocketChatUploadParameter.getRoomId()); if (sendNotification) { @@ -115,7 +123,9 @@ public void uploadFileToFeedbackRoom( private void sanitizeAndEncryptParametersAndUploadToRocketChatRoom( RocketChatCredentials rocketChatCredentials, - RocketChatUploadParameter rocketChatUploadParameter, String type, String fileHeader) { + RocketChatUploadParameter rocketChatUploadParameter, + String type, + String fileHeader) { rocketChatUploadParameterSanitizer.sanitize(rocketChatUploadParameter); @@ -140,11 +150,12 @@ private void sanitizeAndEncryptParametersAndUploadToRocketChatRoom( throw new InternalServerErrorException(e, LogService::logEncryptionServiceError); } - FullUploadResponseDto uploadResponse = rocketChatService.roomsUpload(rocketChatCredentials, - encryptedRocketChatUploadParameter); + FullUploadResponseDto uploadResponse = + rocketChatService.roomsUpload(rocketChatCredentials, encryptedRocketChatUploadParameter); if (doAttachmentE2e) { - if (uploadResponse.getMessage() == null || !StringUtils.hasText(uploadResponse.getMessage().getId())) { + if (uploadResponse.getMessage() == null + || !StringUtils.hasText(uploadResponse.getMessage().getId())) { throw new InternalServerErrorException( new Exception("Upload response message payload or id was empty!"), LogService::logInternalServerError); diff --git a/src/main/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUser.java b/src/main/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUser.java index 906bb2e..40e6584 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUser.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUser.java @@ -7,25 +7,20 @@ import lombok.NonNull; import lombok.Setter; -/** - * Representation of the via Keyclcoak authentificated user - */ +/** Representation of the via Keyclcoak authentificated user */ @AllArgsConstructor @NoArgsConstructor @Getter @Setter public class AuthenticatedUser { - @NonNull - private String userId; + @NonNull private String userId; - @NonNull - private String username; + @NonNull private String username; private Set roles; - @NonNull - private String accessToken; + @NonNull private String accessToken; private Set grantedAuthorities; } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/helper/CustomOffsetDateTime.java b/src/main/java/de/caritas/cob/uploadservice/api/helper/CustomOffsetDateTime.java index 0d4eec3..58d4da9 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/helper/CustomOffsetDateTime.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/helper/CustomOffsetDateTime.java @@ -16,5 +16,4 @@ private CustomOffsetDateTime() {} public static OffsetDateTime nowInUtc() { return OffsetDateTime.now(ZoneOffset.UTC); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/helper/EmailNotificationHelper.java b/src/main/java/de/caritas/cob/uploadservice/api/helper/EmailNotificationHelper.java index e426d13..c85cf03 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/helper/EmailNotificationHelper.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/helper/EmailNotificationHelper.java @@ -9,7 +9,6 @@ import de.caritas.cob.uploadservice.userservice.generated.web.model.NewMessageNotificationDTO; import java.util.Optional; import java.util.function.Consumer; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @@ -25,8 +24,8 @@ public class EmailNotificationHelper { private final TenantHeaderSupplier tenantHeaderSupplier; private final UserServiceApiControllerFactory userServiceApiControllerFactory; - @Autowired - public EmailNotificationHelper(ServiceHelper serviceHelper, + public EmailNotificationHelper( + ServiceHelper serviceHelper, TenantHeaderSupplier tenantHeaderSupplier, UserServiceApiControllerFactory userServiceApiControllerFactory) { this.serviceHelper = serviceHelper; @@ -42,8 +41,7 @@ public EmailNotificationHelper(ServiceHelper serviceHelper, */ @Async public void sendEmailNotificationViaUserService( - String rcGroupId, String accessToken, - Optional currentTenant) { + String rcGroupId, String accessToken, Optional currentTenant) { var userControllerApi = userServiceApiControllerFactory.createControllerApi(); addDefaultHeaders(userControllerApi.getApiClient(), accessToken, currentTenant); sendEmailNotificationCallingMethod(rcGroupId, userControllerApi::sendNewMessageNotification); @@ -51,18 +49,18 @@ public void sendEmailNotificationViaUserService( @Async public void sendEmailFeedbackNotificationViaUserService( - String rcGroupId, String accessToken, - Optional currentTenant) { + String rcGroupId, String accessToken, Optional currentTenant) { var userControllerApi = userServiceApiControllerFactory.createControllerApi(); addDefaultHeaders(userControllerApi.getApiClient(), accessToken, currentTenant); - sendEmailNotificationCallingMethod(rcGroupId, - userControllerApi::sendNewFeedbackMessageNotification); + sendEmailNotificationCallingMethod( + rcGroupId, userControllerApi::sendNewFeedbackMessageNotification); } - private void sendEmailNotificationCallingMethod(String rcGroupId, Consumer newMessageNotificationConsumerMethod) { + private void sendEmailNotificationCallingMethod( + String rcGroupId, Consumer newMessageNotificationConsumerMethod) { try { - NewMessageNotificationDTO notificationDto = new NewMessageNotificationDTO().rcGroupId( - rcGroupId); + NewMessageNotificationDTO notificationDto = + new NewMessageNotificationDTO().rcGroupId(rcGroupId); newMessageNotificationConsumerMethod.accept(notificationDto); TenantContext.clear(); } catch (RestClientException ex) { @@ -70,10 +68,10 @@ private void sendEmailNotificationCallingMethod(String rcGroupId, Consumer currentTenant) { - HttpHeaders headers = this.serviceHelper.getKeycloakAndCsrfHttpHeaders(accessToken, - currentTenant); + private void addDefaultHeaders( + ApiClient apiClient, String accessToken, Optional currentTenant) { + HttpHeaders headers = + this.serviceHelper.getKeycloakAndCsrfHttpHeaders(accessToken, currentTenant); addTenantHeaderIfPresent(currentTenant, headers); headers.forEach((key, value) -> apiClient.addDefaultHeader(key, value.iterator().next())); } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/helper/FileSanitizer.java b/src/main/java/de/caritas/cob/uploadservice/api/helper/FileSanitizer.java index a170fec..500847b 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/helper/FileSanitizer.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/helper/FileSanitizer.java @@ -3,7 +3,7 @@ import static org.apache.commons.lang3.StringUtils.isBlank; import org.apache.commons.io.FilenameUtils; -import org.springframework.util.StringUtils; +import org.springframework.util.ObjectUtils; public class FileSanitizer { @@ -22,7 +22,7 @@ public class FileSanitizer { */ public static String sanitizeFileName(String fileName) { - if (StringUtils.isEmpty(FilenameUtils.getExtension(fileName))) { + if (ObjectUtils.isEmpty(FilenameUtils.getExtension(fileName))) { return null; } @@ -37,7 +37,9 @@ public static String sanitizeFileName(String fileName) { private static String removeSpecialChars(final String fileName) { - return fileName.trim().replaceAll(REGEX_REMOVE_ALL_DOTS_EXCEPT_LAST, "") + return fileName + .trim() + .replaceAll(REGEX_REMOVE_ALL_DOTS_EXCEPT_LAST, "") .replaceAll(REGEX_REMOVE_NOT_ALLOWED_SPECIAL_CHARS, ""); } @@ -46,9 +48,12 @@ private static String limitFileNameLength(final String fileName) { final String extension = "." + FilenameUtils.getExtension(fileName); final String fileNameWithoutExtension = fileNameWithoutExtension(fileName); - return fileNameWithoutExtension.substring(0, - fileName.length() > MAX_FILE_NAME_LENGTH ? MAX_FILE_NAME_LENGTH - extension.length() - : fileNameWithoutExtension.length()) + extension; + return fileNameWithoutExtension.substring( + 0, + fileName.length() > MAX_FILE_NAME_LENGTH + ? MAX_FILE_NAME_LENGTH - extension.length() + : fileNameWithoutExtension.length()) + + extension; } private static boolean isFileNameEmpty(String fileName) { @@ -56,10 +61,9 @@ private static boolean isFileNameEmpty(String fileName) { } private static String fileNameWithoutExtension(String fileName) { - return fileName - .substring(0, fileName.length() - (FilenameUtils.getExtension(fileName).length() + 1)); + return fileName.substring( + 0, fileName.length() - (FilenameUtils.getExtension(fileName).length() + 1)); } - private FileSanitizer() { - } -} \ No newline at end of file + private FileSanitizer() {} +} diff --git a/src/main/java/de/caritas/cob/uploadservice/api/helper/Helper.java b/src/main/java/de/caritas/cob/uploadservice/api/helper/Helper.java index b01f072..10414c5 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/helper/Helper.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/helper/Helper.java @@ -31,7 +31,8 @@ public static String removeHtmFromText(String text) { try { text = Jsoup.clean(text, StringUtils.EMPTY, Whitelist.none(), outputSettings); } catch (Exception exception) { - throw new InternalServerErrorException("Error while removing HTML from text", exception, LogService::logInternalServerError); + throw new InternalServerErrorException( + "Error while removing HTML from text", exception, LogService::logInternalServerError); } return text; } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/helper/JsonStringToObjectConverter.java b/src/main/java/de/caritas/cob/uploadservice/api/helper/JsonStringToObjectConverter.java index 1e35e23..546a18c 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/helper/JsonStringToObjectConverter.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/helper/JsonStringToObjectConverter.java @@ -15,7 +15,7 @@ public class JsonStringToObjectConverter { * Convert a JSON string to an object. * * @param jsonAsString JSON as String - * @param classType Class type + * @param classType Class type * @return if success, instance of classType or null, otherwise null */ public T convert(String jsonAsString, Class classType) { @@ -24,8 +24,8 @@ public T convert(String jsonAsString, Class classType) { return objectMapper.readValue(jsonAsString, classType); } catch (IOException | NullPointerException exception) { LogService.logInternalServerError( - String.format( - "Error while converting JSON string to generic object type %s", classType.toString()), + "Error while converting JSON string to generic object type %s" + .formatted(classType.toString()), exception); return null; } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterEncrypter.java b/src/main/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterEncrypter.java index e9e5459..0053c50 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterEncrypter.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterEncrypter.java @@ -3,7 +3,6 @@ import de.caritas.cob.uploadservice.api.container.RocketChatUploadParameter; import de.caritas.cob.uploadservice.api.exception.CustomCryptoException; import de.caritas.cob.uploadservice.api.service.EncryptionService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** @@ -14,7 +13,6 @@ public class RocketChatUploadParameterEncrypter { private final EncryptionService encryptionService; - @Autowired public RocketChatUploadParameterEncrypter(EncryptionService encryptionService) { this.encryptionService = encryptionService; } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/helper/UserHelper.java b/src/main/java/de/caritas/cob/uploadservice/api/helper/UserHelper.java index d1a4bb9..ebcc56f 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/helper/UserHelper.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/helper/UserHelper.java @@ -28,7 +28,7 @@ private String base32EncodeUsername(String username) { .replace(BASE32_PLACEHOLDER, BASE32_PLACEHOLDER_REPLACE_STRING); } catch (Exception exception) { // Catch generic exception because of lack of base32 documentation - throw new HelperException(String.format("Could not encode username %s", username), exception); + throw new HelperException("Could not encode username %s".formatted(username), exception); } } @@ -49,7 +49,7 @@ private String base32DecodeUsername(String username) { .replace(BASE32_PLACEHOLDER_REPLACE_STRING, BASE32_PLACEHOLDER))); } catch (Exception exception) { // Catch generic exception because of lack of base32 documentation - throw new HelperException(String.format("Could not decode username %s", username), exception); + throw new HelperException("Could not decode username %s".formatted(username), exception); } } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/model/NewMessageNotificationDto.java b/src/main/java/de/caritas/cob/uploadservice/api/model/NewMessageNotificationDto.java index 1a1ff16..2e97d5d 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/model/NewMessageNotificationDto.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/model/NewMessageNotificationDto.java @@ -10,5 +10,6 @@ @Getter @Setter public class NewMessageNotificationDto { + private String rcGroupId; } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/model/UploadByUser.java b/src/main/java/de/caritas/cob/uploadservice/api/model/UploadByUser.java index a9fcdae..44a8cf3 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/model/UploadByUser.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/model/UploadByUser.java @@ -1,13 +1,13 @@ package de.caritas.cob.uploadservice.api.model; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; import java.time.LocalDateTime; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -35,5 +35,4 @@ public class UploadByUser { @Column(name = "create_date", nullable = false) private LocalDateTime createDate; - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/DataDto.java b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/DataDto.java index 4745263..eeefae9 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/DataDto.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/DataDto.java @@ -11,6 +11,7 @@ @NoArgsConstructor @AllArgsConstructor public class DataDto { + private String userId; private String authToken; private MeDto me; diff --git a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/EmailsDto.java b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/EmailsDto.java index 5b524d3..39677c1 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/EmailsDto.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/EmailsDto.java @@ -9,6 +9,7 @@ @Setter @NoArgsConstructor public class EmailsDto { + private String address; private boolean verified; } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/LoginResponseDto.java b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/LoginResponseDto.java index 8add687..da8495f 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/LoginResponseDto.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/LoginResponseDto.java @@ -14,6 +14,7 @@ @NoArgsConstructor @AllArgsConstructor public class LoginResponseDto { + private String status; private DataDto data; } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/MeDto.java b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/MeDto.java index dcdb18b..7fdfac8 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/MeDto.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/MeDto.java @@ -10,6 +10,7 @@ @Setter @NoArgsConstructor public class MeDto { + private String username; private String _id; private String status; diff --git a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/PreferencesDto.java b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/PreferencesDto.java index a48440f..37801a4 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/PreferencesDto.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/PreferencesDto.java @@ -9,6 +9,7 @@ @Setter @NoArgsConstructor public class PreferencesDto { + private String sidebarViewMode; private String sidebarGroupByType; private String sidebarHideAvatar; diff --git a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/SettingsDto.java b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/SettingsDto.java index 155482c..3051c8c 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/SettingsDto.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/model/rocket/chat/login/SettingsDto.java @@ -9,5 +9,6 @@ @Setter @NoArgsConstructor public class SettingsDto { + private PreferencesDto preferences; } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/repository/UploadByUserRepository.java b/src/main/java/de/caritas/cob/uploadservice/api/repository/UploadByUserRepository.java index c1a492d..1504d71 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/repository/UploadByUserRepository.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/repository/UploadByUserRepository.java @@ -6,5 +6,4 @@ public interface UploadByUserRepository extends CrudRepository { Integer countAllByUserIdAndSessionId(String userId, String sessionId); - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/EncryptionService.java b/src/main/java/de/caritas/cob/uploadservice/api/service/EncryptionService.java index 8621dc7..fd6b7f3 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/EncryptionService.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/EncryptionService.java @@ -7,10 +7,8 @@ import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Base64; -import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/FileService.java b/src/main/java/de/caritas/cob/uploadservice/api/service/FileService.java index 769acc4..463f858 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/FileService.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/FileService.java @@ -18,6 +18,7 @@ public class FileService { private final MimeTypeDetector mimeTypeDetector; + @Value("#{${mime-type-whitelist}}") private final Set mimeTypeWhitelist; @@ -31,7 +32,8 @@ public void verifyMimeType(MultipartFile multipartFile) { mimeType = mimeTypeDetector.detect(multipartFile.getInputStream()); } catch (Exception e) { throw new InternalServerErrorException( - "failed to detect mime type of file " + multipartFile.getOriginalFilename(), e, + "failed to detect mime type of file " + multipartFile.getOriginalFilename(), + e, LogService::logInternalServerError); } if (mimeType.isEmpty() || !mimeTypeWhitelist.contains(mimeType.get())) { @@ -50,7 +52,8 @@ public void verifyFileHeaderMimeType(InputStream fileHeaderInputStream) { mimeType = mimeTypeDetector.detect(fileHeaderInputStream); } catch (Exception e) { throw new InternalServerErrorException( - "failed to detect mime type of fileHeader " + fileHeaderInputStream, e, + "failed to detect mime type of fileHeader " + fileHeaderInputStream, + e, LogService::logInternalServerError); } if (mimeType.isEmpty() || !mimeTypeWhitelist.contains(mimeType.get())) { diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationService.java b/src/main/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationService.java index 963270b..3569c60 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationService.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationService.java @@ -13,9 +13,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestClientException; -/** - * Service class to provide live event triggers to the live proxy endpoint in user service. - */ +/** Service class to provide live event triggers to the live proxy endpoint in user service. */ @Service @RequiredArgsConstructor public class LiveEventNotificationService { @@ -32,13 +30,14 @@ public class LiveEventNotificationService { @Async public void sendLiveEvent(String rcGroupId, String accessToken, Optional tenantId) { if (isNotBlank(rcGroupId)) { - LiveproxyControllerApi liveproxyControllerApi = liveProxyApiControllerFactory.createControllerApi(); + LiveproxyControllerApi liveproxyControllerApi = + liveProxyApiControllerFactory.createControllerApi(); addDefaultHeaders(liveproxyControllerApi.getApiClient(), accessToken, tenantId); try { liveproxyControllerApi.sendLiveEvent(rcGroupId); } catch (RestClientException e) { LogService.logInternalServerError( - String.format("Unable to trigger live event for rc group id %s", rcGroupId), e); + "Unable to trigger live event for rc group id %s".formatted(rcGroupId), e); } } } @@ -47,5 +46,4 @@ private void addDefaultHeaders(ApiClient apiClient, String accessToken, Optional var headers = serviceHelper.getKeycloakAndCsrfHttpHeaders(accessToken, tenantId); headers.forEach((key, value) -> apiClient.addDefaultHeader(key, value.iterator().next())); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/LogService.java b/src/main/java/de/caritas/cob/uploadservice/api/service/LogService.java index d8af61a..892e7e0 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/LogService.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/LogService.java @@ -18,9 +18,10 @@ public class LogService { private static final String INTERNAL_SERVER_ERROR_TEXT = "Internal Server Error: "; private static final String BAD_REQUEST_TEXT = "Bad Request: "; private static final String UPLOAD_SERVICE_API_TEXT = "UploadService API: {}"; - private static final String STATISTICS_EVENT_PROCESSING_ERROR = "StatisticsEventProcessing error: "; - private static final String STATISTICS_EVENT_PROCESSING_WARNING = "StatisticsEventProcessing warning: "; - + private static final String STATISTICS_EVENT_PROCESSING_ERROR = + "StatisticsEventProcessing error: "; + private static final String STATISTICS_EVENT_PROCESSING_WARNING = + "StatisticsEventProcessing warning: "; private LogService() {} @@ -183,6 +184,4 @@ public static void logStatisticsEventError(Exception exception) { public static void logStatisticsEventWarning(String message) { LOGGER.warn("{}{}", STATISTICS_EVENT_PROCESSING_WARNING, message); } - - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/MongoDbService.java b/src/main/java/de/caritas/cob/uploadservice/api/service/MongoDbService.java index 68b0491..351fbb5 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/MongoDbService.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/MongoDbService.java @@ -28,7 +28,8 @@ public class MongoDbService { * @param messageId ID of the message */ public void setE2eType(String messageId) { - MongoCollection messageCollection = mongoClient.getDatabase("rocketchat").getCollection("rocketchat_message"); + MongoCollection messageCollection = + mongoClient.getDatabase("rocketchat").getCollection("rocketchat_message"); Bson filter = eq("_id", messageId); Bson update = set("t", "e2e"); UpdateResult result = messageCollection.updateOne(filter, update); @@ -40,5 +41,4 @@ public void setE2eType(String messageId) { LogService::logInternalServerError); } } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/RocketChatService.java b/src/main/java/de/caritas/cob/uploadservice/api/service/RocketChatService.java index eea1480..124df7b 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/RocketChatService.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/RocketChatService.java @@ -100,7 +100,7 @@ public void markGroupAsReadForSystemUser(String rcGroupId) } else { LogService.logRocketChatServiceError( - String.format("Could not set messages as read for system user in group %s", rcGroupId)); + "Could not set messages as read for system user in group %s".formatted(rcGroupId)); } } @@ -110,8 +110,7 @@ private void markGroupAsRead(String rcToken, String rcUserId, String rcGroupId) try { HttpHeaders headers = getRocketChatHeader(rcToken, rcUserId); PostGroupAsReadDto postGroupAsReadDto = new PostGroupAsReadDto(rcGroupId); - HttpEntity request = - new HttpEntity<>(postGroupAsReadDto, headers); + HttpEntity request = new HttpEntity<>(postGroupAsReadDto, headers); restTemplate.postForObject(rcPostGroupMessagesRead, request, StandardResponseDto.class); } catch (Exception ex) { @@ -142,8 +141,7 @@ public FullUploadResponseDto roomsUpload( MultiValueMap map = getParameterMapForUploadRequest( rocketChatUploadParameter, rocketChatCredentials.getRocketChatUserId()); - HttpEntity> request = - new HttpEntity<>(map, headers); + HttpEntity> request = new HttpEntity<>(map, headers); response = restTemplate.postForObject(uploadUrl, request, FullUploadResponseDto.class); @@ -192,7 +190,8 @@ private MultiValueMap getParameterMapForUploadRequest( throw new InternalServerErrorException( String.format( "Could not access file to upload to room with id %s for user with id %s", - rocketChatUploadParameter.getRoomId(), rcUserId), ex, + rocketChatUploadParameter.getRoomId(), rcUserId), + ex, LogService::logInternalServerError); } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/TenantHeaderSupplier.java b/src/main/java/de/caritas/cob/uploadservice/api/service/TenantHeaderSupplier.java index 338b01d..b47f258 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/TenantHeaderSupplier.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/TenantHeaderSupplier.java @@ -1,8 +1,8 @@ package de.caritas.cob.uploadservice.api.service; import de.caritas.cob.uploadservice.api.tenant.TenantContext; +import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/TenantService.java b/src/main/java/de/caritas/cob/uploadservice/api/service/TenantService.java index df1f9d1..fe95b1b 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/TenantService.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/TenantService.java @@ -1,21 +1,31 @@ package de.caritas.cob.uploadservice.api.service; import de.caritas.cob.uploadservice.config.CacheManagerConfig; -import de.caritas.cob.uploadservice.tenantservice.generated.web.TenantControllerApi; +import de.caritas.cob.uploadservice.config.TenantServiceApiControllerFactory; import de.caritas.cob.uploadservice.tenantservice.generated.web.model.RestrictedTenantDTO; import lombok.NonNull; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor +@Slf4j public class TenantService { - private final @NonNull TenantControllerApi tenantControllerApi; + private final @NonNull TenantServiceApiControllerFactory tenantServiceApiControllerFactory; @Cacheable(cacheNames = CacheManagerConfig.TENANT_CACHE, key = "#subdomain") public RestrictedTenantDTO getRestrictedTenantDataBySubdomain(String subdomain) { - return tenantControllerApi.getRestrictedTenantDataBySubdomainWithHttpInfo(subdomain).getBody(); + return getRestrictedTenantDto(subdomain); + } + + private RestrictedTenantDTO getRestrictedTenantDto(String subdomain) { + log.debug("Calling tenant service to get tenant data for subdomain {}", subdomain); + return tenantServiceApiControllerFactory + .createControllerApi() + .getRestrictedTenantDataBySubdomainWithHttpInfo(subdomain) + .getBody(); } } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/UploadTrackingService.java b/src/main/java/de/caritas/cob/uploadservice/api/service/UploadTrackingService.java index 0672661..1387ecd 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/UploadTrackingService.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/UploadTrackingService.java @@ -11,9 +11,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; -/** - * Service to track uploaded files per user and validate against configurated limit. - */ +/** Service to track uploaded files per user and validate against configurated limit. */ @Service @RequiredArgsConstructor public class UploadTrackingService { @@ -32,8 +30,8 @@ public class UploadTrackingService { */ public void validateUploadLimit(String sessionId) { String userId = this.authenticatedUser.getUserId(); - Integer uploadCount = this.uploadByUserRepository - .countAllByUserIdAndSessionId(userId, sessionId); + Integer uploadCount = + this.uploadByUserRepository.countAllByUserIdAndSessionId(userId, sessionId); if (uploadCount >= this.uploadLimit) { throw new QuotaReachedException(LogService::logInfo); } @@ -46,11 +44,12 @@ public void validateUploadLimit(String sessionId) { */ public void trackUploadedFileForUser(String sessionId) { String userId = this.authenticatedUser.getUserId(); - UploadByUser uploadByUser = UploadByUser.builder() - .userId(userId) - .sessionId(sessionId) - .createDate(LocalDateTime.now()) - .build(); + UploadByUser uploadByUser = + UploadByUser.builder() + .userId(userId) + .sessionId(sessionId) + .createDate(LocalDateTime.now()) + .build(); this.uploadByUserRepository.save(uploadByUser); } @@ -64,5 +63,4 @@ public void cleanUpFileLimits() { this.uploadByUserRepository.deleteAll(); LogService.logInfo("File restrictions are reset!"); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/helper/HttpUrlUtils.java b/src/main/java/de/caritas/cob/uploadservice/api/service/helper/HttpUrlUtils.java index 928cc27..d97d367 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/helper/HttpUrlUtils.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/helper/HttpUrlUtils.java @@ -2,7 +2,6 @@ import static org.apache.commons.lang3.Validate.notNull; - public class HttpUrlUtils { private HttpUrlUtils() {} diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/helper/RocketChatCredentialsHelper.java b/src/main/java/de/caritas/cob/uploadservice/api/service/helper/RocketChatCredentialsHelper.java index a539389..37dc4c6 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/helper/RocketChatCredentialsHelper.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/helper/RocketChatCredentialsHelper.java @@ -7,7 +7,6 @@ import de.caritas.cob.uploadservice.api.model.rocket.chat.logout.LogoutResponseDto; import de.caritas.cob.uploadservice.api.service.LogService; import java.time.LocalDateTime; -import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; @@ -157,13 +156,12 @@ public ResponseEntity loginUser(String username, String passwo map.add("username", username); map.add("password", password); - HttpEntity> request = - new HttpEntity<>(map, headers); + HttpEntity> request = new HttpEntity<>(map, headers); return restTemplate.postForEntity(rocketChatApiUserLogin, request, LoginResponseDto.class); } catch (Exception ex) { LogService.logRocketChatServiceError( - String.format("Could not login user (%s) in Rocket.Chat", username), ex); + "Could not login user (%s) in Rocket.Chat".formatted(username), ex); throw new RocketChatLoginException(ex); } } @@ -189,7 +187,7 @@ public boolean logoutUser(String rcUserId, String rcAuthToken) { } catch (Exception ex) { LogService.logRocketChatServiceError( - String.format("Could not log out user id (%s) from Rocket.Chat", rcUserId), ex); + "Could not log out user id (%s) from Rocket.Chat".formatted(rcUserId), ex); return false; } @@ -215,7 +213,7 @@ private void logoutUser(RocketChatCredentials user) { private HttpHeaders getStandardHttpHeaders(String rcToken, String rcUserId) { HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); httpHeaders.add(rocketChatHeaderAuthToken, rcToken); httpHeaders.add(rocketChatHeaderUserId, rcUserId); return httpHeaders; diff --git a/src/main/java/de/caritas/cob/uploadservice/api/service/helper/ServiceHelper.java b/src/main/java/de/caritas/cob/uploadservice/api/service/helper/ServiceHelper.java index af76879..bdf4fc9 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/service/helper/ServiceHelper.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/service/helper/ServiceHelper.java @@ -51,7 +51,7 @@ private void addAuthorizationHeader(HttpHeaders headers, String accessToken) { private HttpHeaders addCsrfValues(HttpHeaders httpHeaders) { String csrfToken = UUID.randomUUID().toString(); - httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); httpHeaders.add("Cookie", csrfCookieProperty + "=" + csrfToken); httpHeaders.add(csrfHeaderProperty, csrfToken); diff --git a/src/main/java/de/caritas/cob/uploadservice/api/statistics/StatisticsService.java b/src/main/java/de/caritas/cob/uploadservice/api/statistics/StatisticsService.java index f30dd0d..02c9378 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/statistics/StatisticsService.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/statistics/StatisticsService.java @@ -2,8 +2,8 @@ import de.caritas.cob.uploadservice.api.service.LogService; import de.caritas.cob.uploadservice.api.statistics.event.StatisticsEvent; +import jakarta.validation.constraints.NotNull; import java.nio.charset.StandardCharsets; -import javax.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.amqp.core.MessageBuilder; @@ -46,9 +46,8 @@ public void fireEvent(StatisticsEvent statisticsEvent) { .build()), () -> LogService.logStatisticsEventWarning( - String.format( - "Empty statistics event message payload for type %s received", - statisticsEvent.getClass().getSimpleName()))); + "Empty statistics event message payload for type %s received" + .formatted(statisticsEvent.getClass().getSimpleName()))); } } } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/statistics/event/CreateMessageStatisticsEvent.java b/src/main/java/de/caritas/cob/uploadservice/api/statistics/event/CreateMessageStatisticsEvent.java index f381f9b..0da598a 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/statistics/event/CreateMessageStatisticsEvent.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/statistics/event/CreateMessageStatisticsEvent.java @@ -34,8 +34,7 @@ public EventType getEventType() { return EVENT_TYPE; } - private CreateMessageStatisticsEventMessage - createCreateMessageStatisticsEventMessage() { + private CreateMessageStatisticsEventMessage createCreateMessageStatisticsEventMessage() { return new CreateMessageStatisticsEventMessage() .eventType(EVENT_TYPE) .userId(userId) diff --git a/src/main/java/de/caritas/cob/uploadservice/api/tenant/AccessTokenTenantResolver.java b/src/main/java/de/caritas/cob/uploadservice/api/tenant/AccessTokenTenantResolver.java index 0d79788..0a72c15 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/tenant/AccessTokenTenantResolver.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/tenant/AccessTokenTenantResolver.java @@ -1,15 +1,15 @@ package de.caritas.cob.uploadservice.api.tenant; +import jakarta.servlet.http.HttpServletRequest; import java.util.Map; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.keycloak.KeycloakSecurityContext; -import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.stereotype.Component; - @AllArgsConstructor @Component @Slf4j @@ -19,35 +19,40 @@ public class AccessTokenTenantResolver implements TenantResolver { @Override public Optional resolve(HttpServletRequest request) { - return resolveTenantIdFromTokenClaims(request); + return resolveTenantIdFromTokenClaims(); } - private Optional resolveTenantIdFromTokenClaims(HttpServletRequest request) { - Map claimMap = getClaimMap(request); + private Optional resolveTenantIdFromTokenClaims() { + Map claimMap = getClaimMap(); log.debug("Found tenantId in claim : " + claimMap.toString()); return getUserTenantIdAttribute(claimMap); } private Optional getUserTenantIdAttribute(Map claimMap) { if (claimMap.containsKey(TENANT_ID)) { - Integer tenantId = (Integer) claimMap.get(TENANT_ID); - return Optional.of(Long.valueOf(tenantId)); - } else { - return Optional.empty(); + Object tenantIdObject = claimMap.get(TENANT_ID); + if (tenantIdObject instanceof Long tenantId) { + return Optional.of(tenantId); + } + if (tenantIdObject instanceof Integer tenantId) { + return Optional.of(Long.valueOf(tenantId)); + } } + return Optional.empty(); } - private Map getClaimMap(HttpServletRequest request) { - KeycloakSecurityContext keycloakSecContext = - ((KeycloakAuthenticationToken) request.getUserPrincipal()).getAccount() - .getKeycloakSecurityContext(); - return keycloakSecContext.getToken().getOtherClaims(); + private Map getClaimMap() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null) { + var jwt = (Jwt) authentication.getPrincipal(); + return jwt.getClaims(); + } else { + return Map.of(); + } } @Override public boolean canResolve(HttpServletRequest request) { return resolve(request).isPresent(); } - - } diff --git a/src/main/java/de/caritas/cob/uploadservice/api/tenant/CustomHeaderTenantResolver.java b/src/main/java/de/caritas/cob/uploadservice/api/tenant/CustomHeaderTenantResolver.java index a61e9c1..489aad2 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/tenant/CustomHeaderTenantResolver.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/tenant/CustomHeaderTenantResolver.java @@ -1,9 +1,8 @@ package de.caritas.cob.uploadservice.api.tenant; - import de.caritas.cob.uploadservice.api.service.TenantHeaderSupplier; +import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; import lombok.NonNull; import org.springframework.stereotype.Component; @@ -11,6 +10,7 @@ @Component @AllArgsConstructor public class CustomHeaderTenantResolver implements TenantResolver { + private final @NonNull TenantHeaderSupplier tenantHeaderSupplier; @Override diff --git a/src/main/java/de/caritas/cob/uploadservice/api/tenant/SubdomainTenantResolver.java b/src/main/java/de/caritas/cob/uploadservice/api/tenant/SubdomainTenantResolver.java index 89c0ffd..0845d5e 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/tenant/SubdomainTenantResolver.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/tenant/SubdomainTenantResolver.java @@ -5,13 +5,12 @@ import de.caritas.cob.uploadservice.api.service.TenantService; import de.caritas.cob.uploadservice.filter.SubdomainExtractor; +import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; import lombok.NonNull; import org.springframework.stereotype.Component; - @AllArgsConstructor @Component public class SubdomainTenantResolver implements TenantResolver { diff --git a/src/main/java/de/caritas/cob/uploadservice/api/tenant/TechnicalUserTenantResolver.java b/src/main/java/de/caritas/cob/uploadservice/api/tenant/TechnicalUserTenantResolver.java index e7bf4bf..829e505 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/tenant/TechnicalUserTenantResolver.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/tenant/TechnicalUserTenantResolver.java @@ -1,9 +1,16 @@ package de.caritas.cob.uploadservice.api.tenant; +import com.google.common.collect.Lists; +import de.caritas.cob.uploadservice.api.authorization.UserRole; +import jakarta.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; -import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; import org.keycloak.representations.AccessToken; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; @Component @@ -14,10 +21,36 @@ public Optional resolve(HttpServletRequest request) { return isTechnicalUserRole(request) ? Optional.of(0L) : Optional.empty(); } + public Collection extractRealmRoles(Jwt jwt) { + Map realmAccess = (Map) jwt.getClaims().get("realm_access"); + if (realmAccess != null) { + var roles = (List) realmAccess.get("roles"); + System.out.println("Extracted roles: " + roles); // Debug logging + if (roles != null) { + return roles; + } + } + return Lists.newArrayList(); + } + + private boolean containsAnyRole(HttpServletRequest request, String... expectedRoles) { + if (request.getUserPrincipal() == null) { + return false; + } + JwtAuthenticationToken token = (JwtAuthenticationToken) request.getUserPrincipal(); + if (token.getToken() == null) { + return false; + } + var roles = extractRealmRoles(token.getToken()); + return !roles.isEmpty() && containsAny(roles, expectedRoles); + } + + private boolean containsAny(Collection roles, String... expectedRoles) { + return Arrays.stream(expectedRoles).anyMatch(roles::contains); + } + private boolean isTechnicalUserRole(HttpServletRequest request) { - AccessToken token = ((KeycloakAuthenticationToken) request.getUserPrincipal()).getAccount() - .getKeycloakSecurityContext().getToken(); - return hasRoles(token) && token.getRealmAccess().getRoles().contains("technical"); + return containsAnyRole(request, UserRole.TECHNICAL.getValue()); } private boolean hasRoles(AccessToken accessToken) { diff --git a/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantContext.java b/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantContext.java index 9626b0c..603e268 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantContext.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantContext.java @@ -4,9 +4,7 @@ public class TenantContext { - private TenantContext() { - - } + private TenantContext() {} private static ThreadLocal currentTenant = new ThreadLocal<>(); diff --git a/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantResolver.java b/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantResolver.java index 833005a..46fc666 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantResolver.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantResolver.java @@ -1,7 +1,7 @@ package de.caritas.cob.uploadservice.api.tenant; +import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; public interface TenantResolver { diff --git a/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantResolverService.java b/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantResolverService.java index 8fcd396..88923ce 100644 --- a/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantResolverService.java +++ b/src/main/java/de/caritas/cob/uploadservice/api/tenant/TenantResolverService.java @@ -2,16 +2,18 @@ import static com.google.common.collect.Lists.newArrayList; +import jakarta.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; @Slf4j @@ -20,17 +22,13 @@ @Component public class TenantResolverService { - @NonNull - CustomHeaderTenantResolver customHeaderTenantResolver; + @NonNull CustomHeaderTenantResolver customHeaderTenantResolver; - @NonNull - SubdomainTenantResolver subdomainTenantResolver; + @NonNull SubdomainTenantResolver subdomainTenantResolver; - @NonNull - TechnicalUserTenantResolver technicalUserTenantResolver; + @NonNull TechnicalUserTenantResolver technicalUserTenantResolver; - @NonNull - AccessTokenTenantResolver accessTokenTenantResolver; + @NonNull AccessTokenTenantResolver accessTokenTenantResolver; @Value("${feature.multitenancy.with.single.domain.enabled}") private boolean multitenancyWithSingleDomain; @@ -61,8 +59,8 @@ private Long resolveForAuthenticatedUser(HttpServletRequest request) { return tenantId.orElseThrow(); } else { if (shouldValidateResolvedTenant(tenantId)) { - Optional tenantIdFromCustomHeaderOrSubdomain = getFirstResolvedTenant(request, - tenantIdCrossValidationResolvers()); + Optional tenantIdFromCustomHeaderOrSubdomain = + getFirstResolvedTenant(request, tenantIdCrossValidationResolvers()); validateResolvedTenantMatch(tenantId, tenantIdFromCustomHeaderOrSubdomain); } return tenantId.orElseThrow(); @@ -85,8 +83,8 @@ private Long resolveForNonAuthenticatedUser(HttpServletRequest request) { return tenantId.get(); } - private void validateResolvedTenantMatch(Optional tenantId, - Optional tenantIdFromHeaderOrSubdomain) { + private void validateResolvedTenantMatch( + Optional tenantId, Optional tenantIdFromHeaderOrSubdomain) { if (tenantId.isPresent() && tenantIdFromHeaderOrSubdomain.isPresent()) { if (!tenantId.get().equals(tenantIdFromHeaderOrSubdomain.get())) { throw new AccessDeniedException("Tenant id from claim and subdomain not same."); @@ -96,8 +94,8 @@ private void validateResolvedTenantMatch(Optional tenantId, } } - private Optional getFirstResolvedTenant(HttpServletRequest request, - List tenantResolvers) { + private Optional getFirstResolvedTenant( + HttpServletRequest request, List tenantResolvers) { for (TenantResolver tenantResolver : tenantResolvers) { if (tenantResolver.canResolve(request)) { return tenantResolver.resolve(request); @@ -107,6 +105,10 @@ private Optional getFirstResolvedTenant(HttpServletRequest request, } private boolean userIsAuthenticated(HttpServletRequest request) { - return request.getUserPrincipal() != null; + /* after upgrade to oauth2ResourceServer security configuration (spring 6.x upgrade) + for authenticated users request.getUserPrincipal() might be still null at the time of HttpTenantFilter is executed + but BearerTokenAuthenticationFilter has already set the principal in the SecurityContext */ + SecurityContext context = SecurityContextHolder.getContext(); + return context.getAuthentication() != null && context.getAuthentication().isAuthenticated(); } } diff --git a/src/main/java/de/caritas/cob/uploadservice/config/AppConfig.java b/src/main/java/de/caritas/cob/uploadservice/config/AppConfig.java index 05fa5df..63b2d0a 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/AppConfig.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/AppConfig.java @@ -8,17 +8,14 @@ import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import org.springframework.web.client.RestTemplate; -/** - * Contains some general spring boot application configurations - * - */ +/** Contains some general spring boot application configurations */ @Configuration @ComponentScan(basePackages = {"de.caritas.cob.uploadservice"}) public class AppConfig { /** * Activate the messages.properties for validation messages. - * + * * @param messageSource * @return */ diff --git a/src/main/java/de/caritas/cob/uploadservice/config/AuthorisationService.java b/src/main/java/de/caritas/cob/uploadservice/config/AuthorisationService.java new file mode 100644 index 0000000..5c8a40e --- /dev/null +++ b/src/main/java/de/caritas/cob/uploadservice/config/AuthorisationService.java @@ -0,0 +1,49 @@ +package de.caritas.cob.uploadservice.config; + +import com.google.common.collect.Lists; +import de.caritas.cob.uploadservice.api.authorization.RoleAuthorizationAuthorityMapper; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.stereotype.Service; + +@Service +public class AuthorisationService { + + private final RoleAuthorizationAuthorityMapper roleAuthorizationAuthorityMapper = + new RoleAuthorizationAuthorityMapper(); + + public Object getUsername() { + return getPrincipal().getClaims().get("username"); + } + + private Authentication getAuthentication() { + return SecurityContextHolder.getContext().getAuthentication(); + } + + private Jwt getPrincipal() { + return (Jwt) getAuthentication().getPrincipal(); + } + + public Collection extractRealmAuthorities(Jwt jwt) { + var roles = extractRealmRoles(jwt); + return roleAuthorizationAuthorityMapper.mapAuthorities( + roles.stream().collect(Collectors.toSet())); + } + + public Collection extractRealmRoles(Jwt jwt) { + Map realmAccess = (Map) jwt.getClaims().get("realm_access"); + if (realmAccess != null) { + var roles = (List) realmAccess.get("roles"); + if (roles != null) { + return roles; + } + } + return Lists.newArrayList(); + } +} diff --git a/src/main/java/de/caritas/cob/uploadservice/config/CacheManagerConfig.java b/src/main/java/de/caritas/cob/uploadservice/config/CacheManagerConfig.java index 883f3fd..da438f3 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/CacheManagerConfig.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/CacheManagerConfig.java @@ -1,10 +1,12 @@ package de.caritas.cob.uploadservice.config; +import java.util.Collection; +import java.util.List; import net.sf.ehcache.config.CacheConfiguration; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; -import org.springframework.cache.ehcache.EhCacheCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -48,5 +50,18 @@ private CacheConfiguration buildTenantCacheConfiguration() { return tenantCacheConfiguration; } + private class EhCacheCacheManager implements CacheManager { + public EhCacheCacheManager(net.sf.ehcache.CacheManager cacheManager) {} + + @Override + public Cache getCache(String name) { + return null; + } + + @Override + public Collection getCacheNames() { + return List.of(); + } + } } diff --git a/src/main/java/de/caritas/cob/uploadservice/config/CustomSwaggerUiPathWebMvcConfigurer.java b/src/main/java/de/caritas/cob/uploadservice/config/CustomSwaggerUiPathWebMvcConfigurer.java index f2d220f..6cf22a4 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/CustomSwaggerUiPathWebMvcConfigurer.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/CustomSwaggerUiPathWebMvcConfigurer.java @@ -13,8 +13,9 @@ public class CustomSwaggerUiPathWebMvcConfigurer implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler(docuPath + "/swagger-ui/**") - .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); + registry + .addResourceHandler(docuPath + "/swagger-ui/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); registry .addResourceHandler(docuPath + "/**") .addResourceLocations("classpath:/META-INF/resources/"); diff --git a/src/main/java/de/caritas/cob/uploadservice/config/GlobalMethodSecurityConfig.java b/src/main/java/de/caritas/cob/uploadservice/config/GlobalMethodSecurityConfig.java index da9e377..4f698b8 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/GlobalMethodSecurityConfig.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/GlobalMethodSecurityConfig.java @@ -1,33 +1,33 @@ package de.caritas.cob.uploadservice.config; import de.caritas.cob.uploadservice.api.authorization.Authority.AuthorityValue; -import java.util.ArrayList; import java.util.List; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.access.AccessDecisionManager; import org.springframework.security.access.AccessDecisionVoter; +import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; import org.springframework.security.access.expression.method.ExpressionBasedPreInvocationAdvice; import org.springframework.security.access.vote.AffirmativeBased; import org.springframework.security.access.vote.AuthenticatedVoter; import org.springframework.security.access.vote.RoleVoter; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.core.GrantedAuthorityDefaults; @Configuration -@EnableGlobalMethodSecurity(securedEnabled = true) -public class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration { +@EnableMethodSecurity(securedEnabled = true, prePostEnabled = false) +public class GlobalMethodSecurityConfig { - @Override - protected AccessDecisionManager accessDecisionManager() { - List> decisionVoters = new ArrayList<>(); + @Bean + public AccessDecisionManager accessDecisionManager() { ExpressionBasedPreInvocationAdvice expressionAdvice = new ExpressionBasedPreInvocationAdvice(); - expressionAdvice.setExpressionHandler(getExpressionHandler()); + expressionAdvice.setExpressionHandler(methodSecurityExpressionHandler()); + RoleVoter roleVoter = new RoleVoter(); - roleVoter.setRolePrefix(""); - decisionVoters.add(roleVoter); - decisionVoters.add(new AuthenticatedVoter()); + roleVoter.setRolePrefix(""); // Remove default "ROLE_" prefix + + List> decisionVoters = List.of(roleVoter, new AuthenticatedVoter()); + return new AffirmativeBased(decisionVoters); } @@ -35,4 +35,9 @@ protected AccessDecisionManager accessDecisionManager() { public GrantedAuthorityDefaults grantedAuthorityDefaults() { return new GrantedAuthorityDefaults(AuthorityValue.PREFIX); } + + @Bean + public DefaultMethodSecurityExpressionHandler methodSecurityExpressionHandler() { + return new DefaultMethodSecurityExpressionHandler(); + } } diff --git a/src/main/java/de/caritas/cob/uploadservice/config/JwtAuthConverter.java b/src/main/java/de/caritas/cob/uploadservice/config/JwtAuthConverter.java new file mode 100644 index 0000000..e3309d8 --- /dev/null +++ b/src/main/java/de/caritas/cob/uploadservice/config/JwtAuthConverter.java @@ -0,0 +1,60 @@ +package de.caritas.cob.uploadservice.config; + +import java.util.Collection; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import org.springframework.core.convert.converter.Converter; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.jwt.JwtClaimNames; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; +import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class JwtAuthConverter implements Converter { + + private final @NonNull AuthorisationService authorisationService; + + private final JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = + new JwtGrantedAuthoritiesConverter(); + + private final JwtAuthConverterProperties properties; + + public JwtAuthConverter( + JwtAuthConverterProperties properties, AuthorisationService authorisationService) { + this.properties = properties; + this.authorisationService = authorisationService; + } + + @Override + public AbstractAuthenticationToken convert(Jwt jwt) { + var authorities = getGrantedAuthorities(jwt); + return new JwtAuthenticationToken(jwt, authorities, getPrincipalClaimName(jwt)); + } + + private Collection getGrantedAuthorities(Jwt jwt) { + Collection convertedGrantedAuthorities = + jwtGrantedAuthoritiesConverter.convert(jwt); + if (convertedGrantedAuthorities != null) { + return Stream.concat( + convertedGrantedAuthorities.stream(), + authorisationService.extractRealmAuthorities(jwt).stream()) + .collect(Collectors.toSet()); + } else { + return authorisationService.extractRealmAuthorities(jwt); + } + } + + private String getPrincipalClaimName(Jwt jwt) { + String claimName = JwtClaimNames.SUB; + if (properties.getPrincipalAttribute() != null) { + claimName = properties.getPrincipalAttribute(); + } + return jwt.getClaim(claimName); + } +} diff --git a/src/main/java/de/caritas/cob/uploadservice/config/JwtAuthConverterProperties.java b/src/main/java/de/caritas/cob/uploadservice/config/JwtAuthConverterProperties.java new file mode 100644 index 0000000..82ba14f --- /dev/null +++ b/src/main/java/de/caritas/cob/uploadservice/config/JwtAuthConverterProperties.java @@ -0,0 +1,16 @@ +package de.caritas.cob.uploadservice.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.validation.annotation.Validated; + +@Data +@Validated +@Configuration +@ConfigurationProperties(prefix = "jwt.auth.converter") +public class JwtAuthConverterProperties { + + private String resourceId; + private String principalAttribute; +} diff --git a/src/main/java/de/caritas/cob/uploadservice/config/KeycloakConfiguration.java b/src/main/java/de/caritas/cob/uploadservice/config/KeycloakConfiguration.java index ef69a8a..71fa672 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/KeycloakConfiguration.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/KeycloakConfiguration.java @@ -6,10 +6,11 @@ @Configuration public class KeycloakConfiguration { + /** - * Use the KeycloakSpringBootConfigResolver to be able to save the Keycloak settings in the spring - * application properties. - */ + * Use the KeycloakSpringBootConfigResolver to be able to save the Keycloak settings in the spring + * application properties. + */ @Bean public KeycloakSpringBootConfigResolver KeycloakConfigResolver() { return new KeycloakSpringBootConfigResolver(); diff --git a/src/main/java/de/caritas/cob/uploadservice/config/MongoDbConfig.java b/src/main/java/de/caritas/cob/uploadservice/config/MongoDbConfig.java index d006c4e..e28ac9f 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/MongoDbConfig.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/MongoDbConfig.java @@ -17,10 +17,8 @@ public class MongoDbConfig { @Bean public MongoClient mongoClient() { final ConnectionString connectionString = new ConnectionString(mongoUri); - final MongoClientSettings mongoClientSettings = MongoClientSettings.builder() - .applyConnectionString(connectionString) - .build(); + final MongoClientSettings mongoClientSettings = + MongoClientSettings.builder().applyConnectionString(connectionString).build(); return MongoClients.create(mongoClientSettings); } - } diff --git a/src/main/java/de/caritas/cob/uploadservice/config/SecurityConfig.java b/src/main/java/de/caritas/cob/uploadservice/config/SecurityConfig.java index 0d089c7..2e3721d 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/SecurityConfig.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/SecurityConfig.java @@ -6,44 +6,31 @@ import static de.caritas.cob.uploadservice.api.authorization.Authority.AuthorityValue.USER_DEFAULT; import static de.caritas.cob.uploadservice.api.authorization.Authority.AuthorityValue.USE_FEEDBACK; -import de.caritas.cob.uploadservice.api.authorization.RoleAuthorizationAuthorityMapper; import de.caritas.cob.uploadservice.filter.HttpTenantFilter; import de.caritas.cob.uploadservice.filter.StatelessCsrfFilter; -import org.keycloak.adapters.AdapterDeploymentContext; -import org.keycloak.adapters.KeycloakConfigResolver; -import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; -import org.keycloak.adapters.springsecurity.AdapterDeploymentContextFactoryBean; +import lombok.RequiredArgsConstructor; import org.keycloak.adapters.springsecurity.KeycloakConfiguration; -import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; -import org.keycloak.adapters.springsecurity.client.KeycloakClientRequestFactory; -import org.keycloak.adapters.springsecurity.config.KeycloakSpringConfigResolverWrapper; -import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; -import org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticatedActionsFilter; -import org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter; -import org.keycloak.adapters.springsecurity.filter.KeycloakPreAuthActionsFilter; -import org.keycloak.adapters.springsecurity.filter.KeycloakSecurityContextRequestFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Lazy; -import org.springframework.context.annotation.Primary; -import org.springframework.core.env.Environment; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.oauth2.server.resource.web.authentication.BearerTokenAuthenticationFilter; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy; import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; import org.springframework.security.web.csrf.CsrfFilter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -/** - * Provides the Keycloak/Spring Security configuration. - */ +@Configuration @KeycloakConfiguration -public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter { - - @SuppressWarnings("unused") - private final KeycloakClientRequestFactory keycloakClientRequestFactory; +@EnableWebSecurity +@EnableMethodSecurity +@RequiredArgsConstructor +public class SecurityConfig implements WebMvcConfigurer { @Value("${csrf.cookie.property}") private String csrfCookieProperty; @@ -54,138 +41,76 @@ public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter { @Value("${csrf.whitelist.header.property}") private String csrfWhitelistHeaderProperty; - @Autowired - private Environment environment; - @Autowired(required = false) private HttpTenantFilter httpTenantFilter; @Value("${multitenancy.enabled}") private boolean multitenancy; - /** - * Processes HTTP requests and checks for a valid spring security authentication for the - * (Keycloak) principal (authorization header). - */ - public SecurityConfig(KeycloakClientRequestFactory keycloakClientRequestFactory) { - this.keycloakClientRequestFactory = keycloakClientRequestFactory; - } + // Whitelist for Swagger, Actuator endpoints, etc. + public static final String[] WHITE_LIST = { + "/uploads/docs", + "/uploads/docs/**", + "/v2/api-docs", + "/configuration/ui", + "/swagger-resources/**", + "/configuration/security", + "/swagger-ui", + "/swagger-ui/**", + "/webjars/**", + "/actuator/health", + "/actuator/health/**" + }; + + @Autowired AuthorisationService authorisationService; + + @Autowired JwtAuthConverterProperties jwtAuthConverterProperties; + + /** Defines our SecurityFilterChain (the new style in Spring Security 6). */ + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - /** - * Configure spring security filter chain: disable default Spring Boot CSRF token behavior and add - * custom {@link StatelessCsrfFilter}, set all sessions to be fully stateless, define necessary - * Keycloak roles for specific REST API paths - */ - @Override - protected void configure(HttpSecurity http) throws Exception { - super.configure(http); - - HttpSecurity httpSecurity = http.csrf() - .disable() + http.csrf(csrf -> csrf.disable()) .addFilterBefore( - new StatelessCsrfFilter(csrfCookieProperty, csrfHeaderProperty, - csrfWhitelistHeaderProperty), CsrfFilter.class); + new StatelessCsrfFilter( + csrfCookieProperty, csrfHeaderProperty, csrfWhitelistHeaderProperty), + CsrfFilter.class); - if (multitenancy) { - httpSecurity = httpSecurity - .addFilterAfter(httpTenantFilter, KeycloakAuthenticatedActionsFilter.class); + if (multitenancy && httpTenantFilter != null) { + http.addFilterAfter(httpTenantFilter, BearerTokenAuthenticationFilter.class); } - httpSecurity - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .sessionAuthenticationStrategy(sessionAuthenticationStrategy()) - .and() - .authorizeRequests() - .antMatchers(SpringFoxConfig.WHITE_LIST) - .permitAll() - .antMatchers("/uploads/messages/key") - .hasAuthority(TECHNICAL_DEFAULT) - .antMatchers("/uploads/new/{roomId:[0-9A-Za-z]+}") - .hasAnyAuthority(USER_DEFAULT, CONSULTANT_DEFAULT, ANONYMOUS_DEFAULT) - .antMatchers("/uploads/feedback/new/{feedbackRoomId:[0-9A-Za-z]+}") - .hasAnyAuthority(USE_FEEDBACK) - .anyRequest() - .denyAll(); + http.sessionManagement( + session -> + session + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .sessionAuthenticationStrategy(sessionAuthenticationStrategy())); + + http.authorizeHttpRequests( + auth -> + auth.requestMatchers(WHITE_LIST) + .permitAll() + .requestMatchers("/uploads/messages/key") + .hasAuthority(TECHNICAL_DEFAULT) + .requestMatchers("/uploads/new/{roomId:[0-9A-Za-z]+}") + .hasAnyAuthority(USER_DEFAULT, CONSULTANT_DEFAULT, ANONYMOUS_DEFAULT) + .requestMatchers("/uploads/feedback/new/{feedbackRoomId:[0-9A-Za-z]+}") + .hasAuthority(USE_FEEDBACK) + .anyRequest() + .denyAll()) + .oauth2ResourceServer( + oauth2 -> oauth2.jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthConverter()))); + return http.build(); } - /** - * Change springs authentication strategy to be stateless (no session is being created). - */ @Bean - @Override - protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { - return new NullAuthenticatedSessionStrategy(); - } - - /** - * Change the default AuthenticationProvider to KeycloakAuthenticationProvider and register it in - * the spring security context. Set the GrantedAuthoritiesMapper to map the Keycloak roles to the - * granted authorities. - */ - @Autowired - public void configureGlobal( - final AuthenticationManagerBuilder auth, RoleAuthorizationAuthorityMapper authorityMapper) { - KeycloakAuthenticationProvider keyCloakAuthProvider = keycloakAuthenticationProvider(); - keyCloakAuthProvider.setGrantedAuthoritiesMapper(authorityMapper); - auth.authenticationProvider(keyCloakAuthProvider); + public JwtAuthConverter jwtAuthConverter() { + return new JwtAuthConverter(jwtAuthConverterProperties, authorisationService); } - /** - * From the Keycloag documentation: "Spring Boot attempts to eagerly register filter beans with - * the web application context. Therefore, when running the Keycloak Spring Security adapter in a - * Spring Boot environment, it may be necessary to add FilterRegistrationBeans to your security - * configuration to prevent the Keycloak filters from being registered twice." - * - *

https://github.com/keycloak/keycloak-documentation/blob/master/securing_apps/topics/oidc/java/spring-security-adapter.adoc - * - *

{@link package.class label} - */ - @SuppressWarnings({"rawtypes", "unchecked"}) + /** Use a NullAuthenticatedSessionStrategy for stateless sessions. */ @Bean - public FilterRegistrationBean keycloakAuthenticationProcessingFilterRegistrationBean( - KeycloakAuthenticationProcessingFilter filter) { - FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter); - registrationBean.setEnabled(false); - return registrationBean; - } - - /** - * see above: {@link SecurityConfig#keycloakAuthenticationProcessingFilterRegistrationBean - * (KeycloakAuthenticationProcessingFilter) - */ - @SuppressWarnings({"rawtypes", "unchecked"}) - @Bean - public FilterRegistrationBean keycloakPreAuthActionsFilterRegistrationBean( - KeycloakPreAuthActionsFilter filter) { - FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter); - registrationBean.setEnabled(false); - return registrationBean; - } - - /** - * see above: {@link SecurityConfig#keycloakAuthenticationProcessingFilterRegistrationBean - * (KeycloakAuthenticationProcessingFilter) - */ - @SuppressWarnings({"rawtypes", "unchecked"}) - @Bean - public FilterRegistrationBean keycloakAuthenticatedActionsFilterBean( - KeycloakAuthenticatedActionsFilter filter) { - FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter); - registrationBean.setEnabled(false); - return registrationBean; - } - - /** - * see above: {@link SecurityConfig#keycloakAuthenticationProcessingFilterRegistrationBean - * (KeycloakAuthenticationProcessingFilter) - */ - @SuppressWarnings({"rawtypes", "unchecked"}) - @Bean - public FilterRegistrationBean keycloakSecurityContextRequestFilterBean( - KeycloakSecurityContextRequestFilter filter) { - FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter); - registrationBean.setEnabled(false); - return registrationBean; + protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { + return new NullAuthenticatedSessionStrategy(); } } diff --git a/src/main/java/de/caritas/cob/uploadservice/config/SpringFoxConfig.java b/src/main/java/de/caritas/cob/uploadservice/config/SpringFoxConfig.java index a25bf32..1ed4123 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/SpringFoxConfig.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/SpringFoxConfig.java @@ -1,85 +1,41 @@ package de.caritas.cob.uploadservice.config; -import static java.util.Collections.singletonList; - -import java.util.Collections; import java.util.HashSet; -import java.util.List; import java.util.Set; import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.ApiKey; -import springfox.documentation.service.AuthorizationScope; -import springfox.documentation.service.Contact; -import springfox.documentation.service.SecurityReference; -import springfox.documentation.service.SecurityScheme; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.plugins.Docket; -/** - * Provides the SpringFox (API documentation generation) configuration. - * - */ +/** Provides the SpringFox (API documentation generation) configuration. */ @Configuration -@Import(BeanValidatorPluginsConfiguration.class) public class SpringFoxConfig { @Value("${springfox.docuTitle}") private String docuTitle; + @Value("${springfox.docuDescription}") private String docuDescription; + @Value("${springfox.docuVersion}") private String docuVersion; + @Value("${springfox.docuTermsUrl}") private String docuTermsUrl; + @Value("${springfox.docuContactName}") private String docuContactName; + @Value("${springfox.docuContactUrl}") private String docuContactUrl; + @Value("${springfox.docuContactEmail}") private String docuContactEmail; + @Value("${springfox.docuLicense}") private String docuLicense; + @Value("${springfox.docuLicenseUrl}") private String docuLicenseUrl; - // White list for path patterns that should be white listed so that swagger UI can be accessed - // without authorization - public static final String[] WHITE_LIST = new String[]{"/uploads/docs", "/uploads/docs/**", - "/v2/api-docs", "/configuration/ui", - "/swagger-resources/**", "/configuration/security", "/swagger-ui", "/swagger-ui/**", - "/webjars/**", "/actuator/health", "/actuator/health/**"}; - - @Bean - public Docket apiDocket() { - return new Docket(DocumentationType.SWAGGER_2).select() - .apis(RequestHandlerSelectors.basePackage("de.caritas.cob.uploadservice.api")).build() - .consumes(getContentTypes()).produces(getContentTypes()).apiInfo(getApiInfo()) - .useDefaultResponseMessages(false).protocols(protocols()).securitySchemes(securitySchemes()) - .securityContexts(securityContexts()); - } - - private List securityContexts() { - return singletonList(SecurityContext.builder() - .forPaths(PathSelectors.any()).securityReferences(securityReferences()).build()); - } - - private List securityReferences() { - return singletonList( - SecurityReference.builder().reference("token").scopes(new AuthorizationScope[0]).build()); - } - - private List securitySchemes() { - return singletonList(new ApiKey("Bearer", "Authorization", "header")); - } - /** * Returns the API protocols (for documentation) * @@ -92,23 +48,10 @@ private Set protocols() { return protocols; } - /** - * Returns all content types which should be consumed/produced - */ + /** Returns all content types which should be consumed/produced */ private Set getContentTypes() { Set contentTypes = new HashSet<>(); contentTypes.add("application/json"); return contentTypes; } - - /** - * Returns the API information (defined in application.properties) - * - * @return - */ - private ApiInfo getApiInfo() { - return new ApiInfo(docuTitle, docuDescription, docuVersion, docuTermsUrl, - new Contact(docuContactName, docuContactUrl, docuContactEmail), docuLicense, docuLicenseUrl, - Collections.emptyList()); - } } diff --git a/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceApiClient.java b/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceApiClient.java index a374606..66b5c93 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceApiClient.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceApiClient.java @@ -1,26 +1,12 @@ package de.caritas.cob.uploadservice.config; -import static java.util.Objects.isNull; -import static java.util.Objects.nonNull; -import static org.apache.commons.lang3.StringUtils.isEmpty; - -import de.caritas.cob.uploadservice.api.exception.httpresponses.InternalServerErrorException; -import java.beans.IntrospectionException; -import java.beans.Introspector; -import java.beans.PropertyDescriptor; -import java.util.Arrays; import java.util.Collection; -import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; -/** - * Extension of the generated UserService API client to adapt the handling of parameter values. - */ -public class TenantServiceApiClient extends - de.caritas.cob.uploadservice.tenantservice.generated.ApiClient { - - private static final String FILTER_NAME = "filter"; +/** Extension of the generated UserService API client to adapt the handling of parameter values. */ +public class TenantServiceApiClient + extends de.caritas.cob.uploadservice.tenantservice.generated.ApiClient { public TenantServiceApiClient(RestTemplate restTemplate) { super(restTemplate); @@ -31,54 +17,18 @@ public TenantServiceApiClient(RestTemplate restTemplate) { * which are not {@link Collection} for filter query params. * * @param collectionFormat The format to convert to - * @param name The name of the parameter - * @param value The parameter's value + * @param name The name of the parameter + * @param value The parameter's value * @return a Map containing non-null String value(s) of the input parameter */ @Override public MultiValueMap parameterToMultiValueMap( CollectionFormat collectionFormat, String name, Object value) { - if (noValidFilterParams(name, value)) { + if (TenantServiceHelper.noValidFilterParams(name, value)) { return super.parameterToMultiValueMap(collectionFormat, name, value); } - return obtainQueryParameters(value); - } - - private boolean noValidFilterParams(String queryName, Object queryValue) { - return isEmpty(queryName) || !queryName.equals(FILTER_NAME) || isNull(queryValue); - } - - private MultiValueMap obtainQueryParameters(Object queryValue) { - MultiValueMap paramMap = new LinkedMultiValueMap<>(); - - try { - Arrays.asList(Introspector.getBeanInfo(queryValue.getClass(), Object.class) - .getPropertyDescriptors()) - .stream() - .filter(descriptor -> nonNull(descriptor.getReadMethod())) - .forEach(descriptor -> setMethodKeyValuePairs(queryValue, paramMap, descriptor)); - return paramMap; - - } catch (IntrospectionException exception) { - throw new InternalServerErrorException( - String.format("Could not obtain method properties of %s", queryValue.toString()), - exception); - } - } - - private void setMethodKeyValuePairs(Object queryValue, MultiValueMap map, - PropertyDescriptor descriptor) { - try { - Object value = descriptor.getReadMethod().invoke(queryValue); - if (nonNull(value)) { - map.add(descriptor.getName(), value.toString()); - } - } catch (Exception exception) { - throw new InternalServerErrorException( - String.format("Could not obtain method key value pairs of %s", queryValue.toString()), - exception); - } + return TenantServiceHelper.obtainQueryParameters(value); } } diff --git a/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceApiClientConfig.java b/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceApiClientConfig.java deleted file mode 100644 index c999bdb..0000000 --- a/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceApiClientConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.caritas.cob.uploadservice.config; - -import de.caritas.cob.uploadservice.tenantservice.generated.ApiClient; -import de.caritas.cob.uploadservice.tenantservice.generated.web.TenantControllerApi; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; - -@Component -@ConditionalOnExpression("${multitenancy.enabled:true}") -public class TenantServiceApiClientConfig { - - @Value("${tenant.service.api.url}") - private String tenantServiceApiUrl; - - @Bean - public TenantControllerApi tenantControllerApi( - ApiClient apiClient) { - return new TenantControllerApi(apiClient); - } - - @Bean - @Primary - public ApiClient tenantApiClient(RestTemplate restTemplate) { - ApiClient apiClient = new TenantServiceApiClient(restTemplate); - apiClient.setBasePath(this.tenantServiceApiUrl); - return apiClient; - } -} \ No newline at end of file diff --git a/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceApiControllerFactory.java b/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceApiControllerFactory.java new file mode 100644 index 0000000..5e2243c --- /dev/null +++ b/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceApiControllerFactory.java @@ -0,0 +1,23 @@ +package de.caritas.cob.uploadservice.config; + +import de.caritas.cob.uploadservice.tenantservice.generated.web.TenantControllerApi; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +@Component +public class TenantServiceApiControllerFactory { + + @Value("${tenant.service.api.url}") + private String tenantServiceApiUrl; + + @Autowired private RestTemplate restTemplate; + + public TenantControllerApi createControllerApi() { + var apiClient = new TenantServiceApiClient(restTemplate).setBasePath(this.tenantServiceApiUrl); + TenantControllerApi controllerApi = new TenantControllerApi(apiClient); + controllerApi.setApiClient(apiClient); + return controllerApi; + } +} diff --git a/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceHelper.java b/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceHelper.java new file mode 100644 index 0000000..45147e1 --- /dev/null +++ b/src/main/java/de/caritas/cob/uploadservice/config/TenantServiceHelper.java @@ -0,0 +1,57 @@ +package de.caritas.cob.uploadservice.config; + +import static java.util.Objects.isNull; +import static java.util.Objects.nonNull; +import static org.apache.commons.lang3.StringUtils.isEmpty; + +import de.caritas.cob.uploadservice.api.exception.httpresponses.InternalServerErrorException; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.util.Arrays; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +public class TenantServiceHelper { + + private static final String FILTER_NAME = "filter"; + + private TenantServiceHelper() { // hide public constructor + } + + public static boolean noValidFilterParams(String queryName, Object queryValue) { + return isEmpty(queryName) || !queryName.equals(FILTER_NAME) || isNull(queryValue); + } + + public static MultiValueMap obtainQueryParameters(Object queryValue) { + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + + try { + Arrays.asList( + Introspector.getBeanInfo(queryValue.getClass(), Object.class) + .getPropertyDescriptors()) + .stream() + .filter(descriptor -> nonNull(descriptor.getReadMethod())) + .forEach(descriptor -> setMethodKeyValuePairs(queryValue, paramMap, descriptor)); + return paramMap; + + } catch (IntrospectionException exception) { + throw new InternalServerErrorException( + "Could not obtain method properties of %s".formatted(queryValue.toString()), exception); + } + } + + private static void setMethodKeyValuePairs( + Object queryValue, MultiValueMap map, PropertyDescriptor descriptor) { + try { + Object value = descriptor.getReadMethod().invoke(queryValue); + if (nonNull(value)) { + map.add(descriptor.getName(), value.toString()); + } + } catch (Exception exception) { + throw new InternalServerErrorException( + "Could not obtain method key value pairs of %s".formatted(queryValue.toString()), + exception); + } + } +} diff --git a/src/main/java/de/caritas/cob/uploadservice/config/apiclient/LiveProxyApiControllerFactory.java b/src/main/java/de/caritas/cob/uploadservice/config/apiclient/LiveProxyApiControllerFactory.java index fad1e46..85da652 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/apiclient/LiveProxyApiControllerFactory.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/apiclient/LiveProxyApiControllerFactory.java @@ -12,8 +12,8 @@ public class LiveProxyApiControllerFactory { @Value("${user.service.api.liveproxy.url}") private String liveProxyApiUrl; - @Autowired - private RestTemplate restTemplate; + + @Autowired private RestTemplate restTemplate; public LiveproxyControllerApi createControllerApi() { var apiClient = new ApiClient(restTemplate).setBasePath(this.liveProxyApiUrl); diff --git a/src/main/java/de/caritas/cob/uploadservice/config/apiclient/UserServiceApiControllerFactory.java b/src/main/java/de/caritas/cob/uploadservice/config/apiclient/UserServiceApiControllerFactory.java index 2d11cef..fead3d7 100644 --- a/src/main/java/de/caritas/cob/uploadservice/config/apiclient/UserServiceApiControllerFactory.java +++ b/src/main/java/de/caritas/cob/uploadservice/config/apiclient/UserServiceApiControllerFactory.java @@ -12,8 +12,8 @@ public class UserServiceApiControllerFactory { @Value("${user.service.api.url}") private String userServiceApiUrl; - @Autowired - private RestTemplate restTemplate; + + @Autowired private RestTemplate restTemplate; public UserControllerApi createControllerApi() { var apiClient = new ApiClient(restTemplate).setBasePath(this.userServiceApiUrl); diff --git a/src/main/java/de/caritas/cob/uploadservice/filter/HttpTenantFilter.java b/src/main/java/de/caritas/cob/uploadservice/filter/HttpTenantFilter.java index 698153c..9599789 100644 --- a/src/main/java/de/caritas/cob/uploadservice/filter/HttpTenantFilter.java +++ b/src/main/java/de/caritas/cob/uploadservice/filter/HttpTenantFilter.java @@ -1,16 +1,15 @@ package de.caritas.cob.uploadservice.filter; import de.caritas.cob.uploadservice.api.tenant.TenantContext; -import de.caritas.cob.uploadservice.api.tenant.TenantResolver; import de.caritas.cob.uploadservice.api.tenant.TenantResolverService; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; @@ -18,10 +17,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; - -/** - * Sets tenantId for current thread needed for tenant feature. - */ +/** Sets tenantId for current thread needed for tenant feature. */ @Component @ConditionalOnExpression("${multitenancy.enabled:true}") @RequiredArgsConstructor @@ -36,8 +32,9 @@ public class HttpTenantFilter extends OncePerRequestFilter { new DefaultRequiresTenantFilterMatcher(); @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, - FilterChain filterChain) throws ServletException, IOException { + protected void doFilterInternal( + HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { if (requiresTenantFilterMatcher.matches(request)) { log.debug("Trying to resolve tenant for request coming from URI {}", request.getRequestURI()); Long tenantId = tenantResolverService.resolve(request); @@ -54,6 +51,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse } class DefaultRequiresTenantFilterMatcher implements RequestMatcher { + @Override public boolean matches(HttpServletRequest request) { @@ -66,4 +64,4 @@ private boolean belongsToWhitelist(HttpServletRequest request, List tena .anyMatch(request.getRequestURI().toLowerCase()::contains); } } -} \ No newline at end of file +} diff --git a/src/main/java/de/caritas/cob/uploadservice/filter/StatelessCsrfFilter.java b/src/main/java/de/caritas/cob/uploadservice/filter/StatelessCsrfFilter.java index e2156e4..73128d8 100644 --- a/src/main/java/de/caritas/cob/uploadservice/filter/StatelessCsrfFilter.java +++ b/src/main/java/de/caritas/cob/uploadservice/filter/StatelessCsrfFilter.java @@ -1,16 +1,16 @@ package de.caritas.cob.uploadservice.filter; -import static de.caritas.cob.uploadservice.config.SpringFoxConfig.WHITE_LIST; import static org.apache.commons.lang3.StringUtils.isNotBlank; +import de.caritas.cob.uploadservice.config.SecurityConfig; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Arrays; import java.util.regex.Pattern; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.springframework.security.access.AccessDeniedException; @@ -19,9 +19,7 @@ import org.springframework.security.web.util.matcher.RequestMatcher; import org.springframework.web.filter.OncePerRequestFilter; -/** - * This custom filter checks CSRF cookie and header token for equality - */ +/** This custom filter checks CSRF cookie and header token for equality */ public class StatelessCsrfFilter extends OncePerRequestFilter { private final RequestMatcher requireCsrfProtectionMatcher; @@ -29,8 +27,8 @@ public class StatelessCsrfFilter extends OncePerRequestFilter { private final String csrfCookieProperty; private final String csrfHeaderProperty; - public StatelessCsrfFilter(String cookieProperty, String headerProperty, - String csrfWhitelistHeaderProperty) { + public StatelessCsrfFilter( + String cookieProperty, String headerProperty, String csrfWhitelistHeaderProperty) { this.csrfCookieProperty = cookieProperty; this.csrfHeaderProperty = headerProperty; this.requireCsrfProtectionMatcher = new DefaultRequiresCsrfMatcher(csrfWhitelistHeaderProperty); @@ -75,7 +73,7 @@ public boolean matches(HttpServletRequest request) { } private boolean isWhiteListUrl(HttpServletRequest request) { - return Arrays.asList(WHITE_LIST).parallelStream() + return Arrays.asList(SecurityConfig.WHITE_LIST).parallelStream() .anyMatch(request.getRequestURI().toLowerCase()::contains); } diff --git a/src/main/java/de/caritas/cob/uploadservice/filter/SubdomainExtractor.java b/src/main/java/de/caritas/cob/uploadservice/filter/SubdomainExtractor.java index 58cc196..74a6760 100644 --- a/src/main/java/de/caritas/cob/uploadservice/filter/SubdomainExtractor.java +++ b/src/main/java/de/caritas/cob/uploadservice/filter/SubdomainExtractor.java @@ -1,13 +1,12 @@ package de.caritas.cob.uploadservice.filter; - import static java.util.Optional.empty; import static java.util.Optional.of; import com.google.common.net.InternetDomainName; import de.caritas.cob.uploadservice.api.service.helper.HttpUrlUtils; +import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -35,4 +34,3 @@ public Optional getSubdomain(String url) { return of(domain.parts().get(0)); } } - diff --git a/src/main/java/de/caritas/cob/uploadservice/media/MimeTypeDetector.java b/src/main/java/de/caritas/cob/uploadservice/media/MimeTypeDetector.java index 6910258..4fb0c97 100644 --- a/src/main/java/de/caritas/cob/uploadservice/media/MimeTypeDetector.java +++ b/src/main/java/de/caritas/cob/uploadservice/media/MimeTypeDetector.java @@ -6,5 +6,4 @@ public interface MimeTypeDetector { Optional detect(InputStream input); - } diff --git a/src/main/java/de/caritas/cob/uploadservice/scheduler/RocketChatCredentialsHelperScheduler.java b/src/main/java/de/caritas/cob/uploadservice/scheduler/RocketChatCredentialsHelperScheduler.java index 326b210..149c34a 100644 --- a/src/main/java/de/caritas/cob/uploadservice/scheduler/RocketChatCredentialsHelperScheduler.java +++ b/src/main/java/de/caritas/cob/uploadservice/scheduler/RocketChatCredentialsHelperScheduler.java @@ -4,7 +4,7 @@ import de.caritas.cob.uploadservice.api.exception.httpresponses.InternalServerErrorException; import de.caritas.cob.uploadservice.api.service.LogService; import de.caritas.cob.uploadservice.api.service.helper.RocketChatCredentialsHelper; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Profile; diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index b635665..0c9752f 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -3,7 +3,6 @@ logging.level.root=INFO logging.level.org.springframework.web=DEBUG logging.level.org.hibernate=ERROR logging.level.de.caritas.cob.uploadservice.scheduler=DEBUG - # Keycloak keycloak.auth-server-url= keycloak.realm= @@ -15,7 +14,6 @@ keycloakService.techuser.id= keycloakService.admin.username= keycloakService.admin.password= keycloakService.admin.clientId=admin-cli - # Rocket.Chat rocket.systemuser.username= rocket.systemuser.password= diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index ea0f4ec..f626cc1 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -2,7 +2,6 @@ logging.level.root=INFO logging.level.org.springframework.web=INFO logging.level.org.hibernate=ERROR - # Keycloak keycloak.auth-server-url= keycloak.realm= diff --git a/src/main/resources/application-testing.properties b/src/main/resources/application-testing.properties index 5718586..8beb046 100644 --- a/src/main/resources/application-testing.properties +++ b/src/main/resources/application-testing.properties @@ -1,10 +1,8 @@ # Testing profile for unit tests spring.main.allow-bean-definition-overriding=true - # Logging: SLF4J (via Lombok) logging.level.root=INFO logging.level.org.springframework.web=DEBUG - # Keycloak keycloak.auth-server-url= keycloak.realm= @@ -29,14 +27,12 @@ user.service.api.liveproxy.url=: spring.liquibase.enabled=false spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 -spring.datasource.schema=classpath*:database/UploadDatabase.sql +spring.sql.init.schema-locations=classpath*:database/UploadDatabase.sql spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect spring.jpa.open-in-view=false spring.jpa.hibernate.ddl-auto=none spring.data.jpa.repositories.bootstrap-mode=default - upload.file.perday.limit=7 - # Statistics statistics.enabled=true spring.mongodb.embedded.version=3.5.5 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d34afcc..4195331 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,8 +5,8 @@ spring.profiles.active=@activeSpringProfile@ spring.main.allow-bean-definition-overriding=true # General app settings server.port=8080 -spring.mvc.locale=de_DE -spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER +spring.web.locale=de_DE +spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER spring.jackson.time-zone=Europe/Berlin service.encryption.appkey= # Logging: SLF4J (via Lombok) @@ -77,34 +77,33 @@ spring.liquibase.change-log=classpath:db/changelog/uploadservice-local-master.xm spring.liquibase.user=root spring.liquibase.password=root spring.liquibase.default-schema=uploadservice - # RabbitMQ spring.rabbitmq.host=rabbitmq spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=admin - # Statistics statistics.enabled=false statistics.rabbitmq.exchange.name=statistics.topic - # MongoDB mongodb.uri=mongodb://:@mongodb:27017/rocketchat?retryWrites=false - # MIME type whitelist for file upload. Supports png, jpeg, doc, docx and pdf. mime-type-whitelist={'image/png','image/jpeg','application/msword','application/vnd.openxmlformats-officedocument.wordprocessingml.document','application/pdf','application/x-tika-ooxml'} cache.tenant.configuration.maxEntriesLocalHeap=100 cache.tenant.configuration.eternal=false cache.tenant.configuration.timeToIdleSeconds=0 cache.tenant.configuration.timeToLiveSeconds=86400 - multitenancy.enabled=false tenant.service.api.url= feature.multitenancy.with.single.domain.enabled=false - management.endpoint.health.enabled=true management.endpoint.health.show-details=never management.endpoints.web.exposure.include=health -management.health.probes.enabled=true +management.endpoint.health.probes.enabled=true management.metrics.mongo.command.enabled=false -management.metrics.mongo.connectionpool.enabled=false \ No newline at end of file +management.metrics.mongo.connectionpool.enabled=false + +spring.security.oauth2.resourceserver.jwt.issuer-uri=https://localhost/auth/realms/onlineberatung +spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://localhost/auth/realms/onlineberatung/protocol/openid-connect/certs +spring.jwt.auth.converter.resource-id: app +spring.jwt.auth.converter.principal-attribute: preferred_username \ No newline at end of file diff --git a/src/main/resources/db/changelog/changeset/0001_initsql/initSql.xml b/src/main/resources/db/changelog/changeset/0001_initsql/initSql.xml index e23426f..aaaa807 100644 --- a/src/main/resources/db/changelog/changeset/0001_initsql/initSql.xml +++ b/src/main/resources/db/changelog/changeset/0001_initsql/initSql.xml @@ -1,9 +1,11 @@ - - - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + + + + + + diff --git a/src/main/resources/db/changelog/changeset/0002_alter_upload_by_user_add_session_id/0002_changeSet.xml b/src/main/resources/db/changelog/changeset/0002_alter_upload_by_user_add_session_id/0002_changeSet.xml index 8cf6c8a..ee4871e 100644 --- a/src/main/resources/db/changelog/changeset/0002_alter_upload_by_user_add_session_id/0002_changeSet.xml +++ b/src/main/resources/db/changelog/changeset/0002_alter_upload_by_user_add_session_id/0002_changeSet.xml @@ -1,13 +1,15 @@ - - - - - - - + + + + + + + diff --git a/src/main/resources/db/changelog/uploadservice-dev-master.xml b/src/main/resources/db/changelog/uploadservice-dev-master.xml index 0c844fa..c33c35b 100644 --- a/src/main/resources/db/changelog/uploadservice-dev-master.xml +++ b/src/main/resources/db/changelog/uploadservice-dev-master.xml @@ -1,12 +1,12 @@ - + - - - - + + + + diff --git a/src/main/resources/db/changelog/uploadservice-local-master.xml b/src/main/resources/db/changelog/uploadservice-local-master.xml index c47e7de..c33c35b 100644 --- a/src/main/resources/db/changelog/uploadservice-local-master.xml +++ b/src/main/resources/db/changelog/uploadservice-local-master.xml @@ -1,12 +1,12 @@ - + - - - + + + diff --git a/src/main/resources/db/changelog/uploadservice-prod-master.xml b/src/main/resources/db/changelog/uploadservice-prod-master.xml index 97128ee..bf4e5d0 100644 --- a/src/main/resources/db/changelog/uploadservice-prod-master.xml +++ b/src/main/resources/db/changelog/uploadservice-prod-master.xml @@ -1,4 +1,4 @@ - + + roles = - Sets.newSet( - UserRole.USER.getValue(), - UserRole.CONSULTANT.getValue(), - UserRole.PEER_CONSULTANT.getValue(), - UserRole.ANONYMOUS.getValue()); + Stream.of(UserRole.values()).map(UserRole::getValue).collect(Collectors.toSet()); @Test - public void roleAuthorizationAuthorityMapper_Should_GrantCorrectAuthorities() { - - Principal principal = mock(Principal.class); - RefreshableKeycloakSecurityContext securityContext = - mock(RefreshableKeycloakSecurityContext.class); - KeycloakAccount account = new SimpleKeycloakAccount(principal, roles, securityContext); - - KeycloakAuthenticationToken token = new KeycloakAuthenticationToken(account, false); + void roleAuthorizationAuthorityMapper_Should_GrantCorrectAuthorities() { RoleAuthorizationAuthorityMapper roleAuthorizationAuthorityMapper = new RoleAuthorizationAuthorityMapper(); - provider.setGrantedAuthoritiesMapper(roleAuthorizationAuthorityMapper); - Authentication result = provider.authenticate(token); + var result = roleAuthorizationAuthorityMapper.mapAuthorities(roles); Set expectedGrantendAuthorities = new HashSet<>(); - roles.forEach(roleName -> { - expectedGrantendAuthorities.addAll(Authority - .getAuthoritiesByUserRole(UserRole.getRoleByValue(roleName).get()).stream() - .map(SimpleGrantedAuthority::new).collect(Collectors.toSet())); - }); - - assertThat(expectedGrantendAuthorities, containsInAnyOrder(result.getAuthorities().toArray())); + roles.forEach( + roleName -> { + expectedGrantendAuthorities.addAll( + Authority.getAuthoritiesByUserRole(UserRole.getRoleByValue(roleName).get()).stream() + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toSet())); + }); + + assertThat(expectedGrantendAuthorities).isEqualTo(result); } } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/controller/ActuatorControllerIT.java b/src/test/java/de/caritas/cob/uploadservice/api/controller/ActuatorControllerIT.java index 657f4e2..975b2ea 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/controller/ActuatorControllerIT.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/controller/ActuatorControllerIT.java @@ -1,6 +1,6 @@ package de.caritas.cob.uploadservice.api.controller; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON; import static org.hamcrest.Matchers.is; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; diff --git a/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerAuthorizationTestIT.java b/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerAuthorizationTestIT.java index fdbc05d..764e343 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerAuthorizationTestIT.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerAuthorizationTestIT.java @@ -20,10 +20,9 @@ import de.caritas.cob.uploadservice.api.facade.UploadFacade; import de.caritas.cob.uploadservice.api.service.EncryptionService; import de.caritas.cob.uploadservice.api.service.RocketChatService; -import javax.servlet.http.Cookie; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import jakarta.servlet.http.Cookie; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; @@ -34,31 +33,25 @@ import org.springframework.mock.web.MockMultipartFile; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; -@RunWith(SpringRunner.class) @TestPropertySource(properties = "spring.profiles.active=testing") @SpringBootTest @AutoConfigureMockMvc @AutoConfigureTestDatabase(replace = Replace.ANY) public class UploadControllerAuthorizationTestIT { - @Autowired - private MockMvc mvc; + @Autowired private MockMvc mvc; - @MockBean - private RocketChatService rocketChatService; + @MockBean private RocketChatService rocketChatService; - @MockBean - private EncryptionService encryptionService; + @MockBean private EncryptionService encryptionService; - @MockBean - private UploadFacade uploadFacade; + @MockBean private UploadFacade uploadFacade; private Cookie csrfCookie; - @Before + @BeforeEach public void setUp() { csrfCookie = new Cookie(CSRF_COOKIE, CSRF_VALUE); } @@ -68,11 +61,11 @@ public void updateKey_Should_ReturnUnauthorizedAndCallNoMethods_WhenNoKeycloakAu throws Exception { mvc.perform( - post(PATH_UPDATE_KEY) - .cookie(csrfCookie) - .header(CSRF_HEADER, CSRF_VALUE) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) + post(PATH_UPDATE_KEY) + .cookie(csrfCookie) + .header(CSRF_HEADER, CSRF_VALUE) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isUnauthorized()); verifyNoMoreInteractions(encryptionService); @@ -84,11 +77,11 @@ public void updateKey_Should_ReturnForbiddenAndCallNoMethods_WhenNoTechnicalDefa throws Exception { mvc.perform( - post(PATH_UPDATE_KEY) - .cookie(csrfCookie) - .header(CSRF_HEADER, CSRF_VALUE) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) + post(PATH_UPDATE_KEY) + .cookie(csrfCookie) + .header(CSRF_HEADER, CSRF_VALUE) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isForbidden()); verifyNoMoreInteractions(encryptionService); @@ -99,24 +92,25 @@ public void updateKey_Should_ReturnForbiddenAndCallNoMethods_WhenNoTechnicalDefa public void updateKey_Should_ReturnForbiddenAndCallNoMethods_WhenNoCsrfTokens() throws Exception { mvc.perform( - post(PATH_UPDATE_KEY) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) + post(PATH_UPDATE_KEY) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isForbidden()); verifyNoMoreInteractions(encryptionService); } @Test - public void uploadFileToRoom_Should_ReturnUnauthorizedAndCallNoMethods_WhenNoKeycloakAuthorization() - throws Exception { + public void + uploadFileToRoom_Should_ReturnUnauthorizedAndCallNoMethods_WhenNoKeycloakAuthorization() + throws Exception { mvc.perform( - post(PATH_UPLOAD_FILE_TO_ROOM + "/" + RC_ROOM_ID) - .cookie(csrfCookie) - .header(CSRF_HEADER, CSRF_VALUE) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) + post(PATH_UPLOAD_FILE_TO_ROOM + "/" + RC_ROOM_ID) + .cookie(csrfCookie) + .header(CSRF_HEADER, CSRF_VALUE) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isUnauthorized()); verifyNoMoreInteractions(rocketChatService); @@ -125,15 +119,16 @@ public void uploadFileToRoom_Should_ReturnUnauthorizedAndCallNoMethods_WhenNoKey @Test @WithMockUser - public void uploadFileToRoom_Should_ReturnForbiddenAndCallNoMethods_WhenNoUserOrConsultantAuthority() - throws Exception { + public void + uploadFileToRoom_Should_ReturnForbiddenAndCallNoMethods_WhenNoUserOrConsultantAuthority() + throws Exception { mvc.perform( - post(PATH_UPLOAD_FILE_TO_ROOM + "/" + RC_ROOM_ID) - .cookie(csrfCookie) - .header(CSRF_HEADER, CSRF_VALUE) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) + post(PATH_UPLOAD_FILE_TO_ROOM + "/" + RC_ROOM_ID) + .cookie(csrfCookie) + .header(CSRF_HEADER, CSRF_VALUE) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isForbidden()); verifyNoMoreInteractions(rocketChatService); @@ -146,9 +141,9 @@ public void uploadFileToRoom_Should_ReturnForbiddenAndCallNoMethods_WhenNoCsrfTo throws Exception { mvc.perform( - post(PATH_UPLOAD_FILE_TO_ROOM + "/" + RC_ROOM_ID) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) + post(PATH_UPLOAD_FILE_TO_ROOM + "/" + RC_ROOM_ID) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isForbidden()); verifyNoMoreInteractions(rocketChatService); @@ -156,15 +151,16 @@ public void uploadFileToRoom_Should_ReturnForbiddenAndCallNoMethods_WhenNoCsrfTo } @Test - public void uploadFileToFeedbackRoom_Should_Return401AndCallNoMethods_WhenNoKeycloakAuthorization() - throws Exception { + public void + uploadFileToFeedbackRoom_Should_Return401AndCallNoMethods_WhenNoKeycloakAuthorization() + throws Exception { mvc.perform( - post(PATH_UPLOAD_FILE_TO_FEEDBACK_ROOM + "/" + RC_ROOM_ID) - .cookie(csrfCookie) - .header(CSRF_HEADER, CSRF_VALUE) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) + post(PATH_UPLOAD_FILE_TO_FEEDBACK_ROOM + "/" + RC_ROOM_ID) + .cookie(csrfCookie) + .header(CSRF_HEADER, CSRF_VALUE) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isUnauthorized()); verifyNoMoreInteractions(rocketChatService); @@ -173,15 +169,16 @@ public void uploadFileToFeedbackRoom_Should_Return401AndCallNoMethods_WhenNoKeyc @Test @WithMockUser - public void uploadFileToFeedbackRoom_Should_Return403AndCallNoMethods_WhenNoUserOrConsultantAuthority() - throws Exception { + public void + uploadFileToFeedbackRoom_Should_Return403AndCallNoMethods_WhenNoUserOrConsultantAuthority() + throws Exception { mvc.perform( - post(PATH_UPLOAD_FILE_TO_FEEDBACK_ROOM + "/" + RC_ROOM_ID) - .cookie(csrfCookie) - .header(CSRF_HEADER, CSRF_VALUE) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) + post(PATH_UPLOAD_FILE_TO_FEEDBACK_ROOM + "/" + RC_ROOM_ID) + .cookie(csrfCookie) + .header(CSRF_HEADER, CSRF_VALUE) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isForbidden()); verifyNoMoreInteractions(rocketChatService); @@ -194,9 +191,9 @@ public void uploadFileToFeedbackRoom_Should_ReturnForbiddenAndCallNoMethods_When throws Exception { mvc.perform( - post(PATH_UPLOAD_FILE_TO_FEEDBACK_ROOM + "/" + RC_ROOM_ID) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) + post(PATH_UPLOAD_FILE_TO_FEEDBACK_ROOM + "/" + RC_ROOM_ID) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isForbidden()); verifyNoMoreInteractions(rocketChatService); @@ -205,22 +202,20 @@ public void uploadFileToFeedbackRoom_Should_ReturnForbiddenAndCallNoMethods_When @Test @WithMockUser(authorities = {AuthorityValue.ANONYMOUS_DEFAULT}) - public void uploadFileToRoom_Should_ReturnCreated_When_AnonymousAuthority() - throws Exception { - MockMultipartFile file = new MockMultipartFile("file", "filename", "text/plain", - "content".getBytes()); + public void uploadFileToRoom_Should_ReturnCreated_When_AnonymousAuthority() throws Exception { + MockMultipartFile file = + new MockMultipartFile("file", "filename", "text/plain", "content".getBytes()); mvc.perform( - multipart(PATH_UPLOAD_FILE_TO_ROOM + "/" + RC_ROOM_ID) - .file(file) - .param("sendNotification", "true") - .cookie(csrfCookie) - .header(CSRF_HEADER, CSRF_VALUE) - .header(RC_TOKEN_HEADER_PARAMETER_NAME, RC_TOKEN) - .header(RC_USER_ID_HEADER_PARAMETER_NAME, RC_USER_ID) - .contentType(MediaType.MULTIPART_FORM_DATA) - .accept(MediaType.APPLICATION_JSON)) + multipart(PATH_UPLOAD_FILE_TO_ROOM + "/" + RC_ROOM_ID) + .file(file) + .param("sendNotification", "true") + .cookie(csrfCookie) + .header(CSRF_HEADER, CSRF_VALUE) + .header(RC_TOKEN_HEADER_PARAMETER_NAME, RC_TOKEN) + .header(RC_USER_ID_HEADER_PARAMETER_NAME, RC_USER_ID) + .contentType(MediaType.MULTIPART_FORM_DATA) + .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isCreated()); } - } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerTest.java b/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerTest.java index 6616c39..1839ae4 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerTest.java @@ -4,30 +4,27 @@ import static de.caritas.cob.uploadservice.helper.MethodAndParameterConstants.UPLOAD_FILE_TO_FEEDBACK_ROOM_METHOD_PARAMS; import static de.caritas.cob.uploadservice.helper.MethodAndParameterConstants.UPLOAD_FILE_TO_ROOM_METHOD_NAME; import static de.caritas.cob.uploadservice.helper.MethodAndParameterConstants.UPLOAD_FILE_TO_ROOM_METHOD_PARAMS; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; import de.caritas.cob.uploadservice.api.aspect.TempCleanup; import de.caritas.cob.uploadservice.api.facade.UploadFacade; import de.caritas.cob.uploadservice.api.service.EncryptionService; import java.lang.reflect.Method; -import lombok.NonNull; -import org.junit.Test; -import org.junit.runner.RunWith; +import java.util.Arrays; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class UploadControllerTest { - @InjectMocks - private UploadController uploadController; + @InjectMocks private UploadController uploadController; - @Mock - private UploadFacade uploadFacade; + @Mock private UploadFacade uploadFacade; - @Mock - private EncryptionService encryptionService; + @Mock private EncryptionService encryptionService; @Test public void test_Should_Fail_WhenMethodUploadFileToRoomDoesNotHaveTempCleanupAnnotation() @@ -46,9 +43,20 @@ public void test_Should_Fail_WhenMethodUploadFileToFeedbackRoomDoesNotHaveTempCl throws NoSuchMethodException { Class classToTest = uploadController.getClass(); + + System.out.println("Declared Methods: "); + for (Method method : classToTest.getDeclaredMethods()) { + System.out.println(method.getName()); + } + + for (Method method : classToTest.getMethods()) { + System.out.println(method.getName() + " -> " + Arrays.toString(method.getParameterTypes())); + } + Method methodToTest = classToTest.getMethod( UPLOAD_FILE_TO_FEEDBACK_ROOM_METHOD_NAME, UPLOAD_FILE_TO_FEEDBACK_ROOM_METHOD_PARAMS); + TempCleanup annotation = methodToTest.getAnnotation(TempCleanup.class); assertNotNull(annotation); diff --git a/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerTestIT.java b/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerTestIT.java index 822c7f1..82e841c 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerTestIT.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/controller/UploadControllerTestIT.java @@ -39,8 +39,7 @@ import de.caritas.cob.uploadservice.api.service.EncryptionService; import de.caritas.cob.uploadservice.api.service.LogService; import de.caritas.cob.uploadservice.api.service.RocketChatService; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -48,32 +47,24 @@ import org.springframework.http.MediaType; import org.springframework.mock.web.MockPart; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; -@RunWith(SpringRunner.class) @WebMvcTest(UploadController.class) @AutoConfigureMockMvc(addFilters = false) @TestPropertySource(properties = "spring.profiles.active=testing") public class UploadControllerTestIT { - @Autowired - private MockMvc mvc; + @Autowired private MockMvc mvc; - @MockBean - private RocketChatService rocketChatService; + @MockBean private RocketChatService rocketChatService; - @MockBean - private EncryptionService encryptionService; + @MockBean private EncryptionService encryptionService; - @MockBean - private LogService logService; + @MockBean private LogService logService; - @MockBean - private UploadFacade uploadFacade; + @MockBean private UploadFacade uploadFacade; - @MockBean - private RoleAuthorizationAuthorityMapper roleAuthorizationAuthorityMapper; + @MockBean private RoleAuthorizationAuthorityMapper roleAuthorizationAuthorityMapper; @Test public void uploadFileToRoom_Should_ReturnNotFound_WhenRoomIdIsMissing() throws Exception { @@ -276,8 +267,13 @@ public void uploadFileToFeedbackRoom_Should_ReturnOk_When_notRequiredParamsAreMi public void uploadFileToRoom_Should_ReturnForbiddenWithCustomHeader_When_quotaLimitIsReached() throws Exception { doThrow(new QuotaReachedException(LogService::logWarning)) - .when(this.uploadFacade).uploadFileToRoom(any(RocketChatCredentials.class), - any(RocketChatUploadParameter.class), anyBoolean(), nullable(String.class), nullable(String.class)); + .when(this.uploadFacade) + .uploadFileToRoom( + any(RocketChatCredentials.class), + any(RocketChatUploadParameter.class), + anyBoolean(), + nullable(String.class), + nullable(String.class)); MockPart fileToUpload = new MockPart(FORM_PARAM_FILE, "fileToUpload", "content".getBytes()); @@ -298,9 +294,14 @@ public void uploadFileToRoom_Should_ReturnForbiddenWithCustomHeader_When_quotaLi @Test public void uploadFileToRoom_should_return_unsupported_media_type_on_InvalidFileTypeException() throws Exception { - doThrow(InvalidFileTypeException.class).when(uploadFacade) - .uploadFileToRoom(any(RocketChatCredentials.class), any(RocketChatUploadParameter.class), - anyBoolean(), nullable(String.class), nullable(String.class)); + doThrow(InvalidFileTypeException.class) + .when(uploadFacade) + .uploadFileToRoom( + any(RocketChatCredentials.class), + any(RocketChatUploadParameter.class), + anyBoolean(), + nullable(String.class), + nullable(String.class)); MockPart fileToUpload = new MockPart(FORM_PARAM_FILE, "fileToUpload", "content".getBytes()); mvc.perform( @@ -317,11 +318,17 @@ public void uploadFileToRoom_should_return_unsupported_media_type_on_InvalidFile } @Test - public void uploadFileToFeedbackRoom_should_return_unsupported_media_type_on_InvalidFileTypeException() - throws Exception { - doThrow(InvalidFileTypeException.class).when(uploadFacade) - .uploadFileToFeedbackRoom(any(RocketChatCredentials.class), - any(RocketChatUploadParameter.class), anyBoolean(), nullable(String.class), nullable(String.class)); + public void + uploadFileToFeedbackRoom_should_return_unsupported_media_type_on_InvalidFileTypeException() + throws Exception { + doThrow(InvalidFileTypeException.class) + .when(uploadFacade) + .uploadFileToFeedbackRoom( + any(RocketChatCredentials.class), + any(RocketChatUploadParameter.class), + anyBoolean(), + nullable(String.class), + nullable(String.class)); MockPart fileToUpload = new MockPart(FORM_PARAM_FILE, "fileToUpload", "content".getBytes()); mvc.perform( diff --git a/src/test/java/de/caritas/cob/uploadservice/api/facade/EmailNotificationFacadeTest.java b/src/test/java/de/caritas/cob/uploadservice/api/facade/EmailNotificationFacadeTest.java index 403cce0..3be6a47 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/facade/EmailNotificationFacadeTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/facade/EmailNotificationFacadeTest.java @@ -9,15 +9,15 @@ import de.caritas.cob.uploadservice.api.helper.EmailNotificationHelper; import de.caritas.cob.uploadservice.api.tenant.TenantContext; import java.util.Optional; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class EmailNotificationFacadeTest { private static final String FIELD_NAME_NEW_MESSAGE_NOTIFICATION = @@ -34,10 +34,14 @@ public class EmailNotificationFacadeTest { @Mock private AuthenticatedUser authenticatedUser; @InjectMocks private EmailNotificationFacade emailNotificationFacade; - @Before + @BeforeEach public void setup() throws NoSuchFieldException, SecurityException { - ReflectionTestUtils.setField(emailNotificationFacade, FIELD_NAME_NEW_MESSAGE_NOTIFICATION, NOTIFICATION_API_URL); - ReflectionTestUtils.setField(emailNotificationFacade, FIELD_NAME_NEW_FEEDBACK_MESSAGE_NOTIFICATION, FEEDBACK_NOTIFICATION_API_URL); + ReflectionTestUtils.setField( + emailNotificationFacade, FIELD_NAME_NEW_MESSAGE_NOTIFICATION, NOTIFICATION_API_URL); + ReflectionTestUtils.setField( + emailNotificationFacade, + FIELD_NAME_NEW_FEEDBACK_MESSAGE_NOTIFICATION, + FEEDBACK_NOTIFICATION_API_URL); } @Test @@ -49,7 +53,9 @@ public void sendEmailNotification_Should_PassSendNewMessageNotificationUrl2Notif verify(emailNotificationHelper, times(1)) .sendEmailNotificationViaUserService( - RC_GROUP_ID, KEYCLOAK_ACCESS_TOKEN, Optional.ofNullable((TenantContext.getCurrentTenant()))); + RC_GROUP_ID, + KEYCLOAK_ACCESS_TOKEN, + Optional.ofNullable((TenantContext.getCurrentTenant()))); } @Test @@ -62,6 +68,8 @@ public void sendEmailNotification_Should_PassSendNewMessageNotificationUrl2Notif verify(emailNotificationHelper, times(1)) .sendEmailFeedbackNotificationViaUserService( - RC_GROUP_ID, KEYCLOAK_ACCESS_TOKEN, Optional.ofNullable(TenantContext.getCurrentTenant())); + RC_GROUP_ID, + KEYCLOAK_ACCESS_TOKEN, + Optional.ofNullable(TenantContext.getCurrentTenant())); } } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/facade/TestMultipartFile.java b/src/test/java/de/caritas/cob/uploadservice/api/facade/TestMultipartFile.java index b98d31f..22fb0b0 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/facade/TestMultipartFile.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/facade/TestMultipartFile.java @@ -44,7 +44,5 @@ public InputStream getInputStream() throws IOException { } @Override - public void transferTo(File file) throws IOException, IllegalStateException { - - } + public void transferTo(File file) throws IOException, IllegalStateException {} } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/facade/UploadFacadeTest.java b/src/test/java/de/caritas/cob/uploadservice/api/facade/UploadFacadeTest.java index 5fb6bd7..a61fd45 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/facade/UploadFacadeTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/facade/UploadFacadeTest.java @@ -3,6 +3,7 @@ import static de.caritas.cob.uploadservice.helper.TestConstants.CONSULTANT_ID; import static de.caritas.cob.uploadservice.helper.TestConstants.RC_ROOM_ID; import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -31,64 +32,49 @@ import java.util.Objects; import org.apache.commons.collections4.SetUtils; import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class UploadFacadeTest { - @InjectMocks - UploadFacade uploadFacade; + @InjectMocks UploadFacade uploadFacade; - @Mock - RocketChatService rocketChatService; + @Mock RocketChatService rocketChatService; - @Mock - EmailNotificationFacade emailNotificationFacade; + @Mock EmailNotificationFacade emailNotificationFacade; - @Mock - RocketChatUploadParameterSanitizer rocketChatUploadParameterSanitizer; + @Mock RocketChatUploadParameterSanitizer rocketChatUploadParameterSanitizer; - @Mock - RocketChatUploadParameterEncrypter rocketChatUploadParameterEncrypter; + @Mock RocketChatUploadParameterEncrypter rocketChatUploadParameterEncrypter; - @Mock - private LiveEventNotificationService liveEventNotificationService; + @Mock private LiveEventNotificationService liveEventNotificationService; - @Mock - RocketChatCredentials rocketChatCredentials; + @Mock RocketChatCredentials rocketChatCredentials; - @Mock - RocketChatUploadParameter rocketChatUploadParameter; + @Mock RocketChatUploadParameter rocketChatUploadParameter; - @Mock - private UploadTrackingService uploadTrackingService; + @Mock private UploadTrackingService uploadTrackingService; - @Mock - private StatisticsService statisticsService; + @Mock private StatisticsService statisticsService; - @Mock - private AuthenticatedUser authenticatedUser; + @Mock private AuthenticatedUser authenticatedUser; - @Mock - private FileService fileService; + @Mock private FileService fileService; - @Mock - private MongoDbService mongoDbService; + @Mock private MongoDbService mongoDbService; private TestMultipartFile multipartFile; - /** - * Method: uploadFileToRoom - */ - @Before + /** Method: uploadFileToRoom */ + @BeforeEach public void setup() throws CustomCryptoException { when(rocketChatUploadParameter.getRoomId()).thenReturn(RC_ROOM_ID); when(rocketChatUploadParameterSanitizer.sanitize(rocketChatUploadParameter)) @@ -99,22 +85,22 @@ public void setup() throws CustomCryptoException { when(rocketChatUploadParameter.getFile()).thenReturn(multipartFile); when(authenticatedUser.getRoles()) .thenReturn(SetUtils.unmodifiableSet(UserRole.CONSULTANT.getValue())); - when(authenticatedUser.getUserId()) - .thenReturn(CONSULTANT_ID); + when(authenticatedUser.getUserId()).thenReturn(CONSULTANT_ID); } @Test public void uploadFileToRoom_Should_UseServicesCorrectly_WhenNoExceptionIsThrown() throws Exception { - uploadFacade.uploadFileToRoom(rocketChatCredentials, rocketChatUploadParameter, false, null, null); + uploadFacade.uploadFileToRoom( + rocketChatCredentials, rocketChatUploadParameter, false, null, null); verify(rocketChatUploadParameterSanitizer, times(1)).sanitize(rocketChatUploadParameter); verify(rocketChatUploadParameterEncrypter, times(1)).encrypt(rocketChatUploadParameter); - verify(rocketChatService, times(1)).roomsUpload(rocketChatCredentials, - rocketChatUploadParameter); - verify(rocketChatService, times(1)).markGroupAsReadForSystemUser( - rocketChatUploadParameter.getRoomId()); + verify(rocketChatService, times(1)) + .roomsUpload(rocketChatCredentials, rocketChatUploadParameter); + verify(rocketChatService, times(1)) + .markGroupAsReadForSystemUser(rocketChatUploadParameter.getRoomId()); verify(uploadTrackingService, times(1)).validateUploadLimit(any()); verify(uploadTrackingService, times(1)).trackUploadedFileForUser(any()); verify(fileService).verifyMimeType(multipartFile); @@ -123,7 +109,8 @@ public void uploadFileToRoom_Should_UseServicesCorrectly_WhenNoExceptionIsThrown @Test public void uploadFileToRoom_Should_sendEmailNotification_WhenParamIsTrue() { - uploadFacade.uploadFileToRoom(rocketChatCredentials, rocketChatUploadParameter, true, null, null); + uploadFacade.uploadFileToRoom( + rocketChatCredentials, rocketChatUploadParameter, true, null, null); verify(emailNotificationFacade, times(1)).sendEmailNotification(RC_ROOM_ID); } @@ -131,31 +118,34 @@ public void uploadFileToRoom_Should_sendEmailNotification_WhenParamIsTrue() { @Test public void uploadFileToRoom_Should_FireUploadFileStatisticsEvent() { - uploadFacade.uploadFileToRoom(rocketChatCredentials, rocketChatUploadParameter, true, null, null); + uploadFacade.uploadFileToRoom( + rocketChatCredentials, rocketChatUploadParameter, true, null, null); - verify(statisticsService, times(1)) - .fireEvent(any(CreateMessageStatisticsEvent.class)); + verify(statisticsService, times(1)).fireEvent(any(CreateMessageStatisticsEvent.class)); - ArgumentCaptor captor = ArgumentCaptor.forClass( - CreateMessageStatisticsEvent.class); + ArgumentCaptor captor = + ArgumentCaptor.forClass(CreateMessageStatisticsEvent.class); verify(statisticsService, times(1)).fireEvent(captor.capture()); - String userId = Objects.requireNonNull( - ReflectionTestUtils.getField(captor.getValue(), "userId")).toString(); + String userId = + Objects.requireNonNull(ReflectionTestUtils.getField(captor.getValue(), "userId")) + .toString(); assertThat(userId, Matchers.is(CONSULTANT_ID)); - String userRole = Objects.requireNonNull( - ReflectionTestUtils.getField(captor.getValue(), "userRole")).toString(); + String userRole = + Objects.requireNonNull(ReflectionTestUtils.getField(captor.getValue(), "userRole")) + .toString(); assertThat(userRole, Matchers.is(UserRole.CONSULTANT.toString())); - String rcGroupId = Objects.requireNonNull( - ReflectionTestUtils.getField(captor.getValue(), "rcGroupId")).toString(); + String rcGroupId = + Objects.requireNonNull(ReflectionTestUtils.getField(captor.getValue(), "rcGroupId")) + .toString(); assertThat(rcGroupId, Matchers.is(RC_ROOM_ID)); - } @Test public void uploadFileToRoom_Should_markGroupAsReadForSystemUser() throws RocketChatPostMarkGroupAsReadException { - uploadFacade.uploadFileToRoom(rocketChatCredentials, rocketChatUploadParameter, false, null, null); + uploadFacade.uploadFileToRoom( + rocketChatCredentials, rocketChatUploadParameter, false, null, null); verify(rocketChatService, times(1)).markGroupAsReadForSystemUser(RC_ROOM_ID); } @@ -163,7 +153,8 @@ public void uploadFileToRoom_Should_markGroupAsReadForSystemUser() @Test public void uploadFileToRoom_Should_uploadToRocketChat() { - uploadFacade.uploadFileToRoom(rocketChatCredentials, rocketChatUploadParameter, false, null, null); + uploadFacade.uploadFileToRoom( + rocketChatCredentials, rocketChatUploadParameter, false, null, null); verify(rocketChatService, times(1)) .roomsUpload( @@ -173,7 +164,8 @@ public void uploadFileToRoom_Should_uploadToRocketChat() { @Test public void uploadFileToRoom_Should_EncryptRocketChatParameters() throws CustomCryptoException { - uploadFacade.uploadFileToRoom(rocketChatCredentials, rocketChatUploadParameter, false, null, null); + uploadFacade.uploadFileToRoom( + rocketChatCredentials, rocketChatUploadParameter, false, null, null); verify(rocketChatUploadParameterEncrypter, times(1)).encrypt(rocketChatUploadParameter); } @@ -181,7 +173,8 @@ public void uploadFileToRoom_Should_EncryptRocketChatParameters() throws CustomC @Test public void uploadFileToRoom_Should_SanitizeRocketChatParameter() { - uploadFacade.uploadFileToRoom(rocketChatCredentials, rocketChatUploadParameter, false, null, null); + uploadFacade.uploadFileToRoom( + rocketChatCredentials, rocketChatUploadParameter, false, null, null); verify(rocketChatUploadParameterSanitizer, times(1)).sanitize(rocketChatUploadParameter); } @@ -189,35 +182,43 @@ public void uploadFileToRoom_Should_SanitizeRocketChatParameter() { @Test public void uploadFileToRoom_Should_sendLiveNotification_When_UploadSucceeds() { - uploadFacade.uploadFileToRoom(rocketChatCredentials, rocketChatUploadParameter, false, null, null); + uploadFacade.uploadFileToRoom( + rocketChatCredentials, rocketChatUploadParameter, false, null, null); verify(this.liveEventNotificationService, times(1)) .sendLiveEvent(eq(rocketChatUploadParameter.getRoomId()), any(), any()); } - @Test(expected = InternalServerErrorException.class) - public void uploadFileToRoom_Should_ThrowInternalServerErrorException_WhenCustomCryptoExceptionIsThrown() - throws Exception { - - when(rocketChatUploadParameterEncrypter.encrypt(any())) - .thenThrow(mock(CustomCryptoException.class)); - - uploadFacade.uploadFileToRoom(rocketChatCredentials, rocketChatUploadParameter, false, null, null); + @Test + public void + uploadFileToRoom_Should_ThrowInternalServerErrorException_WhenCustomCryptoExceptionIsThrown() { + assertThrows( + InternalServerErrorException.class, + () -> { + when(rocketChatUploadParameterEncrypter.encrypt(any())) + .thenThrow(mock(CustomCryptoException.class)); + + uploadFacade.uploadFileToRoom( + rocketChatCredentials, rocketChatUploadParameter, false, null, null); + }); } - @Test(expected = InternalServerErrorException.class) - public void uploadFileToRoom_Should_ThrowInternalServerErrorException_WheRocketChatPostMarkGroupAsReadExceptionIsThrown() - throws Exception { - - doThrow(mock(RocketChatPostMarkGroupAsReadException.class)).when(rocketChatService) - .markGroupAsReadForSystemUser(anyString()); - - uploadFacade.uploadFileToRoom(rocketChatCredentials, rocketChatUploadParameter, false, null, null); + @Test + public void + uploadFileToRoom_Should_ThrowInternalServerErrorException_WheRocketChatPostMarkGroupAsReadExceptionIsThrown() { + assertThrows( + InternalServerErrorException.class, + () -> { + doThrow(mock(RocketChatPostMarkGroupAsReadException.class)) + .when(rocketChatService) + .markGroupAsReadForSystemUser(anyString()); + + uploadFacade.uploadFileToRoom( + rocketChatCredentials, rocketChatUploadParameter, false, null, null); + }); } - /** - * Method: uploadFileToFeedbackRoom - */ + /** Method: uploadFileToFeedbackRoom */ @Test public void uploadFileToFeedbackRoom_Should_CallServicesCorrectly_WhenNoExceptionIsThrown() throws Exception { @@ -227,10 +228,10 @@ public void uploadFileToFeedbackRoom_Should_CallServicesCorrectly_WhenNoExceptio verify(rocketChatUploadParameterSanitizer, times(1)).sanitize(rocketChatUploadParameter); verify(rocketChatUploadParameterEncrypter, times(1)).encrypt(rocketChatUploadParameter); - verify(rocketChatService, times(1)).roomsUpload(rocketChatCredentials, - rocketChatUploadParameter); - verify(rocketChatService, times(1)).markGroupAsReadForSystemUser( - rocketChatUploadParameter.getRoomId()); + verify(rocketChatService, times(1)) + .roomsUpload(rocketChatCredentials, rocketChatUploadParameter); + verify(rocketChatService, times(1)) + .markGroupAsReadForSystemUser(rocketChatUploadParameter.getRoomId()); verify(uploadTrackingService, times(1)).validateUploadLimit(any()); verify(uploadTrackingService, times(1)).trackUploadedFileForUser(any()); verify(fileService).verifyMimeType(multipartFile); @@ -288,7 +289,8 @@ public void uploadFileToFeedbackRoom_Should_SanitizeRocketChatParameter() { @Test public void uploadFileToFeedbackRoom_Should_sendLiveNotification_When_UploadSucceeds() { - uploadFacade.uploadFileToFeedbackRoom(rocketChatCredentials, rocketChatUploadParameter, false, null, null); + uploadFacade.uploadFileToFeedbackRoom( + rocketChatCredentials, rocketChatUploadParameter, false, null, null); verify(this.liveEventNotificationService, times(1)) .sendLiveEvent(eq(rocketChatUploadParameter.getRoomId()), any(), any()); diff --git a/src/test/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUserHelperTest.java b/src/test/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUserHelperTest.java index 8796365..73a09e4 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUserHelperTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUserHelperTest.java @@ -5,11 +5,11 @@ import de.caritas.cob.uploadservice.api.authorization.UserRole; import org.apache.commons.collections4.SetUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class AuthenticatedUserHelperTest { @Test @@ -33,5 +33,4 @@ public void isConsultant_Should_ReturnFalse_IfAuthenticatedUserIsNotConsultant() assertThat(result, is(false)); } - } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUserTest.java b/src/test/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUserTest.java index d5992aa..5b3b6d4 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUserTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/helper/AuthenticatedUserTest.java @@ -1,36 +1,50 @@ package de.caritas.cob.uploadservice.api.helper; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; +import static org.junit.jupiter.api.Assertions.assertThrows; -@RunWith(MockitoJUnitRunner.class) +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) public class AuthenticatedUserTest { - @Test(expected = NullPointerException.class) - public void AuthenticatedUser_Should_ThrowNullPointerExceptionWhenArgumentsAreNull() - throws Exception { - new AuthenticatedUser(null, null, null, null, null); + @Test + public void AuthenticatedUser_Should_ThrowNullPointerExceptionWhenArgumentsAreNull() { + assertThrows( + NullPointerException.class, + () -> { + new AuthenticatedUser(null, null, null, null, null); + }); } - @Test(expected = NullPointerException.class) - public void AuthenticatedUser_Should_ThrowNullPointerExceptionWhenUserIdIsNull() - throws Exception { - AuthenticatedUser authenticatedUser = new AuthenticatedUser(); - authenticatedUser.setUserId(null); + @Test + public void AuthenticatedUser_Should_ThrowNullPointerExceptionWhenUserIdIsNull() { + assertThrows( + NullPointerException.class, + () -> { + AuthenticatedUser authenticatedUser = new AuthenticatedUser(); + authenticatedUser.setUserId(null); + }); } - @Test(expected = NullPointerException.class) - public void AuthenticatedUser_Should_ThrowNullPointerExceptionWhenUsernameIsNull() - throws Exception { - AuthenticatedUser authenticatedUser = new AuthenticatedUser(); - authenticatedUser.setUsername(null); + @Test + public void AuthenticatedUser_Should_ThrowNullPointerExceptionWhenUsernameIsNull() { + assertThrows( + NullPointerException.class, + () -> { + AuthenticatedUser authenticatedUser = new AuthenticatedUser(); + authenticatedUser.setUsername(null); + }); } - @Test(expected = NullPointerException.class) - public void AuthenticatedUser_Should_ThrowNullPointerExceptionWhenAccessTokenIsNull() - throws Exception { - AuthenticatedUser authenticatedUser = new AuthenticatedUser(); - authenticatedUser.setAccessToken(null); + @Test + public void AuthenticatedUser_Should_ThrowNullPointerExceptionWhenAccessTokenIsNull() { + assertThrows( + NullPointerException.class, + () -> { + AuthenticatedUser authenticatedUser = new AuthenticatedUser(); + authenticatedUser.setAccessToken(null); + }); } } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/helper/EmailNotificationHelperTest.java b/src/test/java/de/caritas/cob/uploadservice/api/helper/EmailNotificationHelperTest.java index 3cb8bf2..0f7b081 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/helper/EmailNotificationHelperTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/helper/EmailNotificationHelperTest.java @@ -7,9 +7,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.powermock.reflect.Whitebox.setInternalState; -import de.caritas.cob.uploadservice.api.service.LogService; import de.caritas.cob.uploadservice.api.service.TenantHeaderSupplier; import de.caritas.cob.uploadservice.api.service.helper.ServiceHelper; import de.caritas.cob.uploadservice.api.tenant.TenantContext; @@ -17,19 +15,19 @@ import de.caritas.cob.uploadservice.userservice.generated.web.UserControllerApi; import de.caritas.cob.uploadservice.userservice.generated.web.model.NewMessageNotificationDTO; import java.util.Optional; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.slf4j.Logger; import org.springframework.http.HttpHeaders; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class EmailNotificationHelperTest { private static final String RC_GROUP_ID = "fR2Rz7dmWmHdXE8uz"; @@ -37,29 +35,19 @@ public class EmailNotificationHelperTest { "http://caritas.local/service/user/mails/new"; private static final String ERROR = "error"; - @Mock - private RestTemplate restTemplate; - - @Mock - private UserControllerApi userControllerApi; - @Mock - private de.caritas.cob.uploadservice.userservice.generated.ApiClient apiClient; - @Mock - private ServiceHelper serviceHelper; - @Mock - private Logger logger; - @Mock - private TenantHeaderSupplier tenantHeaderSupplier; - - @Mock - private UserServiceApiControllerFactory userServiceApiControllerFactory; - @InjectMocks - private EmailNotificationHelper emailNotificationHelper; - - @Before - public void setup() { - setInternalState(LogService.class, "LOGGER", logger); - } + @Mock private RestTemplate restTemplate; + + @Mock private UserControllerApi userControllerApi; + @Mock private de.caritas.cob.uploadservice.userservice.generated.ApiClient apiClient; + @Mock private ServiceHelper serviceHelper; + @Mock private Logger logger; + @Mock private TenantHeaderSupplier tenantHeaderSupplier; + + @Mock private UserServiceApiControllerFactory userServiceApiControllerFactory; + @InjectMocks private EmailNotificationHelper emailNotificationHelper; + + @BeforeEach + public void setup() {} @Test public void sendEmailNotificationViaUserService_Should_LogException_OnError() @@ -68,16 +56,16 @@ public void sendEmailNotificationViaUserService_Should_LogException_OnError() // given RestClientException exception = new RestClientException(ERROR); when(userControllerApi.getApiClient()).thenReturn(apiClient); - when(serviceHelper.getKeycloakAndCsrfHttpHeaders(Mockito.anyString(), any())).thenReturn( - new HttpHeaders()); + when(serviceHelper.getKeycloakAndCsrfHttpHeaders(Mockito.anyString(), any())) + .thenReturn(new HttpHeaders()); when(userServiceApiControllerFactory.createControllerApi()).thenReturn(userControllerApi); - doThrow(exception).when(userControllerApi) + doThrow(exception) + .when(userControllerApi) .sendNewMessageNotification(Mockito.any(NewMessageNotificationDTO.class)); // when emailNotificationHelper.sendEmailNotificationViaUserService( - RC_GROUP_ID, KEYCLOAK_ACCESS_TOKEN, - Optional.ofNullable(TenantContext.getCurrentTenant())); + RC_GROUP_ID, KEYCLOAK_ACCESS_TOKEN, Optional.ofNullable(TenantContext.getCurrentTenant())); // then verify(logger, times(1)).error(anyString(), anyString()); @@ -89,15 +77,14 @@ public void sendEmailNotificationViaUserService_Should_CallUserServiceWithGiveUr HttpHeaders headers = new HttpHeaders(); headers.add("authorization", "Bearer XYZ"); - when(serviceHelper.getKeycloakAndCsrfHttpHeaders(Mockito.anyString(), any())).thenReturn( - headers); + when(serviceHelper.getKeycloakAndCsrfHttpHeaders(Mockito.anyString(), any())) + .thenReturn(headers); when(userServiceApiControllerFactory.createControllerApi()).thenReturn(userControllerApi); when(userControllerApi.getApiClient()).thenReturn(apiClient); // when emailNotificationHelper.sendEmailNotificationViaUserService( - RC_GROUP_ID, KEYCLOAK_ACCESS_TOKEN, - Optional.ofNullable(TenantContext.getCurrentTenant())); + RC_GROUP_ID, KEYCLOAK_ACCESS_TOKEN, Optional.ofNullable(TenantContext.getCurrentTenant())); // then verify(userControllerApi, times(1)) diff --git a/src/test/java/de/caritas/cob/uploadservice/api/helper/FileSanitizerTest.java b/src/test/java/de/caritas/cob/uploadservice/api/helper/FileSanitizerTest.java index 89776d6..3c123a8 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/helper/FileSanitizerTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/helper/FileSanitizerTest.java @@ -6,13 +6,13 @@ import static de.caritas.cob.uploadservice.helper.TestConstants.FILE_NAME_SANITIZED_WITH_SPACES; import static de.caritas.cob.uploadservice.helper.TestConstants.FILE_NAME_UNSANITIZED; import static de.caritas.cob.uploadservice.helper.TestConstants.FILE_NAME_UNSANITIZED_WITH_SPACES; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class FileSanitizerTest { @Test @@ -22,7 +22,8 @@ public void sanitizeFileName_Should_ReturnSanitizedFileName() { @Test public void sanitizeFileName_Should_RemoveLeadingAndTrailingSpacesFromFilename() { - assertEquals(FILE_NAME_SANITIZED_WITH_SPACES, + assertEquals( + FILE_NAME_SANITIZED_WITH_SPACES, FileSanitizer.sanitizeFileName(FILE_NAME_UNSANITIZED_WITH_SPACES)); } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/helper/HelperTest.java b/src/test/java/de/caritas/cob/uploadservice/api/helper/HelperTest.java index 5c55143..cec4004 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/helper/HelperTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/helper/HelperTest.java @@ -1,12 +1,12 @@ package de.caritas.cob.uploadservice.api.helper; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class HelperTest { private static String TEXT = "Lorem Ipsum"; diff --git a/src/test/java/de/caritas/cob/uploadservice/api/helper/JsonHelperTest.java b/src/test/java/de/caritas/cob/uploadservice/api/helper/JsonHelperTest.java index aa099ae..9d4e321 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/helper/JsonHelperTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/helper/JsonHelperTest.java @@ -15,7 +15,7 @@ import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.util.Optional; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; public class JsonHelperTest { @@ -35,8 +35,8 @@ public void serializeWithOffsetDateTimeAsString_Should_returnOptionalWithSeriali .timestamp(offsetDateTime); Optional result = - JsonHelper.serializeWithOffsetDateTimeAsString(createMessageStatisticsEventMessage, - LogService::logStatisticsEventError); + JsonHelper.serializeWithOffsetDateTimeAsString( + createMessageStatisticsEventMessage, LogService::logStatisticsEventError); assertThat(result.isPresent(), is(true)); @@ -61,7 +61,6 @@ public void serializeWithOffsetDateTimeAsString_Should_returnOptionalWithSeriali + "}"; assertThat(result.get(), jsonEquals(expectedJson)); - } @Test @@ -72,10 +71,9 @@ public void serialize_Should_returnOptionalEmpty_When_jsonStringCanNotBeConverte Mockito.when(om.writeValueAsString(Object.class)).thenThrow(new JsonProcessingException("") {}); Optional result = - JsonHelper.serializeWithOffsetDateTimeAsString(new Object(), - LogService::logInternalServerError); + JsonHelper.serializeWithOffsetDateTimeAsString( + new Object(), LogService::logInternalServerError); assertThat(result.isPresent(), is(false)); } - } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/helper/JsonStringToObjectConverterTest.java b/src/test/java/de/caritas/cob/uploadservice/api/helper/JsonStringToObjectConverterTest.java index e92929d..005bf13 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/helper/JsonStringToObjectConverterTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/helper/JsonStringToObjectConverterTest.java @@ -2,32 +2,31 @@ import static de.caritas.cob.uploadservice.helper.TestConstants.INVALID_JSON_BODY; import static de.caritas.cob.uploadservice.helper.TestConstants.RC_UPLOAD_ERROR_RESPONSE_BODY; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.powermock.reflect.Whitebox.setInternalState; import de.caritas.cob.uploadservice.api.model.rocket.chat.UploadResponseDto; import de.caritas.cob.uploadservice.api.service.LogService; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.slf4j.Logger; +import org.springframework.test.util.ReflectionTestUtils; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class JsonStringToObjectConverterTest { @Mock private Logger logger; - @Before + @BeforeEach public void setup() { - setInternalState(LogService.class, "LOGGER", logger); + ReflectionTestUtils.setField(LogService.class, "LOGGER", logger); } @Test diff --git a/src/test/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterEncrypterTest.java b/src/test/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterEncrypterTest.java index c5f7a08..80f44b4 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterEncrypterTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterEncrypterTest.java @@ -11,13 +11,13 @@ import de.caritas.cob.uploadservice.api.container.RocketChatUploadParameter; import de.caritas.cob.uploadservice.api.exception.CustomCryptoException; import de.caritas.cob.uploadservice.api.service.EncryptionService; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class RocketChatUploadParameterEncrypterTest { @Mock EncryptionService encryptionService; diff --git a/src/test/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterSanitizerTest.java b/src/test/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterSanitizerTest.java index 941edeb..3266077 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterSanitizerTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/helper/RocketChatUploadParameterSanitizerTest.java @@ -9,20 +9,20 @@ import static de.caritas.cob.uploadservice.helper.TestConstants.RC_TMID; import static de.caritas.cob.uploadservice.helper.TestConstants.RC_TMID_WITH_HTML; import static de.caritas.cob.uploadservice.helper.TestConstants.UPLOAD_FILE; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import de.caritas.cob.uploadservice.api.container.RocketChatUploadParameter; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class RocketChatUploadParameterSanitizerTest { private RocketChatUploadParameterSanitizer rocketChatUploadParameterSanitizer; - @Before + @BeforeEach public void setup() { rocketChatUploadParameterSanitizer = new RocketChatUploadParameterSanitizer(); } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/helper/UserHelperTest.java b/src/test/java/de/caritas/cob/uploadservice/api/helper/UserHelperTest.java index 2ff05f3..8cbd0e6 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/helper/UserHelperTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/helper/UserHelperTest.java @@ -2,26 +2,25 @@ import static de.caritas.cob.uploadservice.helper.TestConstants.USERNAME_DECODED; import static de.caritas.cob.uploadservice.helper.TestConstants.USERNAME_ENCODED; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class UserHelperTest { private UserHelper userHelper; - @Before + @BeforeEach public void setup() { this.userHelper = new UserHelper(); } @Test - public void - encodeUsername_Should_ReturnEncodedUsername_WhenDecodedUsernameIsGiven() { + public void encodeUsername_Should_ReturnEncodedUsername_WhenDecodedUsernameIsGiven() { assertEquals(USERNAME_ENCODED, userHelper.encodeUsername(USERNAME_DECODED)); } @@ -39,5 +38,4 @@ public void decodeUsername_Should_ReturnDecodedUsername_WhenEncodedUsernameIsGiv public void decodeUsername_Should_ReturnDecodedUsername_WhenDecodedUsernameIsGiven() { assertEquals(USERNAME_DECODED, userHelper.decodeUsername(USERNAME_DECODED)); } - } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/model/jsondeserializer/DecodeUsernameJsonDeserializerTest.java b/src/test/java/de/caritas/cob/uploadservice/api/model/jsondeserializer/DecodeUsernameJsonDeserializerTest.java index 0ba985f..402f7d0 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/model/jsondeserializer/DecodeUsernameJsonDeserializerTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/model/jsondeserializer/DecodeUsernameJsonDeserializerTest.java @@ -2,8 +2,8 @@ import static de.caritas.cob.uploadservice.helper.TestConstants.USERNAME_DECODED; import static de.caritas.cob.uploadservice.helper.TestConstants.USERNAME_ENCODED; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; @@ -13,20 +13,20 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.util.ClassUtils; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class DecodeUsernameJsonDeserializerTest { private ObjectMapper objectMapper; private DecodeUsernameJsonDeserializer decodeUsernameJsonDeserializer; private UserHelper userHelper; - @Before + @BeforeEach public void setup() { userHelper = new UserHelper(); objectMapper = new ObjectMapper(); diff --git a/src/test/java/de/caritas/cob/uploadservice/api/service/EncryptionServiceTest.java b/src/test/java/de/caritas/cob/uploadservice/api/service/EncryptionServiceTest.java index b0fc69f..c24c2d2 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/service/EncryptionServiceTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/service/EncryptionServiceTest.java @@ -1,27 +1,21 @@ package de.caritas.cob.uploadservice.api.service; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; import de.caritas.cob.uploadservice.api.exception.CustomCryptoException; -import java.io.UnsupportedEncodingException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import javax.crypto.BadPaddingException; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class EncryptionServiceTest { private static final String KEY_MASTER = "MasterKeyTestKey"; @@ -37,7 +31,7 @@ public class EncryptionServiceTest { @Mock private LogService logService; - @Before + @BeforeEach public void setup() throws NoSuchFieldException { ReflectionTestUtils.setField(encryptionService, "fragment_applicationKey", KEY_APPLICATION); encryptionService.updateMasterKey(KEY_MASTER); @@ -45,39 +39,39 @@ public void setup() throws NoSuchFieldException { @Test public void check_setup() { - assertEquals("MasterKey was not properly set", KEY_MASTER, encryptionService.getMasterKey()); + assertEquals(KEY_MASTER, encryptionService.getMasterKey(), "MasterKey was not properly set"); assertEquals( - "ApplicationKey was not properly set", KEY_APPLICATION, - encryptionService.getApplicationKey()); + encryptionService.getApplicationKey(), + "ApplicationKey was not properly set"); } @Test public void updateMasterKey_Should_UpdateMasterKeyFragment() { encryptionService.updateMasterKey(KEY_MASTER); - assertEquals("Cannot properly set MasterKey", KEY_MASTER, encryptionService.getMasterKey()); + assertEquals(KEY_MASTER, encryptionService.getMasterKey(), "Cannot properly set MasterKey"); } @Test public void encrypt_Should_ReturnEncryptedText_WhenProvidedWithValidParameters() throws Exception { String encryptMessage = encryptionService.encrypt(MESSAGE_PLAIN, KEY_SESSION); - assertEquals("Did not get the expected encryption result.", MESSAGE_ENCRYPTED, encryptMessage); + assertEquals(MESSAGE_ENCRYPTED, encryptMessage, "Did not get the expected encryption result."); } @Test public void encrypt_Should_ReturnWrongEncryptedText_WhenProvidedWithInvalidParameters() throws Exception { String encryptMessage = encryptionService.encrypt(MESSAGE_PLAIN, KEY_SESSION_WRONG); - Assert.assertNotEquals( - "Did not get the expected encryption result.", MESSAGE_ENCRYPTED, encryptMessage); + Assertions.assertNotEquals( + MESSAGE_ENCRYPTED, encryptMessage, "Did not get the expected encryption result."); } @Test public void decrypt_Should_ReturnDecryptedText_WhenProvidedWithValidParameters() throws Exception { String decryptedMessage = encryptionService.decrypt(MESSAGE_ENCRYPTED, KEY_SESSION); - assertEquals("Did not get the expected decrypted result.", MESSAGE_PLAIN, decryptedMessage); + assertEquals(MESSAGE_PLAIN, decryptedMessage, "Did not get the expected decrypted result."); } @Test @@ -87,7 +81,7 @@ public void decrypt_Should_ReturnWrongDecryptedText_WhenProvidedWithInvalidParam encryptionService.decrypt(MESSAGE_ENCRYPTED, KEY_SESSION_WRONG); fail("The expected BadPaddingException due to wrong password was not thrown."); } catch (CustomCryptoException ex) { - assertTrue("Expected BadPaddingException thrown", true); + assertTrue(true, "Expected BadPaddingException thrown"); } } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/service/FileServiceTest.java b/src/test/java/de/caritas/cob/uploadservice/api/service/FileServiceTest.java index 62bb846..4b339c8 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/service/FileServiceTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/service/FileServiceTest.java @@ -1,6 +1,6 @@ package de.caritas.cob.uploadservice.api.service; - +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; @@ -13,8 +13,8 @@ import java.io.InputStream; import java.util.Optional; import java.util.Set; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class FileServiceTest { @@ -22,7 +22,7 @@ public class FileServiceTest { private FileService fileService; private InputStream testInputStream; - @Before + @BeforeEach public void setUp() throws Exception { mimeTypeDetector = mock(MimeTypeDetector.class); fileService = new FileService(mimeTypeDetector, Set.of("application/jpeg")); @@ -36,25 +36,37 @@ public void verifyMimeType_should_verify_that_mime_type_is_whitelisted() { fileService.verifyMimeType(new TestMultipartFile()); } - @Test(expected = InvalidFileTypeException.class) + @Test public void verifyMimeType_should_fail_when_mime_type_of_file_is_not_whitelisted() { - when(mimeTypeDetector.detect(any())).thenReturn(Optional.of("application/octet-stream")); + assertThrows( + InvalidFileTypeException.class, + () -> { + when(mimeTypeDetector.detect(any())).thenReturn(Optional.of("application/octet-stream")); - fileService.verifyMimeType(new TestMultipartFile()); + fileService.verifyMimeType(new TestMultipartFile()); + }); } - @Test(expected = InvalidFileTypeException.class) + @Test public void verifyMimeType_should_fail_when_mime_type_is_empty() { - when(mimeTypeDetector.detect(any())).thenReturn(Optional.empty()); + assertThrows( + InvalidFileTypeException.class, + () -> { + when(mimeTypeDetector.detect(any())).thenReturn(Optional.empty()); - fileService.verifyMimeType(new TestMultipartFile()); + fileService.verifyMimeType(new TestMultipartFile()); + }); } - @Test(expected = InternalServerErrorException.class) + @Test public void verifyMimeType_should_fail_if_input_reading_fails() { - doThrow(RuntimeException.class).when(mimeTypeDetector).detect(any()); + assertThrows( + InternalServerErrorException.class, + () -> { + doThrow(RuntimeException.class).when(mimeTypeDetector).detect(any()); - fileService.verifyMimeType(new TestMultipartFile()); + fileService.verifyMimeType(new TestMultipartFile()); + }); } @Test @@ -69,30 +81,41 @@ public void verifyFileHeaderMimeType_should_verify_that_mime_type_is_whitelisted fileService.verifyFileHeaderMimeType(testInputStream); } - @Test(expected = InvalidFileTypeException.class) + @Test public void verifyFileHeaderMimeType_should_fail_when_mime_type_of_file_is_not_whitelisted() { - when(mimeTypeDetector.detect(any())).thenReturn(Optional.of("application/octet-stream")); + assertThrows( + InvalidFileTypeException.class, + () -> { + when(mimeTypeDetector.detect(any())).thenReturn(Optional.of("application/octet-stream")); - fileService.verifyFileHeaderMimeType(testInputStream); + fileService.verifyFileHeaderMimeType(testInputStream); + }); } - @Test(expected = InvalidFileTypeException.class) + @Test public void verifyFileHeaderMimeType_should_fail_when_mime_type_is_empty() { - when(mimeTypeDetector.detect(any())).thenReturn(Optional.empty()); + assertThrows( + InvalidFileTypeException.class, + () -> { + when(mimeTypeDetector.detect(any())).thenReturn(Optional.empty()); - fileService.verifyFileHeaderMimeType(testInputStream); + fileService.verifyFileHeaderMimeType(testInputStream); + }); } - @Test(expected = InternalServerErrorException.class) + @Test public void verifyFileHeaderMimeType_should_fail_if_input_reading_fails() { - doThrow(RuntimeException.class).when(mimeTypeDetector).detect(any()); + assertThrows( + InternalServerErrorException.class, + () -> { + doThrow(RuntimeException.class).when(mimeTypeDetector).detect(any()); - fileService.verifyFileHeaderMimeType(testInputStream); + fileService.verifyFileHeaderMimeType(testInputStream); + }); } @Test public void verifyFileHeaderMimeType_should_do_nothing_if_file_is_null() { fileService.verifyFileHeaderMimeType(null); } - -} \ No newline at end of file +} diff --git a/src/test/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationServiceIT.java b/src/test/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationServiceIT.java index f5e795f..596ee5a 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationServiceIT.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationServiceIT.java @@ -6,46 +6,34 @@ import static org.mockito.Mockito.when; import de.caritas.cob.uploadservice.api.helper.AuthenticatedUser; -import de.caritas.cob.uploadservice.config.SecurityConfig; import de.caritas.cob.uploadservice.userservice.generated.ApiClient; import de.caritas.cob.uploadservice.userservice.generated.web.LiveproxyControllerApi; import java.lang.management.ManagementFactory; import java.util.Optional; import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.Test; -import org.keycloak.adapters.KeycloakConfigResolver; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.security.config.annotation.SecurityBuilder; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; -import springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper; @SpringBootTest @ActiveProfiles("testing") @DirtiesContext class LiveEventNotificationServiceIT { - @Autowired - private LiveEventNotificationService underTest; + @Autowired private LiveEventNotificationService underTest; @MockBean @Qualifier("liveproxyControllerApi") @SuppressWarnings("unused") private LiveproxyControllerApi liveproxyControllerApi; + @MockBean private AuthenticatedUser authenticatedUser; - @MockBean - private AuthenticatedUser authenticatedUser; - - @MockBean - private ApiClient apiClient; - - @MockBean - private DocumentationPluginsBootstrapper documentationPluginsBootstrapper; - + @MockBean private ApiClient apiClient; @Test void sendLiveEventShouldRunInAnotherThread() { @@ -55,8 +43,7 @@ void sendLiveEventShouldRunInAnotherThread() { underTest.sendLiveEvent( RandomStringUtils.randomAlphanumeric(16), RandomStringUtils.randomAlphanumeric(16), - Optional.of(Long.valueOf(RandomStringUtils.randomNumeric(1))) - ); + Optional.of(Long.valueOf(RandomStringUtils.randomNumeric(1)))); assertEquals(threadCount + 1, ManagementFactory.getThreadMXBean().getThreadCount()); } @@ -68,11 +55,9 @@ void sendLiveEventShouldNeverCallAuthenticatedUserMethodsWhenAccessTokenGiven() underTest.sendLiveEvent( RandomStringUtils.randomAlphanumeric(16), RandomStringUtils.randomAlphanumeric(16), - Optional.of(Long.valueOf(RandomStringUtils.randomNumeric(1))) - ); + Optional.of(Long.valueOf(RandomStringUtils.randomNumeric(1)))); - verify(authenticatedUser, timeout(1000).times(0)) - .getAccessToken(); + verify(authenticatedUser, timeout(1000).times(0)).getAccessToken(); } @Test @@ -82,8 +67,7 @@ void sendLiveEventShouldCallAuthenticatedUserMethodsWhenAccessTokenMissing() { underTest.sendLiveEvent( RandomStringUtils.randomAlphanumeric(16), null, - Optional.of(Long.valueOf(RandomStringUtils.randomNumeric(1))) - ); + Optional.of(Long.valueOf(RandomStringUtils.randomNumeric(1)))); verify(authenticatedUser, timeout(1000)).getAccessToken(); } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationServiceTest.java b/src/test/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationServiceTest.java index 5b5b582..ddc15e3 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationServiceTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/service/LiveEventNotificationServiceTest.java @@ -8,47 +8,41 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import static org.powermock.reflect.Whitebox.setInternalState; import de.caritas.cob.uploadservice.api.service.helper.ServiceHelper; import de.caritas.cob.uploadservice.config.apiclient.LiveProxyApiControllerFactory; import de.caritas.cob.uploadservice.userservice.generated.ApiClient; import de.caritas.cob.uploadservice.userservice.generated.web.LiveproxyControllerApi; import java.util.Optional; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.slf4j.Logger; import org.springframework.http.HttpHeaders; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.client.RestClientException; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class LiveEventNotificationServiceTest { - @InjectMocks - private LiveEventNotificationService liveEventNotificationService; + @InjectMocks private LiveEventNotificationService liveEventNotificationService; - @Mock - private LiveproxyControllerApi liveproxyControllerApi; + @Mock private LiveproxyControllerApi liveproxyControllerApi; - @Mock - private ServiceHelper serviceHelper; + @Mock private ServiceHelper serviceHelper; - @Mock - private TenantHeaderSupplier tenantHeaderSupplier; + @Mock private TenantHeaderSupplier tenantHeaderSupplier; - @Mock - private Logger logger; + @Mock private Logger logger; - @Mock - private LiveProxyApiControllerFactory liveProxyApiControllerFactory; + @Mock private LiveProxyApiControllerFactory liveProxyApiControllerFactory; - @Before + @BeforeEach public void setup() { - setInternalState(LogService.class, "LOGGER", logger); + ReflectionTestUtils.setField(LogService.class, "LOGGER", logger); } @Test @@ -77,7 +71,8 @@ public void sendLiveEvent_Should_triggerLiveEventWithHeaders_When_rcGroupIdIsVal headers.add("header 1", "value 1"); headers.add("header 2", "value 2"); when(this.serviceHelper.getKeycloakAndCsrfHttpHeaders(anyString(), any())).thenReturn(headers); - when(this.liveProxyApiControllerFactory.createControllerApi()).thenReturn(liveproxyControllerApi); + when(this.liveProxyApiControllerFactory.createControllerApi()) + .thenReturn(liveproxyControllerApi); this.liveEventNotificationService.sendLiveEvent("valid", "", Optional.empty()); @@ -88,17 +83,17 @@ public void sendLiveEvent_Should_triggerLiveEventWithHeaders_When_rcGroupIdIsVal @Test public void sendLiveEvent_Should_logError_When_apiClientThrowsRestClientException() { - doThrow(new RestClientException("")).when(this.liveproxyControllerApi) + doThrow(new RestClientException("")) + .when(this.liveproxyControllerApi) .sendLiveEvent(anyString()); when(this.liveproxyControllerApi.getApiClient()).thenReturn(mock(ApiClient.class)); when(this.serviceHelper.getKeycloakAndCsrfHttpHeaders(anyString(), any())) .thenReturn(new HttpHeaders()); - when(this.liveProxyApiControllerFactory.createControllerApi()).thenReturn(liveproxyControllerApi); + when(this.liveProxyApiControllerFactory.createControllerApi()) + .thenReturn(liveproxyControllerApi); this.liveEventNotificationService.sendLiveEvent("valid", "", Optional.empty()); - verify(this.logger, times(1)).error(anyString(), anyString(), anyString()); } - } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/service/LogServiceTest.java b/src/test/java/de/caritas/cob/uploadservice/api/service/LogServiceTest.java index 23a6394..52299f5 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/service/LogServiceTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/service/LogServiceTest.java @@ -7,41 +7,39 @@ import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.powermock.reflect.Whitebox.setInternalState; import java.io.PrintWriter; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.slf4j.Logger; import org.springframework.http.HttpStatus; +import org.springframework.test.util.ReflectionTestUtils; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class LogServiceTest { private static final String ERROR_MESSAGE = "error"; private static final String RC_SERVICE_ERROR_TEXT = "Rocket.Chat service error: "; private static final String INTERNAL_SERVER_ERROR_TEXT = "Internal Server Error: "; private static final String BAD_REQUEST_TEXT = "Bad Request: "; - private static final String STATISTICS_EVENT_PROCESSING_ERROR = "StatisticsEventProcessing error: "; - private static final String STATISTICS_EVENT_PROCESSING_WARNING = "StatisticsEventProcessing warning: "; + private static final String STATISTICS_EVENT_PROCESSING_ERROR = + "StatisticsEventProcessing error: "; + private static final String STATISTICS_EVENT_PROCESSING_WARNING = + "StatisticsEventProcessing warning: "; - @Mock - Exception exception; + @Mock Exception exception; - @Mock - private Logger logger; + @Mock private Logger logger; - @Before + @BeforeEach public void setup() { - setInternalState(LogService.class, "LOGGER", logger); + ReflectionTestUtils.setField(LogService.class, "LOGGER", logger); } - /** - * Tests for method: logRocketChatServiceError - */ + /** Tests for method: logRocketChatServiceError */ @Test public void logRocketChatServiceError_Should_LogExceptionStackTrace() { @@ -53,22 +51,18 @@ public void logRocketChatServiceError_Should_LogExceptionStackTrace() { public void logRocketChatServiceError_Should_LogErrorMessage() { LogService.logRocketChatServiceError(ERROR_MESSAGE); - verify(logger, times(1)).error(RC_SERVICE_ERROR_TEXT + "{}", - ERROR_MESSAGE); + verify(logger, times(1)).error(RC_SERVICE_ERROR_TEXT + "{}", ERROR_MESSAGE); } @Test public void logRocketChatServiceError_Should_LogErrorMessageAndExceptionStackTrace() { LogService.logRocketChatServiceError(ERROR_MESSAGE, exception); - verify(logger, times(1)).error(RC_SERVICE_ERROR_TEXT + "{}", - ERROR_MESSAGE); + verify(logger, times(1)).error(RC_SERVICE_ERROR_TEXT + "{}", ERROR_MESSAGE); verify(exception, atLeastOnce()).printStackTrace(any(PrintWriter.class)); } - /** - * Tests for method: logUserServiceHelperError - */ + /** Tests for method: logUserServiceHelperError */ @Test public void logUserServiceHelperError_Should_LogExceptionStackTrace() { @@ -76,9 +70,7 @@ public void logUserServiceHelperError_Should_LogExceptionStackTrace() { verify(exception, atLeastOnce()).printStackTrace(any(PrintWriter.class)); } - /** - * Tests for method: logInfo - */ + /** Tests for method: logInfo */ @Test public void logInfo_Should_LogMessage() { @@ -86,9 +78,7 @@ public void logInfo_Should_LogMessage() { verify(logger, times(1)).info(ERROR_MESSAGE); } - /** - * Tests for method: logInfo - */ + /** Tests for method: logInfo */ @Test public void logInfo_Should_LogExceptionStackTrace() { @@ -96,9 +86,7 @@ public void logInfo_Should_LogExceptionStackTrace() { verify(logger, times(1)).info(getStackTrace(exception)); } - /** - * Tests for method: logEncryptionServiceError - */ + /** Tests for method: logEncryptionServiceError */ @Test public void logEncryptionServiceError_Should_LogExceptionStackTrace() { @@ -106,9 +94,7 @@ public void logEncryptionServiceError_Should_LogExceptionStackTrace() { verify(exception, atLeastOnce()).printStackTrace(any(PrintWriter.class)); } - /** - * Tests for method: logRocketChatBadRequestError - */ + /** Tests for method: logRocketChatBadRequestError */ @Test public void logRocketChatBadRequestError_Should_LogExceptionStackTrace() { @@ -116,15 +102,12 @@ public void logRocketChatBadRequestError_Should_LogExceptionStackTrace() { verify(exception, atLeastOnce()).printStackTrace(any(PrintWriter.class)); } - /** - * Tests for method: logInternalServerError - */ + /** Tests for method: logInternalServerError */ @Test public void logInternalServerError_Should_LogErrorMessageAndExceptionStackTrace() { LogService.logInternalServerError(ERROR_MESSAGE, exception); - verify(logger, times(1)) - .error(anyString(), eq(INTERNAL_SERVER_ERROR_TEXT), eq(ERROR_MESSAGE)); + verify(logger, times(1)).error(anyString(), eq(INTERNAL_SERVER_ERROR_TEXT), eq(ERROR_MESSAGE)); verify(exception, atLeastOnce()).printStackTrace(any(PrintWriter.class)); } @@ -136,15 +119,12 @@ public void logInternalServerError_Should_LogExceptionStackTrace() { verify(exception, atLeastOnce()).printStackTrace(any(PrintWriter.class)); } - /** - * Tests for method: logInfo - */ + /** Tests for method: logInfo */ @Test public void logBadRequest_Should_LogMessage() { LogService.logBadRequest(ERROR_MESSAGE); - verify(logger, times(1)).error(BAD_REQUEST_TEXT + "{}", - ERROR_MESSAGE); + verify(logger, times(1)).error(BAD_REQUEST_TEXT + "{}", ERROR_MESSAGE); } @Test @@ -160,8 +140,8 @@ public void logWarning_Should_LogMessageAndStatus() { LogService.logWarning(HttpStatus.ACCEPTED, exception); verify(exception, atLeastOnce()).printStackTrace(any(PrintWriter.class)); - verify(logger, times(1)).warn(anyString(), eq(HttpStatus.ACCEPTED.getReasonPhrase()), - anyString()); + verify(logger, times(1)) + .warn(anyString(), eq(HttpStatus.ACCEPTED.getReasonPhrase()), anyString()); } @Test @@ -183,8 +163,7 @@ public void logDebug_Should_LogMessage() { public void logStatisticEventError_Should_LogExceptionStackTraceAndErrorMessage() { LogService.logStatisticsEventError(exception); - verify(logger, times(1)) - .error(anyString(), eq(STATISTICS_EVENT_PROCESSING_ERROR), anyString()); + verify(logger, times(1)).error(anyString(), eq(STATISTICS_EVENT_PROCESSING_ERROR), anyString()); verify(exception, atLeastOnce()).printStackTrace(any(PrintWriter.class)); } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/service/RocketChatServiceTest.java b/src/test/java/de/caritas/cob/uploadservice/api/service/RocketChatServiceTest.java index 0c49902..3343e0b 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/service/RocketChatServiceTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/service/RocketChatServiceTest.java @@ -31,15 +31,14 @@ import static de.caritas.cob.uploadservice.helper.TestConstants.UNSANITIZED_UPLOAD_FILE; import static de.caritas.cob.uploadservice.helper.TestConstants.UPLOAD_FILE; import static org.assertj.core.api.Assertions.fail; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.powermock.reflect.Whitebox.setInternalState; import de.caritas.cob.uploadservice.api.container.RocketChatCredentials; import de.caritas.cob.uploadservice.api.container.RocketChatUploadParameter; @@ -53,16 +52,16 @@ import de.caritas.cob.uploadservice.api.service.helper.RocketChatCredentialsHelper; import de.caritas.cob.uploadservice.rocketchat.generated.web.model.FullUploadResponseDto; import java.nio.charset.StandardCharsets; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.slf4j.Logger; import org.springframework.http.HttpEntity; import org.springframework.http.HttpStatus; @@ -75,22 +74,16 @@ import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.multipart.MultipartException; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class RocketChatServiceTest { - @InjectMocks - private RocketChatService rocketChatService; - @Mock - private RocketChatCredentialsHelper rcCredentialsHelper; - @Mock - private RestTemplate restTemplate; - @Mock - private Logger logger; - @Mock - private UploadErrorHelper uploadErrorHelper; + @InjectMocks private RocketChatService rocketChatService; + @Mock private RocketChatCredentialsHelper rcCredentialsHelper; + @Mock private RestTemplate restTemplate; + @Mock private Logger logger; + @Mock private UploadErrorHelper uploadErrorHelper; - @Captor - private ArgumentCaptor>> mapArgumentCaptor; + @Captor private ArgumentCaptor>> mapArgumentCaptor; private RocketChatCredentials rocketChatCredentials; private RocketChatUploadParameter rocketChatUploadParameter; @@ -98,15 +91,18 @@ public class RocketChatServiceTest { @InjectMocks private EmailNotificationFacade emailNotificationFacade; - /** - * Setup method. - */ - @Before + /** Setup method. */ + @BeforeEach public void setup() throws NoSuchFieldException, SecurityException { - ReflectionTestUtils.setField(emailNotificationFacade, FIELD_NAME_RC_HEADER_AUTH_TOKEN, RC_TOKEN); + ReflectionTestUtils.setField( + emailNotificationFacade, FIELD_NAME_RC_HEADER_AUTH_TOKEN, RC_TOKEN); ReflectionTestUtils.setField(emailNotificationFacade, FIELD_NAME_RC_HEADER_USER_ID, RC_USER_ID); - ReflectionTestUtils.setField(emailNotificationFacade, FIELD_NAME_RC_POST_GROUP_MESSAGES_READ, FIELD_VALUE_RC_POST_GROUP_MESSAGES_READ); - ReflectionTestUtils.setField(emailNotificationFacade, FIELD_NAME_RC_ROOMS_UPLOAD_URL, FIELD_VALUE_RC_ROOMS_UPLOAD_URL); + ReflectionTestUtils.setField( + emailNotificationFacade, + FIELD_NAME_RC_POST_GROUP_MESSAGES_READ, + FIELD_VALUE_RC_POST_GROUP_MESSAGES_READ); + ReflectionTestUtils.setField( + emailNotificationFacade, FIELD_NAME_RC_ROOMS_UPLOAD_URL, FIELD_VALUE_RC_ROOMS_UPLOAD_URL); rocketChatCredentials = RocketChatCredentials.builder() @@ -131,29 +127,28 @@ public void setup() throws NoSuchFieldException, SecurityException { .roomId(RC_ROOM_ID) .tmId(RC_TMID) .build(); - - setInternalState(LogService.class, "LOGGER", logger); } /* Method: markGroupAsReadForSystemUser */ @Test - public void markGroupAsReadForSystemUser_Should_ThrowRocketChatPostMarkGroupAsReadException_WhenMarkGroupAsReadFails() - throws Exception { + public void + markGroupAsReadForSystemUser_Should_ThrowRocketChatPostMarkGroupAsReadException_WhenMarkGroupAsReadFails() + throws Exception { when(rcCredentialsHelper.getSystemUser()).thenReturn(RC_SYSTEM_USER); RestClientException ex = new RestClientException(ERROR_MSG); when(restTemplate.postForObject( - ArgumentMatchers.anyString(), - any(), - ArgumentMatchers.>any())) + ArgumentMatchers.anyString(), + any(), + ArgumentMatchers.>any())) .thenThrow(ex); try { rocketChatService.markGroupAsReadForSystemUser(RC_ROOM_ID); fail("Expected exception: RocketChatPostMarkGroupAsReadException"); } catch (RocketChatPostMarkGroupAsReadException rocketChatPostMarkGroupAsReadException) { - assertTrue("Expected RocketChatPostMarkGroupAsReadException thrown", true); + assertTrue(true, "Expected RocketChatPostMarkGroupAsReadException thrown"); } } @@ -164,9 +159,9 @@ public void markGroupAsReadForSystemUser_Should_MarkGroupAsRead_WhenProvidedWith when(rcCredentialsHelper.getSystemUser()).thenReturn(RC_SYSTEM_USER); when(restTemplate.postForObject( - ArgumentMatchers.anyString(), - any(), - ArgumentMatchers.>any())) + ArgumentMatchers.anyString(), + any(), + ArgumentMatchers.>any())) .thenReturn(STANDARD_SUCCESS_RESPONSE_DTO); rocketChatService.markGroupAsReadForSystemUser(RC_ROOM_ID); @@ -175,8 +170,9 @@ public void markGroupAsReadForSystemUser_Should_MarkGroupAsRead_WhenProvidedWith } @Test - public void markGroupAsReadForSystemUser_Should_LogError_WhenProvidedWithInvalidRChatSysUserCredentials() - throws Exception { + public void + markGroupAsReadForSystemUser_Should_LogError_WhenProvidedWithInvalidRChatSysUserCredentials() + throws Exception { when(rcCredentialsHelper.getSystemUser()).thenReturn(INVALID_RC_SYSTEM_USER); @@ -186,7 +182,8 @@ public void markGroupAsReadForSystemUser_Should_LogError_WhenProvidedWithInvalid /* Method: roomsUpload */ @Test - public void roomsUpload_Should_ThrowMaxUploadSizeExceededException_WhenRcErrorTypeIsFileTooLarge() { + public void + roomsUpload_Should_ThrowMaxUploadSizeExceededException_WhenRcErrorTypeIsFileTooLarge() { HttpStatusCodeException httpStatusCodeException = new HttpServerErrorException( @@ -195,25 +192,23 @@ public void roomsUpload_Should_ThrowMaxUploadSizeExceededException_WhenRcErrorTy RC_UPLOAD_ERROR_RESPONSE_BODY_ENTITY_TOO_LARGE.getBytes(), StandardCharsets.UTF_8); when(restTemplate.postForObject( - ArgumentMatchers.anyString(), - any(), - ArgumentMatchers.>any())) + ArgumentMatchers.anyString(), any(), ArgumentMatchers.>any())) .thenThrow(httpStatusCodeException); when(uploadErrorHelper.getParsedErrorResponse( - httpStatusCodeException.getResponseBodyAsString())) + httpStatusCodeException.getResponseBodyAsString())) .thenReturn(RC_UPLOAD_ERROR_RESPONSE_DTO_ENTITY_TOO_LARGE); when(uploadErrorHelper.getErrorFromUploadResponse( - Mockito.eq(RC_UPLOAD_ERROR_RESPONSE_DTO_ENTITY_TOO_LARGE), - Mockito.anyString(), - Mockito.anyString())) + Mockito.eq(RC_UPLOAD_ERROR_RESPONSE_DTO_ENTITY_TOO_LARGE), + Mockito.anyString(), + Mockito.anyString())) .thenReturn(RC_UPLOAD_ERROR_ENTITY_TOO_LARGE); try { rocketChatService.roomsUpload(rocketChatCredentials, rocketChatUploadParameter); fail("Expected exception: MaxUploadSizeExceededException"); } catch (MaxUploadSizeExceededException maxUploadSizeExceededException) { - assertTrue("Expected MaxUploadSizeExceededException thrown", true); + assertTrue(true, "Expected MaxUploadSizeExceededException thrown"); } } @@ -227,25 +222,23 @@ public void roomsUpload_Should_ThrowInvalidFileTypeException_WhenRcErrorTypeIsIn RC_UPLOAD_ERROR_RESPONSE_BODY_INVALID_FILE_TYPE.getBytes(), StandardCharsets.UTF_8); when(restTemplate.postForObject( - ArgumentMatchers.anyString(), - any(), - ArgumentMatchers.>any())) + ArgumentMatchers.anyString(), any(), ArgumentMatchers.>any())) .thenThrow(httpStatusCodeException); when(uploadErrorHelper.getParsedErrorResponse( - httpStatusCodeException.getResponseBodyAsString())) + httpStatusCodeException.getResponseBodyAsString())) .thenReturn(RC_UPLOAD_ERROR_RESPONSE_DTO_INVALID_FILE_TYPE); when(uploadErrorHelper.getErrorFromUploadResponse( - Mockito.eq(RC_UPLOAD_ERROR_RESPONSE_DTO_INVALID_FILE_TYPE), - Mockito.anyString(), - Mockito.anyString())) + Mockito.eq(RC_UPLOAD_ERROR_RESPONSE_DTO_INVALID_FILE_TYPE), + Mockito.anyString(), + Mockito.anyString())) .thenReturn(RC_UPLOAD_ERROR_INVALID_FILE_TYPE); try { rocketChatService.roomsUpload(rocketChatCredentials, rocketChatUploadParameter); fail("Expected exception: InvalidFileTypeException"); } catch (InvalidFileTypeException invalidFileTypeException) { - assertTrue("Expected InvalidFileTypeException thrown", true); + assertTrue(true, "Expected InvalidFileTypeException thrown"); } } @@ -259,25 +252,23 @@ public void roomsUpload_Should_ThrowMultipartException_WhenRcErrorIsUnknown() { RC_UPLOAD_ERROR_RESPONSE_BODY_UNKNOWN_ERROR.getBytes(), StandardCharsets.UTF_8); when(restTemplate.postForObject( - ArgumentMatchers.anyString(), - any(), - ArgumentMatchers.>any())) + ArgumentMatchers.anyString(), any(), ArgumentMatchers.>any())) .thenThrow(httpStatusCodeException); when(uploadErrorHelper.getParsedErrorResponse( - httpStatusCodeException.getResponseBodyAsString())) + httpStatusCodeException.getResponseBodyAsString())) .thenReturn(RC_UPLOAD_ERROR_RESPONSE_DTO_UNKNOWN_ERROR); when(uploadErrorHelper.getErrorFromUploadResponse( - Mockito.eq(RC_UPLOAD_ERROR_RESPONSE_DTO_UNKNOWN_ERROR), - Mockito.anyString(), - Mockito.anyString())) + Mockito.eq(RC_UPLOAD_ERROR_RESPONSE_DTO_UNKNOWN_ERROR), + Mockito.anyString(), + Mockito.anyString())) .thenReturn(RC_UPLOAD_ERROR_UNKNOWN_ERROR); try { rocketChatService.roomsUpload(rocketChatCredentials, rocketChatUploadParameter); fail("Expected exception: MultipartException"); } catch (MultipartException multipartException) { - assertTrue("Expected MultipartException thrown", true); + assertTrue(true, "Expected MultipartException thrown"); } } @@ -285,16 +276,16 @@ public void roomsUpload_Should_ThrowMultipartException_WhenRcErrorIsUnknown() { public void roomsUpload_Should_ThrowMultipartException_WhenResponseIsNotSuccess() { when(restTemplate.postForObject( - ArgumentMatchers.anyString(), - any(), - ArgumentMatchers.>any())) + ArgumentMatchers.anyString(), + any(), + ArgumentMatchers.>any())) .thenReturn(RC_FULL_UPLOAD_ERROR_RESPONSE_DTO_UNKNOWN_ERROR); try { rocketChatService.roomsUpload(rocketChatCredentials, rocketChatUploadParameter); fail("Expected exception: MultipartException"); } catch (MultipartException multipartException) { - assertTrue("Expected MultipartException thrown", true); + assertTrue(true, "Expected MultipartException thrown"); } } @@ -302,16 +293,14 @@ public void roomsUpload_Should_ThrowMultipartException_WhenResponseIsNotSuccess( public void roomsUpload_Should_ThrowMultipartException_WhenResponseIsNull() { when(restTemplate.postForObject( - ArgumentMatchers.anyString(), - any(), - ArgumentMatchers.>any())) + ArgumentMatchers.anyString(), any(), ArgumentMatchers.>any())) .thenReturn(null); try { rocketChatService.roomsUpload(rocketChatCredentials, rocketChatUploadParameter); fail("Expected exception: MultipartException"); } catch (MultipartException multipartException) { - assertTrue("Expected MultipartException thrown", true); + assertTrue(true, "Expected MultipartException thrown"); } } @@ -319,9 +308,9 @@ public void roomsUpload_Should_ThrowMultipartException_WhenResponseIsNull() { public void roomsUpload_Should_NotThrowException_WhenResponseIsSuccess() { when(restTemplate.postForObject( - ArgumentMatchers.anyString(), - any(), - ArgumentMatchers.>any())) + ArgumentMatchers.anyString(), + any(), + ArgumentMatchers.>any())) .thenReturn(RC_FULL_UPLOAD_ERROR_RESPONSE_DTO_SUCCESS); try { @@ -335,19 +324,22 @@ public void roomsUpload_Should_NotThrowException_WhenResponseIsSuccess() { public void roomsUpload_Should_UploadFileWithSanitizedFileName() { when(restTemplate.postForObject( - ArgumentMatchers.anyString(), - any(), - ArgumentMatchers.>any())) + ArgumentMatchers.anyString(), + any(), + ArgumentMatchers.>any())) .thenReturn(RC_FULL_UPLOAD_ERROR_RESPONSE_DTO_SUCCESS); - rocketChatService - .roomsUpload(rocketChatCredentials, rocketChatUploadParameterWithUnsanitizedFileName); + rocketChatService.roomsUpload( + rocketChatCredentials, rocketChatUploadParameterWithUnsanitizedFileName); - verify(restTemplate).postForObject(ArgumentMatchers.anyString(), mapArgumentCaptor.capture(), - ArgumentMatchers.>any()); + verify(restTemplate) + .postForObject( + ArgumentMatchers.anyString(), + mapArgumentCaptor.capture(), + ArgumentMatchers.>any()); - MultipartInputStreamFileResource file = (MultipartInputStreamFileResource) mapArgumentCaptor - .getValue().getBody().get(null).get(3); + MultipartInputStreamFileResource file = + (MultipartInputStreamFileResource) mapArgumentCaptor.getValue().getBody().get(null).get(3); assertEquals(FILE_NAME_SANITIZED, file.getFilename()); } } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/service/UploadTrackingServiceIT.java b/src/test/java/de/caritas/cob/uploadservice/api/service/UploadTrackingServiceIT.java index e11c407..454f823 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/service/UploadTrackingServiceIT.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/service/UploadTrackingServiceIT.java @@ -3,22 +3,21 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.powermock.reflect.Whitebox.setInternalState; import de.caritas.cob.uploadservice.UploadServiceApplication; import de.caritas.cob.uploadservice.api.exception.httpresponses.QuotaReachedException; import de.caritas.cob.uploadservice.api.helper.AuthenticatedUser; import de.caritas.cob.uploadservice.api.model.UploadByUser; import de.caritas.cob.uploadservice.api.repository.UploadByUserRepository; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -27,33 +26,28 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; -@RunWith(SpringRunner.class) @SpringBootTest(classes = UploadServiceApplication.class) @TestPropertySource(properties = "spring.profiles.active=testing") @AutoConfigureTestDatabase(replace = Replace.ANY) public class UploadTrackingServiceIT { - @Autowired - private UploadTrackingService uploadTrackingService; + @Autowired private UploadTrackingService uploadTrackingService; - @Autowired - private UploadByUserRepository uploadByUserRepository; + @Autowired private UploadByUserRepository uploadByUserRepository; - @MockBean - private AuthenticatedUser authenticatedUser; + @MockBean private AuthenticatedUser authenticatedUser; - @Mock - private Logger logger; + @Mock private Logger logger; - @Before + @BeforeEach public void setup() { when(this.authenticatedUser.getUserId()).thenReturn("userId"); - setInternalState(LogService.class, "LOGGER", logger); + ReflectionTestUtils.setField(LogService.class, "LOGGER", logger); } - @After + @AfterEach public void cleanDatabase() { this.uploadByUserRepository.deleteAll(); } @@ -80,8 +74,8 @@ public void trackUploadedFileForUser_Should_persistTrackingEntries_When_trackMul trackUploadedFile(10); assertThat(this.uploadByUserRepository.count(), is(10L)); - assertThat(this.uploadByUserRepository.countAllByUserIdAndSessionId("userId", "sessionId"), - is(10)); + assertThat( + this.uploadByUserRepository.countAllByUserIdAndSessionId("userId", "sessionId"), is(10)); } @Test @@ -95,15 +89,20 @@ public void validateUploadLimit_Should_notThrowQuotaException_When_limitIsNotRea } } - @Test(expected = QuotaReachedException.class) + @Test public void validateUploadLimit_Should_throwQuotaReachedException_When_limitIsReached() { - trackUploadedFile(7); + assertThrows( + QuotaReachedException.class, + () -> { + trackUploadedFile(7); - this.uploadTrackingService.validateUploadLimit("sessionId"); + this.uploadTrackingService.validateUploadLimit("sessionId"); + }); } @Test - public void validateUploadLimit_Should_notThrowQuotaException_When_limitIsNotReachedForGivenSession() { + public void + validateUploadLimit_Should_notThrowQuotaException_When_limitIsNotReachedForGivenSession() { trackUploadedFile(7); try { @@ -130,5 +129,4 @@ public void cleanUpFileLimits_Should_logExpectedInfoMessage() { verify(this.logger, times(1)).info(eq("File restrictions are reset!")); } - } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/service/helper/RocketChatCredentialsHelperTest.java b/src/test/java/de/caritas/cob/uploadservice/api/service/helper/RocketChatCredentialsHelperTest.java index 769d080..67e9ae9 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/service/helper/RocketChatCredentialsHelperTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/service/helper/RocketChatCredentialsHelperTest.java @@ -1,28 +1,27 @@ package de.caritas.cob.uploadservice.api.service.helper; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import de.caritas.cob.uploadservice.api.container.RocketChatCredentials; -import de.caritas.cob.uploadservice.api.exception.RocketChatLoginException; import de.caritas.cob.uploadservice.api.exception.RocketChatUserNotInitializedException; import de.caritas.cob.uploadservice.api.model.rocket.chat.login.DataDto; import de.caritas.cob.uploadservice.api.model.rocket.chat.login.LoginResponseDto; import de.caritas.cob.uploadservice.api.model.rocket.chat.logout.LogoutResponseDto; import java.time.LocalDateTime; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -33,7 +32,7 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class RocketChatCredentialsHelperTest { /** FIELD Names */ @@ -95,14 +94,23 @@ public class RocketChatCredentialsHelperTest { @Mock private RestTemplate restTemplate; - @Before + @BeforeEach public void setup() throws NoSuchFieldException { - ReflectionTestUtils.setField(rcCredentialHelper, FIELD_NAME_SYSTEM_USERNAME, SYSTEM_USER_USERNAME); + ReflectionTestUtils.setField( + rcCredentialHelper, FIELD_NAME_SYSTEM_USERNAME, SYSTEM_USER_USERNAME); ReflectionTestUtils.setField(rcCredentialHelper, FIELD_NAME_SYSTEM_PASSWORD, SYSTEM_USER_PW); - ReflectionTestUtils.setField(rcCredentialHelper, FIELD_NAME_ROCKET_CHAT_API_POST_USER_LOGIN, RC_URL_CHAT_USER_LOGIN); - ReflectionTestUtils.setField(rcCredentialHelper, FIELD_NAME_ROCKET_CHAT_API_POST_USER_LOGOUT, RC_URL_CHAT_USER_LOGOUT); - ReflectionTestUtils.setField(rcCredentialHelper, FIELD_NAME_ROCKET_CHAT_HEADER_AUTH_TOKEN, FIELD_VALUE_ROCKET_CHAT_HEADER_AUTH_TOKEN); - ReflectionTestUtils.setField(rcCredentialHelper, FIELD_NAME_ROCKET_CHAT_HEADER_USER_ID, FIELD_VALUE_ROCKET_CHAT_HEADER_USER_ID); + ReflectionTestUtils.setField( + rcCredentialHelper, FIELD_NAME_ROCKET_CHAT_API_POST_USER_LOGIN, RC_URL_CHAT_USER_LOGIN); + ReflectionTestUtils.setField( + rcCredentialHelper, FIELD_NAME_ROCKET_CHAT_API_POST_USER_LOGOUT, RC_URL_CHAT_USER_LOGOUT); + ReflectionTestUtils.setField( + rcCredentialHelper, + FIELD_NAME_ROCKET_CHAT_HEADER_AUTH_TOKEN, + FIELD_VALUE_ROCKET_CHAT_HEADER_AUTH_TOKEN); + ReflectionTestUtils.setField( + rcCredentialHelper, + FIELD_NAME_ROCKET_CHAT_HEADER_USER_ID, + FIELD_VALUE_ROCKET_CHAT_HEADER_USER_ID); } /** Method: updateCredentials */ @@ -195,7 +203,6 @@ public void updateCredentials_Should_LogoutAndReLoginBUsers_WhenAllUsersArePrese .build(); ReflectionTestUtils.setField(rcCredentialHelper, FIELD_NAME_SYSTEM_USER_A, systemA); - // create and set system B user RocketChatCredentials systemB = RocketChatCredentials.builder() @@ -208,7 +215,7 @@ public void updateCredentials_Should_LogoutAndReLoginBUsers_WhenAllUsersArePrese // prepare logout intercept for system user HttpHeaders headersLogoutSys = new HttpHeaders(); - headersLogoutSys.setContentType(MediaType.APPLICATION_JSON_UTF8); + headersLogoutSys.setContentType(MediaType.APPLICATION_JSON); headersLogoutSys.add(FIELD_VALUE_ROCKET_CHAT_HEADER_AUTH_TOKEN, SYSTEM_USER_A_TOKEN); headersLogoutSys.add(FIELD_VALUE_ROCKET_CHAT_HEADER_USER_ID, SYSTEM_USER_A_ID); HttpEntity requestSysLogout = new HttpEntity(headersLogoutSys); @@ -255,7 +262,7 @@ public void updateCredentials_Should_LogoutAndReLoginBUsers_WhenAllUsersArePrese rcCredentialHelper.getSystemUser(); fail("Expected exception: RocketChatUserNotInitializedException"); } catch (RocketChatUserNotInitializedException ex) { - assertTrue("Excepted RocketChatUserNotInitializedException thrown", true); + assertTrue(true, "Excepted RocketChatUserNotInitializedException thrown"); } } @@ -318,7 +325,6 @@ public void getSystemUser_Should_ReturnUserA_WhenUserAIsNewer() throws Exception .timeStampCreated(LocalDateTime.now().minusMinutes(5)) .build(); - ReflectionTestUtils.setField(rcCredentialHelper, FIELD_NAME_SYSTEM_USER_B, sysUserB); // Get User from Class (actual test) @@ -342,7 +348,6 @@ public void getSystemUser_Should_ReturnUserB_WhenUserBIsNewer() throws Exception ReflectionTestUtils.setField(rcCredentialHelper, FIELD_NAME_SYSTEM_USER_A, sysUserA); - // Prepare User B RocketChatCredentials sysUserB = RocketChatCredentials.builder() diff --git a/src/test/java/de/caritas/cob/uploadservice/api/service/helper/ServiceHelperTest.java b/src/test/java/de/caritas/cob/uploadservice/api/service/helper/ServiceHelperTest.java index c84cf60..de755b4 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/service/helper/ServiceHelperTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/service/helper/ServiceHelperTest.java @@ -7,26 +7,26 @@ import static de.caritas.cob.uploadservice.helper.TestConstants.AUTHORIZATION; import static de.caritas.cob.uploadservice.helper.TestConstants.BEARER; import static de.caritas.cob.uploadservice.helper.TestConstants.KEYCLOAK_ACCESS_TOKEN; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.when; import de.caritas.cob.uploadservice.api.helper.AuthenticatedUser; import de.caritas.cob.uploadservice.api.service.TenantHeaderSupplier; import java.util.Optional; import org.apache.commons.lang3.RandomStringUtils; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.test.util.ReflectionTestUtils; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class ServiceHelperTest { @InjectMocks private ServiceHelper serviceHelper; @@ -37,86 +37,88 @@ public class ServiceHelperTest { @SuppressWarnings("unused") private TenantHeaderSupplier tenantHeaderSupplier; - @Before + @BeforeEach public void setup() throws NoSuchFieldException, SecurityException { - ReflectionTestUtils.setField(serviceHelper, - FIELD_NAME_CSRF_TOKEN_HEADER_PROPERTY, CSRF_TOKEN_HEADER_VALUE - ); - ReflectionTestUtils.setField(serviceHelper, - FIELD_NAME_CSRF_TOKEN_COOKIE_PROPERTY, CSRF_TOKEN_COOKIE_VALUE - ); + ReflectionTestUtils.setField( + serviceHelper, FIELD_NAME_CSRF_TOKEN_HEADER_PROPERTY, CSRF_TOKEN_HEADER_VALUE); + ReflectionTestUtils.setField( + serviceHelper, FIELD_NAME_CSRF_TOKEN_COOKIE_PROPERTY, CSRF_TOKEN_COOKIE_VALUE); } - /** - * Tests for method: getKeycloakAndCsrfHttpHeaders() - */ + /** Tests for method: getKeycloakAndCsrfHttpHeaders() */ @Test public void getKeycloakAndCsrfHttpHeaders_Should_Return_HeaderWithCorrectContentType() { - HttpHeaders result = serviceHelper.getKeycloakAndCsrfHttpHeaders( - RandomStringUtils.randomAlphanumeric(16), Optional.empty() - ); - assertEquals(MediaType.APPLICATION_JSON_UTF8, result.getContentType()); + HttpHeaders result = + serviceHelper.getKeycloakAndCsrfHttpHeaders( + RandomStringUtils.randomAlphanumeric(16), Optional.empty()); + assertEquals(MediaType.APPLICATION_JSON, result.getContentType()); } @Test - public void getKeycloakAndCsrfHttpHeaders_Should_Return_HeaderWithCookiePropertyNameFromProperties() { + public void + getKeycloakAndCsrfHttpHeaders_Should_Return_HeaderWithCookiePropertyNameFromProperties() { - HttpHeaders result = serviceHelper.getKeycloakAndCsrfHttpHeaders( - RandomStringUtils.randomAlphanumeric(16), Optional.empty() - ); + HttpHeaders result = + serviceHelper.getKeycloakAndCsrfHttpHeaders( + RandomStringUtils.randomAlphanumeric(16), Optional.empty()); assertTrue(result.get("Cookie").toString().startsWith("[" + CSRF_TOKEN_COOKIE_VALUE + "=")); } @Test public void getKeycloakAndCsrfHttpHeaders_Should_Return_HeaderWithPropertyNameFromProperties() { - HttpHeaders result = serviceHelper.getKeycloakAndCsrfHttpHeaders( - RandomStringUtils.randomAlphanumeric(16), Optional.empty() - ); + HttpHeaders result = + serviceHelper.getKeycloakAndCsrfHttpHeaders( + RandomStringUtils.randomAlphanumeric(16), Optional.empty()); assertNotNull(result.get(CSRF_TOKEN_HEADER_VALUE)); } @Test - public void getKeycloakAndCsrfHttpHeaders_Should_Return_HeaderWithBearerTokenForCurrentlyAuthenticatedUser() { + public void + getKeycloakAndCsrfHttpHeaders_Should_Return_HeaderWithBearerTokenForCurrentlyAuthenticatedUser() { when(authenticatedUser.getAccessToken()).thenReturn(KEYCLOAK_ACCESS_TOKEN); - HttpHeaders result = serviceHelper.getKeycloakAndCsrfHttpHeaders( - null, Optional.empty() - ); + HttpHeaders result = serviceHelper.getKeycloakAndCsrfHttpHeaders(null, Optional.empty()); assertNotNull(result.get(AUTHORIZATION)); assertEquals(BEARER + KEYCLOAK_ACCESS_TOKEN, result.get(AUTHORIZATION).get(0)); } - /** - * Test for method: getKeycloakAndCsrfHttpHeaders(String accessToken) - */ + /** Test for method: getKeycloakAndCsrfHttpHeaders(String accessToken) */ @Test - public void getKeycloakAndCsrfHttpHeadersWithTokenParam_Should_Return_HeaderWithCorrectContentType() { + public void + getKeycloakAndCsrfHttpHeadersWithTokenParam_Should_Return_HeaderWithCorrectContentType() { - HttpHeaders result = serviceHelper.getKeycloakAndCsrfHttpHeaders(KEYCLOAK_ACCESS_TOKEN, Optional.empty()); - assertEquals(MediaType.APPLICATION_JSON_UTF8, result.getContentType()); + HttpHeaders result = + serviceHelper.getKeycloakAndCsrfHttpHeaders(KEYCLOAK_ACCESS_TOKEN, Optional.empty()); + assertEquals(MediaType.APPLICATION_JSON, result.getContentType()); } @Test - public void getKeycloakAndCsrfHttpHeadersWithTokenParam_Should_Return_HeaderWithCookiePropertyNameFromProperties() { + public void + getKeycloakAndCsrfHttpHeadersWithTokenParam_Should_Return_HeaderWithCookiePropertyNameFromProperties() { - HttpHeaders result = serviceHelper.getKeycloakAndCsrfHttpHeaders(KEYCLOAK_ACCESS_TOKEN, Optional.empty()); + HttpHeaders result = + serviceHelper.getKeycloakAndCsrfHttpHeaders(KEYCLOAK_ACCESS_TOKEN, Optional.empty()); assertTrue(result.get("Cookie").toString().startsWith("[" + CSRF_TOKEN_COOKIE_VALUE + "=")); } @Test - public void getKeycloakAndCsrfHttpHeadersWithTokenParam_Should_Return_HeaderWithPropertyNameFromProperties() { + public void + getKeycloakAndCsrfHttpHeadersWithTokenParam_Should_Return_HeaderWithPropertyNameFromProperties() { - HttpHeaders result = serviceHelper.getKeycloakAndCsrfHttpHeaders(KEYCLOAK_ACCESS_TOKEN, Optional.empty()); + HttpHeaders result = + serviceHelper.getKeycloakAndCsrfHttpHeaders(KEYCLOAK_ACCESS_TOKEN, Optional.empty()); assertNotNull(result.get(CSRF_TOKEN_HEADER_VALUE)); } @Test - public void getKeycloakAndCsrfHttpHeadersWithTokenParam_Should_Return_HeaderWithBearerTokenForCurrentlyAuthenticatedUser() { + public void + getKeycloakAndCsrfHttpHeadersWithTokenParam_Should_Return_HeaderWithBearerTokenForCurrentlyAuthenticatedUser() { - HttpHeaders result = serviceHelper.getKeycloakAndCsrfHttpHeaders(KEYCLOAK_ACCESS_TOKEN, Optional.empty()); + HttpHeaders result = + serviceHelper.getKeycloakAndCsrfHttpHeaders(KEYCLOAK_ACCESS_TOKEN, Optional.empty()); assertNotNull(result.get(AUTHORIZATION)); assertEquals(BEARER + KEYCLOAK_ACCESS_TOKEN, result.get(AUTHORIZATION).get(0)); } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/statistics/StatisticsServiceIT.java b/src/test/java/de/caritas/cob/uploadservice/api/statistics/StatisticsServiceIT.java index 91ae666..4b2a496 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/statistics/StatisticsServiceIT.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/statistics/StatisticsServiceIT.java @@ -14,8 +14,7 @@ import de.caritas.cob.uploadservice.testconfig.RabbitMqTestConfig; import java.io.IOException; import org.apache.commons.io.IOUtils; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.amqp.core.Message; import org.springframework.beans.factory.annotation.Autowired; @@ -23,10 +22,7 @@ import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.util.ReflectionTestUtils; -@RunWith(SpringRunner.class) @TestPropertySource(properties = "spring.profiles.active=testing") @SpringBootTest(classes = UploadServiceApplication.class) @AutoConfigureTestDatabase(replace = Replace.ANY) @@ -34,21 +30,15 @@ public class StatisticsServiceIT { private static final long MAX_TIMEOUT_MILLIS = 5000; - @Autowired - StatisticsService statisticsService; - @Autowired - AmqpTemplate amqpTemplate; + @Autowired StatisticsService statisticsService; + @Autowired AmqpTemplate amqpTemplate; @Test public void fireEvent_Should_Send_ExpectedUploadFileStatisticsEventMessageToQueue() throws IOException { CreateMessageStatisticsEvent createMessageStatisticsEvent = - new CreateMessageStatisticsEvent( - CONSULTANT_ID, - UserRole.CONSULTANT, - RC_ROOM_ID, - true); + new CreateMessageStatisticsEvent(CONSULTANT_ID, UserRole.CONSULTANT, RC_ROOM_ID, true); statisticsService.fireEvent(createMessageStatisticsEvent); Message message = @@ -83,5 +73,4 @@ public void fireEvent_Should_Send_ExpectedUploadFileStatisticsEventMessageToQueu private String extractBodyFromAmpQMessage(Message message) throws IOException { return IOUtils.toString(message.getBody(), UTF_8); } - } diff --git a/src/test/java/de/caritas/cob/uploadservice/api/statistics/StatisticsServiceTest.java b/src/test/java/de/caritas/cob/uploadservice/api/statistics/StatisticsServiceTest.java index cb6a9d5..f5c18e1 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/statistics/StatisticsServiceTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/statistics/StatisticsServiceTest.java @@ -5,7 +5,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.powermock.reflect.Whitebox.setInternalState; import static org.springframework.test.util.ReflectionTestUtils.setField; import de.caritas.cob.uploadservice.api.service.LogService; @@ -13,19 +12,20 @@ import de.caritas.cob.uploadservice.statisticsservice.generated.web.model.EventType; import java.nio.charset.StandardCharsets; import java.util.Optional; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import org.slf4j.Logger; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.amqp.core.MessageBuilder; import org.springframework.amqp.core.MessageProperties; +import org.springframework.test.util.ReflectionTestUtils; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class StatisticsServiceTest { private static final String FIELD_NAME_STATISTICS_ENABLED = "statisticsEnabled"; @@ -38,13 +38,14 @@ public class StatisticsServiceTest { @InjectMocks private StatisticsService statisticsService; @Mock private AmqpTemplate amqpTemplate; - @Before + @BeforeEach public void setup() { createMessageStatisticsEvent = Mockito.mock(CreateMessageStatisticsEvent.class); when(createMessageStatisticsEvent.getEventType()).thenReturn(eventType); when(createMessageStatisticsEvent.getPayload()).thenReturn(Optional.of(PAYLOAD)); - setInternalState(LogService.class, "LOGGER", logger); - setField(statisticsService, FIELD_NAME_RABBIT_EXCHANGE_NAME, RABBIT_EXCHANGE_NAME); + ReflectionTestUtils.setField( + statisticsService, FIELD_NAME_RABBIT_EXCHANGE_NAME, RABBIT_EXCHANGE_NAME); + ReflectionTestUtils.setField(LogService.class, "LOGGER", logger); } @Test diff --git a/src/test/java/de/caritas/cob/uploadservice/api/statistics/event/CreateMessageStatisticsEventTest.java b/src/test/java/de/caritas/cob/uploadservice/api/statistics/event/CreateMessageStatisticsEventTest.java index 47ccdc7..196264f 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/statistics/event/CreateMessageStatisticsEventTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/statistics/event/CreateMessageStatisticsEventTest.java @@ -9,27 +9,21 @@ import de.caritas.cob.uploadservice.api.helper.CustomOffsetDateTime; import de.caritas.cob.uploadservice.statisticsservice.generated.web.model.EventType; import de.caritas.cob.uploadservice.statisticsservice.generated.web.model.UserRole; -import java.time.OffsetDateTime; -import java.util.Objects; import java.util.Optional; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class CreateMessageStatisticsEventTest { private CreateMessageStatisticsEvent createMessageStatisticsEvent; - @Before + @BeforeEach public void setup() throws NoSuchFieldException, IllegalAccessException { createMessageStatisticsEvent = - new CreateMessageStatisticsEvent( - CONSULTANT_ID, - UserRole.CONSULTANT, - RC_ROOM_ID, - true); + new CreateMessageStatisticsEvent(CONSULTANT_ID, UserRole.CONSULTANT, RC_ROOM_ID, true); } @Test diff --git a/src/test/java/de/caritas/cob/uploadservice/api/tenant/AccessTokenTenantResolverTest.java b/src/test/java/de/caritas/cob/uploadservice/api/tenant/AccessTokenTenantResolverTest.java index 1b32569..abf0fd3 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/tenant/AccessTokenTenantResolverTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/tenant/AccessTokenTenantResolverTest.java @@ -4,36 +4,49 @@ import static org.mockito.Mockito.when; import com.google.common.collect.Maps; +import jakarta.servlet.http.HttpServletRequest; +import java.time.Instant; import java.util.HashMap; +import java.util.Map; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; -import org.mockito.Answers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.jwt.Jwt; @ExtendWith(MockitoExtension.class) class AccessTokenTenantResolverTest { - @Mock - HttpServletRequest authenticatedRequest; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - KeycloakAuthenticationToken token; + @InjectMocks AccessTokenTenantResolver accessTokenTenantResolver; - @InjectMocks - AccessTokenTenantResolver accessTokenTenantResolver; + @Mock SecurityContext mockSecurityContext; + + @Mock Authentication mockAuthentication; + + @Mock HttpServletRequest authenticatedRequest; + + @AfterEach + public void tearDown() { + SecurityContextHolder.clearContext(); + } + + private void givenUserIsAuthenticated() { + SecurityContextHolder.setContext(mockSecurityContext); + when(mockSecurityContext.getAuthentication()).thenReturn(mockAuthentication); + Jwt jwt = buildJwt(); + when(mockAuthentication.getPrincipal()).thenReturn(jwt); + } @Test void resolve_Should_ResolveTenantId_When_TenantIdInAccessTokenClaim() { // given - when(authenticatedRequest.getUserPrincipal()).thenReturn(token); - - HashMap claimMap = givenClaimMapContainingTenantId(1); - when(token.getAccount().getKeycloakSecurityContext().getToken().getOtherClaims()) - .thenReturn(claimMap); + givenUserIsAuthenticated(); // when Optional resolvedTenantId = accessTokenTenantResolver.resolve(authenticatedRequest); @@ -42,9 +55,21 @@ void resolve_Should_ResolveTenantId_When_TenantIdInAccessTokenClaim() { assertThat(resolvedTenantId).isEqualTo(Optional.of(1L)); } + private Jwt buildJwt() { + Map headers = new HashMap<>(); + headers.put("alg", "HS256"); // Signature algorithm + headers.put("typ", "JWT"); // Token type + return new Jwt( + "token", + Instant.now(), + Instant.now().plusSeconds(1), + headers, + givenClaimMapContainingTenantId(1)); + } + private HashMap givenClaimMapContainingTenantId(Integer tenantId) { HashMap claimMap = Maps.newHashMap(); claimMap.put("tenantId", tenantId); return claimMap; } -} \ No newline at end of file +} diff --git a/src/test/java/de/caritas/cob/uploadservice/api/tenant/CustomHeaderTenantResolverTest.java b/src/test/java/de/caritas/cob/uploadservice/api/tenant/CustomHeaderTenantResolverTest.java index c9f3fc6..d97fb0e 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/tenant/CustomHeaderTenantResolverTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/tenant/CustomHeaderTenantResolverTest.java @@ -4,8 +4,8 @@ import static org.mockito.Mockito.when; import de.caritas.cob.uploadservice.api.service.TenantHeaderSupplier; +import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -14,13 +14,11 @@ @ExtendWith(MockitoExtension.class) class CustomHeaderTenantResolverTest { - @Mock - HttpServletRequest request; - @Mock - TenantHeaderSupplier tenantHeaderSupplier; - @InjectMocks - CustomHeaderTenantResolver customHeaderTenantResolver; + @Mock HttpServletRequest request; + @Mock TenantHeaderSupplier tenantHeaderSupplier; + + @InjectMocks CustomHeaderTenantResolver customHeaderTenantResolver; @Test void resolve_Should_ResolveTenantId_When_SupplierCanResolveTenantId() { @@ -39,4 +37,4 @@ void resolve_Should_NotResolveTenantId_When_SupplierCannotResolveTenantId() { // then assertThat(resolved).isEmpty(); } -} \ No newline at end of file +} diff --git a/src/test/java/de/caritas/cob/uploadservice/api/tenant/SubdomainTenantResolverTest.java b/src/test/java/de/caritas/cob/uploadservice/api/tenant/SubdomainTenantResolverTest.java index 80d922f..4506fc0 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/tenant/SubdomainTenantResolverTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/tenant/SubdomainTenantResolverTest.java @@ -5,8 +5,8 @@ import de.caritas.cob.uploadservice.api.service.TenantService; import de.caritas.cob.uploadservice.filter.SubdomainExtractor; +import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -16,25 +16,23 @@ @ExtendWith(MockitoExtension.class) class SubdomainTenantResolverTest { - @Mock - SubdomainExtractor subdomainExtractor; + @Mock SubdomainExtractor subdomainExtractor; - @Mock - TenantService tenantService; + @Mock TenantService tenantService; - @Mock - HttpServletRequest httpServletRequest; + @Mock HttpServletRequest httpServletRequest; - @InjectMocks - SubdomainTenantResolver subdomainTenantResolver; + @InjectMocks SubdomainTenantResolver subdomainTenantResolver; @Test void resolve_should_resolveTenantId_When_SubdomainCouldBeDetermined() { // given - when(subdomainExtractor.getCurrentSubdomain(httpServletRequest)).thenReturn(Optional.of("mucoviscidose")); - when(tenantService.getRestrictedTenantDataBySubdomain("mucoviscidose")).thenReturn( - new de.caritas.cob.uploadservice.tenantservice.generated.web.model.RestrictedTenantDTO() - .id(1L)); + when(subdomainExtractor.getCurrentSubdomain(httpServletRequest)) + .thenReturn(Optional.of("mucoviscidose")); + when(tenantService.getRestrictedTenantDataBySubdomain("mucoviscidose")) + .thenReturn( + new de.caritas.cob.uploadservice.tenantservice.generated.web.model.RestrictedTenantDTO() + .id(1L)); // when Optional resolve = subdomainTenantResolver.resolve(httpServletRequest); @@ -54,5 +52,4 @@ void resolve_should_NotResolve_When_SubdomainIsEmpty() { // then assertThat(resolve).isEmpty(); } - -} \ No newline at end of file +} diff --git a/src/test/java/de/caritas/cob/uploadservice/api/tenant/TechnicalUserTenantResolverTest.java b/src/test/java/de/caritas/cob/uploadservice/api/tenant/TechnicalUserTenantResolverTest.java index 7d48f66..f958d3e 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/tenant/TechnicalUserTenantResolverTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/tenant/TechnicalUserTenantResolverTest.java @@ -1,47 +1,57 @@ package de.caritas.cob.uploadservice.api.tenant; - import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; -import javax.servlet.http.HttpServletRequest; -import org.assertj.core.util.Sets; +import com.google.common.collect.Lists; +import jakarta.servlet.http.HttpServletRequest; +import org.assertj.core.util.Maps; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; -import org.keycloak.representations.AccessToken; -import org.keycloak.representations.AccessToken.Access; -import org.mockito.Answers; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; @ExtendWith(MockitoExtension.class) class TechnicalUserTenantResolverTest { + public static final long TECHNICAL_CONTEXT = 0L; - @Mock - HttpServletRequest authenticatedRequest; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - KeycloakAuthenticationToken token; + @Mock HttpServletRequest authenticatedRequest; + + @Mock JwtAuthenticationToken token; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - AccessToken accessToken; + @Mock Jwt accessToken; - @Mock - Access access; + @InjectMocks TechnicalUserTenantResolver technicalUserTenantResolver; - @InjectMocks - TechnicalUserTenantResolver technicalUserTenantResolver; + @BeforeEach + public void setUp() { + // Configure deep stubs for token and accessToken so that nested calls work as expected. + token = Mockito.mock(JwtAuthenticationToken.class, Mockito.RETURNS_DEEP_STUBS); + accessToken = Mockito.mock(Jwt.class, Mockito.RETURNS_DEEP_STUBS); + } @Test void resolve_should_ResolveTechnicalTenantId_ForTechnicalUserRole() { // given when(authenticatedRequest.getUserPrincipal()).thenReturn(token); - when(token.getAccount() - .getKeycloakSecurityContext().getToken()).thenReturn(accessToken); - when(accessToken.getRealmAccess().getRoles()).thenReturn(Sets.newLinkedHashSet("technical")); + System.out.println( + "Principal class: " + authenticatedRequest.getUserPrincipal().getClass().getName()); + when(token.getToken()).thenReturn(accessToken); + // Simulate a JWT with a "realm_access" claim containing the role "technical" + when(accessToken.getClaims()) + .thenReturn( + Maps.newHashMap( + "realm_access", Maps.newHashMap("roles", Lists.newArrayList("technical")))); + + // when var resolved = technicalUserTenantResolver.resolve(authenticatedRequest); + // then assertThat(resolved).contains(TECHNICAL_CONTEXT); } @@ -50,11 +60,14 @@ void resolve_should_ResolveTechnicalTenantId_ForTechnicalUserRole() { void resolve_should_NotResolveTenantId_When_NonTechnicalUserRole() { // given when(authenticatedRequest.getUserPrincipal()).thenReturn(token); - when(token.getAccount() - .getKeycloakSecurityContext().getToken()).thenReturn(accessToken); - when(accessToken.getRealmAccess().getRoles()).thenReturn(Sets.newLinkedHashSet("another-role")); + when(token.getToken()).thenReturn(accessToken); + when(accessToken.getClaims()) + .thenReturn( + Maps.newHashMap( + "realm_access", Maps.newHashMap("roles", Lists.newArrayList("non-technical")))); + // when var resolved = technicalUserTenantResolver.resolve(authenticatedRequest); // then assertThat(resolved).isEmpty(); } -} \ No newline at end of file +} diff --git a/src/test/java/de/caritas/cob/uploadservice/api/tenant/TenantResolverServiceTest.java b/src/test/java/de/caritas/cob/uploadservice/api/tenant/TenantResolverServiceTest.java index 77bf7bf..1a78d05 100644 --- a/src/test/java/de/caritas/cob/uploadservice/api/tenant/TenantResolverServiceTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/api/tenant/TenantResolverServiceTest.java @@ -4,45 +4,46 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; +import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; -import org.mockito.Answers; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; @ExtendWith(MockitoExtension.class) class TenantResolverServiceTest { public static final long TECHNICAL_CONTEXT = 0L; - @Mock - SubdomainTenantResolver subdomainTenantResolver; + @Mock SubdomainTenantResolver subdomainTenantResolver; - @Mock - AccessTokenTenantResolver accessTokenTenantResolver; + @Mock AccessTokenTenantResolver accessTokenTenantResolver; - @Mock - HttpServletRequest authenticatedRequest; + @Mock HttpServletRequest authenticatedRequest; - @Mock - HttpServletRequest nonAuthenticatedRequest; + @Mock HttpServletRequest nonAuthenticatedRequest; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - KeycloakAuthenticationToken token; + @InjectMocks TenantResolverService tenantResolverService; - @InjectMocks - TenantResolverService tenantResolverService; + @Mock private CustomHeaderTenantResolver customHeaderTenantResolver; - @Mock - private CustomHeaderTenantResolver customHeaderTenantResolver; + @Mock private TechnicalUserTenantResolver technicalUserTenantResolver; - @Mock - private TechnicalUserTenantResolver technicalUserTenantResolver; + @Mock private SecurityContext mockSecurityContext; + + @Mock private Authentication mockAuthentication; + + @AfterEach + void tearDown() { + SecurityContextHolder.clearContext(); + } @Test void resolve_Should_ResolveFromAccessTokenForAuthenticatedUser_And_PassValidation() { @@ -61,11 +62,14 @@ void resolve_Should_ResolveFromAccessTokenForAuthenticatedUser_And_PassValidatio } private void givenUserIsAuthenticated() { - when(authenticatedRequest.getUserPrincipal()).thenReturn(token); + SecurityContextHolder.setContext(mockSecurityContext); + when(mockSecurityContext.getAuthentication()).thenReturn(mockAuthentication); + when(mockAuthentication.isAuthenticated()).thenReturn(true); } @Test - void resolve_Should_ThrowAccessDeniedException_ForAuthenticatedUser_When_SubdomainTenantIdDoesNotMatchTenantIdFromToken() { + void + resolve_Should_ThrowAccessDeniedException_ForAuthenticatedUser_When_SubdomainTenantIdDoesNotMatchTenantIdFromToken() { // given givenUserIsAuthenticated(); @@ -75,26 +79,30 @@ void resolve_Should_ThrowAccessDeniedException_ForAuthenticatedUser_When_Subdoma when(subdomainTenantResolver.resolve(authenticatedRequest)).thenReturn(Optional.of(2L)); // when, then - assertThrows(AccessDeniedException.class, () -> tenantResolverService.resolve(authenticatedRequest)); + assertThrows( + AccessDeniedException.class, () -> tenantResolverService.resolve(authenticatedRequest)); } @Test - void resolve_Should_ThrowAccessDeniedExceptionForAuthenticatedUser_IfAccessTokenResolverCannotResolveTenant() { + void + resolve_Should_ThrowAccessDeniedExceptionForAuthenticatedUser_IfAccessTokenResolverCannotResolveTenant() { // given givenUserIsAuthenticated(); when(accessTokenTenantResolver.canResolve(authenticatedRequest)).thenReturn(false); // when, then - assertThrows(AccessDeniedException.class, () -> tenantResolverService.resolve(authenticatedRequest)); + assertThrows( + AccessDeniedException.class, () -> tenantResolverService.resolve(authenticatedRequest)); } @Test - void resolve_Should_ThrowAccessDeniedExceptionForNotAuthenticatedUser_IfSubdomainCouldNotBeDetermined() { + void + resolve_Should_ThrowAccessDeniedExceptionForNotAuthenticatedUser_IfSubdomainCouldNotBeDetermined() { // given when(subdomainTenantResolver.canResolve(nonAuthenticatedRequest)).thenReturn(false); // when, then - assertThrows(AccessDeniedException.class, - () -> tenantResolverService.resolve(nonAuthenticatedRequest)); + assertThrows( + AccessDeniedException.class, () -> tenantResolverService.resolve(nonAuthenticatedRequest)); } @Test @@ -113,7 +121,8 @@ void resolve_Should_ResolveTenantId_ForTechnicalUserRole() { // given givenUserIsAuthenticated(); when(technicalUserTenantResolver.canResolve(authenticatedRequest)).thenReturn(true); - when(technicalUserTenantResolver.resolve(authenticatedRequest)).thenReturn(Optional.of(TECHNICAL_CONTEXT)); + when(technicalUserTenantResolver.resolve(authenticatedRequest)) + .thenReturn(Optional.of(TECHNICAL_CONTEXT)); Long resolved = tenantResolverService.resolve(authenticatedRequest); // then @@ -132,5 +141,4 @@ void resolve_Should_ResolveTenantId_FromHeader() { // then assertThat(resolved).isEqualTo(2L); } - -} \ No newline at end of file +} diff --git a/src/test/java/de/caritas/cob/uploadservice/filter/HttpTenantFilterTest.java b/src/test/java/de/caritas/cob/uploadservice/filter/HttpTenantFilterTest.java index a4000f2..c0369be 100644 --- a/src/test/java/de/caritas/cob/uploadservice/filter/HttpTenantFilterTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/filter/HttpTenantFilterTest.java @@ -1,11 +1,11 @@ package de.caritas.cob.uploadservice.filter; import de.caritas.cob.uploadservice.api.tenant.TenantResolverService; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; diff --git a/src/test/java/de/caritas/cob/uploadservice/filter/SubdomainExtractorTest.java b/src/test/java/de/caritas/cob/uploadservice/filter/SubdomainExtractorTest.java index 5df1ac9..c4310e5 100644 --- a/src/test/java/de/caritas/cob/uploadservice/filter/SubdomainExtractorTest.java +++ b/src/test/java/de/caritas/cob/uploadservice/filter/SubdomainExtractorTest.java @@ -1,11 +1,10 @@ package de.caritas.cob.uploadservice.filter; - import static java.util.Optional.of; +import jakarta.servlet.http.HttpServletRequest; import java.net.URISyntaxException; import java.util.Enumeration; -import javax.servlet.http.HttpServletRequest; import org.assertj.core.api.AssertionsForClassTypes; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -19,21 +18,18 @@ class SubdomainExtractorTest { private static final String MUCOVISCIDOSE = "mucoviscidose"; private static final String ONLINBEBERATUNG_DE = ".onlineberatung.de"; - @Mock - HttpServletRequest request; + @Mock HttpServletRequest request; - @Mock - Enumeration headerNames; + @Mock Enumeration headerNames; - @InjectMocks - SubdomainExtractor subdomainExtractor; + @InjectMocks SubdomainExtractor subdomainExtractor; @Test void resolveSubdomain_Should_resolveSubdomain() throws URISyntaxException { // given String url = MUCOVISCIDOSE + ONLINBEBERATUNG_DE; // when, then - AssertionsForClassTypes.assertThat(subdomainExtractor.getSubdomain(url)).isEqualTo(of("mucoviscidose")); + AssertionsForClassTypes.assertThat(subdomainExtractor.getSubdomain(url)) + .isEqualTo(of("mucoviscidose")); } - -} \ No newline at end of file +} diff --git a/src/test/java/de/caritas/cob/uploadservice/helper/FieldConstants.java b/src/test/java/de/caritas/cob/uploadservice/helper/FieldConstants.java index 3e482e9..fa92009 100644 --- a/src/test/java/de/caritas/cob/uploadservice/helper/FieldConstants.java +++ b/src/test/java/de/caritas/cob/uploadservice/helper/FieldConstants.java @@ -2,10 +2,9 @@ public class FieldConstants { - /** - * RocketChatService - */ + /** RocketChatService */ public static final String FIELD_NAME_RC_POST_GROUP_MESSAGES_READ = "rcPostGroupMessagesRead"; + public static final String FIELD_VALUE_RC_POST_GROUP_MESSAGES_READ = "/api/v1/subscriptions.read"; public static final String FIELD_NAME_RC_HEADER_AUTH_TOKEN = "rcHeaderAuthToken"; public static final String FIELD_NAME_RC_HEADER_USER_ID = "rcHeaderUserId"; @@ -13,10 +12,9 @@ public class FieldConstants { public static final String FIELD_VALUE_RC_ROOMS_UPLOAD_URL = "http://localhost/api/v1/rooms.upload"; - /** - * ServiceHelper - */ + /** ServiceHelper */ public static final String FIELD_NAME_CSRF_TOKEN_HEADER_PROPERTY = "csrfHeaderProperty"; + public static final String FIELD_NAME_CSRF_TOKEN_COOKIE_PROPERTY = "csrfCookieProperty"; public static final String CSRF_TOKEN_HEADER_VALUE = "X-CSRF-TOKEN"; public static final String CSRF_TOKEN_COOKIE_VALUE = "CSRF-TOKEN"; diff --git a/src/test/java/de/caritas/cob/uploadservice/helper/TestConstants.java b/src/test/java/de/caritas/cob/uploadservice/helper/TestConstants.java index 3ada1ab..4343caa 100644 --- a/src/test/java/de/caritas/cob/uploadservice/helper/TestConstants.java +++ b/src/test/java/de/caritas/cob/uploadservice/helper/TestConstants.java @@ -47,11 +47,13 @@ public class TestConstants { public static final String RC_TMID = "jkadsjk833"; public static final String RC_TMID_WITH_HTML = "jkadsjk833"; public static final String RC_UPLOAD_ERROR_RESPONSE_BODY = - "{\n" - + " \"success\": false,\n" - + " \"error\": \"Invalid room [error-invalid-room]\",\n" - + " \"errorType\": \"error-invalid-room\"\n" - + "}"; + """ + { + "success": false, + "error": "Invalid room [error-invalid-room]", + "errorType": "error-invalid-room" + }\ + """; public static final String RC_TOKEN_HEADER_PARAMETER_NAME = "RCToken"; public static final String RC_USER_ID_HEADER_PARAMETER_NAME = "RCUserId"; public static final String RC_TOKEN = "2fUGwNSqvpiEDTsMJQ54XeYdx0XzzCWdu0PP0lXFNu8"; @@ -155,8 +157,10 @@ public class TestConstants { public static final String FORM_PARAM_FILE_HEADER_EMPTY = ""; public static final String FORM_PARAM_TYPE = "t"; public static final String FORM_PARAM_TYPE_EMPTY = ""; - public static final String FILE_NAME_UNSANITIZED = "äöüßÄÖÜt!\"e...~´´`::.jpg;.jpg;st-+_#$1.jpg.doc"; - public static final String FILE_NAME_UNSANITIZED_WITH_SPACES = " äöüßÄÖÜt!\"e ...~´´`::.jpg;.jpg;st-+_#$1.jpg.doc "; + public static final String FILE_NAME_UNSANITIZED = + "äöüßÄÖÜt!\"e...~´´`::.jpg;.jpg;st-+_#$1.jpg.doc"; + public static final String FILE_NAME_UNSANITIZED_WITH_SPACES = + " äöüßÄÖÜt!\"e ...~´´`::.jpg;.jpg;st-+_#$1.jpg.doc "; public static final String FILE_NAME_SANITIZED = "äöüßÄÖÜtejpgjpgst-+#1jpg.doc"; public static final String FILE_NAME_SANITIZED_WITH_SPACES = "äöüßÄÖÜte jpgjpgst-+#1jpg.doc"; public static final String FILE_NAME_ONLY_SPECIAL_CHARS = "!...~´´`.;;;§%%%_$.jpg"; @@ -164,6 +168,6 @@ public class TestConstants { public static final MockMultipartFile UPLOAD_FILE = new MockMultipartFile("uploadFile", "uploadFile.txt", "text/plain", "content".getBytes()); public static final MockMultipartFile UNSANITIZED_UPLOAD_FILE = - new MockMultipartFile("uploadFile", FILE_NAME_UNSANITIZED, "text/plain", - "content".getBytes()); + new MockMultipartFile( + "uploadFile", FILE_NAME_UNSANITIZED, "text/plain", "content".getBytes()); } diff --git a/src/test/java/de/caritas/cob/uploadservice/testconfig/RabbitMqTestConfig.java b/src/test/java/de/caritas/cob/uploadservice/testconfig/RabbitMqTestConfig.java index e254ca9..c11169d 100644 --- a/src/test/java/de/caritas/cob/uploadservice/testconfig/RabbitMqTestConfig.java +++ b/src/test/java/de/caritas/cob/uploadservice/testconfig/RabbitMqTestConfig.java @@ -18,7 +18,8 @@ public class RabbitMqTestConfig { private static final String QUEUE_PREFIX = "statistics."; public static final String QUEUE_NAME_CREATE_MESSAGE = QUEUE_PREFIX + EventType.CREATE_MESSAGE; - @Bean ConnectionFactory connectionFactory() { + @Bean + ConnectionFactory connectionFactory() { return new CachingConnectionFactory(new MockConnectionFactory()); } @@ -31,9 +32,8 @@ public Declarables topicBindings() { return new Declarables( assignSessionStatisticEventQueue, topicExchange, - BindingBuilder - .bind(assignSessionStatisticEventQueue) - .to(topicExchange).with( - EventType.CREATE_MESSAGE)); + BindingBuilder.bind(assignSessionStatisticEventQueue) + .to(topicExchange) + .with(EventType.CREATE_MESSAGE)); } }