Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ jobs:
if: matrix.jdk == '8' && github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && github.ref != 'refs/heads/development'
run: mvn checkstyle::check

- name: Deploy
if: matrix.jdk == '8' && github.event_name == 'push' && github.ref != 'refs/heads/master' && github.ref != 'refs/heads/development'
run: mvn --batch-mode deploy -P test
# - name: Deploy
# if: matrix.jdk == '8' && github.event_name == 'push' && github.ref != 'refs/heads/master' && github.ref != 'refs/heads/development'
# run: mvn --batch-mode deploy -P test

- name: SonarQube Scan (Push)
if: matrix.jdk == '11' && github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/development')
Expand Down
4 changes: 2 additions & 2 deletions client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
<parent>
<groupId>io.split.client</groupId>
<artifactId>java-client-parent</artifactId>
<version>4.17.0-rc2</version>
<version>4.17.0-rc3</version>
</parent>
<version>4.17.0-rc2</version>
<version>4.17.0-rc3</version>
<artifactId>java-client</artifactId>
<packaging>jar</packaging>
<name>Java Client</name>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
package io.split.client;

import io.split.client.dtos.BearerCredentialsProvider;
import org.apache.hc.client5.http.auth.AuthScope;
import org.apache.hc.client5.http.auth.BearerToken;
import org.apache.hc.client5.http.auth.Credentials;
import org.apache.hc.core5.http.protocol.HttpContext;

class HttpClientDynamicCredentials implements org.apache.hc.client5.http.auth.CredentialsProvider {

private final ProxyCredentialsProvider _proxyCredentialsProvider;
private final BearerCredentialsProvider _bearerCredentialsProvider;

public HttpClientDynamicCredentials (ProxyCredentialsProvider proxyCredentialsProvider) {
_proxyCredentialsProvider = proxyCredentialsProvider;
public HttpClientDynamicCredentials (BearerCredentialsProvider bearerCredentialsProvider) {
_bearerCredentialsProvider = bearerCredentialsProvider;
}

@Override
public Credentials getCredentials(AuthScope authScope, HttpContext context) {

// This Provider is invoked every time a request is made.
// This should invoke a user-custom provider responsible for:
return new BearerToken(_proxyCredentialsProvider.getJwtToken());
return new BearerToken(_bearerCredentialsProvider.getToken());
}

}
Expand Down
10 changes: 0 additions & 10 deletions client/src/main/java/io/split/client/ProxyCredentialsProvider.java

This file was deleted.

95 changes: 30 additions & 65 deletions client/src/main/java/io/split/client/SplitClientConfig.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package io.split.client;

import io.split.client.dtos.ProxyMTLSAuth;
import io.split.client.dtos.ProxyConfiguration;
import io.split.client.impressions.ImpressionListener;
import io.split.client.impressions.ImpressionsManager;
import io.split.client.utils.FileTypeEnum;
Expand Down Expand Up @@ -91,11 +91,10 @@ private HttpScheme() {
private final ThreadFactory _threadFactory;

// Proxy configs
private final ProxyConfiguration _proxyConfiguration;
private final HttpHost _proxy;
private final String _proxyUsername;
private final String _proxyPassword;
private final ProxyCredentialsProvider _proxyCredentialsProvider;
private final ProxyMTLSAuth _proxyMtlsAuth;

// To be set during startup
public static String splitSdkVersion;
Expand Down Expand Up @@ -129,8 +128,7 @@ private SplitClientConfig(String endpoint,
HttpHost proxy,
String proxyUsername,
String proxyPassword,
ProxyCredentialsProvider proxyCredentialsProvider,
ProxyMTLSAuth proxyMtlsAuth,
ProxyConfiguration proxyConfiguration,
int eventsQueueSize,
long eventSendIntervalInMillis,
int maxStringLength,
Expand Down Expand Up @@ -184,8 +182,7 @@ private SplitClientConfig(String endpoint,
_proxy = proxy;
_proxyUsername = proxyUsername;
_proxyPassword = proxyPassword;
_proxyCredentialsProvider = proxyCredentialsProvider;
_proxyMtlsAuth = proxyMtlsAuth;
_proxyConfiguration = proxyConfiguration;
_eventsQueueSize = eventsQueueSize;
_eventSendIntervalInMillis = eventSendIntervalInMillis;
_maxStringLength = maxStringLength;
Expand Down Expand Up @@ -317,12 +314,8 @@ public String proxyPassword() {
return _proxyPassword;
}

public ProxyCredentialsProvider proxyCredentialsProvider() {
return _proxyCredentialsProvider;
}

public ProxyMTLSAuth proxyMTLSAuth() {
return _proxyMtlsAuth;
public ProxyConfiguration proxyConfiguration() {
return _proxyConfiguration;
}

public long eventSendIntervalInMillis() {
Expand Down Expand Up @@ -463,11 +456,9 @@ public static final class Builder {
private int _waitBeforeShutdown = 5000;
private String _proxyHost = "localhost";
private int _proxyPort = -1;
private String _proxyScheme = HttpScheme.HTTP;
private String _proxyUsername;
private String _proxyPassword;
private ProxyCredentialsProvider _proxyCredentialsProvider;
private ProxyMTLSAuth _proxyMtlsAuth;
private ProxyConfiguration _proxyConfiguration;
private int _eventsQueueSize = 500;
private long _eventSendIntervalInMillis = 30 * (long)1000;
private int _maxStringLength = 250;
Expand Down Expand Up @@ -760,43 +751,44 @@ public Builder waitBeforeShutdown(int waitTime) {

/**
* The host location of the proxy. Default is localhost.
* @deprecated
* This method is deprecated.
* <p> Use {@link ProxyConfiguration)} instead.
*
* @param proxyHost location of the proxy
* @return this builder
*/
@Deprecated
public Builder proxyHost(String proxyHost) {
_proxyHost = proxyHost;
return this;
}

/**
* The port of the proxy. Default is -1.
* @deprecated
* This method is deprecated.
* <p> Use {@link ProxyConfiguration)} instead.
*
* @param proxyPort port for the proxy
* @return this builder
*/
@Deprecated
public Builder proxyPort(int proxyPort) {
_proxyPort = proxyPort;
return this;
}

/**
* The http scheme of the proxy. Default is http.
*
* @param proxyScheme protocol for the proxy
* @return this builder
*/
public Builder proxyScheme(String proxyScheme) {
_proxyScheme = proxyScheme;
return this;
}

/**
* Set the username for authentication against the proxy (if proxy settings are enabled). (Optional).
* @deprecated
* This method is deprecated.
* <p> Use {@link ProxyConfiguration)} instead.
*
* @param proxyUsername
* @return this builder
*/
@Deprecated
public Builder proxyUsername(String proxyUsername) {
_proxyUsername = proxyUsername;
return this;
Expand All @@ -813,25 +805,14 @@ public Builder proxyPassword(String proxyPassword) {
return this;
}

/**
* Set the token for authentication against the proxy (if proxy settings are enabled). (Optional).
*
* @param proxyCredentialsProvider
* @return this builder
*/
public Builder proxyCredentialsProvider(ProxyCredentialsProvider proxyCredentialsProvider) {
_proxyCredentialsProvider = proxyCredentialsProvider;
return this;
}

/**
* Set the mtls authentication against the proxy (if proxy settings are enabled). (Optional).
*
* @param proxyMtlsAuth
* @param proxyConfiguration
* @return this builder
*/
public Builder proxyMtlsAuth(ProxyMTLSAuth proxyMtlsAuth) {
_proxyMtlsAuth = proxyMtlsAuth;
public Builder proxyConfiguration(ProxyConfiguration proxyConfiguration) {
_proxyConfiguration = proxyConfiguration;
return this;
}

Expand All @@ -847,7 +828,7 @@ public Builder disableDestroyOnShutDown() {

HttpHost proxy() {
if (_proxyPort != -1) {
return new HttpHost(_proxyScheme, _proxyHost, _proxyPort);
return new HttpHost(_proxyHost, _proxyPort);
}
// Default is no proxy.
return null;
Expand Down Expand Up @@ -986,7 +967,7 @@ public Builder operationMode(OperationMode mode) {

/**
*
* @param storage mode
* @param mode
* @return this builder
*/
public Builder storageMode(StorageMode mode) {
Expand Down Expand Up @@ -1156,31 +1137,16 @@ private void verifyAlternativeClient() {
}

private void verifyProxy() {
if (_proxyPort == -1) {
if (_proxyConfiguration == null)
return;
}

if (!(_proxyScheme.equals(HttpScheme.HTTP) || _proxyScheme.equals(HttpScheme.HTTPS))) {
if (!(_proxyConfiguration.getHost().getSchemeName().equals(HttpScheme.HTTP) ||
_proxyConfiguration.getHost().getSchemeName().equals(HttpScheme.HTTPS))) {
throw new IllegalArgumentException("Proxy scheme must be either http or https.");
}

if (_proxyUsername == null && _proxyCredentialsProvider == null && _proxyMtlsAuth == null) {
return;
}

if (_proxyUsername != null && _proxyCredentialsProvider != null) {
throw new IllegalArgumentException("Proxy user and Proxy token params are updated, set only one param.");
}

if (_proxyUsername != null && _proxyMtlsAuth != null) {
throw new IllegalArgumentException("Proxy user and Proxy mTLS params are updated, set only one param.");
}

if (_proxyCredentialsProvider != null && _proxyMtlsAuth != null) {
throw new IllegalArgumentException("Proxy token and Proxy mTLS params are updated, set only one param.");
}

if (_proxyMtlsAuth != null && (_proxyMtlsAuth.getP12File() == null || _proxyMtlsAuth.getP12FilePassKey() == null)) {
if ((_proxyConfiguration.getP12File() != null && _proxyConfiguration.getPassKey() == null) ||
(_proxyConfiguration.getP12File() == null && _proxyConfiguration.getPassKey() != null)) {
throw new IllegalArgumentException("Proxy mTLS must have p12 file path and name, and pass phrase.");
}
}
Expand Down Expand Up @@ -1224,8 +1190,7 @@ public SplitClientConfig build() {
proxy(),
_proxyUsername,
_proxyPassword,
_proxyCredentialsProvider,
_proxyMtlsAuth,
_proxyConfiguration,
_eventsQueueSize,
_eventSendIntervalInMillis,
_maxStringLength,
Expand Down
54 changes: 40 additions & 14 deletions client/src/main/java/io/split/client/SplitFactoryImpl.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.split.client;

import com.google.common.io.Files;
import io.split.client.dtos.BearerCredentialsProvider;
import io.split.client.dtos.Metadata;
import io.split.client.events.EventsSender;
import io.split.client.events.EventsStorage;
Expand Down Expand Up @@ -105,6 +106,7 @@
import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.io.SocketConfig;
import org.apache.hc.core5.http.ssl.TLS;
import org.apache.hc.core5.ssl.SSLContexts;
Expand Down Expand Up @@ -551,7 +553,7 @@ protected static SplitHttpClient buildSplitHttpClient(String apiToken, SplitClie
.addResponseInterceptorLast((new GzipDecoderResponseInterceptor()));

// Set up proxy is it exists
if (config.proxy() != null) {
if (config.proxy() != null || config.proxyConfiguration() != null) {
httpClientbuilder = setupProxy(httpClientbuilder, config);
}

Expand Down Expand Up @@ -590,7 +592,7 @@ private static CloseableHttpClient buildSSEdHttpClient(String apiToken, SplitCli
.addRequestInterceptorLast(ClientKeyInterceptorFilter.instance(apiToken));

// Set up proxy is it exists
if (config.proxy() != null) {
if (config.proxy() != null || config.proxyConfiguration() != null) {
httpClientbuilder = setupProxy(httpClientbuilder, config);
}

Expand All @@ -599,15 +601,15 @@ private static CloseableHttpClient buildSSEdHttpClient(String apiToken, SplitCli

private static SSLContext buildSSLContext(SplitClientConfig config) throws IOException, NullPointerException {
SSLContext sslContext;
if (config.proxyMTLSAuth() != null) {
if (config.proxyConfiguration() != null && config.proxyConfiguration().getP12File() != null) {
_log.debug("Proxy setup using mTLS");
InputStream keystoreStream = null;
try {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keystoreStream = java.nio.file.Files.newInputStream(Paths.get(config.proxyMTLSAuth().getP12File()));
keyStore.load(keystoreStream, config.proxyMTLSAuth().getP12FilePassKey().toCharArray());
keystoreStream = java.nio.file.Files.newInputStream(Paths.get(config.proxyConfiguration().getP12File()));
keyStore.load(keystoreStream, config.proxyConfiguration().getPassKey().toCharArray());
sslContext = SSLContexts.custom()
.loadKeyMaterial(keyStore, config.proxyMTLSAuth().getP12FilePassKey().toCharArray())
.loadKeyMaterial(keyStore, config.proxyConfiguration().getPassKey().toCharArray())
.build();
} catch (Exception e) {
_log.error("Exception caught while processing p12 file for Proxy mTLS auth: ", e);
Expand All @@ -626,22 +628,46 @@ private static SSLContext buildSSLContext(SplitClientConfig config) throws IOExc

private static HttpClientBuilder setupProxy(HttpClientBuilder httpClientbuilder, SplitClientConfig config) {
_log.info("Initializing Split SDK with proxy settings");
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(config.proxy());
HttpHost proxyHost;
if (config.proxyConfiguration() != null && config.proxyConfiguration().getHost() != null) {
proxyHost = config.proxyConfiguration().getHost();
} else {
_log.warn("`proxyHost`, `proxyPort` configuration methods are deprecated. Please use `ProxyConfiguration` builder instead.");
proxyHost = config.proxy();
}
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxyHost);
httpClientbuilder.setRoutePlanner(routePlanner);

if (config.proxyUsername() != null && config.proxyPassword() != null) {
if ((config.proxyUsername() != null && config.proxyPassword() != null) ||
(config.proxyConfiguration() != null && config.proxyConfiguration().getProxyCredentialsProvider() != null &&
config.proxyConfiguration().getProxyCredentialsProvider() instanceof io.split.client.dtos.BasicCredentialsProvider)) {
_log.debug("Proxy setup using credentials");
String userName;
String password;
if (config.proxyUsername() == null && config.proxyPassword() == null) {
io.split.client.dtos.BasicCredentialsProvider basicAuth =
(io.split.client.dtos.BasicCredentialsProvider) config.proxyConfiguration().getProxyCredentialsProvider();
userName = basicAuth.getUsername();
password = basicAuth.getPassword();
} else {
_log.warn("`proxyUsername` and `proxyPassword` configuration methods are deprecated. " +
"Please use `ProxyConfiguration` builder instead.");
userName = config.proxyUsername();
password = config.proxyPassword();
}
BasicCredentialsProvider credsProvider = new BasicCredentialsProvider();
AuthScope siteScope = new AuthScope(config.proxy().getHostName(), config.proxy().getPort());
Credentials siteCreds = new UsernamePasswordCredentials(config.proxyUsername(),
config.proxyPassword().toCharArray());
AuthScope siteScope = new AuthScope(proxyHost.getHostName(), proxyHost.getPort());
Credentials siteCreds = new UsernamePasswordCredentials(userName,
password.toCharArray());
credsProvider.setCredentials(siteScope, siteCreds);
httpClientbuilder.setDefaultCredentialsProvider(credsProvider);
}

if (config.proxyCredentialsProvider() != null) {
_log.debug("Proxy setup using token");
httpClientbuilder.setDefaultCredentialsProvider(new HttpClientDynamicCredentials(config.proxyCredentialsProvider()));
if (config.proxyConfiguration() != null &&
config.proxyConfiguration().getProxyCredentialsProvider() instanceof io.split.client.dtos.BearerCredentialsProvider) {
_log.debug("Proxy setup using Bearer token");
httpClientbuilder.setDefaultCredentialsProvider(new HttpClientDynamicCredentials(
(BearerCredentialsProvider) config.proxyConfiguration().getProxyCredentialsProvider()));
}

return httpClientbuilder;
Expand Down
Loading