001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/security/drm/model/Role.java $ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 package org.deegree.security.drm.model; 037 038 import java.util.HashSet; 039 import java.util.Set; 040 import java.util.Stack; 041 042 import org.deegree.model.feature.Feature; 043 import org.deegree.security.GeneralSecurityException; 044 import org.deegree.security.drm.SecurityAccess; 045 import org.deegree.security.drm.SecurityRegistry; 046 047 048 /** 049 * Implementation of role-objects. <code>Role</code> s define the 050 * <code>Privilege</code> of <code>User</code> s and <code>Groups</code> 051 * and their <code>Rights</code> on <code>SecurableObjects</code>. 052 * 053 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a> 054 * @version $Revision: 18195 $ 055 */ 056 public class Role extends SecurableObject { 057 058 public final static int ID_SEC_ADMIN = 3; 059 060 /** 061 * Creates a new <code>Role</code> -instance. 062 * 063 * @param id 064 * @param name 065 * @param registry 066 */ 067 public Role(int id, String name, SecurityRegistry registry) { 068 this.id = id; 069 this.name = name; 070 this.title = name; 071 this.registry = registry; 072 } 073 074 /** 075 * Returns the <code>Group</code> s that are associated with this role 076 * DIRECTLY, i.e. not via membership in other roles. 077 * 078 * @param securityAccess 079 * @throws GeneralSecurityException 080 */ 081 public Group[] getGroups(SecurityAccess securityAccess) 082 throws GeneralSecurityException { 083 return registry.getGroupsWithRole(securityAccess, this); 084 } 085 086 /** 087 * Returns the <code>User</code> s that are associated with this role 088 * DIRECTLY, i.e. not via group membership. 089 * 090 * @param securityAccess 091 * @throws GeneralSecurityException 092 */ 093 public User[] getUsers(SecurityAccess securityAccess) 094 throws GeneralSecurityException { 095 return registry.getUsersWithRole(securityAccess, this); 096 } 097 098 /** 099 * Returns the <code>User</code> s that are associated with this role 100 * either directly or via group membership. 101 * 102 * @param securityAccess 103 * @throws GeneralSecurityException 104 */ 105 public User[] getAllUsers(SecurityAccess securityAccess) 106 throws GeneralSecurityException { 107 Set<User> allUsers = new HashSet<User>(); 108 109 // directly associated users 110 User[] directUsers = registry.getUsersWithRole(securityAccess, this); 111 for (int i = 0; i < directUsers.length; i++) { 112 allUsers.add(directUsers[i]); 113 } 114 115 // traverse group hierarchy and add users 116 Group[] groups = registry.getGroupsWithRole(securityAccess, this); 117 Stack<Group> groupsStack = new Stack<Group>(); 118 for (int i = 0; i < groups.length; i++) { 119 groupsStack.push(groups[i]); 120 } 121 while (!groupsStack.isEmpty()) { 122 Group group = groupsStack.pop(); 123 Group[] children = group.getGroups(securityAccess); 124 for (int i = 0; i < children.length; i++) { 125 groupsStack.push(children[i]); 126 } 127 User[] users = group.getUsers(securityAccess); 128 for (int i = 0; i < users.length; i++) { 129 allUsers.add(users[i]); 130 } 131 } 132 133 return allUsers.toArray(new User[allUsers.size()]); 134 } 135 136 /** 137 * Returns the <code>Privilege</code> s that this role has. 138 * 139 * @param securityAccess 140 */ 141 public Privilege[] getPrivileges(SecurityAccess securityAccess) 142 throws GeneralSecurityException { 143 return registry.getPrivilegesForRole(securityAccess, this); 144 } 145 146 /** 147 * Returns the rights that this role defines concerning the given 148 * <code>SecurableObject</code>. 149 * 150 * @param securityAccess 151 */ 152 public RightSet getRights(SecurityAccess securityAccess, 153 SecurableObject object) throws GeneralSecurityException { 154 return new RightSet(registry.getRights(securityAccess, object, this)); 155 } 156 157 /** 158 * Returns whether the <code>Role</code> has a certain <code>Right</code> 159 * on a <code>SecurableObject</code> (directly or via group 160 * memberships). 161 */ 162 public boolean hasRight(SecurityAccess securityAccess, RightType type, 163 Feature accessParams, SecurableObject object) 164 throws GeneralSecurityException { 165 return getRights(securityAccess, object).applies(object, type, 166 accessParams); 167 } 168 169 /** 170 * Returns whether the <code>Role</code> has a certain <code>Right</code> 171 * on a <code>SecurableObject</code>. 172 */ 173 public boolean hasRight(SecurityAccess securityAccess, RightType type, 174 SecurableObject object) throws GeneralSecurityException { 175 return getRights(securityAccess, object).applies(object, type); 176 } 177 178 /** 179 * Returns whether the <code>Role</code> has a certain right on a 180 * <code>SecurableObject</code>. 181 */ 182 public boolean hasRight(SecurityAccess securityAccess, String s, 183 SecurableObject object) throws GeneralSecurityException { 184 RightType right = registry.getRightTypeByName(securityAccess, s); 185 return hasRight(securityAccess, right, object); 186 } 187 188 /** 189 * Returns whether the <code>Role</code> has a certain 190 * <code>Privilege</code>. 191 * 192 * @param privilege 193 */ 194 public boolean hasPrivilege(SecurityAccess securityAccess, 195 Privilege privilege) throws GeneralSecurityException { 196 Privilege[] privileges = getPrivileges(securityAccess); 197 for (int i = 0; i < privileges.length; i++) { 198 if (privileges[i].equals(privilege)) { 199 return true; 200 } 201 } 202 return false; 203 } 204 205 /** 206 * Returns whether the <code>Role</code> has a certain privilege. 207 * 208 * @param s 209 */ 210 public boolean hasPrivilege(SecurityAccess securityAccess, String s) 211 throws GeneralSecurityException { 212 Privilege privilege = registry.getPrivilegeByName(securityAccess, s); 213 return hasPrivilege(securityAccess, privilege); 214 } 215 216 /** 217 * Returns a <code>String</code> representation of this object. 218 * 219 * @param securityAccess 220 */ 221 public String toString(SecurityAccess securityAccess) { 222 StringBuffer sb = new StringBuffer("Name: ").append(name); 223 224 try { 225 sb.append(", Users: ["); 226 User[] users = getUsers(securityAccess); 227 for (int i = 0; i < users.length; i++) { 228 sb.append(users[i].getName()); 229 if (i != users.length - 1) { 230 sb.append(", "); 231 } 232 } 233 sb.append("]"); 234 235 sb.append(", Groups: ["); 236 Group[] groups = getGroups(securityAccess); 237 for (int i = 0; i < groups.length; i++) { 238 sb.append(groups[i].getName()); 239 if (i != groups.length - 1) { 240 sb.append(", "); 241 } 242 } 243 sb.append("]"); 244 } catch (GeneralSecurityException e) { 245 e.printStackTrace(); 246 } 247 return sb.toString(); 248 } 249 }