📄 security.java
字号:
provider);
}
String className = prov.getProperty(engineType + "." + stdName);
if (className == null) {
throw new NoSuchAlgorithmException("no such algorithm: " +
algName +
" for provider " +
provider);
}
return className;
}
/**
* Adds a new provider, at a specified position. The position is
* the preference order in which providers are searched for
* requested algorithms. Note that it is not guaranteed that this
* preference will be respected. The position is 1-based, that is,
* 1 is most preferred, followed by 2, and so on. Sometimes it
* will be legal to add a provider, but only in the last position,
* in which case the <code>position</code> argument will be ignored.
*
* <p>If the given provider is installed at the requested position,
* the provider that used to be at that position, and all providers
* with a position greater than <code>position</code>, are shifted up
* one position (towards the end of the list of installed providers).
*
* <p>A provider cannot be added if it is already installed.
*
* @param provider the provider to be added.
*
* @param position the preference position that the caller would
* like for this provider.
*
* @return the actual preference position in which the provider was
* added, or -1 if the provider was not added because it is
* already installed.
*
* @see #getProvider
* @see #removeProvider
*/
public static int insertProviderAt(Provider provider, int position) {
check();
/* First check if the provider is already installed */
Provider already = getProvider(provider.getName());
if (already != null) {
return -1;
}
int size = providers.size();
if (position > size || position <= 0) {
position = size+1;
}
providers.insertElementAt(provider, position-1);
/* clear the prop caches */
propCache = new Properties();
return position;
}
/**
* Adds a provider to the next position available.
*
* @param provider the provider to be added.
*
* @return the preference position in which the provider was
* added, or -1 if the provider was not added because it is
* already installed.
*
* @see #getProvider
* @see #removeProvider
*/
public static int addProvider(Provider provider) {
return insertProviderAt(provider, providers.size() + 1);
}
/**
* Removes the provider with the specified name.
*
* <p>When the specified provider is removed, all providers located
* at a position greater than where the specified provider was are shifted
* down one position (towards the head of the list of installed providers).
*
* <p>This method returns silently if the provider is not installed.
*
* @param name the name of the provider to remove.
*
* @see #getProvider
* @see #addProvider
*/
public static void removeProvider(String name) {
check();
Provider provider = getProvider(name);
if (provider != null) {
providers.removeElement(provider);
}
}
/**
* Returns all providers currently installed.
*
* @return an array of all providers currently installed.
*/
public static Provider[] getProviders() {
check();
Provider[] result = new Provider[providers.size()];
providers.copyInto(result);
return result;
}
/**
* Returns the provider installed with the specified name, if
* any. Returns null if no provider with the speicified name is
* installed.
*
* @param name the name of the provider to get.
*
* @return the provider of the specified name.
*
* @see #removeProvider
* @see #addProvider
*/
public static Provider getProvider(String name) {
check();
Enumeration enum = providers.elements();
while (enum.hasMoreElements()) {
Provider prov = (Provider)enum.nextElement();
if (prov.getName().equals(name)) {
return prov;
}
}
return null;
}
private static boolean checkSuperclass(Class subclass, Class superclass) {
while(!subclass.equals(superclass)) {
subclass = subclass.getSuperclass();
if (subclass == null) {
return false;
}
}
return true;
}
/*
* Return an object configured to implemented type. Provider can
* be null, in which case all providers will be searched in order
* of preference.
*/
static Object getImpl(String algorithm, String type, String provider)
throws NoSuchAlgorithmException, NoSuchProviderException {
String className = getEngineClassName(algorithm, provider, type);
try {
Class typeClass = Class.forName("java.security." + type);
Class cl = Class.forName(className);
if (checkSuperclass(cl, typeClass)) {
return cl.newInstance();
} else {
throw new NoSuchAlgorithmException("class configured for " +
type + ": " + className +
" not a " + type);
}
} catch (ClassNotFoundException e) {
throw new NoSuchAlgorithmException("class configured for " +
type + "(provider: " +
provider + ")" +
"cannot be found.\n" +
e.getMessage());
} catch (InstantiationException e) {
throw new NoSuchAlgorithmException("class " + className +
" configured for " + type +
"(provider: " + provider +
") cannot be instantiated.\n" +
e.getMessage());
} catch (IllegalAccessException e) {
throw new NoSuchAlgorithmException("class " + className +
" configured for " + type +
"(provider: " + provider +
") cannot be accessed.\n" +
e.getMessage());
}
}
/**
* Gets a security property.
*
* @param key the key of the property being retrieved.
*
* @return the valeu of the security property corresponding to key.
*/
public static String getProperty(String key) {
check();
return props.getProperty(key);
}
/**
* Sets a security property.
*
* @param key the name of the property to be set.
*
* @param datum the value of the property to be set.
*/
public static void setProperty(String key, String datum) {
check();
props.put(key, datum);
}
private static void check() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkSecurityAccess("java");
}
}
/**
* Print an error message that may be significant to a user.
*/
static void error(String msg) {
if (debug) {
System.err.println(msg);
}
}
/**
* Print an error message that may be significant to a user.
*/
static void error(String msg, Throwable t) {
error(msg);
if (debug) {
t.printStackTrace();
}
}
/**
* Print an debugging message that may be significant to a developer.
*/
static void debug(String msg) {
if (debug) {
System.err.println(msg);
}
}
/**
* Print an debugging message that may be significant to a developer.
*/
static void debug(String msg, Throwable t) {
if (debug) {
t.printStackTrace();
System.err.println(msg);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -