blob: 845c36a5f4471c29781786aa6c979e4ebb2bfbb3 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * reserved comment block
3 * DO NOT REMOVE OR ALTER!
4 */
5/*
6 * Copyright 1999-2004 The Apache Software Foundation.
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
20 */
21package com.sun.org.apache.xml.internal.security;
22
23
24
25import java.io.InputStream;
26import java.security.AccessController;
27import java.security.PrivilegedAction;
28
29import javax.xml.parsers.DocumentBuilder;
30import javax.xml.parsers.DocumentBuilderFactory;
31
32import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper;
33import com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithm;
34import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
35import com.sun.org.apache.xml.internal.security.keys.KeyInfo;
36import com.sun.org.apache.xml.internal.security.keys.keyresolver.KeyResolver;
37import com.sun.org.apache.xml.internal.security.transforms.Transform;
38import com.sun.org.apache.xml.internal.security.utils.I18n;
39//import com.sun.org.apache.xml.internal.security.utils.PRNG;
40import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
41import com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolver;
42import org.w3c.dom.Attr;
43import org.w3c.dom.Document;
44import org.w3c.dom.Element;
45import org.w3c.dom.Node;
46
47
48/**
49 * This class does the configuration of the library. This includes creating
50 * the mapping of Canonicalization and Transform algorithms. Initialization is
51 * done by calling {@link Init#init} which should be done in any static block
52 * of the files of this library. We ensure that this call is only executed once.
53 *
54 * @author $Author: raul $
55 */
56public final class Init {
57
58 /** {@link java.util.logging} logging facility */
59 static java.util.logging.Logger log =
60 java.util.logging.Logger.getLogger(Init.class.getName());
61
62 /** Field _initialized */
63 private static boolean _alreadyInitialized = false;
64
65 /** The namespace for CONF file **/
66 public static final String CONF_NS="http://www.xmlsecurity.org/NS/#configuration";
67
68 /**
69 * Method isInitialized
70 * @return true if the librairy is already initialized.
71 *
72 */
73 public static final boolean isInitialized() {
74 return Init._alreadyInitialized;
75 }
76
77 /**
78 * Method init
79 *
80 */
81 public synchronized static void init() {
82
83 if (_alreadyInitialized) {
84 return;
85 }
86 long XX_configure_i18n_end=0;
87 long XX_configure_reg_c14n_start=0;
88 long XX_configure_reg_c14n_end=0;
89 long XX_configure_reg_jcemapper_end=0;
90 long XX_configure_reg_keyInfo_start=0;
91 long XX_configure_reg_keyResolver_end=0;
92 long XX_configure_reg_prefixes_start=0;
93 long XX_configure_reg_resourceresolver_start=0;
94 long XX_configure_reg_sigalgos_end=0;
95 long XX_configure_reg_transforms_end=0;
96 long XX_configure_reg_keyInfo_end=0;
97 long XX_configure_reg_keyResolver_start=0;
98 _alreadyInitialized = true;
99
100 try {
101 long XX_init_start = System.currentTimeMillis();
102 long XX_prng_start = System.currentTimeMillis();
103
104 //PRNG.init(new java.security.SecureRandom());
105
106 long XX_prng_end = System.currentTimeMillis();
107
108 /* read library configuration file */
109 long XX_parsing_start = System.currentTimeMillis();
110 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
111
112 dbf.setNamespaceAware(true);
113 dbf.setValidating(false);
114
115 DocumentBuilder db = dbf.newDocumentBuilder();
116
117 // We don't allow users to override the Apache XML Security
118 // configuration in the JRE. Users should use the standard security
119 // provider mechanism instead if implementing their own
120 // transform or canonicalization algorithms.
121 // String cfile = System.getProperty("com.sun.org.apache.xml.internal.security.resource.config");
122 // InputStream is =
123 // Class.forName("com.sun.org.apache.xml.internal.security.Init")
124 // .getResourceAsStream(cfile != null ? cfile : "resource/config.xml");
125 InputStream is = (InputStream) AccessController.doPrivileged(
126 new PrivilegedAction() {
127 public Object run() {
128 return getClass().getResourceAsStream
129 ("resource/config.xml");
130 }
131 });
132
133 Document doc = db.parse(is);
134 long XX_parsing_end = System.currentTimeMillis();
135 long XX_configure_i18n_start = 0;
136
137 {
138 XX_configure_reg_keyInfo_start = System.currentTimeMillis();
139 try {
140 KeyInfo.init();
141 } catch (Exception e) {
142 e.printStackTrace();
143
144 throw e;
145 }
146 XX_configure_reg_keyInfo_end = System.currentTimeMillis();
147 }
148
149 long XX_configure_reg_transforms_start=0;
150 long XX_configure_reg_jcemapper_start=0;
151 long XX_configure_reg_sigalgos_start=0;
152 long XX_configure_reg_resourceresolver_end=0;
153 long XX_configure_reg_prefixes_end=0;
154 Node config=doc.getFirstChild();
155 for (;config!=null;config=config.getNextSibling()) {
156 if ("Configuration".equals(config.getLocalName())) {
157 break;
158 }
159 }
160 for (Node el=config.getFirstChild();el!=null;el=el.getNextSibling()) {
161 if (!(el instanceof Element)) {
162 continue;
163 }
164 String tag=el.getLocalName();
165//
166// Commented out: not supported in the JDK. We use the default locale.
167//
168// if (tag.equals("ResourceBundles")){
169// XX_configure_i18n_start = System.currentTimeMillis();
170// Element resource=(Element)el;
171// /* configure internationalization */
172// Attr langAttr = resource.getAttributeNode("defaultLanguageCode");
173// Attr countryAttr = resource.getAttributeNode("defaultCountryCode");
174// String languageCode = (langAttr == null)
175// ? null
176// : langAttr.getNodeValue();
177// String countryCode = (countryAttr == null)
178// ? null
179// : countryAttr.getNodeValue();
180//
181// I18n.init(languageCode, countryCode);
182// XX_configure_i18n_end = System.currentTimeMillis();
183// }
184
185 if (tag.equals("CanonicalizationMethods")){
186 XX_configure_reg_c14n_start = System.currentTimeMillis();
187 Canonicalizer.init();
188 Element[] list=XMLUtils.selectNodes(el.getFirstChild(),CONF_NS,"CanonicalizationMethod");
189
190 for (int i = 0; i < list.length; i++) {
191 String URI = list[i].getAttributeNS(null,
192 "URI");
193 String JAVACLASS =
194 list[i].getAttributeNS(null,
195 "JAVACLASS");
196 try {
197 Class.forName(JAVACLASS);
198/* Method methods[] = c.getMethods();
199
200 for (int j = 0; j < methods.length; j++) {
201 Method currMeth = methods[j];
202
203 if (currMeth.getDeclaringClass().getName()
204 .equals(JAVACLASS)) {
205 log.log(java.util.logging.Level.FINE, currMeth.getDeclaringClass().toString());
206 }
207 }*/
208 if (true)
209 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Canonicalizer.register(" + URI + ", "
210 + JAVACLASS + ")");
211 Canonicalizer.register(URI, JAVACLASS);
212 } catch (ClassNotFoundException e) {
213 Object exArgs[] = { URI, JAVACLASS };
214
215 log.log(java.util.logging.Level.SEVERE, I18n.translate("algorithm.classDoesNotExist",
216 exArgs));
217 }
218 }
219 XX_configure_reg_c14n_end = System.currentTimeMillis();
220 }
221
222 if (tag.equals("TransformAlgorithms")){
223 XX_configure_reg_transforms_start = System.currentTimeMillis();
224 Transform.init();
225
226 Element[] tranElem = XMLUtils.selectNodes(el.getFirstChild(),CONF_NS,"TransformAlgorithm");
227
228 for (int i = 0; i < tranElem.length; i++) {
229 String URI = tranElem[i].getAttributeNS(null,
230 "URI");
231 String JAVACLASS =
232 tranElem[i].getAttributeNS(null,
233 "JAVACLASS");
234 try {
235 Class.forName(JAVACLASS);
236 if (true)
237 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Transform.register(" + URI + ", " + JAVACLASS
238 + ")");
239 Transform.register(URI, JAVACLASS);
240 } catch (ClassNotFoundException e) {
241 Object exArgs[] = { URI, JAVACLASS };
242
243 log.log(java.util.logging.Level.SEVERE, I18n.translate("algorithm.classDoesNotExist",
244 exArgs));
245
246 } catch (NoClassDefFoundError ex) {
247 log.log(java.util.logging.Level.WARNING, "Not able to found dependecies for algorithm, I'm keep working.");
248 }
249 }
250 XX_configure_reg_transforms_end = System.currentTimeMillis();
251 }
252
253
254 if ("JCEAlgorithmMappings".equals(tag)){
255 XX_configure_reg_jcemapper_start = System.currentTimeMillis();
256 JCEMapper.init((Element)el);
257 XX_configure_reg_jcemapper_end = System.currentTimeMillis();
258 }
259
260
261
262 if (tag.equals("SignatureAlgorithms")){
263 XX_configure_reg_sigalgos_start = System.currentTimeMillis();
264 SignatureAlgorithm.providerInit();
265
266 Element[] sigElems = XMLUtils.selectNodes(el.getFirstChild(), CONF_NS,
267 "SignatureAlgorithm");
268
269 for (int i = 0; i < sigElems.length; i++) {
270 String URI = sigElems[i].getAttributeNS(null,
271 "URI");
272 String JAVACLASS =
273 sigElems[i].getAttributeNS(null,
274 "JAVACLASS");
275
276 /** $todo$ handle registering */
277
278 try {
279 Class.forName(JAVACLASS);
280 // Method methods[] = c.getMethods();
281
282// for (int j = 0; j < methods.length; j++) {
283// Method currMeth = methods[j];
284//
285// if (currMeth.getDeclaringClass().getName()
286// .equals(JAVACLASS)) {
287// log.log(java.util.logging.Level.FINE, currMeth.getDeclaringClass().toString());
288// }
289// }
290 if (true)
291 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "SignatureAlgorithm.register(" + URI + ", "
292 + JAVACLASS + ")");
293 SignatureAlgorithm.register(URI, JAVACLASS);
294 } catch (ClassNotFoundException e) {
295 Object exArgs[] = { URI, JAVACLASS };
296
297 log.log(java.util.logging.Level.SEVERE, I18n.translate("algorithm.classDoesNotExist",
298 exArgs));
299
300 }
301 }
302 XX_configure_reg_sigalgos_end = System.currentTimeMillis();
303 }
304
305
306
307 if (tag.equals("ResourceResolvers")){
308 XX_configure_reg_resourceresolver_start = System.currentTimeMillis();
309 ResourceResolver.init();
310
311 Element[]resolverElem = XMLUtils.selectNodes(el.getFirstChild(),CONF_NS,
312 "Resolver");
313
314 for (int i = 0; i < resolverElem.length; i++) {
315 String JAVACLASS =
316 resolverElem[i].getAttributeNS(null,
317 "JAVACLASS");
318 String Description =
319 resolverElem[i].getAttributeNS(null,
320 "DESCRIPTION");
321
322 if ((Description != null) && (Description.length() > 0)) {
323 if (true)
324 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS + ": "
325 + Description);
326 } else {
327 if (true)
328 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS
329 + ": For unknown purposes");
330 }
331 try {
332 ResourceResolver.register(JAVACLASS);
333 } catch (Throwable e) {
334 log.log(java.util.logging.Level.WARNING, "Cannot register:"+JAVACLASS+" perhaps some needed jars are not installed",e);
335 }
336 XX_configure_reg_resourceresolver_end =
337 System.currentTimeMillis();
338 }
339
340 }
341
342
343
344
345
346
347 if (tag.equals("KeyResolver")){
348 XX_configure_reg_keyResolver_start =System.currentTimeMillis();
349 KeyResolver.init();
350
351 Element[] resolverElem = XMLUtils.selectNodes(el.getFirstChild(), CONF_NS,"Resolver");
352
353 for (int i = 0; i < resolverElem.length; i++) {
354 String JAVACLASS =
355 resolverElem[i].getAttributeNS(null,
356 "JAVACLASS");
357 String Description =
358 resolverElem[i].getAttributeNS(null,
359 "DESCRIPTION");
360
361 if ((Description != null) && (Description.length() > 0)) {
362 if (true)
363 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS + ": "
364 + Description);
365 } else {
366 if (true)
367 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS
368 + ": For unknown purposes");
369 }
370
371 KeyResolver.register(JAVACLASS);
372 }
373 XX_configure_reg_keyResolver_end = System.currentTimeMillis();
374 }
375
376
377 if (tag.equals("PrefixMappings")){
378 XX_configure_reg_prefixes_start = System.currentTimeMillis();
379 if (true)
380 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Now I try to bind prefixes:");
381
382 Element[] nl = XMLUtils.selectNodes(el.getFirstChild(), CONF_NS,"PrefixMapping");
383
384 for (int i = 0; i < nl.length; i++) {
385 String namespace = nl[i].getAttributeNS(null,
386 "namespace");
387 String prefix = nl[i].getAttributeNS(null,
388 "prefix");
389 if (true)
390 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Now I try to bind " + prefix + " to " + namespace);
391 com.sun.org.apache.xml.internal.security.utils.ElementProxy
392 .setDefaultPrefix(namespace, prefix);
393 }
394 XX_configure_reg_prefixes_end = System.currentTimeMillis();
395 }
396 }
397
398 long XX_init_end = System.currentTimeMillis();
399
400 //J-
401 if (true) {
402 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "XX_init " + ((int)(XX_init_end - XX_init_start)) + " ms");
403 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_prng " + ((int)(XX_prng_end - XX_prng_start)) + " ms");
404 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_parsing " + ((int)(XX_parsing_end - XX_parsing_start)) + " ms");
405 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_i18n " + ((int)(XX_configure_i18n_end- XX_configure_i18n_start)) + " ms");
406 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_c14n " + ((int)(XX_configure_reg_c14n_end- XX_configure_reg_c14n_start)) + " ms");
407 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_jcemapper " + ((int)(XX_configure_reg_jcemapper_end- XX_configure_reg_jcemapper_start)) + " ms");
408 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_keyInfo " + ((int)(XX_configure_reg_keyInfo_end- XX_configure_reg_keyInfo_start)) + " ms");
409 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_keyResolver " + ((int)(XX_configure_reg_keyResolver_end- XX_configure_reg_keyResolver_start)) + " ms");
410 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_prefixes " + ((int)(XX_configure_reg_prefixes_end- XX_configure_reg_prefixes_start)) + " ms");
411 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_resourceresolver " + ((int)(XX_configure_reg_resourceresolver_end- XX_configure_reg_resourceresolver_start)) + " ms");
412 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_sigalgos " + ((int)(XX_configure_reg_sigalgos_end- XX_configure_reg_sigalgos_start)) + " ms");
413 if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_transforms " + ((int)(XX_configure_reg_transforms_end- XX_configure_reg_transforms_start)) + " ms");
414 }
415 } catch (Exception e) {
416 log.log(java.util.logging.Level.SEVERE, "Bad: ", e);
417 e.printStackTrace();
418 }
419
420 }
421
422
423}