--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portal.service.permission;\r
+\r
+import com.liferay.portal.kernel.exception.PortalException;\r
+import com.liferay.portal.kernel.exception.SystemException;\r
+import com.liferay.portal.kernel.log.Log;\r
+import com.liferay.portal.kernel.log.LogFactoryUtil;\r
+import com.liferay.portal.kernel.staging.permission.StagingPermissionUtil;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.model.Group;\r
+import com.liferay.portal.model.Layout;\r
+import com.liferay.portal.model.LayoutTypePortlet;\r
+import com.liferay.portal.model.Portlet;\r
+import com.liferay.portal.model.PortletConstants;\r
+import com.liferay.portal.model.impl.VirtualLayout;\r
+import com.liferay.portal.security.auth.PrincipalException;\r
+import com.liferay.portal.security.permission.ActionKeys;\r
+import com.liferay.portal.security.permission.PermissionChecker;\r
+import com.liferay.portal.security.permission.ResourceActionsUtil;\r
+import com.liferay.portal.service.LayoutLocalServiceUtil;\r
+import com.liferay.portal.service.PortletLocalServiceUtil;\r
+import com.liferay.portal.util.PortletCategoryKeys;\r
+import com.liferay.portal.util.PropsValues;\r
+import com.liferay.portlet.sites.util.SitesUtil;\r
+\r
+import java.util.Collection;\r
+import java.util.List;\r
+\r
+import javax.portlet.PortletMode;\r
+\r
+/**\r
+ * @author Brian Wing Shun Chan\r
+ * @author Raymond Augé\r
+ */\r
+public class PortletPermissionImpl implements PortletPermission {\r
+\r
+ public static final boolean DEFAULT_STRICT = false;\r
+\r
+ public void check(\r
+ PermissionChecker permissionChecker, Layout layout,\r
+ String portletId, String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ if (!contains(\r
+ permissionChecker, 0, layout, portletId, actionId,\r
+ DEFAULT_STRICT)) {\r
+\r
+ throw new PrincipalException();\r
+ }\r
+ }\r
+\r
+ public void check(\r
+ PermissionChecker permissionChecker, Layout layout,\r
+ String portletId, String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ if (!contains(\r
+ permissionChecker, 0, layout, portletId, actionId, strict)) {\r
+\r
+ throw new PrincipalException();\r
+ }\r
+ }\r
+\r
+ public void check(\r
+ PermissionChecker permissionChecker, long groupId, Layout layout,\r
+ String portletId, String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ if (!contains(\r
+ permissionChecker, groupId, layout, portletId, actionId,\r
+ DEFAULT_STRICT)) {\r
+\r
+ throw new PrincipalException();\r
+ }\r
+ }\r
+\r
+ public void check(\r
+ PermissionChecker permissionChecker, long groupId, Layout layout,\r
+ String portletId, String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ if (!contains(\r
+ permissionChecker, groupId, layout, portletId, actionId,\r
+ strict)) {\r
+\r
+ throw new PrincipalException();\r
+ }\r
+ }\r
+\r
+ public void check(\r
+ PermissionChecker permissionChecker, long groupId, long plid,\r
+ String portletId, String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ check(\r
+ permissionChecker, groupId, plid, portletId, actionId,\r
+ DEFAULT_STRICT);\r
+ }\r
+\r
+ public void check(\r
+ PermissionChecker permissionChecker, long groupId, long plid,\r
+ String portletId, String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ if (!contains(\r
+ permissionChecker, groupId, plid, portletId, actionId,\r
+ strict)) {\r
+\r
+ throw new PrincipalException();\r
+ }\r
+ }\r
+\r
+ public void check(\r
+ PermissionChecker permissionChecker, long plid, String portletId,\r
+ String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ check(permissionChecker, plid, portletId, actionId, DEFAULT_STRICT);\r
+ }\r
+\r
+ public void check(\r
+ PermissionChecker permissionChecker, long plid, String portletId,\r
+ String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ if (!contains(permissionChecker, plid, portletId, actionId, strict)) {\r
+ throw new PrincipalException();\r
+ }\r
+ }\r
+\r
+ public void check(\r
+ PermissionChecker permissionChecker, String portletId,\r
+ String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ if (!contains(permissionChecker, portletId, actionId)) {\r
+ throw new PrincipalException();\r
+ }\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, Layout layout, Portlet portlet,\r
+ String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ return contains(\r
+ permissionChecker, layout, portlet, actionId, DEFAULT_STRICT);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, Layout layout, Portlet portlet,\r
+ String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ return contains(\r
+ permissionChecker, 0, layout, portlet, actionId, strict);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, Layout layout,\r
+ String portletId, String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ return contains(\r
+ permissionChecker, layout, portletId, actionId, DEFAULT_STRICT);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, Layout layout,\r
+ String portletId, String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ return contains(\r
+ permissionChecker, 0, layout, portletId, actionId, strict);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long groupId, Layout layout,\r
+ Portlet portlet, String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ return contains(\r
+ permissionChecker, groupId, layout, portlet, actionId,\r
+ DEFAULT_STRICT);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long groupId, Layout layout,\r
+ Portlet portlet, String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ if (portlet.isUndeployedPortlet()) {\r
+ return false;\r
+ }\r
+\r
+ if (portlet.isSystem() && actionId.equals(ActionKeys.VIEW)) {\r
+ return true;\r
+ }\r
+\r
+ return contains(\r
+ permissionChecker, groupId, layout, portlet.getPortletId(),\r
+ actionId, strict);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long groupId, Layout layout,\r
+ String portletId, String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ return contains(\r
+ permissionChecker, groupId, layout, portletId, actionId,\r
+ DEFAULT_STRICT);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long groupId, Layout layout,\r
+ String portletId, String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ String name = null;\r
+ String primKey = null;\r
+\r
+ if (layout == null) {\r
+ name = portletId;\r
+ primKey = portletId;\r
+\r
+ return permissionChecker.hasPermission(\r
+ groupId, name, primKey, actionId);\r
+ }\r
+ \r
+ Group group = layout.getGroup();\r
+\r
+ groupId = group.getGroupId();\r
+\r
+ name = PortletConstants.getRootPortletId(portletId);\r
+ primKey = getPrimaryKey(layout.getPlid(), portletId);\r
+\r
+ if (!actionId.equals(ActionKeys.VIEW) &&\r
+ (layout instanceof VirtualLayout)) {\r
+\r
+ return hasCustomizePermission(\r
+ permissionChecker, layout, portletId, actionId);\r
+ }\r
+ \r
+ if (!group.isLayoutSetPrototype() &&\r
+ !SitesUtil.isLayoutUpdateable(layout) &&\r
+ actionId.equals(ActionKeys.CONFIGURATION)) {\r
+\r
+ return false;\r
+ }\r
+ \r
+ Boolean hasPermission = StagingPermissionUtil.hasPermission(\r
+ permissionChecker, groupId, name, groupId, name, actionId);\r
+\r
+ if (hasPermission != null) {\r
+ return hasPermission.booleanValue();\r
+ }\r
+ \r
+ if (actionId.equals(ActionKeys.VIEW) && group.isControlPanel()) {\r
+ return true;\r
+ }\r
+\r
+ if (strict) {\r
+ return permissionChecker.hasPermission(\r
+ groupId, name, primKey, actionId);\r
+ }\r
+ \r
+ if (hasConfigurePermission(\r
+ permissionChecker, layout, portletId, actionId) ||\r
+ hasCustomizePermission(\r
+ permissionChecker, layout, portletId, actionId)) {\r
+\r
+ return true;\r
+ }\r
+ \r
+// System.out.println("groupId " + groupId);\r
+// System.out.println("name " + name);\r
+// System.out.println("primKey " + primKey);\r
+// System.out.println("actionId " + actionId);\r
+// System.out.println("permissionChecker.hasPermission(groupId, name, primKey, actionId) " + permissionChecker.hasPermission(\r
+// groupId, name, primKey, actionId));\r
+ \r
+ return permissionChecker.hasPermission(\r
+ groupId, name, primKey, actionId);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long groupId, long plid,\r
+ Collection<Portlet> portlets, String actionId) {\r
+\r
+ for (Portlet portlet : portlets) {\r
+ if (permissionChecker.hasPermission(\r
+ groupId, portlet.getPortletId(), portlet.getPortletId(),\r
+ ActionKeys.ACCESS_IN_CONTROL_PANEL)) {\r
+\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long groupId, long plid,\r
+ Portlet portlet, String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ Layout layout = LayoutLocalServiceUtil.fetchLayout(plid);\r
+\r
+ return contains(\r
+ permissionChecker, groupId, layout, portlet, actionId,\r
+ DEFAULT_STRICT);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long groupId, long plid,\r
+ Portlet portlet, String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ Layout layout = LayoutLocalServiceUtil.fetchLayout(plid);\r
+\r
+ return contains(\r
+ permissionChecker, groupId, layout, portlet, actionId, strict);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long groupId, long plid,\r
+ String portletId, String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ Layout layout = LayoutLocalServiceUtil.fetchLayout(plid);\r
+\r
+ return contains(\r
+ permissionChecker, groupId, layout, portletId, actionId,\r
+ DEFAULT_STRICT);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long groupId, long plid,\r
+ String portletId, String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ Layout layout = LayoutLocalServiceUtil.fetchLayout(plid);\r
+\r
+ return contains(\r
+ permissionChecker, groupId, layout, portletId, actionId, strict);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long plid, Portlet portlet,\r
+ String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ Layout layout = LayoutLocalServiceUtil.fetchLayout(plid);\r
+\r
+ return contains(\r
+ permissionChecker, layout, portlet, actionId, DEFAULT_STRICT);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long plid, Portlet portlet,\r
+ String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ Layout layout = LayoutLocalServiceUtil.fetchLayout(plid);\r
+\r
+ return contains(\r
+ permissionChecker, 0, layout, portlet, actionId, strict);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long plid, String portletId,\r
+ String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ Layout layout = LayoutLocalServiceUtil.fetchLayout(plid);\r
+\r
+ return contains(\r
+ permissionChecker, layout, portletId, actionId, DEFAULT_STRICT);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, long plid, String portletId,\r
+ String actionId, boolean strict)\r
+ throws PortalException, SystemException {\r
+\r
+ Layout layout = LayoutLocalServiceUtil.fetchLayout(plid);\r
+\r
+ return contains(\r
+ permissionChecker, 0, layout, portletId, actionId, strict);\r
+ }\r
+\r
+ public boolean contains(\r
+ PermissionChecker permissionChecker, String portletId,\r
+ String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ return contains(permissionChecker, 0, portletId, actionId);\r
+ }\r
+\r
+ public String getPrimaryKey(long plid, String portletId) {\r
+ return String.valueOf(plid).concat(\r
+ PortletConstants.LAYOUT_SEPARATOR).concat(portletId);\r
+ }\r
+\r
+ public boolean hasAccessPermission(\r
+ PermissionChecker permissionChecker, long scopeGroupId,\r
+ Layout layout, Portlet portlet, PortletMode portletMode)\r
+ throws PortalException, SystemException {\r
+\r
+ if ((layout != null) && layout.isTypeControlPanel()) {\r
+ String category = portlet.getControlPanelEntryCategory();\r
+\r
+ if (Validator.equals(category, PortletCategoryKeys.CONTENT)) {\r
+ layout = null;\r
+ }\r
+ }\r
+\r
+ boolean access = contains(\r
+ permissionChecker, scopeGroupId, layout, portlet, ActionKeys.VIEW);\r
+\r
+ if (access && !PropsValues.TCK_URL &&\r
+ portletMode.equals(PortletMode.EDIT)) {\r
+\r
+ access = contains(\r
+ permissionChecker, scopeGroupId, layout, portlet,\r
+ ActionKeys.PREFERENCES);\r
+ }\r
+\r
+ return access;\r
+ }\r
+\r
+ public boolean hasLayoutManagerPermission(\r
+ String portletId, String actionId) {\r
+\r
+ try {\r
+ portletId = PortletConstants.getRootPortletId(portletId);\r
+\r
+ List<String> layoutManagerActions =\r
+ ResourceActionsUtil.getPortletResourceLayoutManagerActions(\r
+ portletId);\r
+\r
+ return layoutManagerActions.contains(actionId);\r
+ }\r
+ catch (Exception e) {\r
+ _log.error(e, e);\r
+\r
+ return false;\r
+ }\r
+ }\r
+\r
+ protected boolean hasConfigurePermission(\r
+ PermissionChecker permissionChecker, Layout layout,\r
+ String portletId, String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ if (!actionId.equals(ActionKeys.CONFIGURATION) &&\r
+ !actionId.equals(ActionKeys.PREFERENCES) &&\r
+ !actionId.equals(ActionKeys.GUEST_PREFERENCES)) {\r
+\r
+ return false;\r
+ }\r
+\r
+ Portlet portlet = PortletLocalServiceUtil.getPortletById(\r
+ layout.getCompanyId(), portletId);\r
+\r
+ if (portlet.isPreferencesUniquePerLayout()) {\r
+ return LayoutPermissionUtil.contains(\r
+ permissionChecker, layout, ActionKeys.CONFIGURE_PORTLETS);\r
+ }\r
+\r
+ return GroupPermissionUtil.contains(\r
+ permissionChecker, layout.getGroupId(),\r
+ ActionKeys.CONFIGURE_PORTLETS);\r
+ }\r
+\r
+ protected boolean hasCustomizePermission(\r
+ PermissionChecker permissionChecker, Layout layout,\r
+ String portletId, String actionId)\r
+ throws PortalException, SystemException {\r
+\r
+ LayoutTypePortlet layoutTypePortlet =\r
+ (LayoutTypePortlet)layout.getLayoutType();\r
+\r
+ if (layoutTypePortlet.isCustomizedView() &&\r
+ layoutTypePortlet.isPortletCustomizable(portletId) &&\r
+ LayoutPermissionUtil.contains(\r
+ permissionChecker, layout, ActionKeys.CUSTOMIZE)) {\r
+\r
+ if (actionId.equals(ActionKeys.VIEW)) {\r
+ return true;\r
+ }\r
+ else if (actionId.equals(ActionKeys.CONFIGURATION)) {\r
+ Portlet portlet = PortletLocalServiceUtil.getPortletById(\r
+ layout.getCompanyId(), portletId);\r
+\r
+ if (portlet.isPreferencesUniquePerLayout()) {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ private static Log _log = LogFactoryUtil.getLog(\r
+ PortletPermissionImpl.class);\r
+\r
+}
\ No newline at end of file