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

Commit 56d70b4

Browse files
committed
#182 Added simple SSL for Manage and Admin servers
1 parent 2fe82c2 commit 56d70b4

File tree

8 files changed

+164
-38
lines changed

8 files changed

+164
-38
lines changed

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ public ManageConfig newManageConfig() {
6060
c.setScheme(prop);
6161
}
6262

63+
prop = getProperty("mlManageSimpleSsl");
64+
if (prop != null) {
65+
logger.info("Use simple SSL for Manage app server: " + prop);
66+
c.setConfigureSimpleSsl(Boolean.parseBoolean(prop));
67+
}
68+
6369
prop = getProperty("mlAdminUsername");
6470
if (prop != null) {
6571
logger.info("Manage admin username: " + prop);
@@ -80,6 +86,24 @@ public ManageConfig newManageConfig() {
8086
c.setAdminPassword(c.getPassword());
8187
}
8288

89+
prop = getProperty("mlAdminPort");
90+
if (prop != null) {
91+
logger.info("Admin port: " + prop);
92+
c.setAdminPort(Integer.parseInt(prop));
93+
}
94+
95+
prop = getProperty("mlAdminScheme");
96+
if (prop != null) {
97+
logger.info("Admin scheme: " + prop);
98+
c.setAdminScheme(prop);
99+
}
100+
101+
prop = getProperty("mlAdminSimpleSsl");
102+
if (prop != null) {
103+
logger.info("Use simple SSL for Admin app server: " + prop);
104+
c.setAdminConfigureSimpleSsl(Boolean.parseBoolean(prop));
105+
}
106+
83107
return c;
84108
}
85109

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public void initialize(ManageConfig config) {
4646
logger.info("Initializing ManageClient with admin config, admin user: " + config.getAdminUsername());
4747
}
4848
this.adminRestTemplate = RestTemplateUtil.newRestTemplate(config.getHost(), config.getPort(),
49-
config.getAdminUsername(), config.getAdminPassword());
49+
config.getAdminUsername(), config.getAdminPassword(), config.isAdminConfigureSimpleSsl());
5050
} else {
5151
this.adminRestTemplate = restTemplate;
5252
}

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@ public class ManageConfig extends RestConfig {
1515
*/
1616
public static final String DEFAULT_USERNAME = "admin";
1717
public static final String DEFAULT_PASSWORD = "admin";
18-
18+
1919
private String adminUsername;
2020
private String adminPassword;
21+
private boolean adminConfigureSimpleSsl;
22+
private String adminScheme = "http";
23+
private int adminPort = 8001;
2124

2225
public ManageConfig() {
2326
this("localhost", DEFAULT_PASSWORD);
@@ -54,4 +57,28 @@ public String getAdminPassword() {
5457
public void setAdminPassword(String adminPassword) {
5558
this.adminPassword = adminPassword;
5659
}
60+
61+
public boolean isAdminConfigureSimpleSsl() {
62+
return adminConfigureSimpleSsl;
63+
}
64+
65+
public void setAdminConfigureSimpleSsl(boolean adminConfigureSimpleSsl) {
66+
this.adminConfigureSimpleSsl = adminConfigureSimpleSsl;
67+
}
68+
69+
public int getAdminPort() {
70+
return adminPort;
71+
}
72+
73+
public void setAdminPort(int adminPort) {
74+
this.adminPort = adminPort;
75+
}
76+
77+
public String getAdminScheme() {
78+
return adminScheme;
79+
}
80+
81+
public void setAdminScheme(String adminScheme) {
82+
this.adminScheme = adminScheme;
83+
}
5784
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ public AdminConfig newAdminConfig() {
6060
c.setScheme(prop);
6161
}
6262

63+
prop = getProperty("mlAdminSimpleSsl");
64+
if (prop != null) {
65+
logger.info("Use simple SSL for Admin app server: " + prop);
66+
c.setConfigureSimpleSsl(Boolean.parseBoolean(prop));
67+
}
68+
6369
return c;
6470
}
6571

src/main/java/com/marklogic/mgmt/api/API.java

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ protected void initializeAdminManager() {
6666
ManageConfig mc = manageClient.getManageConfig();
6767
if (mc.getAdminUsername() != null && mc.getAdminPassword() != null) {
6868
AdminConfig ac = new AdminConfig(mc.getHost(), 8001, mc.getAdminUsername(), mc.getAdminPassword());
69+
ac.setConfigureSimpleSsl(mc.isAdminConfigureSimpleSsl());
6970
this.adminManager = new AdminManager(ac);
7071
}
7172
}
@@ -90,8 +91,29 @@ protected ObjectMapper buildDefaultObjectMapper() {
9091
* @param host
9192
*/
9293
public void connect(String host) {
93-
ManageConfig mc = this.manageClient.getManageConfig();
94-
connect(host, mc.getUsername(), mc.getPassword(), mc.getAdminUsername(), mc.getAdminPassword());
94+
connect(host, this.manageClient.getManageConfig());
95+
}
96+
97+
/**
98+
* Connect to a (presumably) different MarkLogic Management API.
99+
*
100+
* @param host
101+
* @param mc
102+
*/
103+
public void connect(String host, ManageConfig mc) {
104+
if (logger.isInfoEnabled()) {
105+
logger.info("Connecting to host: " + host);
106+
}
107+
SimplePropertySource sps = new SimplePropertySource("mlHost", host, "mlManageUsername", mc.getUsername(),
108+
"mlManagePassword", mc.getPassword(), "mlAdminUsername", mc.getAdminUsername(), "mlAdminPassword", mc.getAdminPassword(),
109+
"mlManageSimpleSsl", mc.isConfigureSimpleSsl() + "", "mlAdminSimpleSsl", mc.isAdminConfigureSimpleSsl() + "",
110+
"mlManageScheme", mc.getScheme(), "mlAdminScheme", mc.getAdminScheme(), "mlAdminPort", mc.getAdminPort() + "",
111+
"mlManagePort", mc.getPort() + "");
112+
this.manageClient = new ManageClient(new DefaultManageConfigFactory(sps).newManageConfig());
113+
initializeAdminManager();
114+
if (logger.isInfoEnabled()) {
115+
logger.info("Connected to host: " + host);
116+
}
95117
}
96118

97119
/**
@@ -116,16 +138,13 @@ public void connect(String host, String username, String password) {
116138
* @param adminPassword
117139
*/
118140
public void connect(String host, String username, String password, String adminUsername, String adminPassword) {
119-
if (logger.isInfoEnabled()) {
120-
logger.info("Connecting to host: " + host);
121-
}
122-
SimplePropertySource sps = new SimplePropertySource("mlHost", host, "mlManageUsername", username,
123-
"mlManagePassword", password, "mlAdminUsername", adminUsername, "mlAdminPassword", adminPassword);
124-
this.manageClient = new ManageClient(new DefaultManageConfigFactory(sps).newManageConfig());
125-
initializeAdminManager();
126-
if (logger.isInfoEnabled()) {
127-
logger.info("Connected to host: " + host);
128-
}
141+
ManageConfig mc = new ManageConfig();
142+
mc.setHost(host);
143+
mc.setUsername(username);
144+
mc.setPassword(password);
145+
mc.setAdminUsername(adminUsername);
146+
mc.setAdminPassword(adminPassword);
147+
connect(host, mc);
129148
}
130149

131150
/**

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class RestConfig {
1010
private String username;
1111
private String password;
1212
private String scheme = "http";
13+
private boolean configureSimpleSsl;
1314

1415
public RestConfig() {
1516
}
@@ -46,7 +47,7 @@ public URI buildUri(String path) {
4647
public String getBaseUrl() {
4748
return String.format("%s://%s:%d", scheme, host, port);
4849
}
49-
50+
5051
public String getHost() {
5152
return host;
5253
}
@@ -86,4 +87,12 @@ public String getScheme() {
8687
public void setScheme(String scheme) {
8788
this.scheme = scheme;
8889
}
90+
91+
public boolean isConfigureSimpleSsl() {
92+
return configureSimpleSsl;
93+
}
94+
95+
public void setConfigureSimpleSsl(boolean configureSimpleSsl) {
96+
this.configureSimpleSsl = configureSimpleSsl;
97+
}
8998
}

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

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,62 @@
33
import org.apache.http.auth.AuthScope;
44
import org.apache.http.auth.UsernamePasswordCredentials;
55
import org.apache.http.client.HttpClient;
6+
import org.apache.http.conn.ssl.SSLContextBuilder;
7+
import org.apache.http.conn.ssl.TrustStrategy;
68
import org.apache.http.impl.client.BasicCredentialsProvider;
79
import org.apache.http.impl.client.HttpClientBuilder;
810
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
911
import org.springframework.web.client.RestTemplate;
1012

13+
import javax.net.ssl.SSLContext;
14+
import java.security.cert.CertificateException;
15+
import java.security.cert.X509Certificate;
16+
1117
public class RestTemplateUtil {
1218

13-
public static RestTemplate newRestTemplate(RestConfig config) {
14-
return newRestTemplate(config.getHost(), config.getPort(), config.getUsername(), config.getPassword());
15-
}
16-
17-
public static RestTemplate newRestTemplate(String host, int port, String username, String password) {
18-
BasicCredentialsProvider prov = new BasicCredentialsProvider();
19-
prov.setCredentials(new AuthScope(host, port, AuthScope.ANY_REALM), new UsernamePasswordCredentials(username,
20-
password));
21-
HttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(prov).build();
22-
RestTemplate rt = new RestTemplate(new HttpComponentsClientHttpRequestFactory(client));
23-
rt.setErrorHandler(new MgmtResponseErrorHandler());
24-
return rt;
25-
}
19+
public static RestTemplate newRestTemplate(RestConfig config) {
20+
return newRestTemplate(config.getHost(), config.getPort(), config.getUsername(), config.getPassword(), config.isConfigureSimpleSsl());
21+
}
22+
23+
public static RestTemplate newRestTemplate(String host, int port, String username, String password) {
24+
return newRestTemplate(host, port, username, password, false);
25+
}
26+
27+
/**
28+
*
29+
* @param host
30+
* @param port
31+
* @param username
32+
* @param password
33+
* @param configureSimpleSsl if true, then a very simple SSLContext that trusts every request will be added to the
34+
* HttpClient that RestTemplate uses
35+
* @return
36+
*/
37+
public static RestTemplate newRestTemplate(String host, int port, String username, String password, boolean configureSimpleSsl) {
38+
BasicCredentialsProvider prov = new BasicCredentialsProvider();
39+
prov.setCredentials(new AuthScope(host, port, AuthScope.ANY_REALM), new UsernamePasswordCredentials(username,
40+
password));
41+
42+
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().setDefaultCredentialsProvider(prov);
43+
44+
if (configureSimpleSsl) {
45+
try {
46+
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
47+
@Override
48+
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
49+
return true;
50+
}
51+
}).build();
52+
httpClientBuilder.setSslcontext(sslContext);
53+
} catch (Exception ex) {
54+
throw new RuntimeException("Unable to configure simple SSL approach: " + ex.getMessage(), ex);
55+
}
56+
}
57+
58+
HttpClient client = httpClientBuilder.build();
59+
60+
RestTemplate rt = new RestTemplate(new HttpComponentsClientHttpRequestFactory(client));
61+
rt.setErrorHandler(new MgmtResponseErrorHandler());
62+
return rt;
63+
}
2664
}

src/test/java/com/marklogic/mgmt/api/ConnectTest.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,18 @@
44

55
public class ConnectTest extends AbstractApiTest {
66

7-
/**
8-
* Just smoke testing that we can use the connect method to connect to the same host as before.
9-
*/
10-
@Test
11-
public void test() {
12-
api.connect(manageConfig.getHost(), manageConfig.getUsername(), manageConfig.getPassword());
13-
api.getDb().list();
7+
/**
8+
* Just smoke testing that we can use the connect method to connect to the same host as before.
9+
*/
10+
@Test
11+
public void test() {
12+
manageConfig.setScheme("https");
13+
manageConfig.setConfigureSimpleSsl(true);
1414

15-
api.connect(manageConfig.getHost());
16-
api.getDb().list();
17-
}
15+
api.connect(manageConfig.getHost(), manageConfig);
16+
api.getDb().list();
17+
18+
api.connect(manageConfig.getHost());
19+
api.getDb().list();
20+
}
1821
}

0 commit comments

Comments
 (0)