001: /*
002: JSPWiki - a JSP-based WikiWiki clone.
003:
004: Copyright (C) 2001-2007 Janne Jalkanen (Janne.Jalkanen@iki.fi)
005:
006: This program is free software; you can redistribute it and/or modify
007: it under the terms of the GNU Lesser General Public License as published by
008: the Free Software Foundation; either version 2.1 of the License, or
009: (at your option) any later version.
010:
011: This program is distributed in the hope that it will be useful,
012: but WITHOUT ANY WARRANTY; without even the implied warranty of
013: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: GNU Lesser General Public License for more details.
015:
016: You should have received a copy of the GNU Lesser General Public License
017: along with this program; if not, write to the Free Software
018: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020: package com.ecyrd.jspwiki.auth.acl;
021:
022: import java.security.Permission;
023: import java.security.Principal;
024: import java.util.Enumeration;
025: import java.util.Iterator;
026: import java.util.Vector;
027:
028: import com.ecyrd.jspwiki.auth.permissions.PagePermission;
029:
030: /**
031: * Implementation of a JSPWiki AclEntry.
032: * @author Janne Jalkanen
033: * @author Andrew Jaquith
034: * @since 2.3
035: */
036: public class AclEntryImpl implements AclEntry {
037:
038: private Vector m_permissions = new Vector();
039: private Principal m_principal;
040:
041: /**
042: * Constructs a new AclEntryImpl instance.
043: */
044: public AclEntryImpl() {
045: }
046:
047: /**
048: * Adds the specified permission to this ACL entry. The permission
049: * <em>must</em> be of type
050: * {@link com.ecyrd.jspwiki.auth.permissions.PagePermission}. Note: An entry
051: * can have multiple permissions.
052: * @param permission the permission to be associated with the principal in
053: * this entry
054: * @return <code>true</code> if the permission was added,
055: * <code>false</code> if the permission was
056: * already part of this entry's permission set, and <code>false</code> if
057: * the permission is not of type PagePermission
058: */
059: public synchronized boolean addPermission(Permission permission) {
060: if (permission instanceof PagePermission
061: && findPermission(permission) == null) {
062: m_permissions.add(permission);
063: return true;
064: }
065:
066: return false;
067: }
068:
069: /**
070: * Checks if the specified permission is part of the permission set in this
071: * entry.
072: * @param permission the permission to be checked for.
073: * @return true if the permission is part of the permission set in this entry,
074: * false otherwise.
075: */
076: public boolean checkPermission(Permission permission) {
077: return findPermission(permission) != null;
078: }
079:
080: /**
081: * Returns the principal for which permissions are granted by this
082: * ACL entry. Returns null if there is no principal set for this entry yet.
083: * @return the principal associated with this entry.
084: */
085: public synchronized Principal getPrincipal() {
086: return m_principal;
087: }
088:
089: /**
090: * Returns an enumeration of the permissions in this ACL entry.
091: * @return an enumeration of the permissions
092: */
093: public Enumeration permissions() {
094: return m_permissions.elements();
095: }
096:
097: /**
098: * Removes the specified permission from this ACL entry.
099: * @param permission the permission to be removed from this entry.
100: * @return true if the permission is removed, false if the permission was not
101: * part of this entry's permission set.
102: */
103: public synchronized boolean removePermission(Permission permission) {
104: Permission p = findPermission(permission);
105:
106: if (p != null) {
107: m_permissions.remove(p);
108: return true;
109: }
110:
111: return false;
112: }
113:
114: /**
115: * Specifies the principal for which permissions are granted or denied by
116: * this ACL entry. If a principal was already set for this ACL entry, false
117: * is returned, otherwise true is returned.
118: * @param user the principal to be set for this entry
119: * @return true if the principal is set, false if there was already a
120: * principal set for this entry
121: */
122: public synchronized boolean setPrincipal(Principal user) {
123: if (m_principal != null || user == null)
124: return false;
125:
126: m_principal = user;
127:
128: return true;
129: }
130:
131: /**
132: * Returns a string representation of the contents of this ACL entry.
133: * @return a string representation of the contents.
134: */
135: public String toString() {
136: StringBuffer sb = new StringBuffer();
137:
138: Principal p = getPrincipal();
139:
140: sb.append("[AclEntry ALLOW "
141: + (p != null ? p.getName() : "null"));
142: sb.append(" ");
143:
144: for (Iterator i = m_permissions.iterator(); i.hasNext();) {
145: Permission pp = (Permission) i.next();
146:
147: sb.append(pp.toString());
148: sb.append(",");
149: }
150:
151: sb.append("]");
152:
153: return sb.toString();
154: }
155:
156: /**
157: * Looks through the permission list and finds a permission that matches the
158: * permission.
159: */
160: private Permission findPermission(Permission p) {
161: for (Iterator i = m_permissions.iterator(); i.hasNext();) {
162: Permission pp = (Permission) i.next();
163:
164: if (pp.implies(p)) {
165: return pp;
166: }
167: }
168:
169: return null;
170: }
171: }
|