History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/javax/security/auth/Policy.java (1 of 18352 files). Show all

Unified · Split

java/pkg/javax/security/auth/Policy.java+361−0
@@ -0,0 +1,361 @@
1/*
2 * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package javax.security.auth;
27
28import java.security.Security;
29import sun.security.util.Debug;
30
31/**
32 * <p> This is an abstract class for representing the system policy for
33 * Subject-based authorization. A subclass implementation
34 * of this class provides a means to specify a Subject-based
35 * access control <code>Policy</code>.
36 *
37 * <p> A <code>Policy</code> object can be queried for the set of
38 * Permissions granted to code running as a
39 * <code>Principal</code> in the following manner:
40 *
41 * <pre>
42 * policy = Policy.getPolicy();
43 * PermissionCollection perms = policy.getPermissions(subject,
44 * codeSource);
45 * </pre>
46 *
47 * The <code>Policy</code> object consults the local policy and returns
48 * and appropriate <code>Permissions</code> object with the
49 * Permissions granted to the Principals associated with the
50 * provided <i>subject</i>, and granted to the code specified
51 * by the provided <i>codeSource</i>.
52 *
53 * <p> A <code>Policy</code> contains the following information.
54 * Note that this example only represents the syntax for the default
55 * <code>Policy</code> implementation. Subclass implementations of this class
56 * may implement alternative syntaxes and may retrieve the
57 * <code>Policy</code> from any source such as files, databases,
58 * or servers.
59 *
60 * <p> Each entry in the <code>Policy</code> is represented as
61 * a <b><i>grant</i></b> entry. Each <b><i>grant</i></b> entry
62 * specifies a codebase, code signers, and Principals triplet,
63 * as well as the Permissions granted to that triplet.
64 *
65 * <pre>
66 * grant CodeBase ["URL"], Signedby ["signers"],
67 * Principal [Principal_Class] "Principal_Name" {
68 * Permission Permission_Class ["Target_Name"]
69 * [, "Permission_Actions"]
70 * [, signedBy "SignerName"];
71 * };
72 * </pre>
73 *
74 * The CodeBase and Signedby components of the triplet name/value pairs
75 * are optional. If they are not present, then any any codebase will match,
76 * and any signer (including unsigned code) will match.
77 * For Example,
78 *
79 * <pre>
80 * grant CodeBase "foo.com", Signedby "foo",
81 * Principal com.sun.security.auth.SolarisPrincipal "duke" {
82 * permission java.io.FilePermission "/home/duke", "read, write";
83 * };
84 * </pre>
85 *
86 * This <b><i>grant</i></b> entry specifies that code from "foo.com",
87 * signed by "foo', and running as a <code>SolarisPrincipal</code> with the
88 * name, duke, has one <code>Permission</code>. This <code>Permission</code>
89 * permits the executing code to read and write files in the directory,
90 * "/home/duke".
91 *
92 * <p> To "run" as a particular <code>Principal</code>,
93 * code invokes the <code>Subject.doAs(subject, ...)</code> method.
94 * After invoking that method, the code runs as all the Principals
95 * associated with the specified <code>Subject</code>.
96 * Note that this <code>Policy</code> (and the Permissions
97 * granted in this <code>Policy</code>) only become effective
98 * after the call to <code>Subject.doAs</code> has occurred.
99 *
100 * <p> Multiple Principals may be listed within one <b><i>grant</i></b> entry.
101 * All the Principals in the grant entry must be associated with
102 * the <code>Subject</code> provided to <code>Subject.doAs</code>
103 * for that <code>Subject</code> to be granted the specified Permissions.
104 *
105 * <pre>
106 * grant Principal com.sun.security.auth.SolarisPrincipal "duke",
107 * Principal com.sun.security.auth.SolarisNumericUserPrincipal "0" {
108 * permission java.io.FilePermission "/home/duke", "read, write";
109 * permission java.net.SocketPermission "duke.com", "connect";
110 * };
111 * </pre>
112 *
113 * This entry grants any code running as both "duke" and "0"
114 * permission to read and write files in duke's home directory,
115 * as well as permission to make socket connections to "duke.com".
116 *
117 * <p> Note that non Principal-based grant entries are not permitted
118 * in this <code>Policy</code>. Therefore, grant entries such as:
119 *
120 * <pre>
121 * grant CodeBase "foo.com", Signedby "foo" {
122 * permission java.io.FilePermission "/tmp/scratch", "read, write";
123 * };
124 * </pre>
125 *
126 * are rejected. Such permission must be listed in the
127 * <code>java.security.Policy</code>.
128 *
129 * <p> The default <code>Policy</code> implementation can be changed by
130 * setting the value of the "auth.policy.provider" security property
131 * (in the Java security properties file) to the fully qualified name of
132 * the desired <code>Policy</code> implementation class.
133 * The Java security properties file is located in the file named
134 * &lt;JAVA_HOME&gt;/lib/security/java.security.
135 * &lt;JAVA_HOME&gt; refers to the value of the java.home system property,
136 * and specifies the directory where the JRE is installed.
137 *
138 * @deprecated as of JDK version 1.4 -- Replaced by java.security.Policy.
139 * java.security.Policy has a method:
140 * <pre>
141 * public PermissionCollection getPermissions
142 * (java.security.ProtectionDomain pd)
143 *
144 * </pre>
145 * and ProtectionDomain has a constructor:
146 * <pre>
147 * public ProtectionDomain
148 * (CodeSource cs,
149 * PermissionCollection permissions,
150 * ClassLoader loader,
151 * Principal[] principals)
152 * </pre>
153 *
154 * These two APIs provide callers the means to query the
155 * Policy for Principal-based Permission entries.
156 *
157 *
158 */
159@Deprecated
160public abstract class Policy {
161
162 private static Policy policy;
163 private static ClassLoader contextClassLoader;
164
165 // true if a custom (not com.sun.security.auth.PolicyFile) system-wide
166 // policy object is set
167 private static boolean isCustomPolicy;
168
169 static {
170 contextClassLoader = java.security.AccessController.doPrivileged
171 (new java.security.PrivilegedAction<ClassLoader>() {
172 public ClassLoader run() {
173 return Thread.currentThread().getContextClassLoader();
174 }
175 });
176 };
177
178 /**
179 * Sole constructor. (For invocation by subclass constructors, typically
180 * implicit.)
181 */
182 protected Policy() { }
183
184 /**
185 * Returns the installed Policy object.
186 * This method first calls
187 * <code>SecurityManager.checkPermission</code> with the
188 * <code>AuthPermission("getPolicy")</code> permission
189 * to ensure the caller has permission to get the Policy object.
190 *
191 * <p>
192 *
193 * @return the installed Policy. The return value cannot be
194 * <code>null</code>.
195 *
196 * @exception java.lang.SecurityException if the current thread does not
197 * have permission to get the Policy object.
198 *
199 * @see #setPolicy
200 */
201 public static Policy getPolicy() {
202 java.lang.SecurityManager sm = System.getSecurityManager();
203 if (sm != null) sm.checkPermission(new AuthPermission("getPolicy"));
204 return getPolicyNoCheck();
205 }
206
207 /**
208 * Returns the installed Policy object, skipping the security check.
209 *
210 * @return the installed Policy.
211 *
212 */
213 static Policy getPolicyNoCheck() {
214 if (policy == null) {
215
216 synchronized(Policy.class) {
217
218 if (policy == null) {
219 String policy_class = null;
220 policy_class = java.security.AccessController.doPrivileged
221 (new java.security.PrivilegedAction<String>() {
222 public String run() {
223 return java.security.Security.getProperty
224 ("auth.policy.provider");
225 }
226 });
227 if (policy_class == null) {
228 policy_class = "com.sun.security.auth.PolicyFile";
229 }
230
231 try {
232 final String finalClass = policy_class;
233 policy = java.security.AccessController.doPrivileged
234 (new java.security.PrivilegedExceptionAction<Policy>() {
235 public Policy run() throws ClassNotFoundException,
236 InstantiationException,
237 IllegalAccessException {
238 return (Policy) Class.forName
239 (finalClass,
240 true,
241 contextClassLoader).newInstance();
242 }
243 });
244 isCustomPolicy =
245 !finalClass.equals("com.sun.security.auth.PolicyFile");
246 } catch (Exception e) {
247 throw new SecurityException
248 (sun.security.util.ResourcesMgr.getString
249 ("unable.to.instantiate.Subject.based.policy"));
250 }
251 }
252 }
253 }
254 return policy;
255 }
256
257
258 /**
259 * Sets the system-wide Policy object. This method first calls
260 * <code>SecurityManager.checkPermission</code> with the
261 * <code>AuthPermission("setPolicy")</code>
262 * permission to ensure the caller has permission to set the Policy.
263 *
264 * <p>
265 *
266 * @param policy the new system Policy object.
267 *
268 * @exception java.lang.SecurityException if the current thread does not
269 * have permission to set the Policy.
270 *
271 * @see #getPolicy
272 */
273 public static void setPolicy(Policy policy) {
274 java.lang.SecurityManager sm = System.getSecurityManager();
275 if (sm != null) sm.checkPermission(new AuthPermission("setPolicy"));
276 Policy.policy = policy;
277 // all non-null policy objects are assumed to be custom
278 isCustomPolicy = policy != null ? true : false;
279 }
280
281 /**
282 * Returns true if a custom (not com.sun.security.auth.PolicyFile)
283 * system-wide policy object has been set or installed. This method is
284 * called by SubjectDomainCombiner to provide backwards compatibility for
285 * developers that provide their own javax.security.auth.Policy
286 * implementations.
287 *
288 * @return true if a custom (not com.sun.security.auth.PolicyFile)
289 * system-wide policy object has been set; false otherwise
290 */
291 static boolean isCustomPolicySet(Debug debug) {
292 if (policy != null) {
293 if (debug != null && isCustomPolicy) {
294 debug.println("Providing backwards compatibility for " +
295 "javax.security.auth.policy implementation: " +
296 policy.toString());
297 }
298 return isCustomPolicy;
299 }
300 // check if custom policy has been set using auth.policy.provider prop
301 String policyClass = java.security.AccessController.doPrivileged
302 (new java.security.PrivilegedAction<String>() {
303 public String run() {
304 return Security.getProperty("auth.policy.provider");
305 }
306 });
307 if (policyClass != null
308 && !policyClass.equals("com.sun.security.auth.PolicyFile")) {
309 if (debug != null) {
310 debug.println("Providing backwards compatibility for " +
311 "javax.security.auth.policy implementation: " +
312 policyClass);
313 }
314 return true;
315 }
316 return false;
317 }
318
319 /**
320 * Retrieve the Permissions granted to the Principals associated with
321 * the specified <code>CodeSource</code>.
322 *
323 * <p>
324 *
325 * @param subject the <code>Subject</code>
326 * whose associated Principals,
327 * in conjunction with the provided
328 * <code>CodeSource</code>, determines the Permissions
329 * returned by this method. This parameter
330 * may be <code>null</code>. <p>
331 *
332 * @param cs the code specified by its <code>CodeSource</code>
333 * that determines, in conjunction with the provided
334 * <code>Subject</code>, the Permissions
335 * returned by this method. This parameter may be
336 * <code>null</code>.
337 *
338 * @return the Collection of Permissions granted to all the
339 * <code>Subject</code> and code specified in
340 * the provided <i>subject</i> and <i>cs</i>
341 * parameters.
342 */
343 public abstract java.security.PermissionCollection getPermissions
344 (Subject subject,
345 java.security.CodeSource cs);
346
347 /**
348 * Refresh and reload the Policy.
349 *
350 * <p>This method causes this object to refresh/reload its current
351 * Policy. This is implementation-dependent.
352 * For example, if the Policy object is stored in
353 * a file, calling <code>refresh</code> will cause the file to be re-read.
354 *
355 * <p>
356 *
357 * @exception SecurityException if the caller does not have permission
358 * to refresh the Policy.
359 */
360 public abstract void refresh();
361}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t