Skip to content

Commit 61394f8

Browse files
authored
hostnameVerifier (arangodb#358)
1 parent a3a95d7 commit 61394f8

File tree

5 files changed

+68
-22
lines changed

5 files changed

+68
-22
lines changed

src/main/java/com/arangodb/ArangoDB.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.arangodb.velocystream.Request;
4747
import com.arangodb.velocystream.Response;
4848

49+
import javax.net.ssl.HostnameVerifier;
4950
import javax.net.ssl.SSLContext;
5051
import java.io.InputStream;
5152
import java.lang.annotation.Annotation;
@@ -175,6 +176,17 @@ public Builder sslContext(final SSLContext sslContext) {
175176
return this;
176177
}
177178

179+
/**
180+
* Sets the {@link javax.net.ssl.HostnameVerifier} to be used when using ssl with http protocol.
181+
*
182+
* @param hostnameVerifier HostnameVerifier to be used
183+
* @return {@link ArangoDB.Builder}
184+
*/
185+
public Builder hostnameVerifier(final HostnameVerifier hostnameVerifier) {
186+
setHostnameVerifier(hostnameVerifier);
187+
return this;
188+
}
189+
178190
/**
179191
* Sets the chunk size when {@link Protocol#VST} is used.
180192
*
@@ -571,8 +583,8 @@ public synchronized ArangoDB build() {
571583

572584
final ConnectionFactory connectionFactory = (protocol == null || Protocol.VST == protocol)
573585
? new VstConnectionFactorySync(host, timeout, connectionTtl, useSsl, sslContext)
574-
: new HttpConnectionFactory(timeout, user, password, useSsl, sslContext, custom, protocol,
575-
connectionTtl, httpCookieSpec);
586+
: new HttpConnectionFactory(timeout, user, password, useSsl, sslContext, hostnameVerifier, custom,
587+
protocol, connectionTtl, httpCookieSpec);
576588

577589
final Collection<Host> hostList = createHostList(max, connectionFactory);
578590
final HostResolver hostResolver = createHostResolver(hostList, max, connectionFactory);

src/main/java/com/arangodb/internal/InternalArangoDBBuilder.java

+6
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.slf4j.Logger;
3535
import org.slf4j.LoggerFactory;
3636

37+
import javax.net.ssl.HostnameVerifier;
3738
import javax.net.ssl.SSLContext;
3839
import java.io.IOException;
3940
import java.io.InputStream;
@@ -74,6 +75,7 @@ public abstract class InternalArangoDBBuilder {
7475
protected Boolean useSsl;
7576
protected String httpCookieSpec;
7677
protected SSLContext sslContext;
78+
protected HostnameVerifier hostnameVerifier;
7779
protected Integer chunksize;
7880
protected Integer maxConnections;
7981
protected Long connectionTtl;
@@ -160,6 +162,10 @@ protected void setSslContext(final SSLContext sslContext) {
160162
this.sslContext = sslContext;
161163
}
162164

165+
protected void setHostnameVerifier(final HostnameVerifier hostnameVerifier) {
166+
this.hostnameVerifier = hostnameVerifier;
167+
}
168+
163169
protected void setChunksize(final Integer chunksize) {
164170
this.chunksize = chunksize;
165171
}

src/main/java/com/arangodb/internal/http/HttpConnection.java

+13-7
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.slf4j.Logger;
5959
import org.slf4j.LoggerFactory;
6060

61+
import javax.net.ssl.HostnameVerifier;
6162
import javax.net.ssl.SSLContext;
6263
import java.io.IOException;
6364
import java.util.ArrayList;
@@ -87,6 +88,7 @@ public static class Builder {
8788
private HostDescription host;
8889
private Long ttl;
8990
private SSLContext sslContext;
91+
private HostnameVerifier hostnameVerifier;
9092
private Integer timeout;
9193

9294
public Builder user(final String user) {
@@ -134,13 +136,18 @@ public Builder sslContext(final SSLContext sslContext) {
134136
return this;
135137
}
136138

139+
public Builder hostnameVerifier(final HostnameVerifier hostnameVerifier) {
140+
this.hostnameVerifier = hostnameVerifier;
141+
return this;
142+
}
143+
137144
public Builder timeout(final Integer timeout) {
138145
this.timeout = timeout;
139146
return this;
140147
}
141148

142149
public HttpConnection build() {
143-
return new HttpConnection(host, timeout, user, password, useSsl, sslContext, util, contentType, ttl, httpCookieSpec);
150+
return new HttpConnection(host, timeout, user, password, useSsl, sslContext, hostnameVerifier, util, contentType, ttl, httpCookieSpec);
144151
}
145152
}
146153

@@ -154,7 +161,7 @@ public HttpConnection build() {
154161
private final HostDescription host;
155162

156163
private HttpConnection(final HostDescription host, final Integer timeout, final String user, final String password,
157-
final Boolean useSsl, final SSLContext sslContext, final ArangoSerialization util, final Protocol contentType,
164+
final Boolean useSsl, final SSLContext sslContext, final HostnameVerifier hostnameVerifier, final ArangoSerialization util, final Protocol contentType,
158165
final Long ttl, final String httpCookieSpec) {
159166
super();
160167
this.host = host;
@@ -166,11 +173,10 @@ private HttpConnection(final HostDescription host, final Integer timeout, final
166173
final RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder
167174
.create();
168175
if (Boolean.TRUE == useSsl) {
169-
if (sslContext != null) {
170-
registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext));
171-
} else {
172-
registryBuilder.register("https", new SSLConnectionSocketFactory(SSLContexts.createSystemDefault()));
173-
}
176+
registryBuilder.register("https", new SSLConnectionSocketFactory(
177+
sslContext != null ? sslContext : SSLContexts.createSystemDefault(),
178+
hostnameVerifier != null ? hostnameVerifier : SSLConnectionSocketFactory.getDefaultHostnameVerifier()
179+
));
174180
} else {
175181
registryBuilder.register("http", new PlainConnectionSocketFactory());
176182
}

src/main/java/com/arangodb/internal/http/HttpConnectionFactory.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.arangodb.internal.net.HostDescription;
2727
import com.arangodb.util.ArangoSerialization;
2828

29+
import javax.net.ssl.HostnameVerifier;
2930
import javax.net.ssl.SSLContext;
3031

3132
/**
@@ -36,11 +37,12 @@ public class HttpConnectionFactory implements ConnectionFactory {
3637
private final HttpConnection.Builder builder;
3738

3839
public HttpConnectionFactory(final Integer timeout, final String user, final String password, final Boolean useSsl,
39-
final SSLContext sslContext, final ArangoSerialization util, final Protocol protocol,
40+
final SSLContext sslContext, final HostnameVerifier hostnameVerifier, final ArangoSerialization util, final Protocol protocol,
4041
final Long connectionTtl, String httpCookieSpec) {
4142
super();
4243
builder = new HttpConnection.Builder().timeout(timeout).user(user).password(password).useSsl(useSsl)
43-
.sslContext(sslContext).serializationUtil(util).contentType(protocol).ttl(connectionTtl).httpCookieSpec(httpCookieSpec);
44+
.sslContext(sslContext).hostnameVerifier(hostnameVerifier).serializationUtil(util).contentType(protocol)
45+
.ttl(connectionTtl).httpCookieSpec(httpCookieSpec);
4446

4547
}
4648

src/test/java/com/arangodb/example/ssl/SslExample.java

+31-11
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.arangodb.ArangoDB;
2424
import com.arangodb.Protocol;
2525
import com.arangodb.entity.ArangoDBVersion;
26+
import org.apache.http.conn.ssl.NoopHostnameVerifier;
2627
import org.junit.Ignore;
2728
import org.junit.Test;
2829

@@ -55,6 +56,35 @@ public class SslExample {
5556
@Test
5657
@Ignore
5758
public void connect() throws Exception {
59+
final ArangoDB arangoDB = new ArangoDB.Builder()
60+
.host("localhost", 8529)
61+
.password("test")
62+
.useSsl(true)
63+
.sslContext(createSslContext())
64+
.useProtocol(Protocol.HTTP_JSON)
65+
.build();
66+
final ArangoDBVersion version = arangoDB.getVersion();
67+
assertThat(version, is(notNullValue()));
68+
System.out.println(version.getVersion());
69+
}
70+
71+
@Test
72+
@Ignore
73+
public void noopHostnameVerifier() throws Exception {
74+
final ArangoDB arangoDB = new ArangoDB.Builder()
75+
.host("127.0.0.1", 8529)
76+
.password("test")
77+
.useSsl(true)
78+
.sslContext(createSslContext())
79+
.hostnameVerifier(NoopHostnameVerifier.INSTANCE)
80+
.useProtocol(Protocol.HTTP_JSON)
81+
.build();
82+
final ArangoDBVersion version = arangoDB.getVersion();
83+
assertThat(version, is(notNullValue()));
84+
System.out.println(version.getVersion());
85+
}
86+
87+
private SSLContext createSslContext() throws Exception {
5888
final KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
5989
ks.load(this.getClass().getResourceAsStream(SSL_TRUSTSTORE), SSL_TRUSTSTORE_PASSWORD.toCharArray());
6090

@@ -67,17 +97,7 @@ public void connect() throws Exception {
6797
final SSLContext sc = SSLContext.getInstance("TLS");
6898
sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
6999

70-
71-
final ArangoDB arangoDB = new ArangoDB.Builder()
72-
.host("127.0.0.1", 8529)
73-
.password("test")
74-
.useSsl(true)
75-
.sslContext(sc)
76-
.useProtocol(Protocol.HTTP_JSON)
77-
.build();
78-
final ArangoDBVersion version = arangoDB.getVersion();
79-
assertThat(version, is(notNullValue()));
80-
System.out.println(version.getVersion());
100+
return sc;
81101
}
82102

83103
}

0 commit comments

Comments
 (0)