1   /**
2    * Copyright (c) 2000-2008 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.security.permission;
24  
25  import com.liferay.portal.PortalException;
26  import com.liferay.portal.SystemException;
27  import com.liferay.portal.model.Group;
28  import com.liferay.portal.model.Organization;
29  import com.liferay.portal.model.OrganizationConstants;
30  import com.liferay.portal.model.Role;
31  import com.liferay.portal.model.impl.RoleImpl;
32  import com.liferay.portal.service.OrganizationLocalServiceUtil;
33  import com.liferay.portal.service.UserGroupRoleLocalServiceUtil;
34  
35  import java.util.HashMap;
36  import java.util.List;
37  import java.util.Map;
38  
39  /**
40   * <a href="PermissionCheckerBagImpl.java.html"><b><i>View Source</i></b></a>
41   *
42   * @author Brian Wing Shun Chan
43   *
44   */
45  public class PermissionCheckerBagImpl implements PermissionCheckerBag {
46  
47      public PermissionCheckerBagImpl() {
48      }
49  
50      public PermissionCheckerBagImpl(
51          long userId, List<Group> userGroups, List<Organization> userOrgs,
52          List<Group> userOrgGroups, List<Group> userUserGroupGroups,
53          List<Group> groups, List<Role> roles) {
54  
55          _userId = userId;
56          _userGroups = userGroups;
57          _userOrgs = userOrgs;
58          _userOrgGroups = userOrgGroups;
59          _userUserGroupGroups = userUserGroupGroups;
60          _groups = groups;
61          _roles = roles;
62      }
63  
64      public List<Group> getUserGroups() {
65          return _userGroups;
66      }
67  
68      public List<Organization> getUserOrgs() {
69          return _userOrgs;
70      }
71  
72      public List<Group> getUserOrgGroups() {
73          return _userOrgGroups;
74      }
75  
76      public List<Group> getUserUserGroupGroups() {
77          return _userUserGroupGroups;
78      }
79  
80      public List<Group> getGroups() {
81          return _groups;
82      }
83  
84      public List<Role> getRoles() {
85          return _roles;
86      }
87  
88      public boolean isCommunityAdmin(
89              PermissionChecker permissionChecker, Group group)
90          throws Exception {
91  
92          Boolean value = _communityAdmins.get(group.getGroupId());
93  
94          if (value == null) {
95              value = Boolean.valueOf(
96                  isCommunityAdminImpl(permissionChecker, group));
97  
98              _communityAdmins.put(group.getGroupId(), value);
99          }
100 
101         return value.booleanValue();
102     }
103 
104     public boolean isCommunityOwner(
105             PermissionChecker permissionChecker, Group group)
106         throws Exception {
107 
108         Boolean value = _communityOwners.get(group.getGroupId());
109 
110         if (value == null) {
111             value = Boolean.valueOf(
112                 isCommunityOwnerImpl(permissionChecker, group));
113 
114             _communityOwners.put(group.getGroupId(), value);
115         }
116 
117         return value.booleanValue();
118     }
119 
120     protected boolean isCommunityAdminImpl(
121             PermissionChecker permissionChecker, Group group)
122         throws PortalException, SystemException {
123 
124         if (group.isCommunity()) {
125             if (UserGroupRoleLocalServiceUtil.hasUserGroupRole(
126                     _userId, group.getGroupId(),
127                     RoleImpl.COMMUNITY_ADMINISTRATOR) ||
128                 UserGroupRoleLocalServiceUtil.hasUserGroupRole(
129                     _userId, group.getGroupId(), RoleImpl.COMMUNITY_OWNER)) {
130 
131                 return true;
132             }
133         }
134         else if (group.isOrganization()) {
135             long organizationId = group.getClassPK();
136 
137             while (organizationId !=
138                         OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID) {
139 
140                 Organization organization =
141                     OrganizationLocalServiceUtil.getOrganization(
142                         organizationId);
143 
144                 Group organizationGroup = organization.getGroup();
145 
146                 long organizationGroupId = organizationGroup.getGroupId();
147 
148                 if (UserGroupRoleLocalServiceUtil.hasUserGroupRole(
149                         _userId, organizationGroupId,
150                         RoleImpl.ORGANIZATION_ADMINISTRATOR) ||
151                     UserGroupRoleLocalServiceUtil.hasUserGroupRole(
152                         _userId, organizationGroupId,
153                         RoleImpl.ORGANIZATION_OWNER)) {
154 
155                     return true;
156                 }
157 
158                 organizationId = organization.getParentOrganizationId();
159             }
160         }
161         else if (group.isUser()) {
162             long userId = group.getClassPK();
163 
164             if (userId == _userId) {
165                 return true;
166             }
167         }
168 
169         return false;
170     }
171 
172     protected boolean isCommunityOwnerImpl(
173             PermissionChecker permissionChecker, Group group)
174         throws PortalException, SystemException {
175 
176         if (group.isCommunity()) {
177             if (UserGroupRoleLocalServiceUtil.hasUserGroupRole(
178                     _userId, group.getGroupId(), RoleImpl.COMMUNITY_OWNER)) {
179 
180                 return true;
181             }
182         }
183         else if (group.isOrganization()) {
184             long organizationId = group.getClassPK();
185 
186             while (organizationId !=
187                         OrganizationConstants.DEFAULT_PARENT_ORGANIZATION_ID) {
188 
189                 Organization organization =
190                     OrganizationLocalServiceUtil.getOrganization(
191                         organizationId);
192 
193                 Group organizationGroup = organization.getGroup();
194 
195                 long organizationGroupId = organizationGroup.getGroupId();
196 
197                 if (UserGroupRoleLocalServiceUtil.hasUserGroupRole(
198                         _userId, organizationGroupId,
199                         RoleImpl.ORGANIZATION_OWNER)) {
200 
201                     return true;
202                 }
203 
204                 organizationId = organization.getParentOrganizationId();
205             }
206         }
207         else if (group.isUser()) {
208             long userId = group.getClassPK();
209 
210             if (userId == _userId) {
211                 return true;
212             }
213         }
214 
215         return false;
216     }
217 
218     private long _userId;
219     private List<Group> _userGroups;
220     private List<Organization> _userOrgs;
221     private List<Group> _userOrgGroups;
222     private List<Group> _userUserGroupGroups;
223     private List<Group> _groups;
224     private List<Role> _roles;
225     private Map<Long, Boolean> _communityAdmins = new HashMap<Long, Boolean>();
226     private Map<Long, Boolean> _communityOwners = new HashMap<Long, Boolean>();
227 
228 }