Skip to content

Commit e956260

Browse files
feat: add ssl support
1 parent c6e07c5 commit e956260

File tree

3 files changed

+67
-29
lines changed

3 files changed

+67
-29
lines changed

src/main/java/com/influxdb/v3/client/config/ClientConfig.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@
3535
import java.util.function.BiFunction;
3636
import javax.annotation.Nonnull;
3737
import javax.annotation.Nullable;
38+
import javax.net.ssl.SSLContext;
3839

3940
import io.grpc.ProxyDetector;
41+
import io.netty.handler.ssl.SslContext;
4042

4143
import com.influxdb.v3.client.write.WritePrecision;
4244

@@ -103,6 +105,8 @@ public final class ClientConfig {
103105
private final ProxyDetector queryApiProxy;
104106
private final Authenticator authenticator;
105107
private final Map<String, String> headers;
108+
private final SslContext grpcSslContext;
109+
private final SSLContext sslContext;
106110

107111
/**
108112
* Gets URL of the InfluxDB server.
@@ -253,6 +257,17 @@ public Map<String, String> getHeaders() {
253257
return headers;
254258
}
255259

260+
261+
@Nullable
262+
public SslContext getGrpcSslContext() {
263+
return grpcSslContext;
264+
}
265+
266+
@Nullable
267+
public SSLContext getSslContext() {
268+
return sslContext;
269+
}
270+
256271
/**
257272
* Validates the configuration properties.
258273
*/
@@ -285,7 +300,9 @@ public boolean equals(final Object o) {
285300
&& Objects.equals(proxy, that.proxy)
286301
&& Objects.equals(queryApiProxy, that.queryApiProxy)
287302
&& Objects.equals(authenticator, that.authenticator)
288-
&& Objects.equals(headers, that.headers);
303+
&& Objects.equals(headers, that.headers)
304+
&& Objects.equals(grpcSslContext, that.grpcSslContext)
305+
&& Objects.equals(sslContext, that.sslContext);
289306
}
290307

291308
@Override
@@ -294,7 +311,7 @@ public int hashCode() {
294311
database, writePrecision, gzipThreshold,
295312
timeout, allowHttpRedirects, disableServerCertificateValidation,
296313
proxy, queryApiProxy, authenticator, headers,
297-
defaultTags);
314+
defaultTags, grpcSslContext, sslContext);
298315
}
299316

300317
@Override
@@ -313,6 +330,8 @@ public String toString() {
313330
.add("authenticator=" + authenticator)
314331
.add("headers=" + headers)
315332
.add("defaultTags=" + defaultTags)
333+
.add("grpcSslContext=" + grpcSslContext)
334+
.add("sslContext=" + sslContext)
316335
.toString();
317336
}
318337

@@ -337,6 +356,8 @@ public static final class Builder {
337356
private ProxyDetector queryApiProxy;
338357
private Authenticator authenticator;
339358
private Map<String, String> headers;
359+
private SslContext grpcSslContext;
360+
private SSLContext sslContext;
340361

341362
/**
342363
* Sets the URL of the InfluxDB server.
@@ -553,6 +574,20 @@ public Builder headers(@Nullable final Map<String, String> headers) {
553574
return this;
554575
}
555576

577+
@Nonnull
578+
public Builder grpcSslContext(@Nullable final SslContext grpcSslContext) {
579+
580+
this.grpcSslContext = grpcSslContext;
581+
return this;
582+
}
583+
584+
@Nonnull
585+
public Builder sslContext(@Nullable final SSLContext sslContext) {
586+
587+
this.sslContext = sslContext;
588+
return this;
589+
}
590+
556591
/**
557592
* Build an instance of {@code ClientConfig}.
558593
*
@@ -691,5 +726,7 @@ private ClientConfig(@Nonnull final Builder builder) {
691726
queryApiProxy = builder.queryApiProxy;
692727
authenticator = builder.authenticator;
693728
headers = builder.headers;
729+
grpcSslContext = builder.grpcSslContext;
730+
sslContext = builder.sslContext;
694731
}
695732
}

src/main/java/com/influxdb/v3/client/internal/FlightSqlClient.java

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import io.grpc.netty.NettyChannelBuilder;
4848
import io.netty.channel.EventLoopGroup;
4949
import io.netty.channel.ServerChannel;
50+
import io.netty.handler.ssl.SslContext;
5051
import io.netty.handler.ssl.SslContextBuilder;
5152
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
5253
import org.apache.arrow.flight.FlightClient;
@@ -94,11 +95,7 @@ final class FlightSqlClient implements AutoCloseable {
9495
defaultHeaders.putAll(config.getHeaders());
9596
}
9697

97-
this.client = Objects.requireNonNullElseGet(client, () -> config.getQueryApiProxy() != null
98-
?
99-
createFlightWithQueryProxy(config)
100-
:
101-
createFlightClient(config));
98+
this.client = createFlightClient(config);
10299
}
103100

104101
@Nonnull
@@ -142,17 +139,8 @@ public void close() throws Exception {
142139
@Nonnull
143140
private FlightClient createFlightClient(@Nonnull final ClientConfig config) {
144141
Location location = createLocation(config);
145-
146-
return FlightClient.builder()
147-
.location(location)
148-
.allocator(new RootAllocator(Long.MAX_VALUE))
149-
.verifyServer(!config.getDisableServerCertificateValidation())
150-
.build();
151-
}
152-
153-
public FlightClient createFlightWithQueryProxy(@Nonnull final ClientConfig config) {
154142
final NettyChannelBuilder nettyChannelBuilder;
155-
Location location = createLocation(config);
143+
156144
switch (location.getUri().getScheme()) {
157145
case LocationSchemes.GRPC:
158146
case LocationSchemes.GRPC_INSECURE:
@@ -205,17 +193,24 @@ public FlightClient createFlightWithQueryProxy(@Nonnull final ClientConfig confi
205193
if (LocationSchemes.GRPC_TLS.equals(location.getUri().getScheme())) {
206194
nettyChannelBuilder.useTransportSecurity();
207195

208-
final SslContextBuilder sslContextBuilder = GrpcSslContexts.forClient();
209-
210-
if (config.getDisableServerCertificateValidation()) {
211-
sslContextBuilder.trustManager(InsecureTrustManagerFactory.INSTANCE);
212-
}
213-
214-
try {
215-
nettyChannelBuilder.sslContext(sslContextBuilder.build());
216-
} catch (SSLException e) {
217-
throw new RuntimeException(e);
196+
SslContextBuilder sslContextBuilder;
197+
SslContext sslContext;
198+
if(config.getGrpcSslContext() != null) {
199+
sslContext = config.getGrpcSslContext();
200+
nettyChannelBuilder.sslContext(sslContext);
201+
} else {
202+
sslContextBuilder = GrpcSslContexts.forClient();
203+
if (config.getDisableServerCertificateValidation()) {
204+
sslContextBuilder.trustManager(InsecureTrustManagerFactory.INSTANCE);
205+
}
206+
try {
207+
nettyChannelBuilder.sslContext(sslContextBuilder.build());
208+
} catch (SSLException e) {
209+
throw new RuntimeException(e);
210+
}
218211
}
212+
} else {
213+
nettyChannelBuilder.usePlaintext();
219214
}
220215

221216
if (config.getQueryApiProxy() != null) {
@@ -229,6 +224,7 @@ public FlightClient createFlightWithQueryProxy(@Nonnull final ClientConfig confi
229224
return FlightGrpcUtils.createFlightClient(new RootAllocator(Long.MAX_VALUE), nettyChannelBuilder.build());
230225
}
231226

227+
232228
@Nonnull
233229
private Location createLocation(@Nonnull final ClientConfig config) {
234230
try {

src/main/java/com/influxdb/v3/client/internal/RestClient.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,15 @@ public void checkServerTrusted(
107107

108108
if (baseUrl.startsWith("https")) {
109109
try {
110-
if (config.getDisableServerCertificateValidation()) {
111-
SSLContext sslContext = SSLContext.getInstance("TLS");
110+
SSLContext sslContext;
111+
sslContext = SSLContext.getInstance("TLS");
112+
SSLContext customeSslContext = config.getSslContext();
113+
if (customeSslContext == null && config.getDisableServerCertificateValidation()) {
112114
sslContext.init(null, TRUST_ALL_CERTS, new SecureRandom());
113115
builder.sslContext(sslContext);
116+
} else {
117+
sslContext.init(null, null, new SecureRandom());
118+
builder.sslContext(customeSslContext != null ? customeSslContext : sslContext);
114119
}
115120
} catch (Exception e) {
116121
throw new RuntimeException(e);

0 commit comments

Comments
 (0)