1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.opensaml.xml;
18
19 import java.security.NoSuchAlgorithmException;
20 import java.util.Map;
21 import java.util.Set;
22 import java.util.concurrent.ConcurrentHashMap;
23 import java.util.concurrent.CopyOnWriteArraySet;
24
25 import javax.crypto.Cipher;
26 import javax.crypto.NoSuchPaddingException;
27 import javax.xml.namespace.QName;
28 import javax.xml.parsers.DocumentBuilderFactory;
29
30 import org.opensaml.xml.io.Marshaller;
31 import org.opensaml.xml.io.MarshallerFactory;
32 import org.opensaml.xml.io.Unmarshaller;
33 import org.opensaml.xml.io.UnmarshallerFactory;
34 import org.opensaml.xml.security.SecurityConfiguration;
35 import org.opensaml.xml.util.XMLConstants;
36 import org.opensaml.xml.validation.ValidatorSuite;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39 import org.w3c.dom.Element;
40
41
42 public class Configuration {
43
44
45 private static Logger log = LoggerFactory.getLogger(Configuration.class);
46
47
48 private static QName defaultProvider = new QName(XMLConstants.XMLTOOLING_CONFIG_NS,
49 XMLConstants.XMLTOOLING_DEFAULT_OBJECT_PROVIDER);
50
51
52 private static Map<QName, Element> configuredObjectProviders = new ConcurrentHashMap<QName, Element>(0);
53
54
55 private static Map<String, Element> validatorSuiteConfigurations = new ConcurrentHashMap<String, Element>(0);
56
57
58 private static XMLObjectBuilderFactory builderFactory = new XMLObjectBuilderFactory();
59
60
61 private static MarshallerFactory marshallerFactory = new MarshallerFactory();
62
63
64 private static UnmarshallerFactory unmarshallerFactory = new UnmarshallerFactory();
65
66
67 private static Map<String, ValidatorSuite> validatorSuites = new ConcurrentHashMap<String, ValidatorSuite>(5);
68
69
70 private static Set<QName> idAttributeNames = new CopyOnWriteArraySet<QName>();
71
72
73 private static SecurityConfiguration globalSecurityConfig;
74
75
76 protected Configuration() {
77
78 }
79
80
81
82
83
84
85
86 public static QName getDefaultProviderQName() {
87 return defaultProvider;
88 }
89
90
91
92
93
94
95
96
97
98
99 public static void registerObjectProvider(QName providerName, XMLObjectBuilder builder, Marshaller marshaller,
100 Unmarshaller unmarshaller) {
101 log.debug("Registering new builder, marshaller, and unmarshaller for {}", providerName);
102 builderFactory.registerBuilder(providerName, builder);
103 marshallerFactory.registerMarshaller(providerName, marshaller);
104 unmarshallerFactory.registerUnmarshaller(providerName, unmarshaller);
105 }
106
107
108
109
110
111
112 public static void deregisterObjectProvider(QName key) {
113 log.debug("Unregistering builder, marshaller, and unmarshaller for {}", key);
114 configuredObjectProviders.remove(key);
115 builderFactory.deregisterBuilder(key);
116 marshallerFactory.deregisterMarshaller(key);
117 unmarshallerFactory.deregisterUnmarshaller(key);
118 }
119
120
121
122
123
124
125 public static XMLObjectBuilderFactory getBuilderFactory() {
126 return builderFactory;
127 }
128
129
130
131
132
133
134 public static MarshallerFactory getMarshallerFactory() {
135 return marshallerFactory;
136 }
137
138
139
140
141
142
143
144 public static UnmarshallerFactory getUnmarshallerFactory() {
145 return unmarshallerFactory;
146 }
147
148
149
150
151
152
153
154
155 public static void registerValidatorSuite(String suiteId, ValidatorSuite suite) {
156 validatorSuites.put(suiteId, suite);
157 }
158
159
160
161
162
163
164 public static void deregisterValidatorSuite(String suiteId) {
165 validatorSuiteConfigurations.remove(suiteId);
166 validatorSuites.remove(suiteId);
167 }
168
169
170
171
172
173
174
175
176 public static ValidatorSuite getValidatorSuite(String suiteId) {
177 return validatorSuites.get(suiteId);
178 }
179
180
181
182
183
184
185 public static void registerIDAttribute(QName attributeName) {
186 if (!idAttributeNames.contains(attributeName)) {
187 idAttributeNames.add(attributeName);
188 }
189 }
190
191
192
193
194
195
196 public static void deregisterIDAttribute(QName attributeName) {
197 if (idAttributeNames.contains(attributeName)) {
198 idAttributeNames.remove(attributeName);
199 }
200 }
201
202
203
204
205
206
207
208 public static boolean isIDAttribute(QName attributeName) {
209 return idAttributeNames.contains(attributeName);
210 }
211
212
213
214
215
216
217 public static SecurityConfiguration getGlobalSecurityConfiguration() {
218 return globalSecurityConfig;
219 }
220
221
222
223
224
225
226 public static void setGlobalSecurityConfiguration(SecurityConfiguration config) {
227 globalSecurityConfig = config;
228 }
229
230
231
232
233 public static void validateNonSunJAXP() {
234 String builderFactoryClass = DocumentBuilderFactory.newInstance().getClass().getName();
235 log.debug("VM using JAXP parser {}", builderFactoryClass);
236
237 if (builderFactoryClass.startsWith("com.sun")) {
238 String errorMsg = "\n\n\nOpenSAML requires an xml parser that supports JAXP 1.3 and DOM3.\n"
239 + "The JVM is currently configured to use the Sun XML parser, which is known\n"
240 + "to be buggy and can not be used with OpenSAML. Please endorse a functional\n"
241 + "JAXP library(ies) such as Xerces and Xalan. For instructions on how to endorse\n"
242 + "a new parser see http://java.sun.com/j2se/1.5.0/docs/guide/standards/index.html\n\n\n";
243
244 log.error(errorMsg);
245 throw new Error(errorMsg);
246 }
247 }
248
249
250
251
252
253
254
255
256
257
258 public static boolean validateJCEProviders() {
259 boolean ret = true;
260
261
262
263
264
265 String errorMsgAESPadding = "The JCE providers currently configured in the JVM do not support\n"
266 + "required capabilities for XML Encryption, either the 'AES' cipher algorithm\n"
267 + "or the 'ISO10126Padding' padding scheme\n";
268
269 try {
270 Cipher.getInstance("AES/CBC/ISO10126Padding");
271 } catch (NoSuchAlgorithmException e) {
272
273
274 log.warn(errorMsgAESPadding);
275 ret = false;
276 } catch (NoSuchPaddingException e) {
277 log.warn(errorMsgAESPadding);
278 ret = false;
279 }
280
281
282
283 return ret;
284 }
285
286
287
288
289
290
291
292
293
294
295
296
297
298 public static void registerObjectProvider(QName providerName, XMLObjectBuilder builder, Marshaller marshaller,
299 Unmarshaller unmarshaller, Element configuration) {
300 log.debug("Registering new builder, marshaller, and unmarshaller for {}", providerName);
301 if (configuration != null) {
302 configuredObjectProviders.put(providerName, configuration);
303 }
304 builderFactory.registerBuilder(providerName, builder);
305 marshallerFactory.registerMarshaller(providerName, marshaller);
306 unmarshallerFactory.registerUnmarshaller(providerName, unmarshaller);
307 }
308
309
310
311
312
313
314
315
316
317
318
319
320 public static Element getObjectProviderConfiguration(QName qualifedName) {
321 Element configElement = configuredObjectProviders.get(qualifedName);
322 if (configElement != null) {
323 return (Element) configElement.cloneNode(true);
324 }
325 return null;
326 }
327
328
329
330
331
332
333
334
335
336
337 public static void registerValidatorSuite(String suiteId, ValidatorSuite suite, Element configuration) {
338 if (configuration != null) {
339 validatorSuiteConfigurations.put(suiteId, configuration);
340 }
341 validatorSuites.put(suiteId, suite);
342 }
343
344
345
346
347
348
349
350
351
352
353
354
355 public static Element getValidatorSuiteConfiguration(String suiteId) {
356 Element configElement = validatorSuiteConfigurations.get(suiteId);
357 if (configElement != null) {
358 return (Element) configElement.cloneNode(true);
359 }
360
361 return null;
362 }
363
364 static {
365 validateNonSunJAXP();
366
367 validateJCEProviders();
368
369
370 registerIDAttribute(new QName(javax.xml.XMLConstants.XML_NS_URI, "id"));
371 }
372 }