1   /**
2    * Copyright (c) 2000-2009 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.service.impl;
24  
25  import com.liferay.portal.NoSuchResourcePermissionException;
26  import com.liferay.portal.PortalException;
27  import com.liferay.portal.SystemException;
28  import com.liferay.portal.kernel.search.SearchEngineUtil;
29  import com.liferay.portal.model.ResourceAction;
30  import com.liferay.portal.model.ResourceConstants;
31  import com.liferay.portal.model.ResourcePermission;
32  import com.liferay.portal.model.ResourcePermissionConstants;
33  import com.liferay.portal.security.permission.PermissionCacheUtil;
34  import com.liferay.portal.service.base.ResourcePermissionLocalServiceBaseImpl;
35  
36  import java.util.ArrayList;
37  import java.util.Collections;
38  import java.util.List;
39  
40  /**
41   * <a href="ResourcePermissionLocalServiceImpl.java.html"><b><i>View Source</i>
42   * </b></a>
43   *
44   * @author Brian Wing Shun Chan
45   * @author Raymond Augé
46   *
47   */
48  public class ResourcePermissionLocalServiceImpl
49      extends ResourcePermissionLocalServiceBaseImpl {
50  
51      public void addResourcePermission(
52              long companyId, String name, int scope, String primKey, long roleId,
53              String actionId)
54          throws PortalException, SystemException {
55  
56          if (scope == ResourceConstants.SCOPE_COMPANY) {
57  
58              // Remove group permission
59  
60              removeResourcePermissions(
61                  companyId, name, ResourceConstants.SCOPE_GROUP, roleId,
62                  actionId);
63          }
64          else if (scope == ResourceConstants.SCOPE_GROUP) {
65  
66              // Remove company permission
67  
68              removeResourcePermissions(
69                  companyId, name, ResourceConstants.SCOPE_COMPANY, roleId,
70                  actionId);
71          }
72          else if (scope == ResourceConstants.SCOPE_INDIVIDUAL) {
73              throw new NoSuchResourcePermissionException();
74          }
75  
76          updateResourcePermission(
77              companyId, name, scope, primKey, roleId, new String[] {actionId},
78              ResourcePermissionConstants.OPERATOR_ADD);
79  
80          PermissionCacheUtil.clearCache();
81      }
82  
83      public List<String> getAvailableResourcePermissionActionIds(
84              long companyId, String name, int scope, String primKey, long roleId,
85              List<String> actionIds)
86          throws PortalException, SystemException {
87  
88          ResourcePermission resourcePermission =
89              resourcePermissionPersistence.fetchByC_N_S_P_R(
90                  companyId, name, scope, primKey, roleId);
91  
92          if (resourcePermission == null) {
93              return Collections.EMPTY_LIST;
94          }
95  
96          List<String> availableActionIds = new ArrayList<String>(
97              actionIds.size());
98  
99          for (String actionId : actionIds) {
100             ResourceAction resourceAction =
101                 resourceActionLocalService.getResourceAction(name, actionId);
102 
103             if (hasActionId(resourcePermission, resourceAction)) {
104                 availableActionIds.add(actionId);
105             }
106         }
107 
108         return availableActionIds;
109     }
110 
111     public int getResourcePermissionsCount(
112             long companyId, String name, int scope, String primKey)
113         throws SystemException {
114 
115         return resourcePermissionPersistence.countByC_N_S_P(
116             companyId, name, scope, primKey);
117     }
118 
119     public List<ResourcePermission> getRoleResourcePermissions(long roleId)
120         throws SystemException {
121 
122         return resourcePermissionPersistence.findByRoleId(roleId);
123     }
124 
125     public boolean hasActionId(
126         ResourcePermission resourcePermission, ResourceAction resourceAction) {
127 
128         long actionIds = resourcePermission.getActionIds();
129         long bitwiseValue = resourceAction.getBitwiseValue();
130 
131         if ((actionIds & bitwiseValue) == bitwiseValue) {
132             return true;
133         }
134         else {
135             return false;
136         }
137     }
138 
139     public boolean hasResourcePermission(
140             long companyId, String name, int scope, String primKey, long roleId,
141             String actionId)
142         throws PortalException, SystemException {
143 
144         ResourcePermission resourcePermission =
145             resourcePermissionPersistence.fetchByC_N_S_P_R(
146                 companyId, name, scope, primKey, roleId);
147 
148         if (resourcePermission == null) {
149             return false;
150         }
151 
152         ResourceAction resourceAction =
153             resourceActionLocalService.getResourceAction(name, actionId);
154 
155         if (hasActionId(resourcePermission, resourceAction)) {
156             return true;
157         }
158         else {
159             return false;
160         }
161     }
162 
163     public boolean hasScopeResourcePermission(
164             long companyId, String name, int scope, long roleId,
165             String actionId)
166         throws PortalException, SystemException {
167 
168         List<ResourcePermission> resourcePermissions =
169             resourcePermissionPersistence.findByC_N_S(companyId, name, scope);
170 
171         for (ResourcePermission resourcePermission : resourcePermissions) {
172             if (hasResourcePermission(
173                     companyId, name, scope, resourcePermission.getPrimKey(),
174                     roleId, actionId)) {
175 
176                 return true;
177             }
178         }
179 
180         return false;
181     }
182 
183     public void removeResourcePermission(
184             long companyId, String name, int scope, String primKey, long roleId,
185             String actionId)
186         throws PortalException, SystemException {
187 
188         updateResourcePermission(
189             companyId, name, scope, primKey, roleId, new String[] {actionId},
190             ResourcePermissionConstants.OPERATOR_REMOVE);
191 
192         PermissionCacheUtil.clearCache();
193     }
194 
195     public void removeResourcePermissions(
196             long companyId, String name, int scope, long roleId,
197             String actionId)
198         throws PortalException, SystemException {
199 
200         List<ResourcePermission> resourcePermissions =
201             resourcePermissionPersistence.findByC_N_S(companyId, name, scope);
202 
203         for (ResourcePermission resourcePermission : resourcePermissions) {
204             updateResourcePermission(
205                 companyId, name, scope, resourcePermission.getPrimKey(), roleId,
206                 new String[] {actionId},
207                 ResourcePermissionConstants.OPERATOR_REMOVE);
208         }
209 
210         PermissionCacheUtil.clearCache();
211     }
212 
213     public void setResourcePermissions(
214             long companyId, String name, int scope, String primKey, long roleId,
215             String[] actionIds)
216         throws PortalException, SystemException {
217 
218         updateResourcePermission(
219             companyId, name, scope, primKey, roleId, actionIds,
220             ResourcePermissionConstants.OPERATOR_SET);
221     }
222 
223     protected void updateResourcePermission(
224             long companyId, String name, int scope, String primKey, long roleId,
225             String[] actionIds, int operator)
226         throws PortalException, SystemException {
227 
228         ResourcePermission resourcePermission =
229             resourcePermissionPersistence.fetchByC_N_S_P_R(
230                 companyId, name, scope, primKey, roleId);
231 
232         if (resourcePermission == null) {
233             if (operator == ResourcePermissionConstants.OPERATOR_REMOVE) {
234                 return;
235             }
236 
237             long resourcePermissionId = counterLocalService.increment(
238                 ResourcePermission.class.getName());
239 
240             resourcePermission = resourcePermissionPersistence.create(
241                 resourcePermissionId);
242 
243             resourcePermission.setCompanyId(companyId);
244             resourcePermission.setName(name);
245             resourcePermission.setScope(scope);
246             resourcePermission.setPrimKey(primKey);
247             resourcePermission.setRoleId(roleId);
248         }
249 
250         long actionIdsLong = resourcePermission.getActionIds();
251 
252         if (operator == ResourcePermissionConstants.OPERATOR_SET) {
253             actionIdsLong = 0;
254         }
255 
256         for (String actionId : actionIds) {
257             ResourceAction resourceAction =
258                 resourceActionLocalService.getResourceAction(name, actionId);
259 
260             if ((operator == ResourcePermissionConstants.OPERATOR_ADD) ||
261                 (operator == ResourcePermissionConstants.OPERATOR_SET)) {
262 
263                 actionIdsLong |= resourceAction.getBitwiseValue();
264             }
265             else {
266                 actionIdsLong =
267                     actionIdsLong & (~resourceAction.getBitwiseValue());
268             }
269         }
270 
271         resourcePermission.setActionIds(actionIdsLong);
272 
273         resourcePermissionPersistence.update(resourcePermission, false);
274 
275         PermissionCacheUtil.clearCache();
276 
277         SearchEngineUtil.updatePermissionFields(name, primKey);
278     }
279 
280 }