Skip to content

Commit f8982bd

Browse files
committed
Polish 'Support userInfo in elasticsearch URI'
See gh-21381
1 parent a72179a commit f8982bd

File tree

2 files changed

+65
-29
lines changed

2 files changed

+65
-29
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java

Lines changed: 65 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
package org.springframework.boot.autoconfigure.elasticsearch;
1818

1919
import java.net.URI;
20+
import java.net.URISyntaxException;
2021
import java.time.Duration;
2122

2223
import org.apache.http.HttpHost;
2324
import org.apache.http.auth.AuthScope;
2425
import org.apache.http.auth.Credentials;
2526
import org.apache.http.auth.UsernamePasswordCredentials;
26-
import org.apache.http.client.CredentialsProvider;
2727
import org.apache.http.client.config.RequestConfig;
2828
import org.apache.http.impl.client.BasicCredentialsProvider;
2929
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
@@ -37,6 +37,7 @@
3737
import org.springframework.boot.context.properties.PropertyMapper;
3838
import org.springframework.context.annotation.Bean;
3939
import org.springframework.context.annotation.Configuration;
40+
import org.springframework.util.StringUtils;
4041

4142
/**
4243
* Elasticsearch rest client infrastructure configurations.
@@ -75,9 +76,25 @@ RestClientBuilder elasticsearchRestClientBuilder(ElasticsearchRestClientProperti
7576
}
7677

7778
private HttpHost createHttpHost(String uri) {
78-
URI parsedUri = URI.create(uri);
79-
String userInfo = parsedUri.getUserInfo();
80-
return HttpHost.create((userInfo != null) ? uri.replace(userInfo + "@", "") : uri);
79+
try {
80+
return createHttpHost(URI.create(uri));
81+
}
82+
catch (IllegalArgumentException ex) {
83+
return HttpHost.create(uri);
84+
}
85+
}
86+
87+
private HttpHost createHttpHost(URI uri) {
88+
if (!StringUtils.hasLength(uri.getUserInfo())) {
89+
return HttpHost.create(uri.toString());
90+
}
91+
try {
92+
return HttpHost.create(new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), uri.getPath(),
93+
uri.getQuery(), uri.getFragment()).toString());
94+
}
95+
catch (URISyntaxException ex) {
96+
throw new IllegalStateException(ex);
97+
}
8198
}
8299

83100
}
@@ -132,30 +149,7 @@ public void customize(RestClientBuilder builder) {
132149

133150
@Override
134151
public void customize(HttpAsyncClientBuilder builder) {
135-
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
136-
builder.setDefaultCredentialsProvider(credentialsProvider);
137-
this.properties.getUris().stream().map(URI::create).filter((uri) -> uri.getUserInfo() != null)
138-
.forEach((uri) -> {
139-
AuthScope authScope = new AuthScope(uri.getHost(), uri.getPort());
140-
Credentials credentials = createCredentials(uri.getUserInfo());
141-
credentialsProvider.setCredentials(authScope, credentials);
142-
});
143-
map.from(this.properties::getUsername).whenHasText().to((username) -> {
144-
Credentials credentials = new UsernamePasswordCredentials(this.properties.getUsername(),
145-
this.properties.getPassword());
146-
credentialsProvider.setCredentials(AuthScope.ANY, credentials);
147-
});
148-
}
149-
150-
private Credentials createCredentials(String usernameAndPassword) {
151-
int delimiter = usernameAndPassword.indexOf(":");
152-
if (delimiter == -1) {
153-
return new UsernamePasswordCredentials(usernameAndPassword, null);
154-
}
155-
156-
String username = usernameAndPassword.substring(0, delimiter);
157-
String password = usernameAndPassword.substring(delimiter + 1);
158-
return new UsernamePasswordCredentials(username, password);
152+
builder.setDefaultCredentialsProvider(new PropertiesCredentialsProvider(this.properties));
159153
}
160154

161155
@Override
@@ -168,4 +162,47 @@ public void customize(RequestConfig.Builder builder) {
168162

169163
}
170164

165+
private static class PropertiesCredentialsProvider extends BasicCredentialsProvider {
166+
167+
PropertiesCredentialsProvider(ElasticsearchRestClientProperties properties) {
168+
if (StringUtils.hasText(properties.getUsername())) {
169+
Credentials credentials = new UsernamePasswordCredentials(properties.getUsername(),
170+
properties.getPassword());
171+
setCredentials(AuthScope.ANY, credentials);
172+
}
173+
properties.getUris().stream().map(this::toUri).filter(this::hasUserInfo)
174+
.forEach(this::addUserInfoCredentials);
175+
}
176+
177+
private URI toUri(String uri) {
178+
try {
179+
return URI.create(uri);
180+
}
181+
catch (IllegalArgumentException ex) {
182+
return null;
183+
}
184+
}
185+
186+
private boolean hasUserInfo(URI uri) {
187+
return uri != null && StringUtils.hasLength(uri.getUserInfo());
188+
}
189+
190+
private void addUserInfoCredentials(URI uri) {
191+
AuthScope authScope = new AuthScope(uri.getHost(), uri.getPort());
192+
Credentials credentials = createUserInfoCredentials(uri.getUserInfo());
193+
setCredentials(authScope, credentials);
194+
}
195+
196+
private Credentials createUserInfoCredentials(String userInfo) {
197+
int delimiter = userInfo.indexOf(":");
198+
if (delimiter == -1) {
199+
return new UsernamePasswordCredentials(userInfo, null);
200+
}
201+
String username = userInfo.substring(0, delimiter);
202+
String password = userInfo.substring(delimiter + 1);
203+
return new UsernamePasswordCredentials(username, password);
204+
}
205+
206+
}
207+
171208
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,6 @@ void configureUriWithUsernameAndPasswordWhenUsernameAndPasswordPropertiesSet() {
228228
.getCredentials(new AuthScope("localhost", 9200));
229229
assertThat(uriCredentials.getUserPrincipal().getName()).isEqualTo("user");
230230
assertThat(uriCredentials.getPassword()).isEqualTo("password");
231-
232231
Credentials defaultCredentials = credentialsProvider
233232
.getCredentials(new AuthScope("localhost", 9201));
234233
assertThat(defaultCredentials.getUserPrincipal().getName()).isEqualTo("admin");

0 commit comments

Comments
 (0)