1 /* 2 * Copyright (c) 1998, 2021, 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 26 package java.security; 27 28 import java.security.*; 29 import java.util.Enumeration; 30 import java.util.Hashtable; 31 import java.util.StringTokenizer; 32 import sun.security.util.SecurityConstants; 33 34 /** 35 * The AllPermission is a permission that implies all other permissions. 36 * <p> 37 * <b>Note:</b> Granting AllPermission should be done with extreme care, 38 * as it implies all other permissions. Thus, it grants code the ability 39 * to run with security 40 * disabled. Extreme caution should be taken before granting such 41 * a permission to code. This permission should be used only during testing, 42 * or in extremely rare cases where an application or applet is 43 * completely trusted and adding the necessary permissions to the policy 44 * is prohibitively cumbersome. 45 * 46 * @see java.security.Permission 47 * @see java.security.AccessController 48 * @see java.security.Permissions 49 * @see java.security.PermissionCollection 50 * @see java.lang.SecurityManager 51 * 52 * 53 * @author Roland Schemers 54 * @since 1.2 55 * 56 * @serial exclude 57 */ 58 59 public final class AllPermission extends Permission { 60 61 @java.io.Serial 62 private static final long serialVersionUID = -2916474571451318075L; 63 64 /** 65 * Creates a new AllPermission object. 66 */ AllPermission()67 public AllPermission() { 68 super("<all permissions>"); 69 } 70 71 72 /** 73 * Creates a new AllPermission object. This 74 * constructor exists for use by the {@code Policy} object 75 * to instantiate new Permission objects. 76 * 77 * @param name ignored 78 * @param actions ignored. 79 */ AllPermission(String name, String actions)80 public AllPermission(String name, String actions) { 81 this(); 82 } 83 84 /** 85 * Checks if the specified permission is "implied" by 86 * this object. This method always returns true. 87 * 88 * @param p the permission to check against. 89 * 90 * @return return 91 */ implies(Permission p)92 public boolean implies(Permission p) { 93 return true; 94 } 95 96 /** 97 * Checks two AllPermission objects for equality. Two AllPermission 98 * objects are always equal. 99 * 100 * @param obj the object we are testing for equality with this object. 101 * @return true if {@code obj} is an AllPermission, false otherwise. 102 */ equals(Object obj)103 public boolean equals(Object obj) { 104 return (obj instanceof AllPermission); 105 } 106 107 /** 108 * Returns the hash code value for this object. 109 * 110 * @return a hash code value for this object. 111 */ 112 hashCode()113 public int hashCode() { 114 return 1; 115 } 116 117 /** 118 * Returns the canonical string representation of the actions. 119 * 120 * @return the actions. 121 */ getActions()122 public String getActions() { 123 return "<all actions>"; 124 } 125 126 /** 127 * Returns a new PermissionCollection object for storing AllPermission 128 * objects. 129 * 130 * @return a new PermissionCollection object suitable for 131 * storing AllPermissions. 132 */ newPermissionCollection()133 public PermissionCollection newPermissionCollection() { 134 return new AllPermissionCollection(); 135 } 136 137 } 138 139 /** 140 * A AllPermissionCollection stores a collection 141 * of AllPermission permissions. AllPermission objects 142 * must be stored in a manner that allows them to be inserted in any 143 * order, but enable the implies function to evaluate the implies 144 * method in an efficient (and consistent) manner. 145 * 146 * @see java.security.Permission 147 * @see java.security.Permissions 148 * 149 * 150 * @author Roland Schemers 151 * 152 * @serial include 153 */ 154 155 final class AllPermissionCollection 156 extends PermissionCollection 157 implements java.io.Serializable 158 { 159 160 // use serialVersionUID from JDK 1.2.2 for interoperability 161 @java.io.Serial 162 private static final long serialVersionUID = -4023755556366636806L; 163 164 /** 165 * True if any AllPermissions have been added. 166 */ 167 private boolean all_allowed; 168 169 /** 170 * Create an empty AllPermissions object. 171 * 172 */ 173 AllPermissionCollection()174 public AllPermissionCollection() { 175 all_allowed = false; 176 } 177 178 /** 179 * Adds a permission to the AllPermissions. The key for the hash is 180 * permission.path. 181 * 182 * @param permission the Permission object to add. 183 * 184 * @throws IllegalArgumentException if the permission is not an 185 * AllPermission 186 * 187 * @throws SecurityException if this AllPermissionCollection object 188 * has been marked readonly 189 */ 190 add(Permission permission)191 public void add(Permission permission) { 192 if (! (permission instanceof AllPermission)) 193 throw new IllegalArgumentException("invalid permission: "+ 194 permission); 195 if (isReadOnly()) 196 throw new SecurityException("attempt to add a Permission to a readonly PermissionCollection"); 197 198 all_allowed = true; // No sync; staleness OK 199 } 200 201 /** 202 * Check and see if this set of permissions implies the permissions 203 * expressed in "permission". 204 * 205 * @param permission the Permission object to compare 206 * 207 * @return always returns true. 208 */ 209 implies(Permission permission)210 public boolean implies(Permission permission) { 211 return all_allowed; // No sync; staleness OK 212 } 213 214 /** 215 * Returns an enumeration of all the AllPermission objects in the 216 * container. 217 * 218 * @return an enumeration of all the AllPermission objects. 219 */ elements()220 public Enumeration<Permission> elements() { 221 return new Enumeration<>() { 222 private boolean hasMore = all_allowed; 223 224 public boolean hasMoreElements() { 225 return hasMore; 226 } 227 228 public Permission nextElement() { 229 hasMore = false; 230 return SecurityConstants.ALL_PERMISSION; 231 } 232 }; 233 } 234 } 235