AccessControlContextpublic final class AccessControlContext extends Object {@code AccessControlContext} encapsulates the {@code ProtectionDomain}s on
which access control decisions are based. |
Fields Summary |
---|
ProtectionDomain[] | context | DomainCombiner | combiner | private AccessControlContext | inherited |
Constructors Summary |
---|
public AccessControlContext(AccessControlContext acc, DomainCombiner combiner)Constructs a new instance of {@code AccessControlContext} with the
specified {@code AccessControlContext} and {@code DomainCombiner}.
If a {@code SecurityManager} is installed, code calling this constructor
need the {@code SecurityPermission} {@code createAccessControlContext} to
be granted, otherwise a {@code SecurityException} will be thrown.
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new SecurityPermission(
"createAccessControlContext"));
}
// no need to clone() here as ACC is immutable
this.context = acc.context;
this.combiner = combiner;
| public AccessControlContext(ProtectionDomain[] context)Constructs a new instance of {@code AccessControlContext} with the
specified array of {@code ProtectionDomain}s.
if (context == null) {
throw new NullPointerException("context can not be null");
}
if (context.length != 0) {
// remove dup entries
ArrayList<ProtectionDomain> a = new ArrayList<ProtectionDomain>();
for (int i = 0; i < context.length; i++) {
if (context[i] != null && !a.contains(context[i])) {
a.add(context[i]);
}
}
if (a.size() != 0) {
this.context = new ProtectionDomain[a.size()];
a.toArray(this.context);
}
}
if (this.context == null) {
// Prevent numerous checks for 'context==null'
this.context = new ProtectionDomain[0];
}
| AccessControlContext(ProtectionDomain[] stack, AccessControlContext inherited)Package-level ctor which is used in AccessController.
ProtectionDomains passed as stack is then passed into
{@link #AccessControlContext(ProtectionDomain[])}, therefore:
it must not be null
duplicates will be removed
null-s will be removed
this(stack); // removes dups, removes nulls, checks for stack==null
this.inherited = inherited;
| AccessControlContext(ProtectionDomain[] stack, DomainCombiner combiner)Package-level ctor which is used in AccessController.
ProtectionDomains passed as stack is then passed into
{@link #AccessControlContext(ProtectionDomain[])}, therefore:
it must not be null
duplicates will be removed
null-s will be removed
this(stack); // removes dups, removes nulls, checks for stack==null
this.combiner = combiner;
|
Methods Summary |
---|
public void | checkPermission(java.security.Permission perm)Checks the specified permission against the vm's current security policy.
The check is based on this {@code AccessControlContext} as opposed to the
{@link AccessController#checkPermission(Permission)} method which
performs access checks based on the context of the current thread. This
method returns silently if the permission is granted, otherwise an
{@code AccessControlException} is thrown.
A permission is considered granted if every {@link ProtectionDomain} in
this context has been granted the specified permission.
If privileged operations are on the call stack, only the {@code
ProtectionDomain}s from the last privileged operation are taken into
account.
If inherited methods are on the call stack, the protection domains of the
declaring classes are checked, not the protection domains of the classes
on which the method is invoked.
if (perm == null) {
throw new NullPointerException("Permission cannot be null");
}
for (int i = 0; i < context.length; i++) {
if (!context[i].implies(perm)) {
throw new AccessControlException("Permission check failed "
+ perm, perm);
}
}
if (inherited != null) {
inherited.checkPermission(perm);
}
| public boolean | equals(java.lang.Object obj)Compares the specified object with this {@code AccessControlContext} for
equality. Returns {@code true} if the specified object is also an
instance of {@code AccessControlContext}, and the two contexts
encapsulate the same {@code ProtectionDomain}s. The order of the {@code
ProtectionDomain}s is ignored by this method.
if (this == obj) {
return true;
}
if (obj instanceof AccessControlContext) {
AccessControlContext that = (AccessControlContext) obj;
if (!(PolicyUtils.matchSubset(context, that.context) && PolicyUtils
.matchSubset(that.context, context))) {
return false;
}
// BEGIN android-changed
if(combiner != null) {
return combiner.equals(that.combiner);
}
return that.combiner == null;
// END android-changed
}
return false;
| public java.security.DomainCombiner | getDomainCombiner()Returns the {@code DomainCombiner} associated with this {@code
AccessControlContext}.
If a {@code SecurityManager} is installed, code calling this method needs
the {@code SecurityPermission} {@code getDomainCombiner} to be granted,
otherwise a {@code SecurityException} will be thrown.
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new SecurityPermission("getDomainCombiner"));
}
return combiner;
| public int | hashCode()Returns the hash code value for this {@code AccessControlContext}.
Returns the same hash code for {@code AccessControlContext}s that are
equal to each other as required by the general contract of
{@link Object#hashCode}.
int hash = 0;
for (int i = 0; i < context.length; i++) {
hash ^= context[i].hashCode();
}
return hash;
|
|