diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/DefaultJedisClientConfiguration.java b/src/main/java/org/springframework/data/redis/connection/jedis/DefaultJedisClientConfiguration.java index d4f1f39c9e..ae2cb087e3 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/DefaultJedisClientConfiguration.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/DefaultJedisClientConfiguration.java @@ -15,6 +15,8 @@ */ package org.springframework.data.redis.connection.jedis; +import redis.clients.jedis.SslOptions; + import java.time.Duration; import java.util.Optional; @@ -30,6 +32,7 @@ * * @author Mark Paluch * @author Christoph Strobl + * @author Geonhyeon Kim * @since 2.0 */ class DefaultJedisClientConfiguration implements JedisClientConfiguration { @@ -40,6 +43,7 @@ class DefaultJedisClientConfiguration implements JedisClientConfiguration { private final Optional sslSocketFactory; private final Optional sslParameters; private final Optional hostnameVerifier; + private final Optional sslOptions; private final boolean usePooling; private final Optional> poolConfig; private final Optional clientName; @@ -49,8 +53,9 @@ class DefaultJedisClientConfiguration implements JedisClientConfiguration { DefaultJedisClientConfiguration(@Nullable JedisClientConfigBuilderCustomizer clientConfigCustomizer, @Nullable JedisClientBuilderCustomizer clientCustomizer, boolean useSsl, @Nullable SSLSocketFactory sslSocketFactory, @Nullable SSLParameters sslParameters, - @Nullable HostnameVerifier hostnameVerifier, boolean usePooling, @Nullable GenericObjectPoolConfig poolConfig, - @Nullable String clientName, Duration readTimeout, Duration connectTimeout) { + @Nullable HostnameVerifier hostnameVerifier, @Nullable SslOptions sslOptions, boolean usePooling, + @Nullable GenericObjectPoolConfig poolConfig, @Nullable String clientName, Duration readTimeout, + Duration connectTimeout) { this.clientConfigCustomizer = Optional.ofNullable(clientConfigCustomizer); this.clientCustomizer = Optional.ofNullable(clientCustomizer); @@ -58,6 +63,7 @@ class DefaultJedisClientConfiguration implements JedisClientConfiguration { this.sslSocketFactory = Optional.ofNullable(sslSocketFactory); this.sslParameters = Optional.ofNullable(sslParameters); this.hostnameVerifier = Optional.ofNullable(hostnameVerifier); + this.sslOptions = Optional.ofNullable(sslOptions); this.usePooling = usePooling; this.poolConfig = Optional.ofNullable(poolConfig); this.clientName = Optional.ofNullable(clientName); @@ -95,6 +101,11 @@ public Optional getHostnameVerifier() { return hostnameVerifier; } + @Override + public Optional getSslOptions() { + return sslOptions; + } + @Override public boolean isUsePooling() { return usePooling; diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisClientConfiguration.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisClientConfiguration.java index 86c0ecb408..56a683e6ad 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisClientConfiguration.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisClientConfiguration.java @@ -17,6 +17,7 @@ import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.Protocol; +import redis.clients.jedis.SslOptions; import java.net.SocketAddress; import java.time.Duration; @@ -41,6 +42,7 @@ *
  • Optional {@link SSLSocketFactory}
  • *
  • Optional {@link SSLParameters}
  • *
  • Optional {@link HostnameVerifier}
  • + *
  • Optional {@link SslOptions}
  • *
  • Whether to use connection-pooling
  • *
  • Optional {@link GenericObjectPoolConfig}
  • *
  • Optional client name
  • @@ -51,6 +53,7 @@ * @author Mark Paluch * @author Christoph Strobl * @author Chao Chang + * @author Geonhyeon Kim * @since 2.0 * @see redis.clients.jedis.Jedis * @see org.springframework.data.redis.connection.RedisStandaloneConfiguration @@ -100,6 +103,12 @@ default Optional getCustomizer() { */ Optional getHostnameVerifier(); + /** + * @return the optional {@link SslOptions}. + * @since 4.1 + */ + Optional getSslOptions(); + /** * @return {@literal true} to use connection-pooling. Applies only to single node Redis. Sentinel and Cluster modes * use always connection-pooling regardless of the pooling setting. @@ -302,6 +311,14 @@ interface JedisSslClientConfigurationBuilder { */ JedisSslClientConfigurationBuilder hostnameVerifier(HostnameVerifier hostnameVerifier); + /** + * @param sslOptions must not be {@literal null}. + * @return {@literal this} builder. + * @throws IllegalArgumentException if sslOptions is {@literal null}. + * @since 4.1 + */ + JedisSslClientConfigurationBuilder sslOptions(SslOptions sslOptions); + /** * Return to {@link JedisClientConfigurationBuilder}. * @@ -330,6 +347,7 @@ class DefaultJedisClientConfigurationBuilder implements JedisClientConfiguration private @Nullable SSLSocketFactory sslSocketFactory; private @Nullable SSLParameters sslParameters; private @Nullable HostnameVerifier hostnameVerifier; + private @Nullable SslOptions sslOptions; private boolean usePooling; private GenericObjectPoolConfig poolConfig = new JedisPoolConfig(); private @Nullable String clientName; @@ -387,6 +405,15 @@ public JedisSslClientConfigurationBuilder hostnameVerifier(HostnameVerifier host return this; } + @Override + public JedisSslClientConfigurationBuilder sslOptions(SslOptions sslOptions) { + + Assert.notNull(sslOptions, "SslOptions must not be null"); + + this.sslOptions = sslOptions; + return this; + } + @Override public JedisPoolingClientConfigurationBuilder usePooling() { @@ -439,7 +466,7 @@ public JedisClientConfigurationBuilder connectTimeout(Duration connectTimeout) { public JedisClientConfiguration build() { return new DefaultJedisClientConfiguration(clientConfigCustomizer, clientCustomizer, useSsl, sslSocketFactory, - sslParameters, hostnameVerifier, + sslParameters, hostnameVerifier, sslOptions, usePooling, poolConfig, clientName, readTimeout, connectTimeout); } } diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactory.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactory.java index cdfd31a002..8e428cdb34 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactory.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactory.java @@ -94,6 +94,7 @@ * @author Fu Jian * @author Ajith Kumar * @author Tihomir Mateev + * @author Geonhyeon Kim * @see JedisClientConfiguration * @see Jedis */ @@ -753,6 +754,7 @@ private JedisClientConfig createClientConfig(int database, @Nullable String user this.clientConfiguration.getSslSocketFactory().ifPresent(builder::sslSocketFactory); this.clientConfiguration.getHostnameVerifier().ifPresent(builder::hostnameVerifier); this.clientConfiguration.getSslParameters().ifPresent(builder::sslParameters); + this.clientConfiguration.getSslOptions().ifPresent(builder::sslOptions); } this.clientConfiguration.getClientConfigCustomizer().ifPresent(customizer -> customizer.customize(builder)); @@ -1286,9 +1288,6 @@ private void assertInitialized() { static class MutableJedisClientConfiguration implements JedisClientConfiguration { private boolean useSsl; - private @Nullable SSLSocketFactory sslSocketFactory; - private @Nullable SSLParameters sslParameters; - private @Nullable HostnameVerifier hostnameVerifier; private boolean usePooling = true; private GenericObjectPoolConfig poolConfig = new JedisPoolConfig(); private @Nullable String clientName; @@ -1323,29 +1322,22 @@ public void setUseSsl(boolean useSsl) { @Override public Optional getSslSocketFactory() { - return Optional.ofNullable(sslSocketFactory); - } - - public void setSslSocketFactory(SSLSocketFactory sslSocketFactory) { - this.sslSocketFactory = sslSocketFactory; + return Optional.empty(); } @Override public Optional getSslParameters() { - return Optional.ofNullable(sslParameters); - } - - public void setSslParameters(SSLParameters sslParameters) { - this.sslParameters = sslParameters; + return Optional.empty(); } @Override public Optional getHostnameVerifier() { - return Optional.ofNullable(hostnameVerifier); + return Optional.empty(); } - public void setHostnameVerifier(HostnameVerifier hostnameVerifier) { - this.hostnameVerifier = hostnameVerifier; + @Override + public Optional getSslOptions() { + return Optional.empty(); } @Override diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClientConfigurationUnitTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClientConfigurationUnitTests.java index 810a14f46c..bfa16227b7 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClientConfigurationUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClientConfigurationUnitTests.java @@ -18,6 +18,7 @@ import static org.assertj.core.api.Assertions.*; import redis.clients.jedis.JedisPoolConfig; +import redis.clients.jedis.SslOptions; import java.security.NoSuchAlgorithmException; import java.time.Duration; @@ -34,6 +35,7 @@ * Unit tests for {@link JedisClientConfiguration}. * * @author Mark Paluch + * @author Geonhyeon Kim */ class JedisClientConfigurationUnitTests { @@ -49,6 +51,7 @@ void shouldCreateEmptyConfiguration() { assertThat(configuration.getPoolConfig()).isPresent(); assertThat(configuration.getSslParameters()).isEmpty(); assertThat(configuration.getSslSocketFactory()).isEmpty(); + assertThat(configuration.getSslOptions()).isEmpty(); } @Test // DATAREDIS-574 @@ -57,12 +60,14 @@ void shouldConfigureAllProperties() throws NoSuchAlgorithmException { SSLParameters sslParameters = new SSLParameters(); SSLContext context = SSLContext.getDefault(); SSLSocketFactory socketFactory = context.getSocketFactory(); + SslOptions sslOptions = SslOptions.builder().build(); JedisPoolConfig poolConfig = new JedisPoolConfig(); JedisClientConfiguration configuration = JedisClientConfiguration.builder().useSsl() // .hostnameVerifier(MyHostnameVerifier.INSTANCE) // .sslParameters(sslParameters) // - .sslSocketFactory(socketFactory).and() // + .sslSocketFactory(socketFactory) // + .sslOptions(sslOptions).and() // .clientName("my-client") // .connectTimeout(Duration.ofMinutes(10)) // .readTimeout(Duration.ofHours(5)) // @@ -73,6 +78,7 @@ void shouldConfigureAllProperties() throws NoSuchAlgorithmException { assertThat(configuration.getHostnameVerifier()).contains(MyHostnameVerifier.INSTANCE); assertThat(configuration.getSslParameters()).contains(sslParameters); assertThat(configuration.getSslSocketFactory()).contains(socketFactory); + assertThat(configuration.getSslOptions()).contains(sslOptions); assertThat(configuration.getClientName()).contains("my-client"); assertThat(configuration.getConnectTimeout()).isEqualTo(Duration.ofMinutes(10));