001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.service.permission;
016    
017    import com.liferay.portal.NoSuchResourceException;
018    import com.liferay.portal.kernel.exception.PortalException;
019    import com.liferay.portal.kernel.exception.SystemException;
020    import com.liferay.portal.model.Group;
021    import com.liferay.portal.model.Layout;
022    import com.liferay.portal.model.LayoutConstants;
023    import com.liferay.portal.model.ResourceConstants;
024    import com.liferay.portal.security.auth.PrincipalException;
025    import com.liferay.portal.security.permission.ActionKeys;
026    import com.liferay.portal.security.permission.PermissionChecker;
027    import com.liferay.portal.service.GroupLocalServiceUtil;
028    import com.liferay.portal.service.LayoutLocalServiceUtil;
029    import com.liferay.portal.service.ResourceLocalServiceUtil;
030    import com.liferay.portal.service.ResourcePermissionLocalServiceUtil;
031    import com.liferay.portal.util.PropsValues;
032    
033    /**
034     * @author Charles May
035     * @author Brian Wing Shun Chan
036     */
037    public class LayoutPermissionImpl implements LayoutPermission {
038    
039            public void check(
040                            PermissionChecker permissionChecker, Layout layout, String actionId)
041                    throws PortalException, SystemException {
042    
043                    if (!contains(permissionChecker, layout, actionId)) {
044                            throw new PrincipalException();
045                    }
046            }
047    
048            public void check(
049                            PermissionChecker permissionChecker, long groupId,
050                            boolean privateLayout, long layoutId, String actionId)
051                    throws PortalException, SystemException {
052    
053                    if (!contains(
054                                    permissionChecker, groupId, privateLayout, layoutId,
055                                    actionId)) {
056    
057                            throw new PrincipalException();
058                    }
059            }
060    
061            public void check(
062                            PermissionChecker permissionChecker, long plid, String actionId)
063                    throws PortalException, SystemException {
064    
065                    if (!contains(permissionChecker, plid, actionId)) {
066                            throw new PrincipalException();
067                    }
068            }
069    
070            public boolean contains(
071                            PermissionChecker permissionChecker, Layout layout, String actionId)
072                    throws PortalException, SystemException {
073    
074                    if ((layout.isPrivateLayout() &&
075                             !PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_MODIFIABLE) ||
076                            (layout.isPublicLayout() &&
077                             !PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_MODIFIABLE)) {
078    
079                            if (actionId.equals(ActionKeys.UPDATE)) {
080                                    Group group = GroupLocalServiceUtil.getGroup(
081                                            layout.getGroupId());
082    
083                                    if (group.isUser()) {
084                                            return false;
085                                    }
086                            }
087                    }
088    
089                    if (GroupPermissionUtil.contains(
090                                    permissionChecker, layout.getGroupId(),
091                                    ActionKeys.MANAGE_LAYOUTS)) {
092    
093                            return true;
094                    }
095    
096                    try {
097                            if (PropsValues.PERMISSIONS_USER_CHECK_ALGORITHM == 6) {
098                                    if (ResourcePermissionLocalServiceUtil.
099                                                    getResourcePermissionsCount(
100                                                            layout.getCompanyId(), Layout.class.getName(),
101                                                            ResourceConstants.SCOPE_INDIVIDUAL,
102                                                            String.valueOf(layout.getPlid())) == 0) {
103    
104                                            throw new NoSuchResourceException();
105                                    }
106                            }
107                            else {
108                                    ResourceLocalServiceUtil.getResource(
109                                            layout.getCompanyId(), Layout.class.getName(),
110                                            ResourceConstants.SCOPE_INDIVIDUAL,
111                                            String.valueOf(layout.getPlid()));
112                            }
113                    }
114                    catch (NoSuchResourceException nsre) {
115                            boolean addCommunityPermission = true;
116                            boolean addGuestPermission = true;
117    
118                            if (layout.isPrivateLayout()) {
119                                    addGuestPermission = false;
120                            }
121    
122                            ResourceLocalServiceUtil.addResources(
123                                    layout.getCompanyId(), layout.getGroupId(), 0,
124                                    Layout.class.getName(), layout.getPlid(), false,
125                                    addCommunityPermission, addGuestPermission);
126                    }
127    
128                    return permissionChecker.hasPermission(
129                            layout.getGroupId(), Layout.class.getName(), layout.getPlid(),
130                            actionId);
131            }
132    
133            public boolean contains(
134                            PermissionChecker permissionChecker, long groupId,
135                            boolean privateLayout, long layoutId, String actionId)
136                    throws PortalException, SystemException {
137    
138                    if (layoutId == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
139                            if (GroupPermissionUtil.contains(
140                                            permissionChecker, groupId, ActionKeys.MANAGE_LAYOUTS)) {
141    
142                                    return true;
143                            }
144                            else {
145                                    return false;
146                            }
147                    }
148                    else {
149                            Layout layout = LayoutLocalServiceUtil.getLayout(
150                                    groupId, privateLayout, layoutId);
151    
152                            return contains(permissionChecker, layout, actionId);
153                    }
154            }
155    
156            public boolean contains(
157                            PermissionChecker permissionChecker, long plid, String actionId)
158                    throws PortalException, SystemException {
159    
160                    Layout layout = LayoutLocalServiceUtil.getLayout(plid);
161    
162                    return contains(permissionChecker, layout, actionId);
163            }
164    
165    }