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.portlet.portletconfiguration.action;
24  
25  import com.liferay.portal.kernel.servlet.SessionErrors;
26  import com.liferay.portal.kernel.util.Constants;
27  import com.liferay.portal.kernel.util.GetterUtil;
28  import com.liferay.portal.kernel.util.ParamUtil;
29  import com.liferay.portal.kernel.util.StringUtil;
30  import com.liferay.portal.kernel.util.Validator;
31  import com.liferay.portal.model.Group;
32  import com.liferay.portal.model.Layout;
33  import com.liferay.portal.model.Organization;
34  import com.liferay.portal.model.Portlet;
35  import com.liferay.portal.model.PortletConstants;
36  import com.liferay.portal.model.Resource;
37  import com.liferay.portal.model.Role;
38  import com.liferay.portal.model.UserGroup;
39  import com.liferay.portal.security.auth.PrincipalException;
40  import com.liferay.portal.security.permission.ResourceActionsUtil;
41  import com.liferay.portal.service.LayoutLocalServiceUtil;
42  import com.liferay.portal.service.PermissionServiceUtil;
43  import com.liferay.portal.service.PortletLocalServiceUtil;
44  import com.liferay.portal.service.ResourceLocalServiceUtil;
45  import com.liferay.portal.service.ResourcePermissionServiceUtil;
46  import com.liferay.portal.servlet.filters.cache.CacheUtil;
47  import com.liferay.portal.theme.ThemeDisplay;
48  import com.liferay.portal.util.PropsValues;
49  import com.liferay.portal.util.WebKeys;
50  
51  import java.util.ArrayList;
52  import java.util.Enumeration;
53  import java.util.List;
54  
55  import javax.portlet.ActionRequest;
56  import javax.portlet.ActionResponse;
57  import javax.portlet.PortletConfig;
58  import javax.portlet.RenderRequest;
59  import javax.portlet.RenderResponse;
60  
61  import org.apache.struts.action.ActionForm;
62  import org.apache.struts.action.ActionForward;
63  import org.apache.struts.action.ActionMapping;
64  
65  /**
66   * <a href="EditPermissionsAction.java.html"><b><i>View Source</i></b></a>
67   *
68   * @author Brian Wing Shun Chan
69   *
70   */
71  public class EditPermissionsAction extends EditConfigurationAction {
72  
73      public void processAction(
74              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
75              ActionRequest actionRequest, ActionResponse actionResponse)
76          throws Exception {
77  
78          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
79  
80          try {
81              if (cmd.equals("group_permissions")) {
82                  updateGroupPermissions(actionRequest);
83              }
84              else if (cmd.equals("guest_permissions")) {
85                  updateGuestPermissions(actionRequest);
86              }
87              else if (cmd.equals("organization_permissions")) {
88                  updateOrganizationPermissions(actionRequest);
89              }
90              else if (cmd.equals("role_permissions")) {
91                  updateRolePermissions(actionRequest);
92              }
93              else if (cmd.equals("user_group_permissions")) {
94                  updateUserGroupPermissions(actionRequest);
95              }
96              else if (cmd.equals("user_permissions")) {
97                  updateUserPermissions(actionRequest);
98              }
99  
100             String redirect = ParamUtil.getString(
101                 actionRequest, "permissionsRedirect");
102 
103             sendRedirect(actionRequest, actionResponse, redirect);
104         }
105         catch (Exception e) {
106             if (e instanceof PrincipalException) {
107                 SessionErrors.add(actionRequest, e.getClass().getName());
108 
109                 setForward(
110                     actionRequest, "portlet.portlet_configuration.error");
111             }
112             else {
113                 throw e;
114             }
115         }
116     }
117 
118     public ActionForward render(
119             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
120             RenderRequest renderRequest, RenderResponse renderResponse)
121         throws Exception {
122 
123         ThemeDisplay themeDisplay = (ThemeDisplay)renderRequest.getAttribute(
124             WebKeys.THEME_DISPLAY);
125 
126         long groupId = themeDisplay.getScopeGroupId();
127 
128         String portletResource = ParamUtil.getString(
129             renderRequest, "portletResource");
130         String modelResource = ParamUtil.getString(
131             renderRequest, "modelResource");
132         String resourcePrimKey = ParamUtil.getString(
133             renderRequest, "resourcePrimKey");
134 
135         String selResource = portletResource;
136 
137         if (Validator.isNotNull(modelResource)) {
138             selResource = modelResource;
139         }
140 
141         try {
142             PermissionServiceUtil.checkPermission(
143                 groupId, selResource, resourcePrimKey);
144         }
145         catch (PrincipalException pe) {
146             SessionErrors.add(
147                 renderRequest, PrincipalException.class.getName());
148 
149             setForward(renderRequest, "portlet.portlet_configuration.error");
150         }
151 
152         Portlet portlet = PortletLocalServiceUtil.getPortletById(
153             themeDisplay.getCompanyId(), portletResource);
154 
155         if (portlet != null) {
156             renderResponse.setTitle(getTitle(portlet, renderRequest));
157         }
158 
159         return mapping.findForward(getForward(
160             renderRequest, "portlet.portlet_configuration.edit_permissions"));
161     }
162 
163     protected String[] getActionIds(ActionRequest actionRequest, long roleId) {
164         List<String> actionIds = new ArrayList<String>();
165 
166         Enumeration<String> enu = actionRequest.getParameterNames();
167 
168         while (enu.hasMoreElements()) {
169             String name = enu.nextElement();
170 
171             if (name.startsWith(roleId + "_ACTION_")) {
172                 int pos = name.indexOf("_ACTION_");
173 
174                 String actionId = name.substring(pos + 8);
175 
176                 actionIds.add(actionId);
177             }
178         }
179 
180         return actionIds.toArray(new String[actionIds.size()]);
181     }
182 
183     protected void updateGroupPermissions(ActionRequest actionRequest)
184         throws Exception {
185 
186         Layout layout = (Layout)actionRequest.getAttribute(WebKeys.LAYOUT);
187 
188         long resourceId = ParamUtil.getLong(actionRequest, "resourceId");
189         long groupId = ParamUtil.getLong(actionRequest, "groupId");
190         String[] actionIds = StringUtil.split(
191             ParamUtil.getString(actionRequest, "groupIdActionIds"));
192 
193         PermissionServiceUtil.setGroupPermissions(
194             groupId, actionIds, resourceId);
195 
196         if (!layout.isPrivateLayout()) {
197             Resource resource =
198                 ResourceLocalServiceUtil.getResource(resourceId);
199 
200             if (resource.getPrimKey().startsWith(
201                     layout.getPlid() + PortletConstants.LAYOUT_SEPARATOR)) {
202 
203                 CacheUtil.clearCache(layout.getCompanyId());
204             }
205         }
206     }
207 
208     protected void updateGuestPermissions(ActionRequest actionRequest)
209         throws Exception {
210 
211         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
212             WebKeys.THEME_DISPLAY);
213 
214         long resourceId = ParamUtil.getLong(actionRequest, "resourceId");
215         String[] actionIds = StringUtil.split(
216             ParamUtil.getString(actionRequest, "guestActionIds"));
217 
218         PermissionServiceUtil.setUserPermissions(
219             themeDisplay.getDefaultUserId(), themeDisplay.getScopeGroupId(),
220             actionIds, resourceId);
221     }
222 
223     protected void updateOrganizationPermissions(ActionRequest actionRequest)
224         throws Exception {
225 
226         Layout layout = (Layout)actionRequest.getAttribute(WebKeys.LAYOUT);
227 
228         long resourceId = ParamUtil.getLong(actionRequest, "resourceId");
229         long organizationId = ParamUtil.getLong(
230             actionRequest, "organizationIdsPosValue");
231         String[] actionIds = StringUtil.split(
232             ParamUtil.getString(actionRequest, "organizationIdActionIds"));
233         //boolean organizationIntersection = ParamUtil.getBoolean(
234         //  actionRequest, "organizationIntersection");
235 
236         //if (!organizationIntersection) {
237             PermissionServiceUtil.setGroupPermissions(
238                 Organization.class.getName(), String.valueOf(organizationId),
239                 layout.getGroupId(), actionIds, resourceId);
240         /*}
241         else {
242             PermissionServiceUtil.setOrgGroupPermissions(
243                 organizationId, layout.getGroupId(), actionIds, resourceId);
244         }*/
245     }
246 
247     protected void updateRolePermissions(ActionRequest actionRequest)
248         throws Exception {
249 
250         if (PropsValues.PERMISSIONS_USER_CHECK_ALGORITHM == 5) {
251             updateRolePermissions_5(actionRequest);
252         }
253         else if (PropsValues.PERMISSIONS_USER_CHECK_ALGORITHM == 6) {
254             updateRolePermissions_6(actionRequest);
255         }
256         else {
257             updateRolePermissions_1to4(actionRequest);
258         }
259     }
260 
261     protected void updateRolePermissions_1to4(ActionRequest actionRequest)
262         throws Exception {
263 
264         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
265             WebKeys.THEME_DISPLAY);
266 
267         long resourceId = ParamUtil.getLong(actionRequest, "resourceId");
268         long roleId = ParamUtil.getLong(actionRequest, "roleIdsPosValue");
269         String[] actionIds = StringUtil.split(
270             ParamUtil.getString(actionRequest, "roleIdActionIds"));
271 
272         PermissionServiceUtil.setRolePermissions(
273             roleId, themeDisplay.getScopeGroupId(), actionIds, resourceId);
274     }
275 
276     protected void updateRolePermissions_5(ActionRequest actionRequest)
277         throws Exception {
278 
279         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
280             WebKeys.THEME_DISPLAY);
281 
282         String modelResource = ParamUtil.getString(
283             actionRequest, "modelResource");
284         long resourceId = ParamUtil.getLong(actionRequest, "resourceId");
285         long resourcePrimKey = ParamUtil.getLong(
286             actionRequest, "resourcePrimKey");
287 
288         Group group = themeDisplay.getScopeGroup();
289 
290         if (modelResource.equals(Layout.class.getName())) {
291             Layout layout = LayoutLocalServiceUtil.getLayout(
292                 resourcePrimKey);
293 
294             group = layout.getGroup();
295         }
296 
297         List<Role> roles = ResourceActionsUtil.getRoles(group, modelResource);
298 
299         for (Role role : roles) {
300             String[] actionIds = getActionIds(actionRequest, role.getRoleId());
301 
302             PermissionServiceUtil.setRolePermissions(
303                 role.getRoleId(), themeDisplay.getScopeGroupId(), actionIds,
304                 resourceId);
305         }
306     }
307 
308     protected void updateRolePermissions_6(ActionRequest actionRequest)
309         throws Exception {
310 
311         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
312             WebKeys.THEME_DISPLAY);
313 
314         String portletResource = ParamUtil.getString(
315             actionRequest, "portletResource");
316         String modelResource = ParamUtil.getString(
317             actionRequest, "modelResource");
318 
319         String selResource = portletResource;
320 
321         if (Validator.isNotNull(modelResource)) {
322             selResource = modelResource;
323         }
324 
325         String resourcePrimKey = ParamUtil.getString(
326             actionRequest, "resourcePrimKey");
327 
328         Group group = themeDisplay.getScopeGroup();
329 
330         if (modelResource.equals(Layout.class.getName())) {
331             long plid = GetterUtil.getLong(resourcePrimKey);
332 
333             Layout layout = LayoutLocalServiceUtil.getLayout(plid);
334 
335             group = layout.getGroup();
336         }
337 
338         List<Role> roles = ResourceActionsUtil.getRoles(group, modelResource);
339 
340         for (Role role : roles) {
341             String[] actionIds = getActionIds(actionRequest, role.getRoleId());
342 
343             ResourcePermissionServiceUtil.setIndividualResourcePermissions(
344                 themeDisplay.getScopeGroupId(), themeDisplay.getCompanyId(),
345                 selResource, resourcePrimKey, role.getRoleId(), actionIds);
346         }
347     }
348 
349     protected void updateUserGroupPermissions(ActionRequest actionRequest)
350         throws Exception {
351 
352         Layout layout = (Layout)actionRequest.getAttribute(WebKeys.LAYOUT);
353 
354         long resourceId = ParamUtil.getLong(actionRequest, "resourceId");
355         long userGroupId = ParamUtil.getLong(
356             actionRequest, "userGroupIdsPosValue");
357         String[] actionIds = StringUtil.split(
358             ParamUtil.getString(actionRequest, "userGroupIdActionIds"));
359 
360         PermissionServiceUtil.setGroupPermissions(
361             UserGroup.class.getName(), String.valueOf(userGroupId),
362             layout.getGroupId(), actionIds, resourceId);
363     }
364 
365     protected void updateUserPermissions(ActionRequest actionRequest)
366         throws Exception {
367 
368         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
369             WebKeys.THEME_DISPLAY);
370 
371         long resourceId = ParamUtil.getLong(actionRequest, "resourceId");
372         long userId = ParamUtil.getLong(actionRequest, "userIdsPosValue");
373         String[] actionIds = StringUtil.split(
374             ParamUtil.getString(actionRequest, "userIdActionIds"));
375 
376         PermissionServiceUtil.setUserPermissions(
377             userId, themeDisplay.getScopeGroupId(), actionIds, resourceId);
378     }
379 
380 }