/*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package javax.security.auth;
import java.util.*;
import java.text.MessageFormat;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Principal;
import sun.security.util.ResourcesMgr;
/**
* This class is used to protect access to private Credentials
* belonging to a particular Subject
. The Subject
* is represented by a Set of Principals.
*
*
The target name of this Permission
specifies
* a Credential class name, and a Set of Principals.
* The only valid value for this Permission's actions is, "read".
* The target name must abide by the following syntax:
*
*
* CredentialClass {PrincipalClass "PrincipalName"}* ** * For example, the following permission grants access to the * com.sun.PrivateCredential owned by Subjects which have * a com.sun.Principal with the name, "duke". Note that although * this example, as well as all the examples below, do not contain * Codebase, SignedBy, or Principal information in the grant statement * (for simplicity reasons), actual policy configurations should * specify that information when appropriate. * *
* * grant { * permission javax.security.auth.PrivateCredentialPermission * "com.sun.PrivateCredential com.sun.Principal \"duke\"", * "read"; * }; ** * If CredentialClass is "*", then access is granted to * all private Credentials belonging to the specified *
Subject
.
* If "PrincipalName" is "*", then access is granted to the
* specified Credential owned by any Subject
that has the
* specified Principal
(the actual PrincipalName doesn't matter).
* For example, the following grants access to the
* a.b.Credential owned by any Subject
that has
* an a.b.Principal.
*
* * grant { * permission javax.security.auth.PrivateCredentialPermission * "a.b.Credential a.b.Principal "*"", * "read"; * }; ** * If both the PrincipalClass and "PrincipalName" are "*", * then access is granted to the specified Credential owned by * any
Subject
.
*
* In addition, the PrincipalClass/PrincipalName pairing may be repeated: * *
* grant { * permission javax.security.auth.PrivateCredentialPermission * "a.b.Credential a.b.Principal "duke" c.d.Principal "dukette"", * "read"; * }; ** * The above grants access to the private Credential, "a.b.Credential", * belonging to a
Subject
with at least two associated Principals:
* "a.b.Principal" with the name, "duke", and "c.d.Principal", with the name,
* "dukette".
*
*/
public final class PrivateCredentialPermission extends Permission {
private static final long serialVersionUID = 5284372143517237068L;
private static final CredOwner[] EMPTY_PRINCIPALS = new CredOwner[0];
/**
* @serial
*/
private String credentialClass;
/**
* @serial The Principals associated with this permission.
* The set contains elements of type,
* PrivateCredentialPermission.CredOwner
.
*/
private Set principals; // ignored - kept around for compatibility
private transient CredOwner[] credOwners;
/**
* @serial
*/
private boolean testing = false;
/**
* Create a new PrivateCredentialPermission
* with the specified credentialClass
and Principals.
*/
PrivateCredentialPermission(String credentialClass,
SetPrivateCredentialPermission
* with the specified name
. The name
* specifies both a Credential class and a Principal
Set.
*
*
*
* @param name the name specifying the Credential class and
* Principal
Set.
*
* @param actions the actions specifying that the Credential can be read.
*
* @throws IllegalArgumentException if name
does not conform
* to the correct syntax or if actions
is not "read".
*/
public PrivateCredentialPermission(String name, String actions) {
super(name);
if (!"read".equalsIgnoreCase(actions))
throw new IllegalArgumentException
(ResourcesMgr.getString("actions.can.only.be.read."));
init(name);
}
/**
* Returns the Class name of the Credential associated with this
* PrivateCredentialPermission
.
*
*
*
* @return the Class name of the Credential associated with this
* PrivateCredentialPermission
.
*/
public String getCredentialClass() {
return credentialClass;
}
/**
* Returns the Principal
classes and names
* associated with this PrivateCredentialPermission
.
* The information is returned as a two-dimensional array (array[x][y]).
* The 'x' value corresponds to the number of Principal
* class and name pairs. When (y==0), it corresponds to
* the Principal
class value, and when (y==1),
* it corresponds to the Principal
name value.
* For example, array[0][0] corresponds to the class name of
* the first Principal
in the array. array[0][1]
* corresponds to the Principal
name of the
* first Principal
in the array.
*
*
*
* @return the Principal
class and names associated
* with this PrivateCredentialPermission
.
*/
public String[][] getPrincipals() {
if (credOwners == null || credOwners.length == 0) {
return new String[0][0];
}
String[][] pArray = new String[credOwners.length][2];
for (int i = 0; i < credOwners.length; i++) {
pArray[i][0] = credOwners[i].principalClass;
pArray[i][1] = credOwners[i].principalName;
}
return pArray;
}
/**
* Checks if this PrivateCredentialPermission
implies
* the specified Permission
.
*
*
* * This method returns true if: *
*
* [* P1 "duke"] implies [a.b.Credential P1 "duke"]. * [C1 P1 "duke"] implies [C1 P1 "duke" P2 "dukette"]. * [C1 P2 "dukette"] implies [C1 P1 "duke" P2 "dukette"]. **
*
* @param p the Permission
to check against.
*
* @return true if this PrivateCredentialPermission
implies
* the specified Permission
, false if not.
*/
public boolean implies(Permission p) {
if (p == null || !(p instanceof PrivateCredentialPermission))
return false;
PrivateCredentialPermission that = (PrivateCredentialPermission)p;
if (!impliesCredentialClass(credentialClass, that.credentialClass))
return false;
return impliesPrincipalSet(credOwners, that.credOwners);
}
/**
* Checks two PrivateCredentialPermission
objects for
* equality. Checks that obj is a
* PrivateCredentialPermission
,
* and has the same credential class as this object,
* as well as the same Principals as this object.
* The order of the Principals in the respective Permission's
* target names is not relevant.
*
*
*
* @param obj the object we are testing for equality with this object.
*
* @return true if obj is a PrivateCredentialPermission
,
* has the same credential class as this object,
* and has the same Principals as this object.
*/
public boolean equals(Object obj) {
if (obj == this)
return true;
if (! (obj instanceof PrivateCredentialPermission))
return false;
PrivateCredentialPermission that = (PrivateCredentialPermission)obj;
return (this.implies(that) && that.implies(this));
}
/**
* Returns the hash code value for this object.
*
* @return a hash code value for this object.
*/
public int hashCode() {
return this.credentialClass.hashCode();
}
/**
* Returns the "canonical string representation" of the actions.
* This method always returns the String, "read".
*
*
*
* @return the actions (always returns "read").
*/
public String getActions() {
return "read";
}
/**
* Return a homogeneous collection of PrivateCredentialPermissions
* in a PermissionCollection
.
* No such PermissionCollection
is defined,
* so this method always returns null
.
*
*
*
* @return null in all cases.
*/
public PermissionCollection newPermissionCollection() {
return null;
}
private void init(String name) {
if (name == null || name.trim().length() == 0) {
throw new IllegalArgumentException("invalid empty name");
}
ArrayList