From cc69adb0ce6c248b5ee7909596b1f739c068ad3c Mon Sep 17 00:00:00 2001 From: githubmamatha Date: Mon, 3 Mar 2025 16:19:19 -0800 Subject: [PATCH 1/6] Set Request Headers --- .../config/RequestResponseInterceptor.java | 8 ++--- .../gradbusiness/config/RestWebClient.java | 29 +++++++++++++++++++ .../util/EducGradBusinessApiConstants.java | 3 ++ .../util/ThreadLocalStateUtil.java | 24 ++++++++++++++- 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RequestResponseInterceptor.java b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RequestResponseInterceptor.java index 852b8ff..0d17301 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RequestResponseInterceptor.java +++ b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RequestResponseInterceptor.java @@ -2,6 +2,7 @@ import ca.bc.gov.educ.api.gradbusiness.util.EducGradBusinessApiConstants; import ca.bc.gov.educ.api.gradbusiness.util.LogHelper; +import ca.bc.gov.educ.api.gradbusiness.util.ThreadLocalStateUtil; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.springframework.beans.factory.annotation.Autowired; @@ -12,6 +13,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.time.Instant; +import java.util.UUID; @Component @Slf4j @@ -31,6 +33,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons final long startTime = Instant.now().toEpochMilli(); request.setAttribute("startTime", startTime); } + ThreadLocalStateUtil.setCorrelationID(UUID.randomUUID().toString()); return true; } @@ -45,10 +48,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons @Override public void afterCompletion(@NonNull final HttpServletRequest request, final HttpServletResponse response, @NonNull final Object handler, final Exception ex) { LogHelper.logServerHttpReqResponseDetails(request, response, constants.isSplunkLogHelperEnabled()); - val correlationID = request.getHeader(EducGradBusinessApiConstants.CORRELATION_ID); - if (correlationID != null) { - response.setHeader(EducGradBusinessApiConstants.CORRELATION_ID, request.getHeader(EducGradBusinessApiConstants.CORRELATION_ID)); - } + ThreadLocalStateUtil.clear(); } } \ No newline at end of file diff --git a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RestWebClient.java b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RestWebClient.java index 245e8af..784e425 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RestWebClient.java +++ b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RestWebClient.java @@ -2,6 +2,7 @@ import ca.bc.gov.educ.api.gradbusiness.util.EducGradBusinessApiConstants; import ca.bc.gov.educ.api.gradbusiness.util.LogHelper; +import ca.bc.gov.educ.api.gradbusiness.util.ThreadLocalStateUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,9 +14,13 @@ import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository; import org.springframework.security.oauth2.client.web.reactive.function.client.ServletOAuth2AuthorizedClientExchangeFilterFunction; +import org.springframework.web.reactive.function.client.ClientRequest; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.UUID; @Configuration @Profile("!test") @@ -43,6 +48,8 @@ public WebClient getGraduationClientWebClient(OAuth2AuthorizedClientManager auth .maxInMemorySize(50 * 1024 * 1024)) .build()) .apply(filter.oauth2Configuration()) + .filter(setRequestHeaders()) + .filter(logRequestHeaders()) .filter(this.log()) .build(); } @@ -59,6 +66,26 @@ public OAuth2AuthorizedClientManager authorizedClientManager( return authorizedClientManager; } + private static ExchangeFilterFunction logRequestHeaders() { + return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + System.out.println("Request Headers:"); + clientRequest.headers().forEach((name, values) -> + values.forEach(value -> System.out.println(name + ": " + value)) + ); + return Mono.just(clientRequest); + }); + } + + private ExchangeFilterFunction setRequestHeaders() { + return (clientRequest, next) -> { + ClientRequest modifiedRequest = ClientRequest.from(clientRequest) + .header(EducGradBusinessApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()) + .header(EducGradBusinessApiConstants.USER_NAME, ThreadLocalStateUtil.getCurrentUser()) + .header(EducGradBusinessApiConstants.REQUEST_SOURCE, EducGradBusinessApiConstants.API_NAME) + .build(); + return next.exchange(modifiedRequest); + }; + } /** * Old web client. You can use a @Qualifier('default') to summon it. */ @@ -69,6 +96,8 @@ public WebClient webClient() { .defaultCodecs() .maxInMemorySize(300 * 1024 * 1024)) // 300MB .build()) + .filter(setRequestHeaders()) + .filter(logRequestHeaders()) .filter(this.log()) .build(); } diff --git a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/EducGradBusinessApiConstants.java b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/EducGradBusinessApiConstants.java index a77c7f9..65ce370 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/EducGradBusinessApiConstants.java +++ b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/EducGradBusinessApiConstants.java @@ -15,6 +15,9 @@ public class EducGradBusinessApiConstants { public static final String GRAD_STUDENT_API = "GRAD-STUDENT-API"; public static final String STREAM_NAME="GRAD_STATUS_EVENTS"; public static final String CORRELATION_ID = "correlationID"; + public static final String USER_NAME = "User-Name"; + public static final String REQUEST_SOURCE = "Request-Source"; + public static final String API_NAME = "EDUC-GRAD-BUSINESS-API"; //API end-point Mapping constants public static final String API_ROOT_MAPPING = ""; diff --git a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/ThreadLocalStateUtil.java b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/ThreadLocalStateUtil.java index 653cac7..837634b 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/ThreadLocalStateUtil.java +++ b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/ThreadLocalStateUtil.java @@ -1,14 +1,36 @@ package ca.bc.gov.educ.api.gradbusiness.util; public class ThreadLocalStateUtil { - private static ThreadLocal transaction = new ThreadLocal<>(); + private static InheritableThreadLocal transaction = new InheritableThreadLocal<>(); + private static final InheritableThreadLocal user = new InheritableThreadLocal(); + private static final InheritableThreadLocal requestSource = new InheritableThreadLocal(); + public static void setCorrelationID(String correlationID){ transaction.set(correlationID); } public static String getCorrelationID() { return transaction.get(); } + + public static String getCurrentUser() { + return user.get(); + } + + public static void setCurrentUser(String username) { + user.set(username); + } + + public static void setRequestSource(String reqSource){ + requestSource.set(reqSource); + } + public static String getRequestSource() { + return requestSource.get(); + } + public static void clear() { transaction.remove(); + user.remove(); + requestSource.remove(); } + } From 20168216883b0b6ca5942896f2a0c1711bd1aac2 Mon Sep 17 00:00:00 2001 From: githubmamatha Date: Mon, 3 Mar 2025 16:42:08 -0800 Subject: [PATCH 2/6] logging id and source --- .../bc/gov/educ/api/gradbusiness/util/LogHelper.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/LogHelper.java b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/LogHelper.java index 322df66..24a6c04 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/LogHelper.java +++ b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/LogHelper.java @@ -36,10 +36,8 @@ public static void logServerHttpReqResponseDetails(@NonNull final HttpServletReq httpMap.put("server_http_response_code", status); httpMap.put("server_http_request_method", request.getMethod()); httpMap.put("server_http_query_params", request.getQueryString()); - val correlationID = request.getHeader(EducGradBusinessApiConstants.CORRELATION_ID); - if (correlationID != null) { - httpMap.put("correlation_id", correlationID); - } + httpMap.put("correlation_id", ThreadLocalStateUtil.getCorrelationID()); + httpMap.put("request_source", EducGradBusinessApiConstants.API_NAME); httpMap.put("server_http_request_url", String.valueOf(request.getRequestURL())); httpMap.put("server_http_request_processing_time_ms", totalTime); httpMap.put("server_http_request_payload", String.valueOf(request.getAttribute("payload"))); @@ -61,7 +59,7 @@ public static void logServerHttpReqResponseDetails(@NonNull final HttpServletReq * @param responseCode * @param correlationID */ - public static void logClientHttpReqResponseDetails(@NonNull final HttpMethod method, final String url, final int responseCode, final List correlationID, final boolean logging) { + public static void logClientHttpReqResponseDetails(@NonNull final HttpMethod method, final String url, final int responseCode, final List correlationID, final List requestSource, final boolean logging) { if (!logging) return; try { final Map httpMap = new HashMap<>(); @@ -71,6 +69,9 @@ public static void logClientHttpReqResponseDetails(@NonNull final HttpMethod met if (correlationID != null) { httpMap.put("correlation_id", String.join(",", correlationID)); } + if (requestSource != null) { + httpMap.put("request_source", String.join(",", requestSource)); + } MDC.putCloseable("httpEvent", mapper.writeValueAsString(httpMap)); log.info(""); MDC.clear(); From 198a55f1ffa8cf52a1b4dcb7a7e2219d87464da9 Mon Sep 17 00:00:00 2001 From: githubmamatha Date: Mon, 3 Mar 2025 17:08:15 -0800 Subject: [PATCH 3/6] corrected logs --- .../educ/api/gradbusiness/config/RestWebClient.java | 13 +------------ .../gov/educ/api/gradbusiness/util/LogHelper.java | 12 +++++++++--- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RestWebClient.java b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RestWebClient.java index 784e425..65a8c95 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RestWebClient.java +++ b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RestWebClient.java @@ -49,7 +49,6 @@ public WebClient getGraduationClientWebClient(OAuth2AuthorizedClientManager auth .build()) .apply(filter.oauth2Configuration()) .filter(setRequestHeaders()) - .filter(logRequestHeaders()) .filter(this.log()) .build(); } @@ -66,16 +65,6 @@ public OAuth2AuthorizedClientManager authorizedClientManager( return authorizedClientManager; } - private static ExchangeFilterFunction logRequestHeaders() { - return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { - System.out.println("Request Headers:"); - clientRequest.headers().forEach((name, values) -> - values.forEach(value -> System.out.println(name + ": " + value)) - ); - return Mono.just(clientRequest); - }); - } - private ExchangeFilterFunction setRequestHeaders() { return (clientRequest, next) -> { ClientRequest modifiedRequest = ClientRequest.from(clientRequest) @@ -97,7 +86,6 @@ public WebClient webClient() { .maxInMemorySize(300 * 1024 * 1024)) // 300MB .build()) .filter(setRequestHeaders()) - .filter(logRequestHeaders()) .filter(this.log()) .build(); } @@ -110,6 +98,7 @@ private ExchangeFilterFunction log() { clientRequest.url().toString(), clientResponse.statusCode().value(), clientRequest.headers().get(EducGradBusinessApiConstants.CORRELATION_ID), + clientRequest.headers().get(EducGradBusinessApiConstants.REQUEST_SOURCE), constants.isSplunkLogHelperEnabled()) )); } diff --git a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/LogHelper.java b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/LogHelper.java index 24a6c04..1fbad85 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/LogHelper.java +++ b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/LogHelper.java @@ -36,8 +36,14 @@ public static void logServerHttpReqResponseDetails(@NonNull final HttpServletReq httpMap.put("server_http_response_code", status); httpMap.put("server_http_request_method", request.getMethod()); httpMap.put("server_http_query_params", request.getQueryString()); - httpMap.put("correlation_id", ThreadLocalStateUtil.getCorrelationID()); - httpMap.put("request_source", EducGradBusinessApiConstants.API_NAME); + val correlationID = request.getHeader(EducGradBusinessApiConstants.CORRELATION_ID); + if (correlationID != null) { + httpMap.put("correlation_id", correlationID); + } + val requestSource = request.getHeader(EducGradBusinessApiConstants.REQUEST_SOURCE); + if (requestSource != null) { + httpMap.put("request_source", requestSource); + } httpMap.put("server_http_request_url", String.valueOf(request.getRequestURL())); httpMap.put("server_http_request_processing_time_ms", totalTime); httpMap.put("server_http_request_payload", String.valueOf(request.getAttribute("payload"))); @@ -70,7 +76,7 @@ public static void logClientHttpReqResponseDetails(@NonNull final HttpMethod met httpMap.put("correlation_id", String.join(",", correlationID)); } if (requestSource != null) { - httpMap.put("request_source", String.join(",", requestSource)); + httpMap.put("requestSource", String.join(",", requestSource)); } MDC.putCloseable("httpEvent", mapper.writeValueAsString(httpMap)); log.info(""); From 6bfb92fa8be41849c250475146ab8a7504bec78b Mon Sep 17 00:00:00 2001 From: githubmamatha Date: Mon, 3 Mar 2025 20:46:35 -0800 Subject: [PATCH 4/6] test cases issue fix --- .../gov/educ/api/gradbusiness/service/RESTService.java | 2 -- .../api/gradbusiness/service/RESTServicePOSTTest.java | 10 ++++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/service/RESTService.java b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/service/RESTService.java index 7a69010..b97eb4b 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/service/RESTService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/service/RESTService.java @@ -34,7 +34,6 @@ public T get(String url, Class clazz) { obj = graduationServiceWebClient .get() .uri(url) - .headers(h -> h.set(EducGradBusinessApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID())) .retrieve() // if 5xx errors, throw Service error .onStatus(HttpStatusCode::is5xxServerError, @@ -63,7 +62,6 @@ public T post(String url, Object body, Class clazz) { try { obj = graduationServiceWebClient.post() .uri(url) - .headers(h -> h.set(EducGradBusinessApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID())) .body(BodyInserters.fromValue(body)) .retrieve() .onStatus(HttpStatusCode::is5xxServerError, diff --git a/api/src/test/java/ca/bc/gov/educ/api/gradbusiness/service/RESTServicePOSTTest.java b/api/src/test/java/ca/bc/gov/educ/api/gradbusiness/service/RESTServicePOSTTest.java index fc676f5..6cf306b 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/gradbusiness/service/RESTServicePOSTTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/gradbusiness/service/RESTServicePOSTTest.java @@ -1,11 +1,13 @@ package ca.bc.gov.educ.api.gradbusiness.service; import ca.bc.gov.educ.api.gradbusiness.exception.ServiceException; +import ca.bc.gov.educ.api.gradbusiness.util.ThreadLocalStateUtil; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.runner.RunWith; +import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -58,10 +60,12 @@ public class RESTServicePOSTTest { @Before public void setUp(){ + Mockito.reset(webClient, graduationClientWebClient, responseMock, requestHeadersMock, requestBodyMock, requestBodyUriMock); + ThreadLocalStateUtil.clear(); when(this.webClient.post()).thenReturn(this.requestBodyUriMock); when(this.graduationClientWebClient.post()).thenReturn(this.requestBodyUriMock); - when(this.requestBodyUriMock.uri(any(String.class))).thenReturn(this.requestBodyUriMock); - when(this.requestBodyUriMock.headers(any(Consumer.class))).thenReturn(this.requestBodyMock); + when(this.requestBodyUriMock.uri(any(String.class))).thenReturn(this.requestBodyMock); + when(this.requestBodyMock.headers(any(Consumer.class))).thenReturn(this.requestBodyMock); when(this.requestBodyMock.contentType(any())).thenReturn(this.requestBodyMock); when(this.requestBodyMock.body(any(BodyInserter.class))).thenReturn(this.requestHeadersMock); when(this.requestHeadersMock.retrieve()).thenReturn(this.responseMock); @@ -70,6 +74,8 @@ public void setUp(){ @Test public void testPostOverride_GivenProperData_Expect200Response(){ + ThreadLocalStateUtil.setCorrelationID("test-correlation-id"); + ThreadLocalStateUtil.setCurrentUser("test-user"); when(this.responseMock.onStatus(any(), any())).thenReturn(this.responseMock); byte[] response = this.restService.post(TEST_URL, TEST_BODY, byte[].class); Assert.assertArrayEquals(TEST_BYTES, response); From f9dee61fff4672a108a65a16d4decbe508622b22 Mon Sep 17 00:00:00 2001 From: githubmamatha Date: Mon, 10 Mar 2025 14:18:08 -0700 Subject: [PATCH 5/6] Added JwtUtil --- .../config/RequestResponseInterceptor.java | 32 +++++++++- .../educ/api/gradbusiness/util/JwtUtil.java | 60 +++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/JwtUtil.java diff --git a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RequestResponseInterceptor.java b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RequestResponseInterceptor.java index 0d17301..9b6612e 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RequestResponseInterceptor.java +++ b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/config/RequestResponseInterceptor.java @@ -1,12 +1,17 @@ package ca.bc.gov.educ.api.gradbusiness.config; import ca.bc.gov.educ.api.gradbusiness.util.EducGradBusinessApiConstants; +import ca.bc.gov.educ.api.gradbusiness.util.JwtUtil; import ca.bc.gov.educ.api.gradbusiness.util.LogHelper; import ca.bc.gov.educ.api.gradbusiness.util.ThreadLocalStateUtil; import lombok.extern.slf4j.Slf4j; import lombok.val; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.lang.NonNull; +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.stereotype.Component; import org.springframework.web.servlet.AsyncHandlerInterceptor; @@ -33,7 +38,32 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons final long startTime = Instant.now().toEpochMilli(); request.setAttribute("startTime", startTime); } - ThreadLocalStateUtil.setCorrelationID(UUID.randomUUID().toString()); + // correlationID + val correlationID = request.getHeader(EducGradBusinessApiConstants.CORRELATION_ID); + ThreadLocalStateUtil.setCorrelationID(correlationID != null ? correlationID : UUID.randomUUID().toString()); + + //Request Source + val requestSource = request.getHeader(EducGradBusinessApiConstants.REQUEST_SOURCE); + if(requestSource != null) { + ThreadLocalStateUtil.setRequestSource(requestSource); + } + + // Header userName + val userName = request.getHeader(EducGradBusinessApiConstants.USER_NAME); + if (userName != null) { + ThreadLocalStateUtil.setCurrentUser(userName); + } + else { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + if (auth instanceof JwtAuthenticationToken) { + JwtAuthenticationToken authenticationToken = (JwtAuthenticationToken) auth; + Jwt jwt = (Jwt) authenticationToken.getCredentials(); + String username = JwtUtil.getName(jwt); + if (username != null) { + ThreadLocalStateUtil.setCurrentUser(username); + } + } + } return true; } diff --git a/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/JwtUtil.java b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/JwtUtil.java new file mode 100644 index 0000000..5d50ae9 --- /dev/null +++ b/api/src/main/java/ca/bc/gov/educ/api/gradbusiness/util/JwtUtil.java @@ -0,0 +1,60 @@ +package ca.bc.gov.educ.api.gradbusiness.util; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.oauth2.jwt.Jwt; + +import java.util.Map; + +/** + * The type JWT util. + */ +public class JwtUtil { + + private JwtUtil() { + } + + /** + * Gets username string from object. + * + * @param jwt the JWT + * @return the username string from jwt + */ + public static String getUsername(Jwt jwt) { + return (String) jwt.getClaims().get("preferred_username"); + } + + /** + * Gets email string from object. + * + * @param jwt the JWT + * @return the username string from jwt + */ + public static String getEmail(Jwt jwt) { + return (String) jwt.getClaims().get("email"); + } + + /** + * Gets name string from object. + * + * @param jwt the JWT + * @return the username string from jwt + */ + public static String getName(Jwt jwt) { + StringBuilder sb = new StringBuilder(); + if (isServiceAccount(jwt.getClaims())) { + sb.append("Batch Process"); + } else { + String givenName = (String) jwt.getClaims().get("given_name"); + if (StringUtils.isNotBlank(givenName)) { + sb.append(givenName.charAt(0)); + } + String familyName = (String) jwt.getClaims().get("family_name"); + sb.append(familyName); + } + return sb.toString(); + } + + private static boolean isServiceAccount(Map claims) { + return !claims.containsKey("family_name"); + } +} From 10958682762d5f4095532aca498c585dddc49cb4 Mon Sep 17 00:00:00 2001 From: githubmamatha Date: Mon, 10 Mar 2025 14:21:43 -0700 Subject: [PATCH 6/6] Cache version upgraded --- .github/workflows/on.pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/on.pr.yml b/.github/workflows/on.pr.yml index 0a24f2d..0a7e360 100644 --- a/.github/workflows/on.pr.yml +++ b/.github/workflows/on.pr.yml @@ -25,7 +25,7 @@ jobs: with: distribution: 'corretto' java-version: 18 - - uses: actions/cache@v1 + - uses: actions/cache@v4 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-5Jun-${{ hashFiles('**/pom.xml') }}