/* | 
|
 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. | 
|
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 
|
 * | 
|
 * This code is free software; you can redistribute it and/or modify it | 
|
 * under the terms of the GNU General Public License version 2 only, as | 
|
 * published by the Free Software Foundation.  Oracle designates this | 
|
 * particular file as subject to the "Classpath" exception as provided | 
|
 * by Oracle in the LICENSE file that accompanied this code. | 
|
 * | 
|
 * This code is distributed in the hope that it will be useful, but WITHOUT | 
|
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
|
 * version 2 for more details (a copy is included in the LICENSE file that | 
|
 * accompanied this code). | 
|
 * | 
|
 * You should have received a copy of the GNU General Public License version | 
|
 * 2 along with this work; if not, write to the Free Software Foundation, | 
|
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | 
|
 * | 
|
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | 
|
 * or visit www.oracle.com if you need additional information or have any | 
|
 * questions. | 
|
*/  | 
|
package com.sun.security.auth;  | 
|
import java.security.CodeSource;  | 
|
import java.security.PermissionCollection;  | 
|
import javax.security.auth.Subject;  | 
|
/** | 
|
 * This class represents a default implementation for | 
|
 * <code>javax.security.auth.Policy</code>. | 
|
 * | 
|
 * <p> This object stores the policy for entire Java runtime, | 
|
 * and is the amalgamation of multiple static policy | 
|
 * configurations that resides in files. | 
|
 * The algorithm for locating the policy file(s) and reading their | 
|
 * information into this <code>Policy</code> object is: | 
|
 * | 
|
 * <ol> | 
|
 * <li> | 
|
 *   Loop through the security properties, | 
|
 *   <i>auth.policy.url.1</i>, <i>auth.policy.url.2</i>, ..., | 
|
 *   <i>auth.policy.url.X</i>". | 
|
 *   Each property value specifies a <code>URL</code> pointing to a | 
|
 *   policy file to be loaded.  Read in and load each policy. | 
|
 * | 
|
 * <li> | 
|
 *   The <code>java.lang.System</code> property <i>java.security.auth.policy</i> | 
|
 *   may also be set to a <code>URL</code> pointing to another policy file | 
|
 *   (which is the case when a user uses the -D switch at runtime). | 
|
 *   If this property is defined, and its use is allowed by the | 
|
 *   security property file (the Security property, | 
|
 *   <i>policy.allowSystemProperty</i> is set to <i>true</i>), | 
|
 *   also load that policy. | 
|
 * | 
|
 * <li> | 
|
 *   If the <i>java.security.auth.policy</i> property is defined using | 
|
 *   "==" (rather than "="), then ignore all other specified | 
|
 *   policies and only load this policy. | 
|
 * </ol> | 
|
 * | 
|
 * Each policy file consists of one or more grant entries, each of | 
|
 * which consists of a number of permission entries. | 
|
 * | 
|
 * <pre> | 
|
 *   grant signedBy "<b>alias</b>", codeBase "<b>URL</b>", | 
|
 *         principal <b>principalClass</b> "<b>principalName</b>", | 
|
 *         principal <b>principalClass</b> "<b>principalName</b>", | 
|
 *         ... { | 
|
 * | 
|
 *     permission <b>Type</b> "<b>name</b> "<b>action</b>", | 
|
 *         signedBy "<b>alias</b>"; | 
|
 *     permission <b>Type</b> "<b>name</b> "<b>action</b>", | 
|
 *         signedBy "<b>alias</b>"; | 
|
 *     .... | 
|
 *   }; | 
|
 * </pre> | 
|
 * | 
|
 * All non-bold items above must appear as is (although case | 
|
 * doesn't matter and some are optional, as noted below). | 
|
 * Italicized items represent variable values. | 
|
 * | 
|
 * <p> A grant entry must begin with the word <code>grant</code>. | 
|
 * The <code>signedBy</code> and <code>codeBase</code> | 
|
 * name/value pairs are optional. | 
|
 * If they are not present, then any signer (including unsigned code) | 
|
 * will match, and any codeBase will match.  Note that the | 
|
 * <code>principal</code> name/value pair is not optional. | 
|
 * This <code>Policy</code> implementation only permits | 
|
 * Principal-based grant entries.  Note that the <i>principalClass</i> | 
|
 * may be set to the wildcard value, *, which allows it to match | 
|
 * any <code>Principal</code> class.  In addition, the <i>principalName</i> | 
|
 * may also be set to the wildcard value, *, allowing it to match | 
|
 * any <code>Principal</code> name.  When setting the <i>principalName</i> | 
|
 * to the *, do not surround the * with quotes. | 
|
 * | 
|
 * <p> A permission entry must begin with the word <code>permission</code>. | 
|
 * The word <code><i>Type</i></code> in the template above is | 
|
 * a specific permission type, such as <code>java.io.FilePermission</code> | 
|
 * or <code>java.lang.RuntimePermission</code>. | 
|
 * | 
|
 * <p> The "<i>action</i>" is required for | 
|
 * many permission types, such as <code>java.io.FilePermission</code> | 
|
 * (where it specifies what type of file access that is permitted). | 
|
 * It is not required for categories such as | 
|
 * <code>java.lang.RuntimePermission</code> | 
|
 * where it is not necessary - you either have the | 
|
 * permission specified by the <code>"<i>name</i>"</code> | 
|
 * value following the type name or you don't. | 
|
 * | 
|
 * <p> The <code>signedBy</code> name/value pair for a permission entry | 
|
 * is optional. If present, it indicates a signed permission. That is, | 
|
 * the permission class itself must be signed by the given alias in | 
|
 * order for it to be granted. For example, | 
|
 * suppose you have the following grant entry: | 
|
 * | 
|
 * <pre> | 
|
 *   grant principal foo.com.Principal "Duke" { | 
|
 *     permission Foo "foobar", signedBy "FooSoft"; | 
|
 *   } | 
|
 * </pre> | 
|
 * | 
|
 * <p> Then this permission of type <i>Foo</i> is granted if the | 
|
 * <code>Foo.class</code> permission has been signed by the | 
|
 * "FooSoft" alias, or if <code>Foo.class</code> is a | 
|
 * system class (i.e., is found on the CLASSPATH). | 
|
 * | 
|
 * <p> Items that appear in an entry must appear in the specified order | 
|
 * (<code>permission</code>, <i>Type</i>, "<i>name</i>", and | 
|
 * "<i>action</i>"). An entry is terminated with a semicolon. | 
|
 * | 
|
 * <p> Case is unimportant for the identifiers (<code>permission</code>, | 
|
 * <code>signedBy</code>, <code>codeBase</code>, etc.) but is | 
|
 * significant for the <i>Type</i> | 
|
 * or for any string that is passed in as a value. <p> | 
|
 * | 
|
 * <p> An example of two entries in a policy configuration file is | 
|
 * <pre> | 
|
 *   // if the code is comes from "foo.com" and is running as "Duke", | 
|
 *   // grant it read/write to all files in /tmp. | 
|
 * | 
|
 *   grant codeBase "foo.com", principal foo.com.Principal "Duke" { | 
|
 *              permission java.io.FilePermission "/tmp/*", "read,write"; | 
|
 *   }; | 
|
 * | 
|
 *   // grant any code running as "Duke" permission to read | 
|
 *   // the "java.vendor" Property. | 
|
 * | 
|
 *   grant principal foo.com.Principal "Duke" { | 
|
 *         permission java.util.PropertyPermission "java.vendor"; | 
|
 * </pre> | 
|
 * | 
|
 * <p> This <code>Policy</code> implementation supports | 
|
 * special handling for PrivateCredentialPermissions. | 
|
 * If a grant entry is configured with a | 
|
 * <code>PrivateCredentialPermission</code>, | 
|
 * and the "Principal Class/Principal Name" for that | 
|
 * <code>PrivateCredentialPermission</code> is "self", | 
|
 * then the entry grants the specified <code>Subject</code> permission to | 
|
 * access its own private Credential.  For example, | 
|
 * the following grants the <code>Subject</code> "Duke" | 
|
 * access to its own a.b.Credential. | 
|
 * | 
|
 * <pre> | 
|
 *   grant principal foo.com.Principal "Duke" { | 
|
 *      permission javax.security.auth.PrivateCredentialPermission | 
|
 *              "a.b.Credential self", | 
|
 *              "read"; | 
|
 *    }; | 
|
 * </pre> | 
|
 * | 
|
 * The following grants the <code>Subject</code> "Duke" | 
|
 * access to all of its own private Credentials: | 
|
 * | 
|
 * <pre> | 
|
 *   grant principal foo.com.Principal "Duke" { | 
|
 *      permission javax.security.auth.PrivateCredentialPermission | 
|
 *              "* self", | 
|
 *              "read"; | 
|
 *    }; | 
|
 * </pre> | 
|
 * | 
|
 * The following grants all Subjects authenticated as a | 
|
 * <code>SolarisPrincipal</code> (regardless of their respective names) | 
|
 * permission to access their own private Credentials: | 
|
 * | 
|
 * <pre> | 
|
 *   grant principal com.sun.security.auth.SolarisPrincipal * { | 
|
 *      permission javax.security.auth.PrivateCredentialPermission | 
|
 *              "* self", | 
|
 *              "read"; | 
|
 *    }; | 
|
 * </pre> | 
|
 * | 
|
 * The following grants all Subjects permission to access their own | 
|
 * private Credentials: | 
|
 * | 
|
 * <pre> | 
|
 *   grant principal * * { | 
|
 *      permission javax.security.auth.PrivateCredentialPermission | 
|
 *              "* self", | 
|
 *              "read"; | 
|
 *    }; | 
|
 * </pre> | 
|
 | 
|
 * @deprecated As of JDK 1.4, replaced by | 
|
 *             <code>sun.security.provider.PolicyFile</code>. | 
|
 *             This class is entirely deprecated. | 
|
 * | 
|
 * @see java.security.CodeSource | 
|
 * @see java.security.Permissions | 
|
 * @see java.security.ProtectionDomain | 
|
 * @see java.security.Security security properties | 
|
*/  | 
|
@jdk.Exported(false)  | 
|
@Deprecated  | 
|
public class PolicyFile extends javax.security.auth.Policy { | 
|
private final sun.security.provider.AuthPolicyFile apf;  | 
|
    /** | 
|
     * Initializes the Policy object and reads the default policy | 
|
     * configuration file(s) into the Policy object. | 
|
*/  | 
|
    public PolicyFile() { | 
|
apf = new sun.security.provider.AuthPolicyFile();  | 
|
}  | 
|
    /** | 
|
     * Refreshes the policy object by re-reading all the policy files. | 
|
     * | 
|
     * <p> | 
|
     * | 
|
     * @exception SecurityException if the caller doesn't have permission | 
|
     *          to refresh the <code>Policy</code>. | 
|
*/  | 
|
@Override  | 
|
    public void refresh() { | 
|
apf.refresh();  | 
|
}  | 
|
    /** | 
|
     * Examines this <code>Policy</code> and returns the Permissions granted | 
|
     * to the specified <code>Subject</code> and <code>CodeSource</code>. | 
|
     * | 
|
     * <p> Permissions for a particular <i>grant</i> entry are returned | 
|
     * if the <code>CodeSource</code> constructed using the codebase and | 
|
     * signedby values specified in the entry <code>implies</code> | 
|
     * the <code>CodeSource</code> provided to this method, and if the | 
|
     * <code>Subject</code> provided to this method contains all of the | 
|
     * Principals specified in the entry. | 
|
     * | 
|
     * <p> The <code>Subject</code> provided to this method contains all | 
|
     * of the Principals specified in the entry if, for each | 
|
     * <code>Principal</code>, "P1", specified in the <i>grant</i> entry | 
|
     * one of the following two conditions is met: | 
|
     * | 
|
     * <p> | 
|
     * <ol> | 
|
     * <li> the <code>Subject</code> has a | 
|
     *      <code>Principal</code>, "P2", where | 
|
     *      <code>P2.getClass().getName()</code> equals the | 
|
     *      P1's class name, and where | 
|
     *      <code>P2.getName()</code> equals the P1's name. | 
|
     * | 
|
     * <li> P1 implements | 
|
     *      <code>com.sun.security.auth.PrincipalComparator</code>, | 
|
     *      and <code>P1.implies</code> the provided <code>Subject</code>. | 
|
     * </ol> | 
|
     * | 
|
     * <p> Note that this <code>Policy</code> implementation has | 
|
     * special handling for PrivateCredentialPermissions. | 
|
     * When this method encounters a <code>PrivateCredentialPermission</code> | 
|
     * which specifies "self" as the <code>Principal</code> class and name, | 
|
     * it does not add that <code>Permission</code> to the returned | 
|
     * <code>PermissionCollection</code>.  Instead, it builds | 
|
     * a new <code>PrivateCredentialPermission</code> | 
|
     * for each <code>Principal</code> associated with the provided | 
|
     * <code>Subject</code>.  Each new <code>PrivateCredentialPermission</code> | 
|
     * contains the same Credential class as specified in the | 
|
     * originally granted permission, as well as the Class and name | 
|
     * for the respective <code>Principal</code>. | 
|
     * | 
|
     * <p> | 
|
     * | 
|
     * @param subject the Permissions granted to this <code>Subject</code> | 
|
     *          and the additionally provided <code>CodeSource</code> | 
|
     *          are returned. <p> | 
|
     * | 
|
     * @param codesource the Permissions granted to this <code>CodeSource</code> | 
|
     *          and the additionally provided <code>Subject</code> | 
|
     *          are returned. | 
|
     * | 
|
     * @return the Permissions granted to the provided <code>Subject</code> | 
|
     *          <code>CodeSource</code>. | 
|
*/  | 
|
@Override  | 
|
public PermissionCollection getPermissions(final Subject subject,  | 
|
final CodeSource codesource) {  | 
|
return apf.getPermissions(subject, codesource);  | 
|
}  | 
|
}  |