GNU Classpath (0.95) | |
Frames | No Frames |
1: /* BasicPermission.java -- implements a simple named permission 2: Copyright (C) 1998, 1999, 2002, 2003, 2004, 2005, 2006 3: Free Software Foundation, Inc. 4: 5: This file is part of GNU Classpath. 6: 7: GNU Classpath is free software; you can redistribute it and/or modify 8: it under the terms of the GNU General Public License as published by 9: the Free Software Foundation; either version 2, or (at your option) 10: any later version. 11: 12: GNU Classpath is distributed in the hope that it will be useful, but 13: WITHOUT ANY WARRANTY; without even the implied warranty of 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15: General Public License for more details. 16: 17: You should have received a copy of the GNU General Public License 18: along with GNU Classpath; see the file COPYING. If not, write to the 19: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20: 02110-1301 USA. 21: 22: Linking this library statically or dynamically with other modules is 23: making a combined work based on this library. Thus, the terms and 24: conditions of the GNU General Public License cover the whole 25: combination. 26: 27: As a special exception, the copyright holders of this library give you 28: permission to link this library with independent modules to produce an 29: executable, regardless of the license terms of these independent 30: modules, and to copy and distribute the resulting executable under 31: terms of your choice, provided that you also meet, for each linked 32: independent module, the terms and conditions of the license of that 33: module. An independent module is a module which is not derived from 34: or based on this library. If you modify this library, you may extend 35: this exception to your version of the library, but you are not 36: obligated to do so. If you do not wish to do so, delete this 37: exception statement from your version. */ 38: 39: 40: package java.security; 41: 42: import java.io.Serializable; 43: import java.util.Enumeration; 44: import java.util.Hashtable; 45: 46: /** 47: * This class implements a simple model for named permissions without an 48: * associated action list. That is, either the named permission is granted 49: * or it is not. 50: * 51: * <p>It also supports trailing wildcards to allow the easy granting of 52: * permissions in a hierarchical fashion. (For example, the name "org.gnu.*" 53: * might grant all permissions under the "org.gnu" permissions hierarchy). 54: * The only valid wildcard character is a '*' which matches anything. It 55: * must be the rightmost element in the permission name and must follow a 56: * '.' or else the Permission name must consist of only a '*'. Any other 57: * occurrence of a '*' is not valid. 58: * 59: * <p>This class ignores the action list. Subclasses can choose to implement 60: * actions on top of this class if desired. 61: * 62: * @author Aaron M. Renn (arenn@urbanophile.com) 63: * @author Eric Blake (ebb9@email.byu.edu) 64: * @see Permission 65: * @see Permissions 66: * @see PermissionCollection 67: * @see RuntimePermission 68: * @see SecurityPermission 69: * @see PropertyPermission 70: * @see AWTPermission 71: * @see NetPermission 72: * @see SecurityManager 73: * @since 1.1 74: * @status updated to 1.4 75: */ 76: public abstract class BasicPermission extends Permission 77: implements Serializable 78: { 79: /** 80: * Compatible with JDK 1.1+. 81: */ 82: private static final long serialVersionUID = 6279438298436773498L; 83: 84: /** 85: * Create a new instance with the specified permission name. If the 86: * name is empty an exception is thrown. 87: * 88: * @param name the name of this permission 89: * @throws NullPointerException if name is null 90: * @throws IllegalArgumentException if name is invalid 91: */ 92: public BasicPermission(String name) 93: { 94: super(name); 95: 96: // This routine used to check for illegal wildcards, but no such 97: // requirement exists in the specification and Sun's runtime 98: // doesn't appear to do it. 99: 100: if (name.equals("")) 101: throw new IllegalArgumentException("Empty name"); 102: } 103: 104: /** 105: * Create a new instance with the specified permission name. If the name 106: * is empty, or contains an illegal wildcard character, an exception is 107: * thrown. The actions parameter is ignored. 108: * 109: * @param name the name of this permission 110: * @param actions ignored 111: * @throws NullPointerException if name is null 112: * @throws IllegalArgumentException if name is invalid 113: */ 114: public BasicPermission(String name, String actions) 115: { 116: this(name); 117: } 118: 119: /** 120: * This method tests to see if the specified permission is implied by this 121: * permission. This will be true if the following conditions are met:<ul> 122: * <li>The specified object is an instance of the same class as this 123: * object.</li> 124: * <li>The name of the specified permission is implied by this permission's 125: * name based on wildcard matching. For example, "a.*" implies "a.b".</li> 126: * </ul> 127: * 128: * @param perm the <code>Permission</code> object to test against 129: * @return true if the specified permission is implied 130: */ 131: public boolean implies(Permission perm) 132: { 133: if (! getClass().isInstance(perm)) 134: return false; 135: 136: String otherName = perm.getName(); 137: String name = getName(); 138: 139: if (name.equals(otherName)) 140: return true; 141: 142: int last = name.length() - 1; 143: return name.charAt(last) == '*' 144: && otherName.startsWith(name.substring(0, last)); 145: } 146: 147: /** 148: * This method tests to see if this object is equal to the specified 149: * <code>Object</code>. This will be true if and only if the specified 150: * object meets the following conditions:<ul> 151: * <li>It is an instance of the same class as this.</li> 152: * <li>It has the same name as this permission.</li> 153: * </ul> 154: * 155: * @param obj the <code>Object</code> to test for equality 156: * @return true if obj is semantically equal to this 157: */ 158: public boolean equals(Object obj) 159: { 160: return getClass().isInstance(obj) 161: && getName().equals(((BasicPermission) obj).getName()); 162: } 163: 164: /** 165: * This method returns a hash code for this permission object. The hash 166: * code returned is the value returned by calling the <code>hashCode</code> 167: * method on the <code>String</code> that is the name of this permission. 168: * 169: * @return a hash value for this object 170: */ 171: public int hashCode() 172: { 173: return getName().hashCode(); 174: } 175: 176: /** 177: * This method returns a list of the actions associated with this 178: * permission. This method always returns the empty string ("") since 179: * this class ignores actions. 180: * 181: * @return the action list 182: */ 183: public String getActions() 184: { 185: return ""; 186: } 187: 188: /** 189: * This method returns an instance of <code>PermissionCollection</code> 190: * suitable for storing <code>BasicPermission</code> objects. The 191: * collection returned can only store objects of the same type as this. 192: * Subclasses which use actions must override this method; but a class with 193: * no actions will work fine with this. 194: * 195: * @return a new empty <code>PermissionCollection</code> object 196: */ 197: public PermissionCollection newPermissionCollection() 198: { 199: return new BasicPermissionCollection(getClass()); 200: } 201: 202: /** 203: * Implements AllPermission.newPermissionCollection, and obeys serialization 204: * of JDK. 205: * 206: * @author Eric Blake (ebb9@email.byu.edu) 207: */ 208: private static final class BasicPermissionCollection extends PermissionCollection 209: { 210: /** 211: * Compatible with JDK 1.1+. 212: */ 213: private static final long serialVersionUID = 739301742472979399L; 214: 215: /** 216: * The permissions in the collection. 217: * 218: * @serial a hash mapping name to permissions, all of type permClass 219: */ 220: private final Hashtable permissions = new Hashtable(); 221: 222: /** 223: * If "*" is in the collection. 224: * 225: * @serial true if a permission named "*" is in the collection 226: */ 227: private boolean all_allowed; 228: 229: /** 230: * The runtime class which all entries in the table must belong to. 231: * 232: * @serial the limiting subclass of this collection 233: */ 234: private final Class permClass; 235: 236: /** 237: * Construct a collection over the given runtime class. 238: * 239: * @param c the class 240: */ 241: BasicPermissionCollection(Class c) 242: { 243: permClass = c; 244: } 245: 246: /** 247: * Add a Permission. It must be of the same type as the permission which 248: * created this collection. 249: * 250: * @param perm the permission to add 251: * @throws IllegalArgumentException if perm is not the correct type 252: * @throws SecurityException if the collection is read-only 253: */ 254: public void add(Permission perm) 255: { 256: if (isReadOnly()) 257: throw new SecurityException("readonly"); 258: if (! permClass.isInstance(perm)) 259: throw new IllegalArgumentException("Expecting instance of " + permClass); 260: BasicPermission bp = (BasicPermission) perm; 261: String name = bp.getName(); 262: if (name.equals("*")) 263: all_allowed = true; 264: permissions.put(name, bp); 265: } 266: 267: /** 268: * Returns true if this collection implies the given permission. 269: * 270: * @param permission the permission to check 271: * @return true if it is implied by this 272: */ 273: public boolean implies(Permission permission) 274: { 275: if (! permClass.isInstance(permission)) 276: return false; 277: if (all_allowed) 278: return true; 279: BasicPermission toImply = (BasicPermission) permission; 280: String name = toImply.getName(); 281: if (name.equals("*")) 282: return false; 283: int prefixLength = name.length(); 284: if (name.endsWith("*")) 285: prefixLength -= 2; 286: 287: while (true) 288: { 289: if (permissions.get(name) != null) 290: return true; 291: prefixLength = name.lastIndexOf('.', prefixLength); 292: if (prefixLength < 0) 293: return false; 294: name = name.substring(0, prefixLength + 1) + '*'; 295: } 296: } 297: 298: /** 299: * Enumerate over the collection. 300: * 301: * @return an enumeration of the collection contents 302: */ 303: public Enumeration elements() 304: { 305: return permissions.elements(); 306: } 307: } // class BasicPermissionCollection 308: } // class BasicPermission
GNU Classpath (0.95) |