1 /***
2 * Redistribution and use of this software and associated documentation
3 * ("Software"), with or without modification, are permitted provided
4 * that the following conditions are met:
5 *
6 * 1. Redistributions of source code must retain copyright
7 * statements and notices. Redistributions must also contain a
8 * copy of this document.
9 *
10 * 2. Redistributions in binary form must reproduce the
11 * above copyright notice, this list of conditions and the
12 * following disclaimer in the documentation and/or other
13 * materials provided with the distribution.
14 *
15 * 3. The name "Exolab" must not be used to endorse or promote
16 * products derived from this Software without prior written
17 * permission of Exoffice Technologies. For written permission,
18 * please contact info@exolab.org.
19 *
20 * 4. Products derived from this Software may not be called "Exolab"
21 * nor may "Exolab" appear in their names without prior written
22 * permission of Exoffice Technologies. Exolab is a registered
23 * trademark of Exoffice Technologies.
24 *
25 * 5. Due credit should be given to the Exolab Project
26 * (http://www.exolab.org/).
27 *
28 * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
29 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
32 * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 *
41 * Copyright 2005 (C) Exoffice Technologies Inc. All Rights Reserved.
42 *
43 * $Id: SSLProperties.java,v 1.4 2005/05/03 13:45:59 tanderson Exp $
44 */
45 package org.exolab.jms.net.util;
46
47 import org.exolab.jms.net.connector.ResourceException;
48
49
50 /***
51 * Helper class to hold the SSL properties (used by TPCS & HTTPS connectors).
52 *
53 * @author <a href="mailto:daniel.otero@mac.com">Daniel Otero</a>
54 * @author <a href="mailto:tma@netspace.net.au">Tim Anderson</a>
55 * @version $Revision: 1.4 $
56 */
57 public final class SSLProperties {
58
59 /***
60 * The keystore to use. If <code>null</code>, indicates to use the default
61 * keystore.
62 */
63 private String _keyStore;
64
65 /***
66 * The keystore password. If <code>null</code>, indicates to use the default
67 * password.
68 */
69 private String _keyStorePassword;
70
71 /***
72 * The keystore type. If <code>null</code>, indicates to use the default
73 * type.
74 */
75 private String _keyStoreType;
76
77 /***
78 * The truststore to use. If <code>null</code>, indicates to use the default
79 * truststore.
80 */
81 private String _trustStore;
82
83 /***
84 * The truststore password. If <code>null</code>, indicates to use the
85 * default password.
86 */
87 private String _trustStorePassword;
88
89 /***
90 * The truststore type. If <code>null</code>, indicates to use the default
91 * type.
92 */
93 private String _trustStoreType;
94
95 /***
96 * Connection property to indicate the keystore to use.
97 */
98 private static final String KEY_STORE = "keyStore";
99
100 /***
101 * Connection property to indicate the keystore password.
102 */
103 private static final String KEY_STORE_PASSWORD = "keyStorePassword";
104
105 /***
106 * Connection property to indicate the keystore type.
107 */
108 private static final String KEY_STORE_TYPE = "keyStoreType";
109
110 /***
111 * Connection property to indicate the truststore to use.
112 */
113 private static final String TRUST_STORE = "trustStore";
114
115 /***
116 * Connection property to indicate the truststore password.
117 */
118 private static final String TRUST_STORE_PASSWORD = "trustStorePassword";
119
120 /***
121 * Connection property to indicate the truststore type.
122 */
123 private static final String TRUST_STORE_TYPE = "trustStoreType";
124
125 /***
126 * Construct a new <code>SSLProperties</code>.
127 */
128 public SSLProperties() {
129 }
130
131 /***
132 * Construct a new <code>SSLProperties</code>.
133 *
134 * @param properties the properties to populate this from
135 * @throws ResourceException if any of the properties are invalid
136 */
137 public SSLProperties(Properties properties) throws ResourceException {
138 setKeyStore(properties.get(KEY_STORE));
139 setKeyStorePassword(properties.get(KEY_STORE_PASSWORD));
140 setKeyStoreType(properties.get(KEY_STORE_TYPE));
141 setTrustStore(properties.get(TRUST_STORE));
142 setTrustStorePassword(properties.get(TRUST_STORE_PASSWORD));
143 setTrustStoreType(properties.get(TRUST_STORE_TYPE));
144 }
145
146 /***
147 * Returns the keystore.
148 *
149 * @return the keystore, or <code>null</code> if unset
150 */
151 public String getKeyStore() {
152 return _keyStore;
153 }
154
155 /***
156 * Sets the keystore..
157 *
158 * @param store the keystore
159 */
160 public void setKeyStore(String store) {
161 _keyStore = store;
162 }
163
164 /***
165 * Returns the keystore password.
166 *
167 * @return the keystore password, or <code>null</code> if unset
168 */
169 public String getKeyStorePassword() {
170 return _keyStorePassword;
171 }
172
173 /***
174 * Sets the keystore password.
175 *
176 * @param password the keystore password
177 */
178 public void setKeyStorePassword(String password) {
179 _keyStorePassword = password;
180 }
181
182 /***
183 * Returns the keystore type.
184 *
185 * @return the keystore type, or <code>null</code> if unset
186 */
187 public String getKeyStoreType() {
188 return _keyStoreType;
189 }
190
191 /***
192 * Sets the keystore type.
193 *
194 * @param type the the keystore type
195 */
196 public void setKeyStoreType(String type) {
197 _keyStoreType = type;
198 }
199
200 /***
201 * Returns the truststore.
202 *
203 * @return the truststore, or <code>null</code> if unset
204 */
205 public String getTrustStore() {
206 return _trustStore;
207 }
208
209 /***
210 * Sets the truststore.
211 *
212 * @param store the truststore
213 */
214 public void setTrustStore(String store) {
215 _trustStore = store;
216 }
217
218 /***
219 * Returns the truststore password.
220 *
221 * @return the truststore passowrd, or <code>null</code> if unset
222 */
223 public String getTrustStorePassword() {
224 return _trustStorePassword;
225 }
226
227 /***
228 * Sets the truststore password.
229 *
230 * @param password the truststore password
231 */
232 public void setTrustStorePassword(String password) {
233 _trustStorePassword = password;
234 }
235
236 /***
237 * Returns the truststore type.
238 *
239 * @return the truststore type, or <code>null</code> if unset
240 */
241 public String getTrustStoreType() {
242 return _trustStoreType;
243 }
244
245 /***
246 * Sets the truststore type.
247 *
248 * @param type the the trusstore type
249 */
250 public void setTrustStoreType(String type) {
251 _trustStoreType = type;
252 }
253
254 /***
255 * Test to see if this instance has been populated.
256 *
257 * @return <code>true</code> if this hasn't been populated
258 */
259 public boolean isEmpty() {
260 return _keyStore == null && _keyStorePassword == null
261 && _keyStoreType == null && _trustStore == null
262 && _trustStorePassword == null && _trustStoreType == null;
263 }
264
265 /***
266 * Checks whether this instance is equal to another.
267 *
268 * @param other the object to compare
269 * @return <code>true</code> if the two instances are equal; otherwise
270 * <code>false</code>
271 */
272 public boolean equals(Object other) {
273 boolean equal = (this == other);
274 if (!equal) {
275 if (other instanceof SSLProperties) {
276 SSLProperties props = (SSLProperties) other;
277 if (equals(_keyStore, props._keyStore)
278 && equals(_keyStorePassword, props._keyStorePassword)
279 && equals(_keyStoreType, props._keyStoreType)
280 && equals(_trustStore, props._trustStore)
281 && equals(_trustStorePassword,
282 props._trustStorePassword)
283 && equals(_trustStoreType, props._trustStoreType)) {
284 equal = true;
285 }
286 } else {
287 equal = false;
288 }
289 }
290 return equal;
291 }
292
293 /***
294 * Helper to export this to a {@link Properties} instance.
295 *
296 * @param properties the properties to export to.
297 */
298 public void export(Properties properties) {
299 properties.setNonNull(KEY_STORE, getKeyStore());
300 properties.setNonNull(KEY_STORE_PASSWORD, getKeyStorePassword());
301 properties.setNonNull(KEY_STORE_TYPE, getKeyStoreType());
302 properties.setNonNull(TRUST_STORE, getTrustStore());
303 properties.setNonNull(TRUST_STORE_PASSWORD, getTrustStorePassword());
304 properties.setNonNull(TRUST_STORE_TYPE, getTrustStoreType());
305 }
306
307 /***
308 * Helper to compare two objects for equality.
309 *
310 * @param o1 the first object to compare
311 * @param o2 the second object to compare
312 * @return <code>true</code> if the objects are equal, otherwise
313 * <code>false</code>
314 */
315 private boolean equals(Object o1, Object o2) {
316 boolean equal = (o1 == null && o2 == null);
317 if (!equal) {
318 if (o1 != null && o1.equals(o2)) {
319 equal = true;
320 }
321 }
322 return equal;
323 }
324
325 }