diff --git a/pom.xml b/pom.xml index 936b09e1df9175f5393b78446501b528c4fb395b..495c3be485b9b30d8823593c76ef1f9203c30c79 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ <parent> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-parent</artifactId> - <version>4.6.0</version> + <version>4.9.0-SNAPSHOT</version> </parent> <groupId>de.ozgcloud.osiv2</groupId> @@ -42,13 +42,23 @@ </dependency> <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-oauth2-client</artifactId> + <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-webflux</artifactId> + <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency> + +<!-- <dependency>--> +<!-- <groupId>org.springframework.boot</groupId>--> +<!-- <artifactId>spring-boot-starter-oauth2-client</artifactId>--> +<!-- </dependency>--> +<!-- <dependency>--> +<!-- <groupId>org.springframework.boot</groupId>--> +<!-- <artifactId>spring-boot-starter-security</artifactId>--> +<!-- </dependency>--> + <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> @@ -95,8 +105,6 @@ <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> </dependency> - - <!-- used by generated code --> <!-- @Nullable annotation --> <dependency> diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java index 4fad50c977fdf20a3bddfe5f72fe7dfa5063ae25..df03b3f970eef27b799fc8a471a85ca531c83e10 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java @@ -2,7 +2,6 @@ package de.ozgcloud.nachrichten.postfach.osiv2.config; import org.apache.hc.client5.http.auth.AuthScope; import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; -import org.apache.hc.client5.http.classic.HttpClient; import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.core5.http.HttpHost; @@ -12,19 +11,9 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.security.oauth2.client.AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager; -import org.springframework.security.oauth2.client.InMemoryReactiveOAuth2AuthorizedClientService; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; -import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientProvider; -import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientProviderBuilder; -import org.springframework.security.oauth2.client.endpoint.WebClientReactiveClientCredentialsTokenResponseClient; -import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; -import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; +import org.springframework.security.oauth2.client.web.client.OAuth2ClientHttpRequestInterceptor; import org.springframework.web.client.RestClient; -import org.springframework.web.reactive.function.client.WebClient; import de.ozgcloud.nachrichten.postfach.osiv2.gen.ApiClient; import de.ozgcloud.nachrichten.postfach.osiv2.gen.api.MessageExchangeApi; @@ -73,86 +62,86 @@ public class ApiClientConfiguration { } private ClientHttpRequestInterceptor createOAuth2Interceptor(OAuth2AuthorizedClientManager authorizedClientManager) { - OAuth2ClientHttpRequestInterceptor interceptor = new OAuth2ClientHttpRequestInterceptor(authorizedClientManager); - - } - - - @Bean - ApiClient apiClient(ReactiveClientRegistrationRepository clientRegistrations) { - return new ApiClient(osi2PostfachWebClient(clientRegistrations)) - .setBasePath(apiConfiguration.getUrl()); - } - - private WebClient osi2PostfachWebClient( - ReactiveClientRegistrationRepository clientRegistrations) { - return WebClient.builder() - .clientConnector(new ReactorClientHttpConnector(httpClient())) - .filter(serverOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations)) - .build(); - } - - @SuppressWarnings("ConstantConditions") - private HttpClient httpClient() { - var webClient = HttpClient.create(); - return proxyConfiguration.isEnabled() ? webClient - .proxy(proxy -> proxy - .type(ProxyProvider.Proxy.HTTP) - .host(proxyConfiguration.getHost()) - .port(proxyConfiguration.getPort()) - .username(proxyConfiguration.getUsername()) - .password(username -> proxyConfiguration.getPassword()) - ) : webClient; - } - - private ServerOAuth2AuthorizedClientExchangeFilterFunction serverOAuth2AuthorizedClientExchangeFilterFunction( - ReactiveClientRegistrationRepository clientRegistrations) { - - var oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager(clientRegistrations)); - oauth.setDefaultClientRegistrationId("osi2"); - return oauth; - } - - private AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager( - ReactiveClientRegistrationRepository clientRegistrations) { - var clientService = new InMemoryReactiveOAuth2AuthorizedClientService( - clientRegistrations); - var authorizedClientManager = new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager( - clientRegistrations, clientService); - - authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider()); - - return authorizedClientManager; + var interceptor = new OAuth2ClientHttpRequestInterceptor(authorizedClientManager); + return interceptor; } - private ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider() { - return ReactiveOAuth2AuthorizedClientProviderBuilder.builder() - .clientCredentials(builder -> - builder.accessTokenResponseClient(clientCredentialsTokenResponseClient()) - ) - .build(); - } - private WebClientReactiveClientCredentialsTokenResponseClient clientCredentialsTokenResponseClient() { - var client = new WebClientReactiveClientCredentialsTokenResponseClient(); - configureHttpClientForTokenRequests(client); - configureParametersForTokenRequests(client); - return client; - } - - private void configureHttpClientForTokenRequests(WebClientReactiveClientCredentialsTokenResponseClient client) { - client.setWebClient(WebClient.builder() - .clientConnector(new ReactorClientHttpConnector(httpClient())) - .build()); - } - - private void configureParametersForTokenRequests(WebClientReactiveClientCredentialsTokenResponseClient client) { - client.addParametersConverter(source -> { - MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>(); - // Pass a resource indicator parameter https://datatracker.ietf.org/doc/html/rfc8707 - parameters.add("resource", apiConfiguration.getResource()); - return parameters; - }); - } +// @Bean +// ApiClient apiClient(ReactiveClientRegistrationRepository clientRegistrations) { +// return new ApiClient(osi2PostfachWebClient(clientRegistrations)) +// .setBasePath(apiConfiguration.getUrl()); +// } + +// private WebClient osi2PostfachWebClient( +// ReactiveClientRegistrationRepository clientRegistrations) { +// return WebClient.builder() +// .clientConnector(new ReactorClientHttpConnector(httpClient())) +// .filter(serverOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations)) +// .build(); +// } +// +// @SuppressWarnings("ConstantConditions") +// private HttpClient httpClient() { +// var webClient = HttpClient.create(); +// return proxyConfiguration.isEnabled() ? webClient +// .proxy(proxy -> proxy +// .type(ProxyProvider.Proxy.HTTP) +// .host(proxyConfiguration.getHost()) +// .port(proxyConfiguration.getPort()) +// .username(proxyConfiguration.getUsername()) +// .password(username -> proxyConfiguration.getPassword()) +// ) : webClient; +// } +// +// private ServerOAuth2AuthorizedClientExchangeFilterFunction serverOAuth2AuthorizedClientExchangeFilterFunction( +// ReactiveClientRegistrationRepository clientRegistrations) { +// +// var oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager(clientRegistrations)); +// oauth.setDefaultClientRegistrationId("osi2"); +// return oauth; +// } +// +// private AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager( +// ReactiveClientRegistrationRepository clientRegistrations) { +// var clientService = new InMemoryReactiveOAuth2AuthorizedClientService( +// clientRegistrations); +// var authorizedClientManager = new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager( +// clientRegistrations, clientService); +// +// authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider()); +// +// return authorizedClientManager; +// } +// +// private ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider() { +// return ReactiveOAuth2AuthorizedClientProviderBuilder.builder() +// .clientCredentials(builder -> +// builder.accessTokenResponseClient(clientCredentialsTokenResponseClient()) +// ) +// .build(); +// } +// +// private WebClientReactiveClientCredentialsTokenResponseClient clientCredentialsTokenResponseClient() { +// var client = new WebClientReactiveClientCredentialsTokenResponseClient(); +// configureHttpClientForTokenRequests(client); +// configureParametersForTokenRequests(client); +// return client; +// } +// +// private void configureHttpClientForTokenRequests(WebClientReactiveClientCredentialsTokenResponseClient client) { +// client.setWebClient(WebClient.builder() +// .clientConnector(new ReactorClientHttpConnector(httpClient())) +// .build()); +// } +// +// private void configureParametersForTokenRequests(WebClientReactiveClientCredentialsTokenResponseClient client) { +// client.addParametersConverter(source -> { +// MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>(); +// // Pass a resource indicator parameter https://datatracker.ietf.org/doc/html/rfc8707 +// parameters.add("resource", apiConfiguration.getResource()); +// return parameters; +// }); +// } } diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java index f8a3c19c34125ece0bf242dea493888a2fd2050c..139ba192c9394ddb55d2657e094a2d9d15765866 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java @@ -22,7 +22,6 @@ import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.MessageExchangeReceiveMe import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.MessageExchangeSendMessageResponse; import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.OutSendMessageRequestV2; import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.V1ReplyMessage; -import reactor.core.publisher.Mono; class PostfachApiFacadeServiceTest { @@ -52,10 +51,9 @@ class PostfachApiFacadeServiceTest { @BeforeEach void mock() { - var responseMono = Mono.just(messageExchangeSendMessageResponse); when(requestMapper.mapMailboxId(nachricht)).thenReturn(MAILBOX_ID); when(requestMapper.mapOutSendMessageRequestV2(nachricht)).thenReturn(outSendMessageRequestV2); - when(messageExchangeApi.sendMessage(any(), any())).thenReturn(responseMono); + when(messageExchangeApi.sendMessage(any(), any())).thenReturn(messageExchangeSendMessageResponse); } @DisplayName("should call sendMessage") @@ -77,8 +75,7 @@ class PostfachApiFacadeServiceTest { @BeforeEach void mock(){ - var responseMono = Mono.just(messageExchangeReceiveMessagesResponse); - when(messageExchangeApi.receiveMessages(anyInt(),anyInt())).thenReturn(responseMono); + when(messageExchangeApi.receiveMessages(anyInt(),anyInt())).thenReturn(messageExchangeReceiveMessagesResponse); } @Test @@ -100,8 +97,7 @@ class PostfachApiFacadeServiceTest { @Test void shouldCallGetMessage(){ - var replyMono = Mono.just(replyMessage); - when(messageExchangeApi.getMessage(any())).thenReturn(replyMono); + when(messageExchangeApi.getMessage(any())).thenReturn(replyMessage); postfachApiFacadeService.fetchMessageByGuid(receiveMessage); @@ -110,8 +106,7 @@ class PostfachApiFacadeServiceTest { @Test void shouldCallResponseMapper(){ - var replyMono = Mono.just(replyMessage); - when(messageExchangeApi.getMessage(any())).thenReturn(replyMono); + when(messageExchangeApi.getMessage(any())).thenReturn(replyMessage); when(responseMapper.toPostfachNachricht(any())).thenReturn(PostfachNachrichtTestFactory.create()); postfachApiFacadeService.fetchMessageByGuid(receiveMessage); @@ -121,8 +116,7 @@ class PostfachApiFacadeServiceTest { @Test void shouldReturnPostfachNachricht(){ - var replyMono = Mono.just(replyMessage); - when(messageExchangeApi.getMessage(any())).thenReturn(replyMono); + when(messageExchangeApi.getMessage(any())).thenReturn(replyMessage); when(responseMapper.toPostfachNachricht(any())).thenReturn(PostfachNachrichtTestFactory.create()); var postfachNachricht = postfachApiFacadeService.fetchMessageByGuid(receiveMessage); @@ -139,8 +133,7 @@ class PostfachApiFacadeServiceTest { @Test void shouldCallDeleteMessage(){ - var replyMono = Mono.just(replyMessage); - when(messageExchangeApi.deleteMessage(any())).thenReturn(replyMono); + when(messageExchangeApi.deleteMessage(any())).thenReturn(replyMessage); postfachApiFacadeService.deleteMessage(UUID.randomUUID().toString());