Skip to content

Commit

Permalink
ISPN-6438 Client SSL and Auth config w/ properties
Browse files Browse the repository at this point in the history
  • Loading branch information
galderz authored and tristantarrant committed Apr 19, 2016
1 parent 01e5f77 commit 7eede26
Show file tree
Hide file tree
Showing 8 changed files with 409 additions and 81 deletions.
Expand Up @@ -114,61 +114,7 @@ public Configuration getConfiguration() {
@Override
@Deprecated
public Properties getProperties() {
Properties properties = new Properties();
if (configuration.asyncExecutorFactory().factoryClass() != null) {
properties.setProperty(ConfigurationProperties.ASYNC_EXECUTOR_FACTORY, configuration.asyncExecutorFactory().factoryClass().getName());
TypedProperties aefProps = configuration.asyncExecutorFactory().properties();
for(String key : Arrays.asList(ConfigurationProperties.DEFAULT_EXECUTOR_FACTORY_POOL_SIZE, ConfigurationProperties.DEFAULT_EXECUTOR_FACTORY_QUEUE_SIZE)) {
if (aefProps.containsKey(key)) {
properties.setProperty(key, aefProps.getProperty(key));
}
}
}
properties.setProperty(ConfigurationProperties.REQUEST_BALANCING_STRATEGY, configuration.balancingStrategyClass().getName());
properties.setProperty(ConfigurationProperties.CONNECT_TIMEOUT, Integer.toString(configuration.connectionTimeout()));
for (int i = 0; i < configuration.consistentHashImpl().length; i++) {
int version = i + 1;
if (configuration.consistentHashImpl(version) != null) {
properties.setProperty(ConfigurationProperties.HASH_FUNCTION_PREFIX + "." + version,
configuration.consistentHashImpl(version).getName());
}
}
properties.setProperty(ConfigurationProperties.FORCE_RETURN_VALUES, Boolean.toString(configuration.forceReturnValues()));
properties.setProperty(ConfigurationProperties.KEY_SIZE_ESTIMATE, Integer.toString(configuration.keySizeEstimate()));
properties.setProperty(ConfigurationProperties.MARSHALLER, configuration.marshallerClass().getName());
properties.setProperty(ConfigurationProperties.PROTOCOL_VERSION, configuration.protocolVersion());
properties.setProperty(ConfigurationProperties.SO_TIMEOUT, Integer.toString(configuration.socketTimeout()));
properties.setProperty(ConfigurationProperties.TCP_NO_DELAY, Boolean.toString(configuration.tcpNoDelay()));
properties.setProperty(ConfigurationProperties.TCP_KEEP_ALIVE, Boolean.toString(configuration.tcpKeepAlive()));
properties.setProperty(ConfigurationProperties.TRANSPORT_FACTORY, configuration.transportFactory().getName());
properties.setProperty(ConfigurationProperties.VALUE_SIZE_ESTIMATE, Integer.toString(configuration.valueSizeEstimate()));
properties.setProperty(ConfigurationProperties.MAX_RETRIES, Integer.toString(configuration.maxRetries()));

properties.setProperty("exhaustedAction", Integer.toString(configuration.connectionPool().exhaustedAction().ordinal()));
properties.setProperty("maxActive", Integer.toString(configuration.connectionPool().maxActive()));
properties.setProperty("maxTotal", Integer.toString(configuration.connectionPool().maxTotal()));
properties.setProperty("maxWait", Long.toString(configuration.connectionPool().maxWait()));
properties.setProperty("maxIdle", Integer.toString(configuration.connectionPool().maxIdle()));
properties.setProperty("minIdle", Integer.toString(configuration.connectionPool().minIdle()));
properties.setProperty("numTestsPerEvictionRun", Integer.toString(configuration.connectionPool().numTestsPerEvictionRun()));
properties.setProperty("minEvictableIdleTimeMillis", Long.toString(configuration.connectionPool().minEvictableIdleTime()));
properties.setProperty("timeBetweenEvictionRunsMillis", Long.toString(configuration.connectionPool().timeBetweenEvictionRuns()));

properties.setProperty("lifo", Boolean.toString(configuration.connectionPool().lifo()));
properties.setProperty("testOnBorrow", Boolean.toString(configuration.connectionPool().testOnBorrow()));
properties.setProperty("testOnReturn", Boolean.toString(configuration.connectionPool().testOnReturn()));
properties.setProperty("testWhileIdle", Boolean.toString(configuration.connectionPool().testWhileIdle()));

StringBuilder servers = new StringBuilder();
for(ServerConfiguration server : configuration.servers()) {
if (servers.length() > 0) {
servers.append(";");
}
servers.append(server.host()).append(":").append(server.port());
}
properties.setProperty(ConfigurationProperties.SERVER_LIST, servers.toString());

return properties;
return configuration.properties();
}

/**
Expand Down
Expand Up @@ -7,7 +7,7 @@
* @since 7.0
*/
public class AbstractSecurityConfigurationChildBuilder extends AbstractConfigurationChildBuilder {
private final SecurityConfigurationBuilder builder;
final SecurityConfigurationBuilder builder;

AbstractSecurityConfigurationChildBuilder(SecurityConfigurationBuilder builder) {
super(builder.getBuilder());
Expand Down
Expand Up @@ -2,15 +2,21 @@

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;

import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.sasl.Sasl;

import org.infinispan.client.hotrod.impl.ConfigurationProperties;
import org.infinispan.client.hotrod.impl.TypedProperties;
import org.infinispan.client.hotrod.logging.Log;
import org.infinispan.client.hotrod.logging.LogFactory;
import org.infinispan.commons.CacheException;
import org.infinispan.commons.configuration.Builder;
import org.infinispan.commons.util.Util;

/**
* AuthenticationConfigurationBuilder.
Expand Down Expand Up @@ -154,4 +160,31 @@ public void validate() {
}
}

@Override
public ConfigurationBuilder withProperties(Properties properties) {
TypedProperties typed = TypedProperties.toTypedProperties(properties);
this.enabled(typed.getBooleanProperty(ConfigurationProperties.USE_AUTH, enabled));
this.saslMechanism(typed.getProperty(ConfigurationProperties.SASL_MECHANISM));
Object prop = typed.get(ConfigurationProperties.AUTH_CALLBACK_HANDLER);
if (prop instanceof String) {
CallbackHandler handler = Util.getInstance((String) prop, builder.getBuilder().classLoader());
this.callbackHandler(handler);
} else {
this.callbackHandler((CallbackHandler) prop);
}

this.serverName(typed.getProperty(ConfigurationProperties.AUTH_SERVER_NAME));
this.clientSubject((Subject) typed.get(ConfigurationProperties.AUTH_CLIENT_SUBJECT));

Map<String, String> saslProperties = typed.entrySet().stream()
.filter(e -> ((String) e.getKey()).startsWith(ConfigurationProperties.SASL_PROPERTIES_PREFIX))
.collect(Collectors.toMap(
e -> ConfigurationProperties.SASL_PROPERTIES_PREFIX_REGEX
.matcher((String) e.getKey()).replaceFirst(""),
e -> (String) e.getValue()));
this.saslProperties(saslProperties);

return builder.getBuilder();
}

}
Expand Up @@ -4,12 +4,16 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.infinispan.client.hotrod.impl.ConfigurationProperties;
import org.infinispan.client.hotrod.impl.consistenthash.ConsistentHash;
import org.infinispan.client.hotrod.impl.transport.TransportFactory;
import org.infinispan.client.hotrod.impl.transport.tcp.FailoverRequestBalancingStrategy;
import org.infinispan.commons.configuration.BuiltBy;
import org.infinispan.commons.marshall.Marshaller;
import org.infinispan.commons.util.TypedProperties;

/**
* Configuration.
Expand Down Expand Up @@ -202,4 +206,100 @@ public String toString() {
+ ", transportFactory=" + transportFactory + ", valueSizeEstimate=" + valueSizeEstimate + ", maxRetries=" + maxRetries
+ "nearCache=" + nearCache + "]";
}

public Properties properties() {
Properties properties = new Properties();
if (asyncExecutorFactory().factoryClass() != null) {
properties.setProperty(ConfigurationProperties.ASYNC_EXECUTOR_FACTORY, asyncExecutorFactory().factoryClass().getName());
TypedProperties aefProps = asyncExecutorFactory().properties();
for(String key : Arrays.asList(ConfigurationProperties.DEFAULT_EXECUTOR_FACTORY_POOL_SIZE, ConfigurationProperties.DEFAULT_EXECUTOR_FACTORY_QUEUE_SIZE)) {
if (aefProps.containsKey(key)) {
properties.setProperty(key, aefProps.getProperty(key));
}
}
}
properties.setProperty(ConfigurationProperties.REQUEST_BALANCING_STRATEGY, balancingStrategyClass().getName());
properties.setProperty(ConfigurationProperties.CONNECT_TIMEOUT, Integer.toString(connectionTimeout()));
for (int i = 0; i < consistentHashImpl().length; i++) {
int version = i + 1;
if (consistentHashImpl(version) != null) {
properties.setProperty(ConfigurationProperties.HASH_FUNCTION_PREFIX + "." + version,
consistentHashImpl(version).getName());
}
}
properties.setProperty(ConfigurationProperties.FORCE_RETURN_VALUES, Boolean.toString(forceReturnValues()));
properties.setProperty(ConfigurationProperties.KEY_SIZE_ESTIMATE, Integer.toString(keySizeEstimate()));
properties.setProperty(ConfigurationProperties.MARSHALLER, marshallerClass().getName());
properties.setProperty(ConfigurationProperties.PROTOCOL_VERSION, protocolVersion());
properties.setProperty(ConfigurationProperties.SO_TIMEOUT, Integer.toString(socketTimeout()));
properties.setProperty(ConfigurationProperties.TCP_NO_DELAY, Boolean.toString(tcpNoDelay()));
properties.setProperty(ConfigurationProperties.TCP_KEEP_ALIVE, Boolean.toString(tcpKeepAlive()));
properties.setProperty(ConfigurationProperties.TRANSPORT_FACTORY, transportFactory().getName());
properties.setProperty(ConfigurationProperties.VALUE_SIZE_ESTIMATE, Integer.toString(valueSizeEstimate()));
properties.setProperty(ConfigurationProperties.MAX_RETRIES, Integer.toString(maxRetries()));

properties.setProperty("exhaustedAction", Integer.toString(connectionPool().exhaustedAction().ordinal()));
properties.setProperty("maxActive", Integer.toString(connectionPool().maxActive()));
properties.setProperty("maxTotal", Integer.toString(connectionPool().maxTotal()));
properties.setProperty("maxWait", Long.toString(connectionPool().maxWait()));
properties.setProperty("maxIdle", Integer.toString(connectionPool().maxIdle()));
properties.setProperty("minIdle", Integer.toString(connectionPool().minIdle()));
properties.setProperty("numTestsPerEvictionRun", Integer.toString(connectionPool().numTestsPerEvictionRun()));
properties.setProperty("minEvictableIdleTimeMillis", Long.toString(connectionPool().minEvictableIdleTime()));
properties.setProperty("timeBetweenEvictionRunsMillis", Long.toString(connectionPool().timeBetweenEvictionRuns()));

properties.setProperty("lifo", Boolean.toString(connectionPool().lifo()));
properties.setProperty("testOnBorrow", Boolean.toString(connectionPool().testOnBorrow()));
properties.setProperty("testOnReturn", Boolean.toString(connectionPool().testOnReturn()));
properties.setProperty("testWhileIdle", Boolean.toString(connectionPool().testWhileIdle()));

StringBuilder servers = new StringBuilder();
for(ServerConfiguration server : servers()) {
if (servers.length() > 0) {
servers.append(";");
}
servers.append(server.host()).append(":").append(server.port());
}
properties.setProperty(ConfigurationProperties.SERVER_LIST, servers.toString());

properties.setProperty(ConfigurationProperties.USE_SSL, Boolean.toString(security.ssl().enabled()));

if (security.ssl().keyStoreFileName() != null)
properties.setProperty(ConfigurationProperties.KEY_STORE_FILE_NAME, security.ssl().keyStoreFileName());

if (security.ssl().keyStorePassword() != null)
properties.setProperty(ConfigurationProperties.KEY_STORE_PASSWORD, new String(security.ssl().keyStorePassword()));

if (security.ssl().keyStoreCertificatePassword() != null)
properties.setProperty(ConfigurationProperties.KEY_STORE_CERTIFICATE_PASSWORD, new String(security.ssl().keyStoreCertificatePassword()));

if (security.ssl().trustStoreFileName() != null)
properties.setProperty(ConfigurationProperties.TRUST_STORE_FILE_NAME, security.ssl().trustStoreFileName());

if (security.ssl().trustStorePassword() != null)
properties.setProperty(ConfigurationProperties.TRUST_STORE_PASSWORD, new String(security.ssl().trustStorePassword()));

if (security.ssl().sslContext() != null)
properties.put(ConfigurationProperties.SSL_CONTEXT, security.ssl().sslContext());

properties.setProperty(ConfigurationProperties.USE_AUTH, Boolean.toString(security.authentication().enabled()));

if (security.authentication().saslMechanism() != null)
properties.setProperty(ConfigurationProperties.SASL_MECHANISM, security.authentication().saslMechanism());

if (security.authentication().callbackHandler() != null)
properties.put(ConfigurationProperties.AUTH_CALLBACK_HANDLER, security.authentication().callbackHandler());

if (security.authentication().serverName() != null)
properties.setProperty(ConfigurationProperties.AUTH_SERVER_NAME, security.authentication().serverName());

if (security.authentication().clientSubject() != null)
properties.put(ConfigurationProperties.AUTH_CLIENT_SUBJECT, security.authentication().clientSubject());

for (Map.Entry<String, String> entry : security.authentication().saslProperties().entrySet())
properties.setProperty(ConfigurationProperties.SASL_PROPERTIES_PREFIX + '.' + entry.getKey(), entry.getValue());

return properties;
}

}
Expand Up @@ -301,6 +301,8 @@ public ConfigurationBuilder withProperties(Properties properties) {
}
this.valueSizeEstimate(typed.getIntProperty(ConfigurationProperties.VALUE_SIZE_ESTIMATE, valueSizeEstimate));
this.maxRetries(typed.getIntProperty(ConfigurationProperties.MAX_RETRIES, maxRetries));
this.security.ssl().withProperties(properties);
this.security.authentication().withProperties(properties);
return this;
}

Expand Down
Expand Up @@ -4,10 +4,14 @@
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;

import org.infinispan.client.hotrod.impl.ConfigurationProperties;
import org.infinispan.client.hotrod.impl.TypedProperties;
import org.infinispan.client.hotrod.logging.LogFactory;
import org.infinispan.commons.configuration.Builder;
import org.infinispan.client.hotrod.logging.Log;

import java.util.Properties;

/**
*
* SSLConfigurationBuilder.
Expand Down Expand Up @@ -146,4 +150,25 @@ public SslConfigurationBuilder read(SslConfiguration template) {
return this;
}

@Override
public ConfigurationBuilder withProperties(Properties properties) {
TypedProperties typed = TypedProperties.toTypedProperties(properties);
this.enabled(typed.getBooleanProperty(ConfigurationProperties.USE_SSL, enabled));
this.keyStoreFileName(typed.getProperty(ConfigurationProperties.KEY_STORE_FILE_NAME, keyStoreFileName));

if (typed.containsKey(ConfigurationProperties.KEY_STORE_PASSWORD))
this.keyStorePassword(typed.getProperty(ConfigurationProperties.KEY_STORE_PASSWORD).toCharArray());

if (typed.containsKey(ConfigurationProperties.KEY_STORE_CERTIFICATE_PASSWORD))
this.keyStoreCertificatePassword(typed.getProperty(ConfigurationProperties.KEY_STORE_CERTIFICATE_PASSWORD).toCharArray());

this.trustStoreFileName(typed.getProperty(ConfigurationProperties.TRUST_STORE_FILE_NAME, trustStoreFileName));

if (typed.containsKey(ConfigurationProperties.TRUST_STORE_PASSWORD))
this.trustStorePassword(typed.getProperty(ConfigurationProperties.TRUST_STORE_PASSWORD).toCharArray());

this.sslContext((SSLContext) typed.get(ConfigurationProperties.SSL_CONTEXT));

return builder.getBuilder();
}
}
Expand Up @@ -7,6 +7,7 @@
import java.util.Objects;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Pattern;

import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.async.DefaultAsyncExecutorFactory;
Expand Down Expand Up @@ -42,9 +43,19 @@ public class ConfigurationProperties {
public static final String USE_SSL = "infinispan.client.hotrod.use_ssl";
public static final String KEY_STORE_FILE_NAME = "infinispan.client.hotrod.key_store_file_name";
public static final String KEY_STORE_PASSWORD = "infinispan.client.hotrod.key_store_password";
public static final String KEY_STORE_CERTIFICATE_PASSWORD = "infinispan.client.hotrod.key_store_certificate_password";
public static final String TRUST_STORE_FILE_NAME = "infinispan.client.hotrod.trust_store_file_name";
public static final String TRUST_STORE_PASSWORD = "infinispan.client.hotrod.trust_store_password";
public static final String SSL_CONTEXT = "infinispan.client.hotrod.ssl_context";
public static final String MAX_RETRIES = "infinispan.client.hotrod.max_retries";
public static final String USE_AUTH = "infinispan.client.hotrod.use_auth";
public static final String SASL_MECHANISM = "infinispan.client.hotrod.sasl_mechanism";
public static final String AUTH_CALLBACK_HANDLER = "infinispan.client.hotrod.auth_callback_handler";
public static final String AUTH_SERVER_NAME = "infinispan.client.hotrod.auth_server_name";
public static final String AUTH_CLIENT_SUBJECT = "infinispan.client.hotrod.auth_client_subject";
public static final String SASL_PROPERTIES_PREFIX = "infinispan.client.hotrod.sasl_properties";
public static final Pattern SASL_PROPERTIES_PREFIX_REGEX =
Pattern.compile('^' + ConfigurationProperties.SASL_PROPERTIES_PREFIX + '.');

// defaults

Expand Down

0 comments on commit 7eede26

Please sign in to comment.