Skip to content

Commit caa4491

Browse files
thanosploumisThanos Ploumis
andauthored
SSLHostConfig implementation for Connector (#110)
* SSLHostConfig implementation for Connector Co-authored-by: Thanos Ploumis <[email protected]>
1 parent 4bb32e0 commit caa4491

File tree

8 files changed

+489
-29
lines changed

8 files changed

+489
-29
lines changed

core/src/main/groovy/noe/tomcat/configure/ConnectorAttributesTransformer.groovy

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,7 @@ class ConnectorAttributesTransformer {
8686
attributes.put('secret', connector.getSecret())
8787
}
8888

89-
if (connector.getAllowedRequestAttributesPattern() != null
90-
&& !connector.getAllowedRequestAttributesPattern().isEmpty()) {
89+
if (connector.getAllowedRequestAttributesPattern() != null && !connector.getAllowedRequestAttributesPattern().isEmpty()) {
9190
attributes.put('allowedRequestAttributesPattern', connector.getAllowedRequestAttributesPattern())
9291
}
9392
}
@@ -169,7 +168,7 @@ class ConnectorAttributesTransformer {
169168
if (connector.getSslPassword() != null && !connector.getSslPassword().isEmpty()) {
170169
attributes.put('SSLPassword', connector.getSslPassword())
171170
}
172-
if (connector.getSslEnabledProtocols() != null) {
171+
if (connector.getSslEnabledProtocols() != null && !connector.getSslEnabledProtocols().isEmpty()) {
173172
attributes.put('sslEnabledProtocols', connector.getSslEnabledProtocols())
174173
}
175174
// ---------------------
@@ -178,6 +177,87 @@ class ConnectorAttributesTransformer {
178177
node.appendNode("UpgradeProtocol", ['className': connector.getUpgradeProtocol().getClassName()])
179178
}
180179

180+
if (connector.getSSLHostConfigs() != null) {
181+
for (ConnectorSSLHostConfigTomcat sslHostConfig : connector.getSSLHostConfigs()) {
182+
183+
Map<String, Object> sslHostConfigAttributes = [:]
184+
185+
if (sslHostConfig.getHostName() != null && !sslHostConfig.getHostName().isEmpty()) {
186+
sslHostConfigAttributes.put('hostName', sslHostConfig.getHostName())
187+
}
188+
if (sslHostConfig.getCertificateVerification() != null && !sslHostConfig.getCertificateVerification().isEmpty()) {
189+
sslHostConfigAttributes.put('certificateVerification', sslHostConfig.getCertificateVerification())
190+
}
191+
if (sslHostConfig.getCaCertificateFile() != null && !sslHostConfig.getCaCertificateFile().isEmpty()) {
192+
sslHostConfigAttributes.put('caCertificateFile', sslHostConfig.getCaCertificateFile())
193+
}
194+
if (sslHostConfig.getCaCertificatePath() != null && !sslHostConfig.getCaCertificatePath().isEmpty()) {
195+
sslHostConfigAttributes.put('caCertificatePath', sslHostConfig.getCaCertificatePath())
196+
}
197+
if (sslHostConfig.getCiphers() != null && !sslHostConfig.getCiphers().isEmpty()) {
198+
sslHostConfigAttributes.put('ciphers', sslHostConfig.getCiphers())
199+
}
200+
if (sslHostConfig.getSslProtocol() != null && !sslHostConfig.getSslProtocol().isEmpty()) {
201+
sslHostConfigAttributes.put('sslProtocol', sslHostConfig.getSslProtocol())
202+
}
203+
if (sslHostConfig.getProtocols() != null && !sslHostConfig.getProtocols().isEmpty()) {
204+
sslHostConfigAttributes.put('protocols', sslHostConfig.getProtocols())
205+
}
206+
if (sslHostConfig.getTruststoreFile() != null && !sslHostConfig.getTruststoreFile().isEmpty()) {
207+
sslHostConfigAttributes.put('truststoreFile', sslHostConfig.getTruststoreFile())
208+
}
209+
if (sslHostConfig.getTruststorePassword() != null && !sslHostConfig.getTruststorePassword().isEmpty()) {
210+
sslHostConfigAttributes.put('truststorePassword', sslHostConfig.getTruststorePassword())
211+
}
212+
if (sslHostConfig.getTruststoreProvider() != null && !sslHostConfig.getTruststoreProvider().isEmpty()) {
213+
sslHostConfigAttributes.put('truststoreProvider', sslHostConfig.getTruststoreProvider())
214+
}
215+
if (sslHostConfig.getTruststoreType() != null && !sslHostConfig.getTruststoreType().isEmpty()) {
216+
sslHostConfigAttributes.put('truststoreType', sslHostConfig.getTruststoreType())
217+
}
218+
219+
Node sslHostConfigNode = node.appendNode("SSLHostConfig", sslHostConfigAttributes)
220+
221+
if (sslHostConfig.getCertificate() != null ) {
222+
Map<String, Object> certificateAttributes = [:]
223+
ConnectorCertificateTomcat certificate = sslHostConfig.getCertificate()
224+
225+
if (certificate.getCertificateFile() != null && !certificate.getCertificateFile().isEmpty()) {
226+
certificateAttributes.put('certificateFile', certificate.getCertificateFile())
227+
}
228+
if (certificate.getCertificateChainFile() != null && !certificate.getCertificateChainFile().isEmpty()) {
229+
certificateAttributes.put('certificateChainFile', certificate.getCertificateChainFile())
230+
}
231+
if (certificate.getCertificateKeyAlias() != null && !certificate.getCertificateKeyAlias().isEmpty()) {
232+
certificateAttributes.put('certificateKeyAlias', certificate.getCertificateKeyAlias())
233+
}
234+
if (certificate.getCertificateKeyFile() != null && !certificate.getCertificateKeyFile().isEmpty()) {
235+
certificateAttributes.put('certificateKeyFile', certificate.getCertificateKeyFile())
236+
}
237+
if (certificate.getCertificateKeyPassword() != null && !certificate.getCertificateKeyPassword().isEmpty()) {
238+
certificateAttributes.put('certificateKeyPassword', certificate.getCertificateKeyPassword())
239+
}
240+
if (certificate.getCertificateKeystoreFile() != null && !certificate.getCertificateKeystoreFile().isEmpty()) {
241+
certificateAttributes.put('certificateKeystoreFile', certificate.getCertificateKeystoreFile())
242+
}
243+
if (certificate.getCertificateKeystorePassword() != null && !certificate.getCertificateKeystorePassword().isEmpty()) {
244+
certificateAttributes.put('certificateKeystorePassword', certificate.getCertificateKeystorePassword())
245+
}
246+
if (certificate.getCertificateKeystoreProvider() != null && !certificate.getCertificateKeystoreProvider().isEmpty()) {
247+
certificateAttributes.put('certificateKeystoreProvider', certificate.getCertificateKeystoreProvider())
248+
}
249+
if (certificate.getCertificateKeystoreType() != null && !certificate.getCertificateKeystoreType().isEmpty()) {
250+
certificateAttributes.put('certificateKeystoreType', certificate.getCertificateKeystoreType())
251+
}
252+
if (certificate.getCertificateType() != null && !certificate.getCertificateType().isEmpty()) {
253+
certificateAttributes.put('certificateType', certificate.getCertificateType())
254+
}
255+
256+
sslHostConfigNode.appendNode("Certificate", certificateAttributes)
257+
}
258+
}
259+
}
260+
181261
return node
182262
}
183263
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package noe.tomcat.configure
2+
3+
/**
4+
* Abstraction for Certificate inside SSLHostConfig tag of either Secure or Non-Secure Connector in Tomcat server.xml.
5+
* It is used for transfer data from user to `TomcatConfigurator`.
6+
* Provides default values if needed.
7+
* *
8+
* IMPORTANT
9+
* <ul>
10+
* <li>Not all Certificate attributes are supported. Only the most used ones.</li>
11+
* <li>It is user responsibility to set values semantically, no validation is performed.</li>
12+
* <ul>
13+
*
14+
* @link https://tomcat.apache.org/tomcat-9.0-doc/config/http.html#SSL_Support_-_Certificate
15+
*/
16+
17+
class ConnectorCertificateTomcat {
18+
19+
public String certificateFile
20+
public String certificateChainFile
21+
public String certificateKeyAlias
22+
public String certificateKeyFile
23+
public String certificateKeyPassword
24+
public String certificateKeystoreFile
25+
public String certificateKeystorePassword
26+
public String certificateKeystoreProvider
27+
public String certificateKeystoreType
28+
public String certificateType
29+
30+
public String getCertificateFile() {
31+
return this.certificateFile
32+
}
33+
34+
public String getCertificateChainFile() {
35+
return this.certificateChainFile
36+
}
37+
38+
public String getCertificateKeyAlias() {
39+
return this.certificateKeyAlias
40+
}
41+
42+
public String getCertificateKeyFile() {
43+
return this.certificateKeyFile
44+
}
45+
46+
public String getCertificateKeyPassword() {
47+
return this.certificateKeyPassword
48+
}
49+
50+
public String getCertificateKeystoreFile() {
51+
return this.certificateKeystoreFile
52+
}
53+
54+
public String getCertificateKeystorePassword() {
55+
return this.certificateKeystorePassword
56+
}
57+
58+
public String getCertificateKeystoreProvider() {
59+
return this.certificateKeystoreProvider
60+
}
61+
62+
public String getCertificateKeystoreType() {
63+
return this.certificateKeystoreType
64+
}
65+
66+
public String getCertificateType() {
67+
return this.certificateType
68+
}
69+
70+
public ConnectorCertificateTomcat setCertificateFile(String certificateFile) {
71+
this.certificateFile = certificateFile
72+
return this
73+
}
74+
75+
public ConnectorCertificateTomcat setCertificateChainFile(String certificateChainFile) {
76+
this.certificateChainFile = certificateChainFile
77+
return this
78+
}
79+
80+
public ConnectorCertificateTomcat setCertificateKeyAlias(String certificateKeyAlias) {
81+
this.certificateKeyAlias = certificateKeyAlias
82+
return this
83+
}
84+
85+
public ConnectorCertificateTomcat setCertificateKeyFile(String certificateKeyFile) {
86+
this.certificateKeyFile = certificateKeyFile
87+
return this
88+
}
89+
90+
public ConnectorCertificateTomcat setCertificateKeyPassword(String certificateKeyPassword) {
91+
this.certificateKeyPassword = certificateKeyPassword
92+
return this
93+
}
94+
95+
public ConnectorCertificateTomcat setCertificateKeystoreFile(String certificateKeystoreFile) {
96+
this.certificateKeystoreFile = certificateKeystoreFile
97+
return this
98+
}
99+
100+
public ConnectorCertificateTomcat setCertificateKeystorePassword(String certificateKeystorePassword) {
101+
this.certificateKeystorePassword = certificateKeystorePassword
102+
return this
103+
}
104+
105+
public ConnectorCertificateTomcat setCertificateKeystoreType(String certificateKeystoreType) {
106+
this.certificateKeystoreType = certificateKeystoreType
107+
return this
108+
}
109+
110+
public ConnectorCertificateTomcat setCertificateKeystoreProvider(String certificateKeystoreProvider) {
111+
this.certificateKeystoreProvider = certificateKeystoreProvider
112+
return this
113+
}
114+
115+
public ConnectorCertificateTomcat setCertificateType(String certificateType) {
116+
this.certificateType = certificateType
117+
return this
118+
}
119+
120+
}

core/src/main/groovy/noe/tomcat/configure/ConnectorConfiguratorTomcat.groovy

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -124,29 +124,32 @@ class ConnectorConfiguratorTomcat {
124124
}
125125

126126
private void updateExistingConnector(Node connector, Node newConnector) {
127-
// update attributes
127+
// update connector attributes
128128
newConnector.attributes().each { attribute ->
129129
connector.@"${attribute.key}" = attribute.value
130130
}
131131

132-
// update nodes
133132
newConnector.each { Node newSubelement ->
134-
String UpgradeProtocol = ConnectorUpgradeProtocolTomcat.ELEMENT_NAME
135-
136-
if (newSubelement.name() == UpgradeProtocol) {
137-
if (connector.find { it.name() == UpgradeProtocol } == null) {
138-
// create new element
139-
connector.appendNode(newSubelement, newSubelement.attributes(), newSubelement.value())
140-
} else {
141-
// upgrade existing element
142-
connector.findAll { it.name() == UpgradeProtocol }.each { upgradeProtocol ->
143-
newSubelement.attributes() { attribute ->
144-
upgradeProtocol.@"${attribute.key}" = attribute.value
145-
}
146-
}
147-
}
133+
replaceInnerElements(connector, newSubelement)
134+
}
135+
}
136+
137+
/**
138+
*
139+
* @param connector
140+
* @param newSubElement
141+
*
142+
* Search for existing inner element to remove and replace with new one
143+
*/
144+
private void replaceInnerElements(Node connector, Node newSubElement) {
145+
if (connector.find { it.name() == newSubElement.name() } != null) {
146+
List<Node> innerElements = connector.findAll { it.name() == newSubElement.name()}
147+
innerElements.each { element ->
148+
connector.remove(element)
148149
}
149150
}
151+
152+
connector.appendNode(newSubElement, newSubElement.attributes(), newSubElement.value())
150153
}
151154

152155
/**

0 commit comments

Comments
 (0)