Skip to content

Commit 9e46ad5

Browse files
author
Bilal Al
committed
Refactor kerberos code to sub module
1 parent 7d136d7 commit 9e46ad5

File tree

15 files changed

+247
-551
lines changed

15 files changed

+247
-551
lines changed

client/pom.xml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -177,18 +177,6 @@
177177
<artifactId>snakeyaml</artifactId>
178178
<version>2.0</version>
179179
</dependency>
180-
<dependency>
181-
<groupId>com.squareup.okhttp3</groupId>
182-
<artifactId>okhttp</artifactId>
183-
<version>4.12.0</version>
184-
<optional>true</optional>
185-
</dependency>
186-
<dependency>
187-
<groupId>com.squareup.okhttp3</groupId>
188-
<artifactId>logging-interceptor</artifactId>
189-
<version>4.12.0</version>
190-
<optional>true</optional>
191-
</dependency>
192180

193181
<!-- Test deps -->
194182
<dependency>

client/src/main/java/io/split/client/SplitClientConfig.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.split.client.utils.FileTypeEnum;
66
import io.split.integrations.IntegrationsConfig;
77
import io.split.service.ProxyAuthScheme;
8+
import io.split.service.SplitHttpClient;
89
import io.split.storages.enums.OperationMode;
910
import io.split.storages.enums.StorageMode;
1011
import org.apache.hc.core5.http.HttpHost;
@@ -94,6 +95,7 @@ public class SplitClientConfig {
9495
private final CustomHeaderDecorator _customHeaderDecorator;
9596
private final ProxyAuthScheme _proxyAuthScheme;
9697
private final String _proxyKerberosPrincipalName;
98+
private final SplitHttpClient _proxyKerberosClient;
9799

98100
public static Builder builder() {
99101
return new Builder();
@@ -152,7 +154,8 @@ private SplitClientConfig(String endpoint,
152154
int invalidSets,
153155
CustomHeaderDecorator customHeaderDecorator,
154156
ProxyAuthScheme proxyAuthScheme,
155-
String proxyKerberosPrincipalName) {
157+
String proxyKerberosPrincipalName,
158+
SplitHttpClient proxyKerberosClient) {
156159
_endpoint = endpoint;
157160
_eventsEndpoint = eventsEndpoint;
158161
_featuresRefreshRate = pollForFeatureChangesEveryNSeconds;
@@ -207,6 +210,7 @@ private SplitClientConfig(String endpoint,
207210
_customHeaderDecorator = customHeaderDecorator;
208211
_proxyAuthScheme = proxyAuthScheme;
209212
_proxyKerberosPrincipalName = proxyKerberosPrincipalName;
213+
_proxyKerberosClient = proxyKerberosClient;
210214

211215
Properties props = new Properties();
212216
try {
@@ -419,6 +423,7 @@ public ProxyAuthScheme proxyAuthScheme() {
419423
}
420424
public String proxyKerberosPrincipalName() { return _proxyKerberosPrincipalName; }
421425

426+
public SplitHttpClient proxyKerberosClient() { return _proxyKerberosClient; }
422427
public static final class Builder {
423428

424429
private String _endpoint = SDK_ENDPOINT;
@@ -478,6 +483,7 @@ public static final class Builder {
478483
private CustomHeaderDecorator _customHeaderDecorator = null;
479484
private ProxyAuthScheme _proxyAuthScheme = null;
480485
private String _proxyKerberosPrincipalName = null;
486+
private SplitHttpClient _proxyKerberosClient = null;
481487

482488
public Builder() {
483489
}
@@ -994,6 +1000,17 @@ public Builder proxyKerberosPrincipalName(String proxyKerberosPrincipalName) {
9941000
return this;
9951001
}
9961002

1003+
/**
1004+
* Kerberos Http Client
1005+
*
1006+
* @param proxyKerberosClient
1007+
* @return this builder
1008+
*/
1009+
public Builder proxyKerberosClient(SplitHttpClient proxyKerberosClient) {
1010+
_proxyKerberosClient = proxyKerberosClient;
1011+
return this;
1012+
}
1013+
9971014
/**
9981015
* Thread Factory
9991016
*
@@ -1060,6 +1077,9 @@ private void verifyAuthScheme() {
10601077
if (_proxyKerberosPrincipalName == null) {
10611078
throw new IllegalStateException("Kerberos mode require Kerberos Principal Name.");
10621079
}
1080+
if (_proxyKerberosClient == null) {
1081+
throw new IllegalStateException("Kerberos mode require Kerberos Http Client.");
1082+
}
10631083
}
10641084
}
10651085

@@ -1184,7 +1204,8 @@ public SplitClientConfig build() {
11841204
_invalidSetsCount,
11851205
_customHeaderDecorator,
11861206
_proxyAuthScheme,
1187-
_proxyKerberosPrincipalName);
1207+
_proxyKerberosPrincipalName,
1208+
_proxyKerberosClient);
11881209
}
11891210
}
11901211
}

client/src/main/java/io/split/client/SplitFactoryBuilder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.split.inputValidation.ApiKeyValidator;
44
import io.split.grammar.Treatments;
5+
import io.split.service.SplitHttpClient;
56
import io.split.storages.enums.StorageMode;
67
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;

client/src/main/java/io/split/client/SplitFactoryImpl.java

Lines changed: 26 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,9 @@
5858
import io.split.engine.segments.SegmentSynchronizationTaskImp;
5959
import io.split.integrations.IntegrationsConfig;
6060
import io.split.service.ProxyAuthScheme;
61-
import io.split.service.SplitHttpClientKerberosImpl;
6261
import io.split.service.SplitHttpClientImpl;
6362
import io.split.service.SplitHttpClient;
64-
import io.split.service.HTTPKerberosAuthInterceptor;
63+
6564
import io.split.storages.SegmentCache;
6665
import io.split.storages.SegmentCacheConsumer;
6766
import io.split.storages.SegmentCacheProducer;
@@ -86,6 +85,7 @@
8685
import io.split.telemetry.synchronizer.TelemetryInMemorySubmitter;
8786
import io.split.telemetry.synchronizer.TelemetrySyncTask;
8887
import io.split.telemetry.synchronizer.TelemetrySynchronizer;
88+
8989
import org.apache.hc.client5.http.auth.AuthScope;
9090
import org.apache.hc.client5.http.auth.Credentials;
9191
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
@@ -108,26 +108,16 @@
108108
import org.slf4j.LoggerFactory;
109109
import pluggable.CustomStorageWrapper;
110110

111-
import okhttp3.Authenticator;
112-
import okhttp3.OkHttpClient;
113-
import okhttp3.OkHttpClient.Builder;
114-
import okhttp3.logging.HttpLoggingInterceptor;
115-
116111
import java.io.IOException;
117112
import java.io.InputStream;
118113
import java.net.InetAddress;
119114
import java.net.URI;
120115
import java.net.URISyntaxException;
121-
import java.net.InetSocketAddress;
122-
import java.net.Proxy;
123-
import java.util.Map;
124-
import java.util.HashMap;
125116
import java.util.concurrent.ExecutorService;
126117
import java.util.stream.Collectors;
127118
import java.util.HashSet;
128119
import java.util.List;
129120
import java.util.ArrayList;
130-
import java.util.concurrent.TimeUnit;
131121

132122
import static io.split.client.utils.SplitExecutorFactory.buildExecutorService;
133123

@@ -167,15 +157,16 @@ public class SplitFactoryImpl implements SplitFactory {
167157
private final SplitSynchronizationTask _splitSynchronizationTask;
168158
private final EventsTask _eventsTask;
169159
private final SyncManager _syncManager;
170-
private final SplitHttpClient _splitHttpClient;
160+
private SplitHttpClient _splitHttpClient;
171161
private final UserStorageWrapper _userStorageWrapper;
172162
private final ImpressionsSender _impressionsSender;
173163
private final URI _rootTarget;
174164
private final URI _eventsRootTarget;
175165
private final UniqueKeysTracker _uniqueKeysTracker;
166+
private RequestDecorator _requestDecorator;
176167

177168
// Constructor for standalone mode
178-
public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyntaxException, IOException {
169+
public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyntaxException {
179170
_userStorageWrapper = null;
180171
_operationMode = config.operationMode();
181172
_startTime = System.currentTimeMillis();
@@ -199,8 +190,14 @@ public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyn
199190
_gates = new SDKReadinessGates();
200191

201192
// HttpClient
202-
RequestDecorator requestDecorator = new RequestDecorator(config.customHeaderDecorator());
203-
_splitHttpClient = buildSplitHttpClient(apiToken, config, _sdkMetadata, requestDecorator);
193+
_requestDecorator = new RequestDecorator(config.customHeaderDecorator());
194+
if (config.proxyAuthScheme() != ProxyAuthScheme.KERBEROS) {
195+
_splitHttpClient = buildSplitHttpClient(apiToken, config, _sdkMetadata, _requestDecorator);
196+
} else {
197+
_splitHttpClient = config.proxyKerberosClient();
198+
_splitHttpClient.setMetaData(_sdkMetadata);
199+
_splitHttpClient.setRequestDecorator(_requestDecorator);
200+
}
204201

205202
// Roots
206203
_rootTarget = URI.create(config.endpoint());
@@ -269,7 +266,7 @@ public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyn
269266
// SyncManager
270267
SplitTasks splitTasks = SplitTasks.build(_splitSynchronizationTask, _segmentSynchronizationTaskImp,
271268
_impressionsManager, _eventsTask, _telemetrySyncTask, _uniqueKeysTracker);
272-
SplitAPI splitAPI = SplitAPI.build(_splitHttpClient, buildSSEdHttpClient(apiToken, config, _sdkMetadata), requestDecorator);
269+
SplitAPI splitAPI = SplitAPI.build(_splitHttpClient, buildSSEdHttpClient(apiToken, config, _sdkMetadata), _requestDecorator);
273270

274271
_syncManager = SyncManagerImp.build(splitTasks, _splitFetcher, splitCache, splitAPI,
275272
segmentCache, _gates, _telemetryStorageProducer, _telemetrySynchronizer, config, splitParser,
@@ -287,6 +284,14 @@ public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyn
287284
}
288285
}
289286

287+
public RequestDecorator getRequestDecorator() {
288+
return _requestDecorator;
289+
}
290+
291+
public SDKMetadata getSDKMetaData() {
292+
return _sdkMetadata;
293+
}
294+
290295
// Constructor for consumer mode
291296
protected SplitFactoryImpl(String apiToken, SplitClientConfig config, CustomStorageWrapper customStorageWrapper)
292297
throws URISyntaxException {
@@ -503,36 +508,12 @@ public boolean isDestroyed() {
503508
return isTerminated;
504509
}
505510

511+
public void setSplitHttpClient(SplitHttpClient splitHttpClient) {
512+
_splitHttpClient = splitHttpClient;
513+
}
506514
protected static SplitHttpClient buildSplitHttpClient(String apiToken, SplitClientConfig config,
507515
SDKMetadata sdkMetadata, RequestDecorator requestDecorator)
508-
throws URISyntaxException, IOException {
509-
// setup Kerberos client
510-
if (config.proxyAuthScheme() == ProxyAuthScheme.KERBEROS) {
511-
_log.info("Using Kerberos-Proxy Authentication Scheme.");
512-
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(config.proxy().getHostName(), config.proxy().getPort()));
513-
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
514-
if (config.debugEnabled()) {
515-
logging.setLevel(HttpLoggingInterceptor.Level.HEADERS);
516-
} else {
517-
logging.setLevel(HttpLoggingInterceptor.Level.NONE);
518-
}
519-
520-
Map<String, String> kerberosOptions = new HashMap<>();
521-
kerberosOptions.put("com.sun.security.auth.module.Krb5LoginModule", "required");
522-
kerberosOptions.put("refreshKrb5Config", "false");
523-
kerberosOptions.put("doNotPrompt", "false");
524-
kerberosOptions.put("useTicketCache", "true");
525-
526-
Authenticator proxyAuthenticator = getProxyAuthenticator(config, kerberosOptions);
527-
OkHttpClient client = buildOkHttpClient(proxy, config, logging, proxyAuthenticator);
528-
529-
return SplitHttpClientKerberosImpl.create(
530-
client,
531-
requestDecorator,
532-
apiToken,
533-
sdkMetadata);
534-
}
535-
516+
throws URISyntaxException {
536517
SSLConnectionSocketFactory sslSocketFactory = SSLConnectionSocketFactoryBuilder.create()
537518
.setSslContext(SSLContexts.createSystemDefault())
538519
.setTlsVersions(TLS.V_1_1, TLS.V_1_2)
@@ -570,21 +551,6 @@ protected static SplitHttpClient buildSplitHttpClient(String apiToken, SplitClie
570551
sdkMetadata);
571552
}
572553

573-
protected static OkHttpClient buildOkHttpClient(Proxy proxy, SplitClientConfig config,
574-
HttpLoggingInterceptor logging, Authenticator proxyAuthenticator) {
575-
return new Builder()
576-
.proxy(proxy)
577-
.readTimeout(config.readTimeout(), TimeUnit.MILLISECONDS)
578-
.connectTimeout(config.connectionTimeout(), TimeUnit.MILLISECONDS)
579-
.addInterceptor(logging)
580-
.proxyAuthenticator(proxyAuthenticator)
581-
.build();
582-
}
583-
584-
protected static HTTPKerberosAuthInterceptor getProxyAuthenticator(SplitClientConfig config,
585-
Map<String, String> kerberosOptions) throws IOException {
586-
return new HTTPKerberosAuthInterceptor(config.proxyKerberosPrincipalName(), kerberosOptions);
587-
}
588554
private static CloseableHttpClient buildSSEdHttpClient(String apiToken, SplitClientConfig config,
589555
SDKMetadata sdkMetadata) {
590556
RequestConfig requestConfig = RequestConfig.custom()

client/src/main/java/io/split/service/SplitHttpClient.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.split.service;
22

3+
import io.split.client.RequestDecorator;
4+
import io.split.client.utils.SDKMetadata;
35
import io.split.engine.common.FetchOptions;
46
import io.split.client.dtos.SplitHttpResponse;
57

@@ -32,4 +34,8 @@ public interface SplitHttpClient extends Closeable {
3234
public SplitHttpResponse post(URI uri,
3335
HttpEntity entity,
3436
Map<String, List<String>> additionalHeaders) throws IOException;
35-
}
37+
38+
public void setMetaData(SDKMetadata metadata);
39+
40+
public void setRequestDecorator(RequestDecorator requestDecorator);
41+
}

client/src/main/java/io/split/service/SplitHttpClientImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,15 @@ private void setBasicHeaders(HttpRequest request) {
145145
public void close() throws IOException {
146146
_client.close();
147147
}
148+
149+
@Override
150+
public void setMetaData(SDKMetadata metadata) {
151+
// only implemented for Kerberos client
152+
}
153+
154+
@Override
155+
public void setRequestDecorator(RequestDecorator requestDecorator) {
156+
// only implemented for Kerberos client
157+
}
158+
148159
}

0 commit comments

Comments
 (0)