8038913: Bolster XML support

Reviewed-by: xuelei, skoivu
This commit is contained in:
Sean Mullan 2014-06-11 16:25:59 -04:00
parent 52d7b541a6
commit 3847915051
10 changed files with 136 additions and 35 deletions

View File

@ -25,6 +25,8 @@ package com.sun.org.apache.xml.internal.security;
import java.io.InputStream; import java.io.InputStream;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -35,6 +37,7 @@ import javax.xml.parsers.DocumentBuilderFactory;
import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper; import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper;
import com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithm; import com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithm;
import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer; import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.keys.keyresolver.KeyResolver; import com.sun.org.apache.xml.internal.security.keys.keyresolver.KeyResolver;
import com.sun.org.apache.xml.internal.security.transforms.Transform; import com.sun.org.apache.xml.internal.security.transforms.Transform;
import com.sun.org.apache.xml.internal.security.utils.ElementProxy; import com.sun.org.apache.xml.internal.security.utils.ElementProxy;
@ -118,6 +121,8 @@ public class Init {
log.log(java.util.logging.Level.FINE, "Registering default algorithms"); log.log(java.util.logging.Level.FINE, "Registering default algorithms");
} }
try { try {
AccessController.doPrivileged(new PrivilegedExceptionAction<Void>(){
@Override public Void run() throws XMLSecurityException {
// //
// Bind the default prefixes // Bind the default prefixes
// //
@ -152,9 +157,14 @@ public class Init {
// Register the default key resolvers // Register the default key resolvers
// //
KeyResolver.registerDefaultResolvers(); KeyResolver.registerDefaultResolvers();
} catch (Exception ex) {
log.log(java.util.logging.Level.SEVERE, ex.getMessage(), ex); return null;
ex.printStackTrace(); }
});
} catch (PrivilegedActionException ex) {
XMLSecurityException xse = (XMLSecurityException)ex.getException();
log.log(java.util.logging.Level.SEVERE, xse.getMessage(), xse);
xse.printStackTrace();
} }
} }

View File

@ -27,6 +27,7 @@ import java.util.concurrent.ConcurrentHashMap;
import com.sun.org.apache.xml.internal.security.encryption.XMLCipher; import com.sun.org.apache.xml.internal.security.encryption.XMLCipher;
import com.sun.org.apache.xml.internal.security.signature.XMLSignature; import com.sun.org.apache.xml.internal.security.signature.XMLSignature;
import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import org.w3c.dom.Element; import org.w3c.dom.Element;
@ -49,8 +50,11 @@ public class JCEMapper {
* *
* @param id * @param id
* @param algorithm * @param algorithm
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the JCE algorithm
*/ */
public static void register(String id, Algorithm algorithm) { public static void register(String id, Algorithm algorithm) {
JavaUtils.checkRegisterPermission();
algorithmsMap.put(id, algorithm); algorithmsMap.put(id, algorithm);
} }
@ -296,8 +300,11 @@ public class JCEMapper {
/** /**
* Sets the default Provider for obtaining the security algorithms * Sets the default Provider for obtaining the security algorithms
* @param provider the default providerId. * @param provider the default providerId.
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to set the JCE provider
*/ */
public static void setProviderId(String provider) { public static void setProviderId(String provider) {
JavaUtils.checkRegisterPermission();
providerName = provider; providerName = provider;
} }

View File

@ -37,6 +37,7 @@ import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.signature.XMLSignature; import com.sun.org.apache.xml.internal.security.signature.XMLSignature;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException; import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
import com.sun.org.apache.xml.internal.security.utils.Constants; import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import org.w3c.dom.Attr; import org.w3c.dom.Attr;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
@ -314,18 +315,21 @@ public class SignatureAlgorithm extends Algorithm {
} }
/** /**
* Registers implementing class of the Transform algorithm with algorithmURI * Registers implementing class of the SignatureAlgorithm with algorithmURI
* *
* @param algorithmURI algorithmURI URI representation of <code>Transform algorithm</code>. * @param algorithmURI algorithmURI URI representation of <code>SignatureAlgorithm</code>.
* @param implementingClass <code>implementingClass</code> the implementing class of * @param implementingClass <code>implementingClass</code> the implementing class of
* {@link SignatureAlgorithmSpi} * {@link SignatureAlgorithmSpi}
* @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered
* @throws XMLSignatureException * @throws XMLSignatureException
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the signature algorithm
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static void register(String algorithmURI, String implementingClass) public static void register(String algorithmURI, String implementingClass)
throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, throws AlgorithmAlreadyRegisteredException, ClassNotFoundException,
XMLSignatureException { XMLSignatureException {
JavaUtils.checkRegisterPermission();
if (log.isLoggable(java.util.logging.Level.FINE)) { if (log.isLoggable(java.util.logging.Level.FINE)) {
log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass); log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass);
} }
@ -352,15 +356,18 @@ public class SignatureAlgorithm extends Algorithm {
/** /**
* Registers implementing class of the Transform algorithm with algorithmURI * Registers implementing class of the Transform algorithm with algorithmURI
* *
* @param algorithmURI algorithmURI URI representation of <code>Transform algorithm</code>. * @param algorithmURI algorithmURI URI representation of <code>SignatureAlgorithm</code>.
* @param implementingClass <code>implementingClass</code> the implementing class of * @param implementingClass <code>implementingClass</code> the implementing class of
* {@link SignatureAlgorithmSpi} * {@link SignatureAlgorithmSpi}
* @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered
* @throws XMLSignatureException * @throws XMLSignatureException
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the signature algorithm
*/ */
public static void register(String algorithmURI, Class<? extends SignatureAlgorithmSpi> implementingClass) public static void register(String algorithmURI, Class<? extends SignatureAlgorithmSpi> implementingClass)
throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, throws AlgorithmAlreadyRegisteredException, ClassNotFoundException,
XMLSignatureException { XMLSignatureException {
JavaUtils.checkRegisterPermission();
if (log.isLoggable(java.util.logging.Level.FINE)) { if (log.isLoggable(java.util.logging.Level.FINE)) {
log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass); log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass);
} }

View File

@ -41,6 +41,7 @@ import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicaliz
import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicalizer20010315WithComments; import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicalizer20010315WithComments;
import com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerPhysical; import com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerPhysical;
import com.sun.org.apache.xml.internal.security.exceptions.AlgorithmAlreadyRegisteredException; import com.sun.org.apache.xml.internal.security.exceptions.AlgorithmAlreadyRegisteredException;
import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
@ -142,10 +143,13 @@ public class Canonicalizer {
* @param algorithmURI * @param algorithmURI
* @param implementingClass * @param implementingClass
* @throws AlgorithmAlreadyRegisteredException * @throws AlgorithmAlreadyRegisteredException
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the canonicalizer
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static void register(String algorithmURI, String implementingClass) public static void register(String algorithmURI, String implementingClass)
throws AlgorithmAlreadyRegisteredException, ClassNotFoundException { throws AlgorithmAlreadyRegisteredException, ClassNotFoundException {
JavaUtils.checkRegisterPermission();
// check whether URI is already registered // check whether URI is already registered
Class<? extends CanonicalizerSpi> registeredClass = Class<? extends CanonicalizerSpi> registeredClass =
canonicalizerHash.get(algorithmURI); canonicalizerHash.get(algorithmURI);
@ -166,9 +170,12 @@ public class Canonicalizer {
* @param algorithmURI * @param algorithmURI
* @param implementingClass * @param implementingClass
* @throws AlgorithmAlreadyRegisteredException * @throws AlgorithmAlreadyRegisteredException
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the canonicalizer
*/ */
public static void register(String algorithmURI, Class<CanonicalizerSpi> implementingClass) public static void register(String algorithmURI, Class<? extends CanonicalizerSpi> implementingClass)
throws AlgorithmAlreadyRegisteredException, ClassNotFoundException { throws AlgorithmAlreadyRegisteredException, ClassNotFoundException {
JavaUtils.checkRegisterPermission();
// check whether URI is already registered // check whether URI is already registered
Class<? extends CanonicalizerSpi> registeredClass = canonicalizerHash.get(algorithmURI); Class<? extends CanonicalizerSpi> registeredClass = canonicalizerHash.get(algorithmURI);

View File

@ -42,6 +42,7 @@ import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations
import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SKIResolver; import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SKIResolver;
import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SubjectNameResolver; import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SubjectNameResolver;
import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver; import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver;
import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.Node; import org.w3c.dom.Node;
@ -175,9 +176,12 @@ public class KeyResolver {
* @throws InstantiationException * @throws InstantiationException
* @throws IllegalAccessException * @throws IllegalAccessException
* @throws ClassNotFoundException * @throws ClassNotFoundException
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the key resolver
*/ */
public static void register(String className, boolean globalResolver) public static void register(String className, boolean globalResolver)
throws ClassNotFoundException, IllegalAccessException, InstantiationException { throws ClassNotFoundException, IllegalAccessException, InstantiationException {
JavaUtils.checkRegisterPermission();
KeyResolverSpi keyResolverSpi = KeyResolverSpi keyResolverSpi =
(KeyResolverSpi) Class.forName(className).newInstance(); (KeyResolverSpi) Class.forName(className).newInstance();
keyResolverSpi.setGlobalResolver(globalResolver); keyResolverSpi.setGlobalResolver(globalResolver);
@ -195,8 +199,11 @@ public class KeyResolver {
* *
* @param className * @param className
* @param globalResolver Whether the KeyResolverSpi is a global resolver or not * @param globalResolver Whether the KeyResolverSpi is a global resolver or not
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the key resolver
*/ */
public static void registerAtStart(String className, boolean globalResolver) { public static void registerAtStart(String className, boolean globalResolver) {
JavaUtils.checkRegisterPermission();
KeyResolverSpi keyResolverSpi = null; KeyResolverSpi keyResolverSpi = null;
Exception ex = null; Exception ex = null;
try { try {
@ -228,11 +235,14 @@ public class KeyResolver {
* *
* @param keyResolverSpi a KeyResolverSpi instance to register * @param keyResolverSpi a KeyResolverSpi instance to register
* @param start whether to register the KeyResolverSpi at the start of the list or not * @param start whether to register the KeyResolverSpi at the start of the list or not
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the key resolver
*/ */
public static void register( public static void register(
KeyResolverSpi keyResolverSpi, KeyResolverSpi keyResolverSpi,
boolean start boolean start
) { ) {
JavaUtils.checkRegisterPermission();
KeyResolver resolver = new KeyResolver(keyResolverSpi); KeyResolver resolver = new KeyResolver(keyResolverSpi);
if (start) { if (start) {
resolverVector.add(0, resolver); resolverVector.add(0, resolver);
@ -254,9 +264,12 @@ public class KeyResolver {
* @throws InstantiationException * @throws InstantiationException
* @throws IllegalAccessException * @throws IllegalAccessException
* @throws ClassNotFoundException * @throws ClassNotFoundException
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the key resolver
*/ */
public static void registerClassNames(List<String> classNames) public static void registerClassNames(List<String> classNames)
throws ClassNotFoundException, IllegalAccessException, InstantiationException { throws ClassNotFoundException, IllegalAccessException, InstantiationException {
JavaUtils.checkRegisterPermission();
List<KeyResolver> keyResolverList = new ArrayList<KeyResolver>(classNames.size()); List<KeyResolver> keyResolverList = new ArrayList<KeyResolver>(classNames.size());
for (String className : classNames) { for (String className : classNames) {
KeyResolverSpi keyResolverSpi = KeyResolverSpi keyResolverSpi =

View File

@ -46,6 +46,7 @@ import com.sun.org.apache.xml.internal.security.transforms.implementations.Trans
import com.sun.org.apache.xml.internal.security.transforms.implementations.TransformXSLT; import com.sun.org.apache.xml.internal.security.transforms.implementations.TransformXSLT;
import com.sun.org.apache.xml.internal.security.utils.Constants; import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.HelperNodeList; import com.sun.org.apache.xml.internal.security.utils.HelperNodeList;
import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy; import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
import com.sun.org.apache.xml.internal.security.utils.XMLUtils; import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Document; import org.w3c.dom.Document;
@ -181,11 +182,14 @@ public final class Transform extends SignatureElementProxy {
* class of {@link TransformSpi} * class of {@link TransformSpi}
* @throws AlgorithmAlreadyRegisteredException if specified algorithmURI * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI
* is already registered * is already registered
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the transform
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static void register(String algorithmURI, String implementingClass) public static void register(String algorithmURI, String implementingClass)
throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, throws AlgorithmAlreadyRegisteredException, ClassNotFoundException,
InvalidTransformException { InvalidTransformException {
JavaUtils.checkRegisterPermission();
// are we already registered? // are we already registered?
Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI); Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI);
if (transformSpi != null) { if (transformSpi != null) {
@ -206,9 +210,12 @@ public final class Transform extends SignatureElementProxy {
* class of {@link TransformSpi} * class of {@link TransformSpi}
* @throws AlgorithmAlreadyRegisteredException if specified algorithmURI * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI
* is already registered * is already registered
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register the transform
*/ */
public static void register(String algorithmURI, Class<? extends TransformSpi> implementingClass) public static void register(String algorithmURI, Class<? extends TransformSpi> implementingClass)
throws AlgorithmAlreadyRegisteredException { throws AlgorithmAlreadyRegisteredException {
JavaUtils.checkRegisterPermission();
// are we already registered? // are we already registered?
Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI); Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI);
if (transformSpi != null) { if (transformSpi != null) {

View File

@ -468,9 +468,12 @@ public abstract class ElementProxy {
* @param namespace * @param namespace
* @param prefix * @param prefix
* @throws XMLSecurityException * @throws XMLSecurityException
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to set the default prefix
*/ */
public static void setDefaultPrefix(String namespace, String prefix) public static void setDefaultPrefix(String namespace, String prefix)
throws XMLSecurityException { throws XMLSecurityException {
JavaUtils.checkRegisterPermission();
if (prefixMappings.containsValue(prefix)) { if (prefixMappings.containsValue(prefix)) {
String storedPrefix = prefixMappings.get(namespace); String storedPrefix = prefixMappings.get(namespace);
if (!storedPrefix.equals(prefix)) { if (!storedPrefix.equals(prefix)) {

View File

@ -28,6 +28,7 @@ import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.security.SecurityPermission;
/** /**
* A collection of different, general-purpose methods for JAVA-specific things * A collection of different, general-purpose methods for JAVA-specific things
@ -39,6 +40,10 @@ public class JavaUtils {
private static java.util.logging.Logger log = private static java.util.logging.Logger log =
java.util.logging.Logger.getLogger(JavaUtils.class.getName()); java.util.logging.Logger.getLogger(JavaUtils.class.getName());
private static final SecurityPermission REGISTER_PERMISSION =
new SecurityPermission(
"com.sun.org.apache.xml.internal.security.register");
private JavaUtils() { private JavaUtils() {
// we don't allow instantiation // we don't allow instantiation
} }
@ -146,6 +151,23 @@ public class JavaUtils {
return retBytes; return retBytes;
} }
/**
* Throws a {@code SecurityException} if a security manager is installed
* and the caller is not allowed to register an implementation of an
* algorithm, transform, or other security sensitive XML Signature function.
*
* @throws SecurityException if a security manager is installed and the
* caller has not been granted the
* {@literal "com.sun.org.apache.xml.internal.security.register"}
* {@code SecurityPermission}
*/
public static void checkRegisterPermission() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(REGISTER_PERMISSION);
}
}
/** /**
* Converts an ASN.1 DSA value to a XML Signature DSA Value. * Converts an ASN.1 DSA value to a XML Signature DSA Value.
* *

View File

@ -80,32 +80,44 @@ public class XMLUtils {
/** /**
* Set the prefix for the digital signature namespace * Set the prefix for the digital signature namespace
* @param prefix the new prefix for the digital signature namespace * @param prefix the new prefix for the digital signature namespace
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to set the prefix
*/ */
public static void setDsPrefix(String prefix) { public static void setDsPrefix(String prefix) {
JavaUtils.checkRegisterPermission();
dsPrefix = prefix; dsPrefix = prefix;
} }
/** /**
* Set the prefix for the digital signature 1.1 namespace * Set the prefix for the digital signature 1.1 namespace
* @param prefix the new prefix for the digital signature 1.1 namespace * @param prefix the new prefix for the digital signature 1.1 namespace
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to set the prefix
*/ */
public static void setDs11Prefix(String prefix) { public static void setDs11Prefix(String prefix) {
JavaUtils.checkRegisterPermission();
ds11Prefix = prefix; ds11Prefix = prefix;
} }
/** /**
* Set the prefix for the encryption namespace * Set the prefix for the encryption namespace
* @param prefix the new prefix for the encryption namespace * @param prefix the new prefix for the encryption namespace
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to set the prefix
*/ */
public static void setXencPrefix(String prefix) { public static void setXencPrefix(String prefix) {
JavaUtils.checkRegisterPermission();
xencPrefix = prefix; xencPrefix = prefix;
} }
/** /**
* Set the prefix for the encryption namespace 1.1 * Set the prefix for the encryption namespace 1.1
* @param prefix the new prefix for the encryption namespace 1.1 * @param prefix the new prefix for the encryption namespace 1.1
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to set the prefix
*/ */
public static void setXenc11Prefix(String prefix) { public static void setXenc11Prefix(String prefix) {
JavaUtils.checkRegisterPermission();
xenc11Prefix = prefix; xenc11Prefix = prefix;
} }

View File

@ -27,6 +27,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput; import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput;
import com.sun.org.apache.xml.internal.security.utils.JavaUtils;
import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverDirectHTTP; import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverDirectHTTP;
import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment; import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment;
import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverLocalFilesystem; import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverLocalFilesystem;
@ -199,9 +200,12 @@ public class ResourceResolver {
* the class cannot be registered. * the class cannot be registered.
* *
* @param className the name of the ResourceResolverSpi class to be registered * @param className the name of the ResourceResolverSpi class to be registered
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register a resource resolver
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static void register(String className) { public static void register(String className) {
JavaUtils.checkRegisterPermission();
try { try {
Class<ResourceResolverSpi> resourceResolverClass = Class<ResourceResolverSpi> resourceResolverClass =
(Class<ResourceResolverSpi>) Class.forName(className); (Class<ResourceResolverSpi>) Class.forName(className);
@ -216,9 +220,12 @@ public class ResourceResolver {
* list. This method logs a warning if the class cannot be registered. * list. This method logs a warning if the class cannot be registered.
* *
* @param className the name of the ResourceResolverSpi class to be registered * @param className the name of the ResourceResolverSpi class to be registered
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register a resource resolver
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static void registerAtStart(String className) { public static void registerAtStart(String className) {
JavaUtils.checkRegisterPermission();
try { try {
Class<ResourceResolverSpi> resourceResolverClass = Class<ResourceResolverSpi> resourceResolverClass =
(Class<ResourceResolverSpi>) Class.forName(className); (Class<ResourceResolverSpi>) Class.forName(className);
@ -233,8 +240,11 @@ public class ResourceResolver {
* cannot be registered. * cannot be registered.
* @param className * @param className
* @param start * @param start
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register a resource resolver
*/ */
public static void register(Class<? extends ResourceResolverSpi> className, boolean start) { public static void register(Class<? extends ResourceResolverSpi> className, boolean start) {
JavaUtils.checkRegisterPermission();
try { try {
ResourceResolverSpi resourceResolverSpi = className.newInstance(); ResourceResolverSpi resourceResolverSpi = className.newInstance();
register(resourceResolverSpi, start); register(resourceResolverSpi, start);
@ -250,8 +260,11 @@ public class ResourceResolver {
* cannot be registered. * cannot be registered.
* @param resourceResolverSpi * @param resourceResolverSpi
* @param start * @param start
* @throws SecurityException if a security manager is installed and the
* caller does not have permission to register a resource resolver
*/ */
public static void register(ResourceResolverSpi resourceResolverSpi, boolean start) { public static void register(ResourceResolverSpi resourceResolverSpi, boolean start) {
JavaUtils.checkRegisterPermission();
synchronized(resolverList) { synchronized(resolverList) {
if (start) { if (start) {
resolverList.add(0, new ResourceResolver(resourceResolverSpi)); resolverList.add(0, new ResourceResolver(resourceResolverSpi));