diff --git a/.github/workflows/backend.yaml b/.github/workflows/backend.yaml index 2762f88af..484a5c6f8 100644 --- a/.github/workflows/backend.yaml +++ b/.github/workflows/backend.yaml @@ -14,7 +14,7 @@ env: jobs: formatting: name: Formatting - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout if: github.event_name != 'pull_request' @@ -48,7 +48,7 @@ jobs: build: name: Build - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 @@ -64,14 +64,14 @@ jobs: build-root-directory: backend - name: Upload artifacts if: github.event.pull_request.head.repo.full_name == github.repository - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: backend path: backend/build test: name: Test - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: checks: write contents: read @@ -99,7 +99,7 @@ jobs: echo "branch coverage = ${{ steps.jacoco.outputs.branches }}" - name: Upload JaCoCo coverage report if: github.event.pull_request.head.repo.full_name == github.repository - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: jacoco-report path: backend/build/jacoco-report/ diff --git a/.github/workflows/badges.yaml b/.github/workflows/badges.yaml index 940905108..cb9be2985 100644 --- a/.github/workflows/badges.yaml +++ b/.github/workflows/badges.yaml @@ -56,7 +56,7 @@ jobs: add: '*.svg' - name: Upload Jacoco coverage report - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: jacoco-report path: target/site/jacoco/ diff --git a/.github/workflows/docs-deploy.yaml b/.github/workflows/docs-deploy.yaml index 4b4bebe43..8bae2f07a 100644 --- a/.github/workflows/docs-deploy.yaml +++ b/.github/workflows/docs-deploy.yaml @@ -32,7 +32,7 @@ jobs: - name: Build run: npm run docs:build - uses: actions/configure-pages@v2 - - uses: actions/upload-pages-artifact@v1 + - uses: actions/upload-pages-artifact@v3 with: path: docs/.vitepress/dist - name: Deploy diff --git a/.github/workflows/frontend.yaml b/.github/workflows/frontend.yaml index fe5aeffe7..3ceb38632 100644 --- a/.github/workflows/frontend.yaml +++ b/.github/workflows/frontend.yaml @@ -52,7 +52,7 @@ jobs: run: npm run build - name: Upload artifacts if: github.event.pull_request.head.repo.full_name == github.repository - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: frontend path: frontend/dist diff --git a/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/azuredevops/AzureDevOpsService.java b/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/azuredevops/AzureDevOpsService.java index 6ce87234f..ce31e2833 100644 --- a/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/azuredevops/AzureDevOpsService.java +++ b/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/azuredevops/AzureDevOpsService.java @@ -11,7 +11,6 @@ import io.diveni.backend.service.projectmanagementproviders.ProjectManagementProviderOAuth2; import lombok.Getter; import lombok.val; -import org.apache.tomcat.util.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -32,6 +31,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Base64; @Service public class AzureDevOpsService implements ProjectManagementProviderOAuth2 { @@ -82,7 +82,8 @@ public ResponseEntity executeRequest( headers.setAccept(List.of(MediaType.APPLICATION_JSON)); headers.setContentType(contentType); String token = ":" + accessToken; - headers.add("Authorization", "Basic " + new String(new Base64().encode(token.getBytes()))); + headers.add( + "Authorization", "Basic " + new String(Base64.getEncoder().encode(token.getBytes()))); HttpEntity request = new HttpEntity<>(body, headers); LOGGER.debug("<-- executeRequest()"); return restTemplate.exchange(url, method, request, String.class); diff --git a/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/jiracloud/JiraCloudService.java b/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/jiracloud/JiraCloudService.java index e4dcf629f..1716d7fdb 100644 --- a/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/jiracloud/JiraCloudService.java +++ b/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/jiracloud/JiraCloudService.java @@ -9,11 +9,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Base64; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.google.api.client.util.Base64; import io.diveni.backend.Utils; import io.diveni.backend.model.Project; @@ -126,7 +126,7 @@ public TokenIdentifier getAccessToken(String authorizationCode, String origin) { LOGGER.debug("--> getAccessToken()"); RestTemplate restTemplate = new RestTemplate(); String credentials = CLIENT_ID + ":" + CLIENT_SECRET; - String encodedCredentials = new String(Base64.encodeBase64(credentials.getBytes())); + String encodedCredentials = new String(Base64.getEncoder().encode(credentials.getBytes())); HttpHeaders headers = new HttpHeaders(); headers.setAccept(List.of(MediaType.APPLICATION_JSON)); diff --git a/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/jiraserver/JiraOAuthTokenFactory.java b/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/jiraserver/JiraOAuthTokenFactory.java index e146cbc13..f755b49ef 100644 --- a/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/jiraserver/JiraOAuthTokenFactory.java +++ b/backend/src/main/java/io/diveni/backend/service/projectmanagementproviders/jiraserver/JiraOAuthTokenFactory.java @@ -6,8 +6,7 @@ package io.diveni.backend.service.projectmanagementproviders.jiraserver; import com.google.api.client.auth.oauth.OAuthRsaSigner; -import com.google.api.client.http.apache.ApacheHttpTransport; -import com.google.api.client.util.Base64; +import com.google.api.client.http.javanet.NetHttpTransport; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; @@ -15,6 +14,8 @@ import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Base64; + public class JiraOAuthTokenFactory { protected final String accessTokenUrl; protected final String requestTokenUrl; @@ -42,7 +43,7 @@ public JiraOAuthGetAccessToken getJiraOAuthGetAccessToken( JiraOAuthGetAccessToken accessToken = new JiraOAuthGetAccessToken(accessTokenUrl); accessToken.consumerKey = consumerKey; accessToken.signer = getOAuthRsaSigner(privateKey); - accessToken.transport = new ApacheHttpTransport(); + accessToken.transport = new NetHttpTransport(); accessToken.verifier = secret; accessToken.temporaryToken = tmpToken; return accessToken; @@ -65,7 +66,7 @@ public JiraOAuthGetAccessToken getJiraOAuthGetAccessToken( JiraOAuthGetAccessToken accessToken = new JiraOAuthGetAccessToken(accessTokenUrl); accessToken.consumerKey = consumerKey; accessToken.signer = getOAuthRsaSigner(privateKey); - accessToken.transport = new ApacheHttpTransport(); + accessToken.transport = new NetHttpTransport(); accessToken.temporaryToken = tmpToken; return accessToken; } @@ -86,7 +87,7 @@ public JiraOAuthGetTemporaryToken getTemporaryToken(String consumerKey, String p new JiraOAuthGetTemporaryToken(requestTokenUrl); oAuthGetTemporaryToken.consumerKey = consumerKey; oAuthGetTemporaryToken.signer = getOAuthRsaSigner(privateKey); - oAuthGetTemporaryToken.transport = new ApacheHttpTransport(); + oAuthGetTemporaryToken.transport = new NetHttpTransport(); oAuthGetTemporaryToken.callback = "oob"; return oAuthGetTemporaryToken; } @@ -114,7 +115,7 @@ private OAuthRsaSigner getOAuthRsaSigner(String privateKey) */ private PrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException { - byte[] privateBytes = Base64.decodeBase64(privateKey); + byte[] privateBytes = Base64.getDecoder().decode(privateKey); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateBytes); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePrivate(keySpec); diff --git a/backend/src/test/java/io/diveni/backend/controller/AiControllerTest.java b/backend/src/test/java/io/diveni/backend/controller/AiControllerTest.java index b68b4f09d..5363aba6e 100644 --- a/backend/src/test/java/io/diveni/backend/controller/AiControllerTest.java +++ b/backend/src/test/java/io/diveni/backend/controller/AiControllerTest.java @@ -10,10 +10,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import java.util.HashMap; @@ -30,7 +30,7 @@ public class AiControllerTest { @Autowired private MockMvc mockMvc; - @MockBean private AiService service; + @MockitoBean private AiService service; @BeforeEach public void setUp() { diff --git a/backend/src/test/java/io/diveni/backend/controller/NewsControllerTest.java b/backend/src/test/java/io/diveni/backend/controller/NewsControllerTest.java index e8ffaab81..093fe0549 100644 --- a/backend/src/test/java/io/diveni/backend/controller/NewsControllerTest.java +++ b/backend/src/test/java/io/diveni/backend/controller/NewsControllerTest.java @@ -7,9 +7,9 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.web.client.RestClientException; @@ -35,7 +35,7 @@ public class NewsControllerTest { @Autowired private MockMvc mockMvc; - @MockBean private RestTemplate client; + @MockitoBean private RestTemplate client; @Test public void getPRs_InvalidState_returnsException() throws Exception { diff --git a/backend/src/test/java/io/diveni/backend/controller/WebsocketControllerTest.java b/backend/src/test/java/io/diveni/backend/controller/WebsocketControllerTest.java index a1360e965..499310caf 100644 --- a/backend/src/test/java/io/diveni/backend/controller/WebsocketControllerTest.java +++ b/backend/src/test/java/io/diveni/backend/controller/WebsocketControllerTest.java @@ -121,7 +121,7 @@ private String getWsPath(String format, String sessionID, String principalID) { private StompSession getAdminSession(String sessionID, String adminID) throws Exception { return webSocketStompClient - .connect( + .connectAsync( getWsPath(WS_ADMIN_PATH, sessionID, adminID), new StompSessionHandlerAdapter() { @Override @@ -139,7 +139,7 @@ public void handleException( private StompSession getMemberSession(String sessionID, String memberID) throws Exception { return webSocketStompClient - .connect( + .connectAsync( getWsPath(WS_MEMBER_PATH, sessionID, memberID), new StompSessionHandlerAdapter() {}) .get(); }