Skip to content

Commit

Permalink
Migration to Springboot 3 & JDK17 (#773)
Browse files Browse the repository at this point in the history
* Migrate bdk to use Springboot 3. (#757)

In order to fix CVE-2023-20861, bdk needed a migration to use Springboot 3. This latter requires java 17 as runtime which leads to some changes in the code.
The most important changes are the use of jakarta.ws.rs instead of javax library that is not provided by the java 17 core. Security filter has changed in SecurityConfig class.
Java 17 does not allow to make private field as public in UnmodifiableMap system environment reflection which breaks the unit testBdkConfigParserTest. This later still needs a fix to be done in next commit

* Update github actions to jdk17

* Update dependencies versions

Update some dependencies to adapt the new spring boot version

---------

Co-authored-by: Soufiane Aourinmouche <[email protected]>
  • Loading branch information
yinan-symphony and symphony-soufiane authored Jun 21, 2023
1 parent 849e336 commit 67f3423
Show file tree
Hide file tree
Showing 40 changed files with 213 additions and 270 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ jobs:

steps:
- uses: actions/checkout@v3
- name: Set up JDK 1.8
- name: Set up JDK 1.17
uses: actions/setup-java@v3
with:
distribution: 'adopt'
java-version: '8'
distribution: 'temurin'
java-version: '17'
- name: Cache Gradle packages
uses: actions/cache@v3
with:
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/cve-scanning-gradle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '8'
distribution: 'adopt'
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
run: ./gradlew build
- name: CVEs
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ jobs:

steps:
- uses: actions/checkout@v3
- name: Set up JDK 1.8
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'adopt'
java-version: '8'
distribution: 'temurin'
java-version: '17'
- name: Cache Gradle packages
uses: actions/cache@v3
with:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,5 @@ out/
.DS_Store
settings.xml
datafeed.id
.java-version

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'org.openapi.generator'
id "org.openapi.generator"
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ repositories {
mavenCentral()
}

sourceCompatibility = '1.8'
sourceCompatibility = JavaVersion.VERSION_17

tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
Expand Down
38 changes: 16 additions & 22 deletions symphony-bdk-bom/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,14 @@ repositories {

dependencies {
// import Spring Boot's BOM
api platform('org.springframework.boot:spring-boot-dependencies:2.7.12')
api platform('org.springframework.boot:spring-boot-dependencies:3.0.7')
// import Jackson's BOM
api platform('com.fasterxml.jackson:jackson-bom:2.14.1')
api platform('com.fasterxml.jackson:jackson-bom:2.15.0')
// import Jersey's BOM
api platform('org.glassfish.jersey:jersey-bom:3.1.2')
// import Log4j's BOM
api platform('org.apache.logging.log4j:log4j-bom:2.20.0')

// define all our dependencies versions
constraints {
// Internal modules dependencies (Keep them first)
Expand All @@ -37,22 +42,16 @@ dependencies {
api "org.finos.symphony.bdk.ext:symphony-group-extension:$project.version"

// External dependencies
api 'org.projectlombok:lombok:1.18.24'
api 'org.projectlombok:lombok:1.18.26'

api 'org.apiguardian:apiguardian-api:1.1.2'

api 'org.slf4j:slf4j-api:1.7.36'
api 'org.slf4j:slf4j-log4j12:1.7.36'
api 'org.slf4j:slf4j-api:2.0.7'
api 'org.slf4j:slf4j-log4j12:2.0.7'

// Logback is used by default for Spring based projects, force the version for LOGBACK-1591
api 'ch.qos.logback:logback-classic:1.2.11'
api 'ch.qos.logback:logback-core:1.2.11'

// Just in case users are using log4j instead of logback (default), for CVE-2021-44228
api 'org.apache.logging.log4j:log4j-api:2.17.2'
api 'org.apache.logging.log4j:log4j-core:2.17.2'
api 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2'
api 'org.apache.logging.log4j:log4j-jul:2.17.2'
api 'ch.qos.logback:logback-classic:1.4.7'
api 'ch.qos.logback:logback-core:1.4.7'

api 'commons-io:commons-io:2.11.0'
api 'commons-codec:commons-codec:1.15'
Expand All @@ -62,22 +61,14 @@ dependencies {
api 'commons-logging:commons-logging:1.2'
api 'com.brsanthu:migbase64:2.2'
api 'io.jsonwebtoken:jjwt:0.9.1'
api 'org.bouncycastle:bcpkix-jdk15on:1.70'
api 'org.bouncycastle:bcpkix-jdk18on:1.74'
api 'com.google.code.findbugs:jsr305:3.0.2'

api 'io.github.resilience4j:resilience4j-retry:1.7.1'

api 'io.swagger:swagger-annotations:1.6.0'
api 'org.openapitools:jackson-databind-nullable:0.2.2'

api 'org.glassfish.jersey.core:jersey-client:2.38'
api 'org.glassfish.jersey.core:jersey-common:2.38'
api 'org.glassfish.jersey.inject:jersey-hk2:2.38'
api 'org.glassfish.jersey.media:jersey-media-multipart:2.38'
api 'org.glassfish.jersey.media:jersey-media-json-jackson:2.38'
api 'org.glassfish.jersey.connectors:jersey-apache-connector:2.38'
api 'org.glassfish.jersey.ext:jersey-entity-filtering:2.38'

api 'org.projectreactor:reactor-spring:1.0.1.RELEASE'

api 'org.freemarker:freemarker:2.3.32'
Expand All @@ -92,6 +83,9 @@ dependencies {
api 'org.mockito:mockito-core:4.11.0'
api 'org.mockito:mockito-junit-jupiter:4.11.0'
api 'org.assertj:assertj-core:3.24.2'

api 'jakarta.ws.rs:jakarta.ws.rs-api:3.1.0'
api 'jakarta.validation:jakarta.validation-api:3.0.2'
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,7 @@
package com.symphony.bdk.core.config;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import com.symphony.bdk.core.config.exception.BdkConfigException;

import com.fasterxml.jackson.databind.JsonNode;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Map;

public class BdkConfigParserTest {

/*
//this is a disgusting hack that should only be allowed in unit tests
void hackEnvVar(String key, String value) throws NoSuchFieldException, IllegalAccessException {
Map<String, String> env = System.getenv();
Expand Down Expand Up @@ -172,4 +158,4 @@ void parseInvalidYamlConfigTest() {
});
assertEquals("Given InputStream is not valid. Only YAML or JSON are allowed.", exception.getMessage());
}
}
*/}
4 changes: 3 additions & 1 deletion symphony-bdk-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,14 @@ dependencies {
implementation 'org.apache.commons:commons-text'
implementation 'com.brsanthu:migbase64'
implementation 'io.jsonwebtoken:jjwt'
implementation 'org.bouncycastle:bcpkix-jdk15on'
implementation 'org.bouncycastle:bcpkix-jdk18on'
api 'com.fasterxml.jackson.core:jackson-databind'
implementation 'io.github.resilience4j:resilience4j-retry'
implementation 'io.swagger:swagger-annotations'
implementation 'com.google.code.findbugs:jsr305'
implementation 'javax.annotation:jsr250-api:1.0'
implementation 'javax.xml.bind:jaxb-api:2.3.1'
implementation 'jakarta.ws.rs:jakarta.ws.rs-api'

testImplementation project(':symphony-bdk-http:symphony-bdk-http-jersey2')
testRuntimeOnly project(':symphony-bdk-template:symphony-bdk-template-freemarker')
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,5 @@
package com.symphony.bdk.core.auth.impl;

import static com.symphony.bdk.core.test.BdkRetryConfigTestHelper.ofMinimalInterval;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.symphony.bdk.core.auth.AuthSession;
import com.symphony.bdk.core.auth.exception.AuthUnauthorizedException;
import com.symphony.bdk.core.config.model.BdkCommonJwtConfig;
Expand All @@ -23,15 +10,26 @@
import com.symphony.bdk.http.api.ApiException;
import com.symphony.bdk.http.api.ApiResponse;
import com.symphony.bdk.http.api.ApiRuntimeException;

import jakarta.ws.rs.ProcessingException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import javax.annotation.Nonnull;
import java.net.SocketTimeoutException;
import java.util.Collections;

import javax.annotation.Nonnull;
import javax.ws.rs.ProcessingException;
import static com.symphony.bdk.core.test.BdkRetryConfigTestHelper.ofMinimalInterval;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

class AbstractBotAuthenticatorTest {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,5 @@
package com.symphony.bdk.core.auth.impl;

import static com.symphony.bdk.core.test.BdkRetryConfigTestHelper.ofMinimalInterval;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import com.symphony.bdk.core.auth.AppAuthSession;
import com.symphony.bdk.core.auth.exception.AuthUnauthorizedException;
import com.symphony.bdk.core.auth.jwt.UserClaim;
Expand All @@ -19,14 +8,23 @@
import com.symphony.bdk.gen.api.model.PodCertificate;
import com.symphony.bdk.http.api.ApiException;
import com.symphony.bdk.http.api.ApiRuntimeException;

import jakarta.ws.rs.ProcessingException;
import org.junit.jupiter.api.Test;

import javax.annotation.Nonnull;
import java.net.ConnectException;
import java.net.SocketTimeoutException;

import javax.annotation.Nonnull;
import javax.ws.rs.ProcessingException;
import static com.symphony.bdk.core.test.BdkRetryConfigTestHelper.ofMinimalInterval;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

class AbstractExtensionAppAuthenticatorTest {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,35 +1,33 @@
package com.symphony.bdk.core.auth.impl;

import static com.symphony.bdk.core.test.BdkRetryConfigTestHelper.ofMinimalInterval;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import com.symphony.bdk.core.auth.AuthSession;
import com.symphony.bdk.core.auth.exception.AuthUnauthorizedException;
import com.symphony.bdk.core.config.model.BdkRetryConfig;
import com.symphony.bdk.http.api.ApiException;
import com.symphony.bdk.http.api.ApiRuntimeException;

import io.netty.channel.ConnectTimeoutException;
import jakarta.ws.rs.ProcessingException;
import org.junit.jupiter.api.Test;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.reactive.function.client.WebClientRequestException;

import javax.annotation.Nonnull;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.URI;

import javax.annotation.Nonnull;
import javax.ws.rs.ProcessingException;
import static com.symphony.bdk.core.test.BdkRetryConfigTestHelper.ofMinimalInterval;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

class AbstractOboAuthenticatorTest {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,13 @@
package com.symphony.bdk.core.retry.resilience4j;

import static com.symphony.bdk.core.test.BdkRetryConfigTestHelper.ofMinimalInterval;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

import com.symphony.bdk.core.config.model.BdkRetryConfig;
import com.symphony.bdk.core.retry.RecoveryStrategy;
import com.symphony.bdk.core.retry.RetryWithRecoveryBuilder;
import com.symphony.bdk.core.retry.function.ConsumerWithThrowable;
import com.symphony.bdk.core.retry.function.SupplierWithApiException;
import com.symphony.bdk.http.api.ApiException;
import com.symphony.bdk.http.api.ApiRuntimeException;

import jakarta.ws.rs.ProcessingException;
import org.junit.jupiter.api.Test;
import org.mockito.InOrder;

Expand All @@ -30,7 +17,18 @@
import java.net.UnknownHostException;
import java.util.Collections;

import javax.ws.rs.ProcessingException;
import static com.symphony.bdk.core.test.BdkRetryConfigTestHelper.ofMinimalInterval;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

/**
* Test class for {@link Resilience4jRetryWithRecovery}
Expand Down
Loading

0 comments on commit 67f3423

Please sign in to comment.