diff --git a/apps/backend/pom.xml b/apps/backend/pom.xml index e9adfd815..5bf53d9c7 100644 --- a/apps/backend/pom.xml +++ b/apps/backend/pom.xml @@ -27,7 +27,7 @@ 4.21.0 4.4 - 2.10.0 + 3.0.0 1.9.1 @@ -36,6 +36,8 @@ 30.1-jre 2.3 5.7.0 + 15.0 + 4.2.1 6.1.0 @@ -342,6 +344,21 @@ + + net.java.dev.jna + jna-platform + ${jna.version} + + + org.jetbrains + annotations + ${jetbrains.annotation.version} + + + org.codehaus.woodstox + stax2-api + ${stax2-api.version} + org.scala-lang diff --git a/apps/backend/src/main/java/no/nav/data/common/security/azure/AzureAdService.java b/apps/backend/src/main/java/no/nav/data/common/security/azure/AzureAdService.java index c3ef9fabe..dec41e2ba 100644 --- a/apps/backend/src/main/java/no/nav/data/common/security/azure/AzureAdService.java +++ b/apps/backend/src/main/java/no/nav/data/common/security/azure/AzureAdService.java @@ -2,14 +2,16 @@ import com.microsoft.graph.core.ClientException; import com.microsoft.graph.http.GraphServiceException; -import com.microsoft.graph.models.extensions.IGraphServiceClient; +import com.microsoft.graph.models.UserSendMailParameterSet; import com.microsoft.graph.options.QueryOption; +import com.microsoft.graph.requests.GraphServiceClient; import lombok.extern.slf4j.Slf4j; import no.nav.data.common.exceptions.TechnicalException; import no.nav.data.common.exceptions.TimeoutException; import no.nav.data.common.security.azure.support.GraphLogger; import no.nav.data.common.security.azure.support.MailLog; import no.nav.data.common.storage.StorageService; +import okhttp3.Request; import org.springframework.stereotype.Service; import org.springframework.util.StreamUtils; @@ -39,7 +41,10 @@ public byte[] lookupProfilePictureByNavIdent(String navIdent) { public void sendMail(String to, String subject, String messageBody) { getMailGraphClient().me() - .sendMail(compose(to, subject, messageBody), false) + .sendMail(UserSendMailParameterSet.newBuilder() + .withMessage(compose(to, subject, messageBody)) + .withSaveToSentItems(false) + .build()) .buildRequest() .post(); @@ -78,11 +83,11 @@ private byte[] lookupUserProfilePicture(String id) { } } - private IGraphServiceClient getMailGraphClient() { + private GraphServiceClient getMailGraphClient() { return azureTokenProvider.getGraphClient(azureTokenProvider.getMailAccessToken()); } - private IGraphServiceClient getAppGraphClient() { + private GraphServiceClient getAppGraphClient() { return azureTokenProvider.getGraphClient(azureTokenProvider.getApplicationTokenForResource(MICROSOFT_GRAPH_SCOPE_APP)); } } diff --git a/apps/backend/src/main/java/no/nav/data/common/security/azure/AzureTokenProvider.java b/apps/backend/src/main/java/no/nav/data/common/security/azure/AzureTokenProvider.java index bad74c710..38603b33e 100644 --- a/apps/backend/src/main/java/no/nav/data/common/security/azure/AzureTokenProvider.java +++ b/apps/backend/src/main/java/no/nav/data/common/security/azure/AzureTokenProvider.java @@ -12,10 +12,7 @@ import com.microsoft.aad.msal4j.RefreshTokenParameters; import com.microsoft.aad.msal4j.ResponseMode; import com.microsoft.aad.msal4j.UserNamePasswordParameters; -import com.microsoft.graph.concurrency.DefaultExecutors; -import com.microsoft.graph.logger.DefaultLogger; -import com.microsoft.graph.models.extensions.IGraphServiceClient; -import com.microsoft.graph.requests.extensions.GraphServiceClient; +import com.microsoft.graph.requests.GraphServiceClient; import com.nimbusds.oauth2.sdk.pkce.CodeChallengeMethod; import io.prometheus.client.Summary; import lombok.extern.slf4j.Slf4j; @@ -30,22 +27,21 @@ import no.nav.data.common.security.dto.OAuthState; import no.nav.data.common.utils.Constants; import no.nav.data.common.utils.MetricUtils; +import okhttp3.Request; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import org.springframework.util.ReflectionUtils; -import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URI; import java.net.URL; import java.time.Duration; import java.util.Set; -import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.CompletableFuture; import static java.util.Objects.requireNonNull; import static no.nav.data.common.security.SecurityConstants.SESS_ID_LEN; @@ -61,7 +57,6 @@ public class AzureTokenProvider implements TokenProvider { private final IConfidentialClientApplication msalClient; private final PublicClientApplication msalPublicClient; private final AuthService authService; - private final MdcMsalExecutor msalExecutor; private final ConfidentialClientApplication confidentialClientApplication; private final AADAuthenticationProperties aadAuthProps; @@ -71,13 +66,12 @@ public class AzureTokenProvider implements TokenProvider { public AzureTokenProvider(AADAuthenticationProperties aadAuthProps, IConfidentialClientApplication msalClient, PublicClientApplication msalPublicClient, - AuthService authService, ThreadPoolExecutor msalThreadPool, + AuthService authService, ConfidentialClientApplication confidentialClientApplication, Encryptor encryptor) { this.aadAuthProps = aadAuthProps; this.msalClient = msalClient; this.msalPublicClient = msalPublicClient; this.authService = authService; - this.msalExecutor = new MdcMsalExecutor(msalThreadPool); this.confidentialClientApplication = confidentialClientApplication; this.encryptor = encryptor; this.tokenMetrics = MetricUtils.summary() @@ -96,10 +90,11 @@ public AzureTokenProvider(AADAuthenticationProperties aadAuthProps, MetricUtils.register("accessTokenCache", accessTokenCache); } - IGraphServiceClient getGraphClient(String accessToken) { + // buildClient has omitted it's generic type... + @SuppressWarnings("unchecked") + GraphServiceClient getGraphClient(String accessToken) { return GraphServiceClient.builder() - .authenticationProvider(request -> request.addHeader(HttpHeaders.AUTHORIZATION, TOKEN_TYPE + accessToken)) - .executors(msalExecutor) + .authenticationProvider(url -> CompletableFuture.completedFuture(accessToken)) .logger(new GraphLogger()) .buildClient(); } @@ -226,24 +221,4 @@ private IAuthenticationResult acquireTokenByCredential(String resource) { } } - private static class MdcMsalExecutor extends DefaultExecutors { - - static Field backgroundExecutor; - - static { - backgroundExecutor = ReflectionUtils.findField(DefaultExecutors.class, "backgroundExecutor", ThreadPoolExecutor.class); - Assert.notNull(backgroundExecutor, "couldn't find executor field"); - backgroundExecutor.setAccessible(true); - } - - public MdcMsalExecutor(ThreadPoolExecutor threadPoolExecutor) { - super(new DefaultLogger()); - try { - backgroundExecutor.set(this, threadPoolExecutor); - } catch (Exception e) { - throw new TechnicalException("reflection error", e); - } - } - } - } diff --git a/apps/backend/src/main/java/no/nav/data/common/security/azure/support/MailMessage.java b/apps/backend/src/main/java/no/nav/data/common/security/azure/support/MailMessage.java index d1693057b..42b45c461 100644 --- a/apps/backend/src/main/java/no/nav/data/common/security/azure/support/MailMessage.java +++ b/apps/backend/src/main/java/no/nav/data/common/security/azure/support/MailMessage.java @@ -1,10 +1,10 @@ package no.nav.data.common.security.azure.support; -import com.microsoft.graph.models.extensions.EmailAddress; -import com.microsoft.graph.models.extensions.ItemBody; -import com.microsoft.graph.models.extensions.Message; -import com.microsoft.graph.models.extensions.Recipient; -import com.microsoft.graph.models.generated.BodyType; +import com.microsoft.graph.models.BodyType; +import com.microsoft.graph.models.EmailAddress; +import com.microsoft.graph.models.ItemBody; +import com.microsoft.graph.models.Message; +import com.microsoft.graph.models.Recipient; import lombok.experimental.UtilityClass; import java.util.List;