Skip to content

Commit cfec632

Browse files
committed
CWMS-1875 - Removing use of .pem
1 parent 73335f6 commit cfec632

File tree

4 files changed

+43
-28
lines changed

4 files changed

+43
-28
lines changed

cwbi-auth-http-client/src/main/java/hec/army/usace/hec/cwbi/auth/http/client/CwbiAuthUtil.java

+32-10
Original file line numberDiff line numberDiff line change
@@ -23,32 +23,54 @@
2323
*/
2424
package hec.army.usace.hec.cwbi.auth.http.client;
2525

26-
27-
import static hec.army.usace.hec.cwbi.auth.http.client.trustmanagers.CwbiAuthTrustManager.TOKEN_URL;
28-
2926
import java.io.IOException;
27+
import java.io.UncheckedIOException;
3028
import java.util.Collections;
29+
import java.util.Map;
3130
import java.util.Objects;
31+
import java.util.concurrent.ConcurrentHashMap;
3232
import javax.net.ssl.KeyManager;
3333
import javax.net.ssl.SSLSocketFactory;
3434
import mil.army.usace.hec.cwms.http.client.auth.OAuth2TokenProvider;
3535

3636
public final class CwbiAuthUtil {
3737

38+
private static final Map<String, OAuth2TokenProvider> TOKEN_PROVIDER_CACHE = new ConcurrentHashMap<>();
39+
3840
private CwbiAuthUtil() {
3941
throw new AssertionError("Utility class");
4042
}
4143

4244
/**
4345
* Builds CumulusTokenProvider for retrieving and refreshing tokens for cumulus authentication.
44-
* @param keyManager - KeyManager for client
45-
* @return OAuth2TokenProvider - CumulusTokenProvider
46+
* Caches the TokenProvider instance per KeyCloak token URL to prevent redundant creation.
47+
* Ensures thread safety and propagates IOException.
48+
*
49+
* @param tokenUrl - KeyCloak token URL
50+
* @param clientId - Client ID for authentication
51+
* @param keyManager - KeyManager for client SSL
52+
* @return OAuth2TokenProvider - Cached or newly created TokenProvider
4653
* @throws IOException - thrown if failed to build CumulusTokenProvider
4754
*/
48-
public static OAuth2TokenProvider buildCwbiAuthTokenProvider(String clientId, KeyManager keyManager) throws IOException {
49-
SSLSocketFactory sslSocketFactory = CwbiAuthSslSocketFactory.buildSSLSocketFactory(
50-
Collections.singletonList(Objects.requireNonNull(keyManager, "Missing required KeyManager")));
51-
return new CwbiAuthTokenProvider(TOKEN_URL, clientId, sslSocketFactory);
52-
}
55+
public static OAuth2TokenProvider buildCwbiAuthTokenProvider(String tokenUrl, String clientId, KeyManager keyManager) throws IOException {
56+
Objects.requireNonNull(tokenUrl, "Missing required tokenUrl");
57+
Objects.requireNonNull(clientId, "Missing required clientId");
58+
Objects.requireNonNull(keyManager, "Missing required KeyManager");
5359

60+
try {
61+
return TOKEN_PROVIDER_CACHE.computeIfAbsent(tokenUrl, url -> {
62+
try {
63+
SSLSocketFactory sslSocketFactory = CwbiAuthSslSocketFactory.buildSSLSocketFactory(
64+
Collections.singletonList(keyManager));
65+
return new CwbiAuthTokenProvider(url, clientId, sslSocketFactory);
66+
} catch (IOException e) {
67+
throw new UncheckedIOException(e);
68+
}
69+
});
70+
} catch (UncheckedIOException e) {
71+
throw e.getCause();
72+
}
73+
}
5474
}
75+
76+

cwbi-auth-http-client/src/main/java/hec/army/usace/hec/cwbi/auth/http/client/trustmanagers/CwbiAuthTrustManager.java

+6-14
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,10 @@
2323
*/
2424
package hec.army.usace.hec.cwbi.auth.http.client.trustmanagers;
2525

26-
import java.io.IOException;
27-
import java.io.InputStream;
2826
import java.security.KeyStore;
2927
import java.security.KeyStoreException;
3028
import java.security.NoSuchAlgorithmException;
31-
import java.security.cert.Certificate;
3229
import java.security.cert.CertificateException;
33-
import java.security.cert.CertificateFactory;
3430
import java.security.cert.X509Certificate;
3531
import java.util.Arrays;
3632
import java.util.logging.Level;
@@ -45,6 +41,7 @@ public final class CwbiAuthTrustManager implements X509TrustManager {
4541

4642
private static final Logger LOGGER = Logger.getLogger(CwbiAuthTrustManager.class.getName());
4743
public static final String TOKEN_URL = "https://auth.corps.cloud/auth/realms/water/protocol/openid-connect/token";
44+
public static final String TOKEN_TEST_URL = "https://identity-test.cwbi.us/auth/realms/cwbi/protocol/openid-connect/token";
4845
private final TrustManagerFactory trustManagerFactory;
4946

5047
private static final X509TrustManager INSTANCE = buildTrustManager();
@@ -60,17 +57,12 @@ private CwbiAuthTrustManager(TrustManagerFactory trustManagerFactory) {
6057
*/
6158
private static X509TrustManager buildTrustManager() {
6259
X509TrustManager retVal = null;
63-
try (InputStream trustedCertificateAsInputStream = CwbiAuthTrustManager.class.getResourceAsStream("cwbiAuthServer.pem")) {
64-
KeyStore ts = KeyStore.getInstance("JKS");
65-
ts.load(null, null);
66-
Certificate trustedCertificate = CertificateFactory.getInstance("X.509").generateCertificate(trustedCertificateAsInputStream);
67-
ts.setCertificateEntry("cwbi-auth-server-root-certificate", trustedCertificate);
68-
((X509Certificate) trustedCertificate).checkValidity();
60+
try {
6961
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX");
70-
trustManagerFactory.init(ts);
62+
trustManagerFactory.init((KeyStore) null);
7163
retVal = new CwbiAuthTrustManager(trustManagerFactory);
72-
} catch (CertificateException | NoSuchAlgorithmException | KeyStoreException | IOException e) {
73-
LOGGER.log(Level.SEVERE, "Unable to authenticate with CWBI Auth server", e);
64+
} catch (NoSuchAlgorithmException | KeyStoreException e) {
65+
LOGGER.log(Level.SEVERE, "Unable to initialize CWBI Auth Trust Manager", e);
7466
}
7567
return retVal;
7668
}
@@ -125,4 +117,4 @@ public X509Certificate[] getAcceptedIssuers() {
125117
.toArray(X509Certificate[]::new);
126118
}
127119

128-
}
120+
}

cwbi-auth-http-client/src/test/java/hec/army/usace/hec/cwbi/auth/http/client/TestCwbiAuthTrustManager.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ void testGetTrustManager() {
5151
List<String> details = Arrays.asList(acceptedIssuers[0].getIssuerDN().toString().split(","));
5252
details = details.stream().map(String::trim)
5353
.collect(toList());
54-
assertTrue(details.contains("CN=ISRG Root X1"));
55-
assertTrue(details.contains("O=Internet Security Research Group"));
54+
assertTrue(details.contains("CN=Entrust Root Certification Authority - EC1"));
55+
assertTrue(details.contains("O=\"Entrust"));
5656
assertTrue(details.contains("C=US"));
5757
}
5858

cwbi-auth-http-client/src/test/java/hec/army/usace/hec/cwbi/auth/http/client/TestCwbiAuthUtil.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424
package hec.army.usace.hec.cwbi.auth.http.client;
2525

26+
import static hec.army.usace.hec.cwbi.auth.http.client.trustmanagers.CwbiAuthTrustManager.TOKEN_TEST_URL;
2627
import static hec.army.usace.hec.cwbi.auth.http.client.trustmanagers.CwbiAuthTrustManager.TOKEN_URL;
2728
import static org.junit.jupiter.api.Assertions.assertEquals;
2829
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -35,14 +36,14 @@ class TestCwbiAuthUtil {
3536

3637
@Test
3738
void testBuildTokenProvider() throws IOException {
38-
CwbiAuthTokenProvider tokenProvider = (CwbiAuthTokenProvider) CwbiAuthUtil.buildCwbiAuthTokenProvider("cumulus", getTestKeyManager());
39+
CwbiAuthTokenProvider tokenProvider = (CwbiAuthTokenProvider) CwbiAuthUtil.buildCwbiAuthTokenProvider(TOKEN_URL, "cumulus", getTestKeyManager());
3940
assertEquals(TOKEN_URL, tokenProvider.getUrl());
4041
assertEquals("cumulus", tokenProvider.getClientId());
4142
}
4243

4344
@Test
4445
void testNulls() {
45-
assertThrows(NullPointerException.class, () -> CwbiAuthUtil.buildCwbiAuthTokenProvider("cumulus", null));
46+
assertThrows(NullPointerException.class, () -> CwbiAuthUtil.buildCwbiAuthTokenProvider(TOKEN_TEST_URL, "cumulus", null));
4647
}
4748

4849
private KeyManager getTestKeyManager() {

0 commit comments

Comments
 (0)