Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit a9ffe83

Browse files
authored
Merge pull request #469 from marklogic-community/feature/188-hostname-verifier
DEVEXP-188: User can now configure SSL hostname verifier
2 parents 2234d44 + e51a20d commit a9ffe83

File tree

8 files changed

+102
-1
lines changed

8 files changed

+102
-1
lines changed

src/main/java/com/marklogic/appdeployer/DefaultAppConfigFactory.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.marklogic.appdeployer;
22

3+
import com.marklogic.appdeployer.util.JavaClientUtil;
34
import com.marklogic.client.DatabaseClient;
5+
import com.marklogic.client.DatabaseClientFactory;
46
import com.marklogic.client.ext.SecurityContextType;
57
import com.marklogic.mgmt.util.PropertySource;
68
import com.marklogic.mgmt.util.PropertySourceFactory;
@@ -249,6 +251,11 @@ public void initialize() {
249251
config.setAppServicesSslProtocol(prop);
250252
});
251253

254+
propertyConsumerMap.put("mlAppServicesSslHostnameVerifier", (config, prop) -> {
255+
logger.info("App-Services SSL hostname verifier: " + prop);
256+
config.setAppServicesSslHostnameVerifier(JavaClientUtil.toSSLHostnameVerifier(prop));
257+
});
258+
252259
propertyConsumerMap.put("mlAppServicesUseDefaultKeystore", (config, prop) -> {
253260
logger.info("Using default JVM keystore for SSL for App-Services server: " + prop);
254261
config.setAppServicesUseDefaultKeystore(Boolean.parseBoolean(prop));
@@ -350,6 +357,11 @@ public void initialize() {
350357
config.setRestSslProtocol(prop);
351358
});
352359

360+
propertyConsumerMap.put("mlRestSslHostnameVerifier", (config, prop) -> {
361+
logger.info("REST SSL hostname verifier: " + prop);
362+
config.setRestSslHostnameVerifier(JavaClientUtil.toSSLHostnameVerifier(prop));
363+
});
364+
353365
propertyConsumerMap.put("mlRestUseDefaultKeystore", (config, prop) -> {
354366
logger.info("Using default JVM keystore for SSL for client REST API server: " + prop);
355367
config.setRestUseDefaultKeystore(Boolean.parseBoolean(prop));
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.marklogic.appdeployer.util;
2+
3+
import com.marklogic.client.DatabaseClientFactory;
4+
5+
public interface JavaClientUtil {
6+
7+
static DatabaseClientFactory.SSLHostnameVerifier toSSLHostnameVerifier(String type) {
8+
if ("any".equalsIgnoreCase(type)) {
9+
return DatabaseClientFactory.SSLHostnameVerifier.ANY;
10+
}
11+
if ("common".equalsIgnoreCase(type)) {
12+
return DatabaseClientFactory.SSLHostnameVerifier.COMMON;
13+
}
14+
if ("strict".equalsIgnoreCase(type)) {
15+
return DatabaseClientFactory.SSLHostnameVerifier.STRICT;
16+
}
17+
throw new IllegalArgumentException(String.format("Unrecognized SSLHostnameVerifier type: " + type));
18+
}
19+
}

src/main/java/com/marklogic/mgmt/DefaultManageConfigFactory.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.marklogic.mgmt;
22

3+
import com.marklogic.appdeployer.util.JavaClientUtil;
34
import com.marklogic.mgmt.util.PropertySource;
45
import com.marklogic.mgmt.util.PropertySourceFactory;
56
import org.springframework.util.StringUtils;
@@ -112,6 +113,11 @@ public void initialize() {
112113
config.setSslProtocol(prop);
113114
});
114115

116+
propertyConsumerMap.put("mlManageSslHostnameVerifier", (config, prop) -> {
117+
logger.info("Manage SSL hostname verifier: " + prop);
118+
config.setSslHostnameVerifier(JavaClientUtil.toSSLHostnameVerifier(prop));
119+
});
120+
115121
propertyConsumerMap.put("mlManageUseDefaultKeystore", (config, prop) -> {
116122
logger.info("Using default JVM keystore for SSL for Manage app server: " + prop);
117123
config.setUseDefaultKeystore(Boolean.parseBoolean(prop));

src/main/java/com/marklogic/mgmt/admin/DefaultAdminConfigFactory.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.marklogic.mgmt.admin;
22

3+
import com.marklogic.appdeployer.util.JavaClientUtil;
34
import com.marklogic.mgmt.util.PropertySource;
45
import com.marklogic.mgmt.util.PropertySourceFactory;
56

@@ -108,6 +109,11 @@ public void initialize() {
108109
config.setSslProtocol(prop);
109110
});
110111

112+
propertyConsumerMap.put("mlAdminSslHostnameVerifier", (config, prop) -> {
113+
logger.info("Admin SSL hostname verifier: " + prop);
114+
config.setSslHostnameVerifier(JavaClientUtil.toSSLHostnameVerifier(prop));
115+
});
116+
111117
propertyConsumerMap.put("mlAdminUseDefaultKeystore", (config, prop) -> {
112118
logger.info("Using default JVM keystore for SSL for Admin app server: " + prop);
113119
config.setUseDefaultKeystore(Boolean.parseBoolean(prop));

src/main/java/com/marklogic/rest/util/RestConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ public DatabaseClientBuilder newDatabaseClientBuilder() {
7878
.withCertificateFile(getCertFile())
7979
.withCertificatePassword(getCertPassword())
8080
.withKerberosPrincipal(getExternalName())
81-
.withSAMLToken(getSamlToken());
81+
.withSAMLToken(getSamlToken())
82+
.withSSLHostnameVerifier(getSslHostnameVerifier());
8283

8384
if (getSslContext() != null) {
8485
builder.withSSLContext(getSslContext());

src/test/java/com/marklogic/appdeployer/DefaultAppConfigFactoryTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import static org.junit.jupiter.api.Assertions.assertFalse;
1818
import static org.junit.jupiter.api.Assertions.assertNotNull;
1919
import static org.junit.jupiter.api.Assertions.assertNull;
20+
import static org.junit.jupiter.api.Assertions.assertThrows;
2021
import static org.junit.jupiter.api.Assertions.assertTrue;
2122
import static org.junit.jupiter.api.Assertions.fail;
2223

@@ -670,6 +671,31 @@ void cloudApiKeyAndBasePath() {
670671
assertEquals("/test/path", config.getTestRestBasePath());
671672
}
672673

674+
@Test
675+
void sslHostnameVerifier() {
676+
AppConfig config = new DefaultAppConfigFactory(new SimplePropertySource(
677+
"mlRestSslHostnameVerifier", "any",
678+
"mlAppServicesSslHostnameVerifier", "COMmon"
679+
)).newAppConfig();
680+
681+
assertEquals(DatabaseClientFactory.SSLHostnameVerifier.ANY, config.getRestSslHostnameVerifier());
682+
assertEquals(DatabaseClientFactory.SSLHostnameVerifier.COMMON, config.getAppServicesSslHostnameVerifier());
683+
684+
config = new DefaultAppConfigFactory(new SimplePropertySource(
685+
"mlRestSslHostnameVerifier", "STRICT",
686+
"mlAppServicesSslHostnameVerifier", "ANY"
687+
)).newAppConfig();
688+
689+
assertEquals(DatabaseClientFactory.SSLHostnameVerifier.STRICT, config.getRestSslHostnameVerifier());
690+
assertEquals(DatabaseClientFactory.SSLHostnameVerifier.ANY, config.getAppServicesSslHostnameVerifier());
691+
692+
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () ->
693+
new DefaultAppConfigFactory(new SimplePropertySource("mlRestSslHostnameVerifier", "bogus")).newAppConfig());
694+
assertEquals("Unable to parse value 'bogus' for property 'mlRestSslHostnameVerifier'; " +
695+
"cause: Unrecognized SSLHostnameVerifier type: bogus",
696+
ex.getMessage());
697+
}
698+
673699
@Test
674700
void samlTokens() {
675701
AppConfig config = new DefaultAppConfigFactory(new SimplePropertySource(

src/test/java/com/marklogic/mgmt/DefaultManageConfigFactoryTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.junit.jupiter.api.Test;
77

88
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
import static org.junit.jupiter.api.Assertions.assertThrows;
910
import static org.junit.jupiter.api.Assertions.assertTrue;
1011

1112
public class DefaultManageConfigFactoryTest {
@@ -165,6 +166,20 @@ void samlAuth() {
165166
assertEquals("my-token", ((DatabaseClientFactory.SAMLAuthContext)bean.getSecurityContext()).getToken());
166167
}
167168

169+
@Test
170+
void sslHostnameVerifier() {
171+
ManageConfig config = configure("mlManageSslHostnameVerifier", "common");
172+
assertEquals(DatabaseClientFactory.SSLHostnameVerifier.COMMON, config.getSslHostnameVerifier());
173+
174+
config = configure("mlManageSslHostnameVerifier", "ANY");
175+
assertEquals(DatabaseClientFactory.SSLHostnameVerifier.ANY, config.getSslHostnameVerifier());
176+
177+
config = configure("mlManageSslHostnameVerifier", "strICT");
178+
assertEquals(DatabaseClientFactory.SSLHostnameVerifier.STRICT, config.getSslHostnameVerifier());
179+
180+
assertThrows(IllegalArgumentException.class, () -> configure("mlManageSslHostnameVerifier", "bogus"));
181+
}
182+
168183
private ManageConfig configure(String... properties) {
169184
return new DefaultManageConfigFactory(new SimplePropertySource(properties)).newManageConfig();
170185
}

src/test/java/com/marklogic/mgmt/admin/DefaultAdminConfigFactoryTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.marklogic.mgmt.admin;
22

33
import com.marklogic.client.DatabaseClientFactory;
4+
import com.marklogic.mgmt.ManageConfig;
45
import com.marklogic.mgmt.util.SimplePropertySource;
56
import com.marklogic.rest.util.RestTemplateUtil;
67
import org.junit.jupiter.api.Test;
78

89
import static org.junit.jupiter.api.Assertions.assertEquals;
910
import static org.junit.jupiter.api.Assertions.assertNotNull;
11+
import static org.junit.jupiter.api.Assertions.assertThrows;
1012
import static org.junit.jupiter.api.Assertions.assertTrue;
1113

1214
public class DefaultAdminConfigFactoryTest {
@@ -123,6 +125,20 @@ void samlAuth() {
123125
assertEquals("my-token", ((DatabaseClientFactory.SAMLAuthContext)bean.getSecurityContext()).getToken());
124126
}
125127

128+
@Test
129+
void sslHostnameVerifier() {
130+
AdminConfig config = configure("mlAdminSslHostnameVerifier", "common");
131+
assertEquals(DatabaseClientFactory.SSLHostnameVerifier.COMMON, config.getSslHostnameVerifier());
132+
133+
config = configure("mlAdminSslHostnameVerifier", "ANY");
134+
assertEquals(DatabaseClientFactory.SSLHostnameVerifier.ANY, config.getSslHostnameVerifier());
135+
136+
config = configure("mlAdminSslHostnameVerifier", "strICT");
137+
assertEquals(DatabaseClientFactory.SSLHostnameVerifier.STRICT, config.getSslHostnameVerifier());
138+
139+
assertThrows(IllegalArgumentException.class, () -> configure("mlAdminSslHostnameVerifier", "bogus"));
140+
}
141+
126142
private AdminConfig configure(String... properties) {
127143
return new DefaultAdminConfigFactory(new SimplePropertySource(properties)).newAdminConfig();
128144
}

0 commit comments

Comments
 (0)