001 /** 002 * 003 * Copyright 2003-2004 The Apache Software Foundation 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 // 019 // This source code implements specifications defined by the Java 020 // Community Process. In order to remain compliant with the specification 021 // DO NOT add / change / or delete method signatures! 022 // 023 024 package javax.security.jacc; 025 026 import java.io.IOException; 027 import java.io.ObjectInputStream; 028 import java.io.ObjectOutputStream; 029 import java.io.Serializable; 030 import java.security.Permission; 031 import java.security.PermissionCollection; 032 import java.util.Hashtable; 033 import java.util.Enumeration; 034 import javax.servlet.http.HttpServletRequest; 035 036 /** 037 * @version $Rev: 431818 $ $Date: 2006-08-15 21:55:26 -0700 (Tue, 15 Aug 2006) $ 038 */ 039 public final class WebResourcePermission extends Permission implements Serializable { 040 private transient int cachedHashCode = 0; 041 private transient URLPatternSpec urlPatternSpec; 042 private transient HTTPMethodSpec httpMethodSpec; 043 044 public WebResourcePermission(HttpServletRequest request) { 045 super(request.getServletPath()); 046 047 urlPatternSpec = new URLPatternSpec(URLPatternSpec.encodeColons(request)); 048 httpMethodSpec = new HTTPMethodSpec(request.getMethod(), HTTPMethodSpec.NA); 049 } 050 051 public WebResourcePermission(String name, String actions) { 052 super(name); 053 054 urlPatternSpec = new URLPatternSpec(name); 055 httpMethodSpec = new HTTPMethodSpec(actions, false); 056 } 057 058 public WebResourcePermission(String urlPattern, String[] HTTPMethods) { 059 super(urlPattern); 060 061 urlPatternSpec = new URLPatternSpec(urlPattern); 062 httpMethodSpec = new HTTPMethodSpec(HTTPMethods); 063 } 064 065 public boolean equals(Object o) { 066 if (o == null || !(o instanceof WebResourcePermission)) return false; 067 068 WebResourcePermission other = (WebResourcePermission) o; 069 return urlPatternSpec.equals(other.urlPatternSpec) && httpMethodSpec.equals(other.httpMethodSpec); 070 } 071 072 public String getActions() { 073 return httpMethodSpec.getActions(); 074 } 075 076 public int hashCode() { 077 if (cachedHashCode == 0) { 078 cachedHashCode = urlPatternSpec.hashCode() ^ httpMethodSpec.hashCode(); 079 } 080 return cachedHashCode; 081 } 082 083 public boolean implies(Permission permission) { 084 if (permission == null || !(permission instanceof WebResourcePermission)) return false; 085 086 WebResourcePermission other = (WebResourcePermission) permission; 087 return urlPatternSpec.implies(other.urlPatternSpec) && httpMethodSpec.implies(other.httpMethodSpec); 088 } 089 090 public PermissionCollection newPermissionCollection() { 091 return new WebResourcePermissionCollection(); 092 } 093 094 private synchronized void readObject(ObjectInputStream in) throws IOException { 095 urlPatternSpec = new URLPatternSpec(in.readUTF()); 096 httpMethodSpec = new HTTPMethodSpec(in.readUTF(), false); 097 } 098 099 private synchronized void writeObject(ObjectOutputStream out) throws IOException { 100 out.writeUTF(urlPatternSpec.getPatternSpec()); 101 out.writeUTF(httpMethodSpec.getActions()); 102 } 103 104 private static final class WebResourcePermissionCollection extends PermissionCollection { 105 private Hashtable permissions = new Hashtable(); 106 107 /** 108 * Adds a permission object to the current collection of permission objects. 109 * 110 * @param permission the Permission object to add. 111 * 112 * @exception SecurityException - if this PermissionCollection object 113 * has been marked readonly 114 */ 115 public void add(Permission permission) { 116 if (isReadOnly()) throw new IllegalArgumentException("Read only collection"); 117 118 if (!(permission instanceof WebResourcePermission)) throw new IllegalArgumentException("Wrong permission type"); 119 120 WebResourcePermission p = (WebResourcePermission)permission; 121 122 permissions.put(p, p); 123 } 124 125 /** 126 * Checks to see if the specified permission is implied by 127 * the collection of Permission objects held in this PermissionCollection. 128 * 129 * @param permission the Permission object to compare. 130 * 131 * @return true if "permission" is implied by the permissions in 132 * the collection, false if not. 133 */ 134 public boolean implies(Permission permission) { 135 if (!(permission instanceof WebResourcePermission)) return false; 136 137 WebResourcePermission p = (WebResourcePermission)permission; 138 Enumeration e = permissions.elements(); 139 140 while (e.hasMoreElements()) { 141 if (((WebResourcePermission)e.nextElement()).implies(p)) return true; 142 } 143 144 return false; 145 } 146 147 /** 148 * Returns an enumeration of all the Permission objects in the collection. 149 * 150 * @return an enumeration of all the Permissions. 151 */ 152 public Enumeration elements() { 153 return permissions.elements(); 154 } 155 } 156 } 157