49 |
import java.security.AccessController; |
import java.security.AccessController; |
50 |
import java.security.AllPermission; |
import java.security.AllPermission; |
51 |
import java.security.Permission; |
import java.security.Permission; |
52 |
|
import java.security.PrivilegedAction; |
53 |
import java.security.Security; |
import java.security.Security; |
54 |
import java.security.SecurityPermission; |
import java.security.SecurityPermission; |
55 |
import java.util.PropertyPermission; |
import java.util.PropertyPermission; |
56 |
|
import java.util.StringTokenizer; |
57 |
|
|
58 |
/** |
/** |
59 |
* SecurityManager is a class you can extend to create your own Java |
* SecurityManager is a class you can extend to create your own Java |
890 |
*/ |
*/ |
891 |
public void checkPackageAccess(String packageName) |
public void checkPackageAccess(String packageName) |
892 |
{ |
{ |
893 |
checkPackageList(packageName, "access", "accessClassInPackage."); |
checkPackageList(packageName, "package.access", "accessClassInPackage."); |
894 |
} |
} |
895 |
|
|
896 |
/** |
/** |
912 |
*/ |
*/ |
913 |
public void checkPackageDefinition(String packageName) |
public void checkPackageDefinition(String packageName) |
914 |
{ |
{ |
915 |
checkPackageList(packageName, "definition", "defineClassInPackage."); |
checkPackageList(packageName, "package.definition", "defineClassInPackage."); |
916 |
} |
} |
917 |
|
|
918 |
/** |
/** |
1008 |
* <code>RuntimePermission(permission + packageName)</code>. |
* <code>RuntimePermission(permission + packageName)</code>. |
1009 |
* |
* |
1010 |
* @param packageName the package name to check access to |
* @param packageName the package name to check access to |
1011 |
* @param restriction the list of restrictions, after "package." |
* @param restriction "package.access" or "package.definition" |
1012 |
* @param permission the base permission, including the '.' |
* @param permission the base permission, including the '.' |
1013 |
* @throws SecurityException if permission is denied |
* @throws SecurityException if permission is denied |
1014 |
* @throws NullPointerException if packageName is null |
* @throws NullPointerException if packageName is null |
1015 |
* @see #checkPackageAccess(String) |
* @see #checkPackageAccess(String) |
1016 |
* @see #checkPackageDefinition(String) |
* @see #checkPackageDefinition(String) |
1017 |
*/ |
*/ |
1018 |
void checkPackageList(String packageName, String restriction, |
void checkPackageList(String packageName, final String restriction, |
1019 |
String permission) |
String permission) |
1020 |
{ |
{ |
1021 |
// Use the toString() hack to do the null check. |
if (packageName == null) |
1022 |
Permission p = new RuntimePermission(permission + packageName.toString()); |
throw new NullPointerException(); |
1023 |
String list = Security.getProperty("package." + restriction); |
|
1024 |
if (list == null) |
String list = (String)AccessController.doPrivileged(new PrivilegedAction() { |
1025 |
|
public Object run() { |
1026 |
|
return Security.getProperty(restriction); |
1027 |
|
} |
1028 |
|
}); |
1029 |
|
|
1030 |
|
if (list == null || list.equals("")) |
1031 |
return; |
return; |
1032 |
while (! "".equals(packageName)) |
|
1033 |
|
String packageNamePlusDot = packageName + "."; |
1034 |
|
|
1035 |
|
StringTokenizer st = new StringTokenizer(list, ","); |
1036 |
|
while (st.hasMoreTokens()) |
1037 |
{ |
{ |
1038 |
for (int index = list.indexOf(packageName); |
if (packageNamePlusDot.startsWith(st.nextToken())) |
1039 |
index != -1; index = list.indexOf(packageName, index + 1)) |
{ |
1040 |
{ |
Permission p = new RuntimePermission(permission + packageName); |
1041 |
// Exploit package visibility for speed. |
checkPermission(p); |
1042 |
int packageNameCount = packageName.length(); |
return; |
1043 |
if (index + packageNameCount == list.length() |
} |
|
|| list.charAt(index + packageNameCount) == ',') |
|
|
{ |
|
|
checkPermission(p); |
|
|
return; |
|
|
} |
|
|
} |
|
|
int index = packageName.lastIndexOf('.'); |
|
|
packageName = index < 0 ? "" : packageName.substring(0, index); |
|
1044 |
} |
} |
1045 |
} |
} |
1046 |
} // class SecurityManager |
} // class SecurityManager |