From b174e3f17761c9cecd616598114118b437e916b8 Mon Sep 17 00:00:00 2001
From: Jan Zickermann <jan.zickermann@dataport.de>
Date: Fri, 24 Jan 2025 12:50:14 +0100
Subject: [PATCH] OZG-4095 config: Configure proxy

---
 .../osiv2/config/ApiClientConfiguration.java  | 49 ++++++++++++++-----
 .../OsiPostfachRemoteServiceRemoteITCase.java |  4 +-
 2 files changed, 40 insertions(+), 13 deletions(-)

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 d8671c1..2cb4f19 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
@@ -10,14 +10,17 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.http.client.ClientHttpRequestFactory;
 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.http.converter.FormHttpMessageConverter;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.oauth2.client.AuthorizedClientServiceOAuth2AuthorizedClientManager;
 import org.springframework.security.oauth2.client.InMemoryOAuth2AuthorizedClientService;
 import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider;
 import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder;
 import org.springframework.security.oauth2.client.endpoint.RestClientClientCredentialsTokenResponseClient;
+import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler;
 import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
 import org.springframework.security.oauth2.client.web.client.OAuth2ClientHttpRequestInterceptor;
+import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestClient;
@@ -53,30 +56,40 @@ public class ApiClientConfiguration {
 				new OAuth2ClientHttpRequestInterceptor(authorizedClientManager(clientRegistrations));
 		requestInterceptor.setClientRegistrationIdResolver(request -> "osi2");
 
-		return RestClient.builder()
+		return defaultRestClientBuilder()
 				.requestInterceptor(requestInterceptor)
 				.build();
 	}
 
+	private RestClient.Builder defaultRestClientBuilder() {
+		return RestClient.builder()
+				.requestFactory(createProxyRequestFactory());
+	}
+
 	private ClientHttpRequestFactory createProxyRequestFactory() {
 		var requestFactory = new HttpComponentsClientHttpRequestFactory();
 		if (proxyConfiguration.isEnabled()) {
-			var credsProvider = new BasicCredentialsProvider();
-			credsProvider.setCredentials(
-					new AuthScope(proxyConfiguration.getHost(), proxyConfiguration.getPort()),
-					//TODO: hier brauchen wir noch eine Ordentliche Lösung
-					//					new UsernamePasswordCredentials(proxyConfiguration.getUsername(), proxyConfiguration.getPassword().toCharArray())
-					new UsernamePasswordCredentials("", "".toCharArray())
+			requestFactory.setHttpClient(
+					HttpClientBuilder.create()
+							.setProxy(new HttpHost(proxyConfiguration.getHost(), proxyConfiguration.getPort()))
+							.setDefaultCredentialsProvider(basicCredentialsProviderForProxy())
+							.build()
 			);
-			var httpClient = HttpClientBuilder.create()
-					.setProxy(new HttpHost(proxyConfiguration.getHost(), proxyConfiguration.getPort()))
-					.setDefaultCredentialsProvider(credsProvider)
-					.build();
-			requestFactory.setHttpClient(httpClient);
 		}
 		return requestFactory;
 	}
 
+	private BasicCredentialsProvider basicCredentialsProviderForProxy() {
+		var credentialsProvider = new BasicCredentialsProvider();
+		var username = proxyConfiguration.getUsername();
+		var password = proxyConfiguration.getPassword();
+		if (username != null && password != null) {
+			credentialsProvider.setCredentials(new AuthScope(proxyConfiguration.getHost(), proxyConfiguration.getPort()),
+					new UsernamePasswordCredentials(username, password.toCharArray()));
+		}
+		return credentialsProvider;
+	}
+
 	private AuthorizedClientServiceOAuth2AuthorizedClientManager authorizedClientManager(
 			ClientRegistrationRepository clientRegistrations) {
 		var clientService = new InMemoryOAuth2AuthorizedClientService(
@@ -99,10 +112,22 @@ public class ApiClientConfiguration {
 
 	private RestClientClientCredentialsTokenResponseClient clientCredentialsTokenResponseClient() {
 		var client = new RestClientClientCredentialsTokenResponseClient();
+		configureClientCredentialsRestClient(client);
 		configureParametersForTokenRequests(client);
 		return client;
 	}
 
+	private void configureClientCredentialsRestClient(RestClientClientCredentialsTokenResponseClient client) {
+		client.setRestClient(defaultRestClientBuilder()
+				.messageConverters(messageConverters -> {
+					messageConverters.clear();
+					messageConverters.add(new FormHttpMessageConverter());
+					messageConverters.add(new OAuth2AccessTokenResponseHttpMessageConverter());
+				})
+				.defaultStatusHandler(new OAuth2ErrorResponseErrorHandler())
+				.build());
+	}
+
 	private void configureParametersForTokenRequests(RestClientClientCredentialsTokenResponseClient client) {
 		client.addParametersConverter(source -> {
 			MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java
index 6012b3c..9978f98 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java
@@ -83,8 +83,10 @@ public class OsiPostfachRemoteServiceRemoteITCase {
 		@Test
 		void shouldReceiveAllMessage(){
 			Stream<PostfachNachricht> allMessages = osiPostfachRemoteService.getAllMessages();
+
 			var messages = allMessages.toList();
-			assertThat(messages.size() > 0);
+
+			assertThat(messages).isNotEmpty();
 		}
 	}
 
-- 
GitLab