package org.pac4j.saml.util; import net.shibboleth.utilities.java.support.component.ComponentInitializationException; import net.shibboleth.utilities.java.support.xml.BasicParserPool; import net.shibboleth.utilities.java.support.xml.ParserPool; import org.opensaml.core.config.ConfigurationService; import org.opensaml.core.config.InitializationException; import org.opensaml.core.config.InitializationService; import org.opensaml.core.xml.XMLObjectBuilderFactory; import org.opensaml.core.xml.config.XMLObjectProviderRegistry; import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport; import org.opensaml.core.xml.io.MarshallerFactory; import org.opensaml.core.xml.io.UnmarshallerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; /** * OpenSAML configuration bean to bootstrap the parser pool. * @author Misagh Moayyed * @since 1.7 */ public final class Configuration { protected static final Logger logger = LoggerFactory.getLogger(Configuration.class); private static BasicParserPool parserPool; private Configuration() {} static { logger.info("Bootstrapping OpenSAML configuration via Pac4j..."); bootstrap(); } private static void bootstrap() { parserPool = new BasicParserPool(); parserPool.setMaxPoolSize(100); parserPool.setCoalescing(true); parserPool.setIgnoreComments(true); parserPool.setNamespaceAware(true); parserPool.setExpandEntityReferences(false); parserPool.setXincludeAware(false); parserPool.setIgnoreElementContentWhitespace(true); final Map<String, Object> builderAttributes = new HashMap<String, Object>(); parserPool.setBuilderAttributes(builderAttributes); final Map<String, Boolean> features = new HashMap<>(); features.put("http://apache.org/xml/features/disallow-doctype-decl", Boolean.TRUE); features.put("http://apache.org/xml/features/validation/schema/normalized-value", Boolean.FALSE); features.put("http://javax.xml.XMLConstants/feature/secure-processing", Boolean.TRUE); features.put("http://xml.org/sax/features/external-general-entities", Boolean.FALSE); features.put("http://xml.org/sax/features/external-parameter-entities", Boolean.FALSE); parserPool.setBuilderFeatures(features); try { parserPool.initialize(); } catch (final ComponentInitializationException e) { throw new RuntimeException("Exception initializing parserPool", e); } try { InitializationService.initialize(); } catch (final InitializationException e) { throw new RuntimeException("Exception initializing OpenSAML", e); } XMLObjectProviderRegistry registry; synchronized(ConfigurationService.class) { registry = ConfigurationService.get(XMLObjectProviderRegistry.class); if (registry == null) { registry = new XMLObjectProviderRegistry(); ConfigurationService.register(XMLObjectProviderRegistry.class, registry); } } registry.setParserPool(parserPool); } public static ParserPool getParserPool () { return parserPool; } public static XMLObjectBuilderFactory getBuilderFactory() { return XMLObjectProviderRegistrySupport.getBuilderFactory(); } public static MarshallerFactory getMarshallerFactory() { return XMLObjectProviderRegistrySupport.getMarshallerFactory(); } public static UnmarshallerFactory getUnmarshallerFactory() { return XMLObjectProviderRegistrySupport.getUnmarshallerFactory(); } }