1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17   * SOFTWARE.
18   */
19  
20  package com.liferay.portal.service.permission;
21  
22  import com.liferay.portal.NoSuchResourceException;
23  import com.liferay.portal.PortalException;
24  import com.liferay.portal.SystemException;
25  import com.liferay.portal.model.Group;
26  import com.liferay.portal.model.Layout;
27  import com.liferay.portal.model.LayoutConstants;
28  import com.liferay.portal.model.ResourceConstants;
29  import com.liferay.portal.security.auth.PrincipalException;
30  import com.liferay.portal.security.permission.ActionKeys;
31  import com.liferay.portal.security.permission.PermissionChecker;
32  import com.liferay.portal.service.GroupLocalServiceUtil;
33  import com.liferay.portal.service.LayoutLocalServiceUtil;
34  import com.liferay.portal.service.ResourceLocalServiceUtil;
35  import com.liferay.portal.service.ResourcePermissionLocalServiceUtil;
36  import com.liferay.portal.util.PropsValues;
37  
38  /**
39   * <a href="LayoutPermissionImpl.java.html"><b><i>View Source</i></b></a>
40   *
41   * @author Charles May
42   * @author Brian Wing Shun Chan
43   *
44   */
45  public class LayoutPermissionImpl implements LayoutPermission {
46  
47      public void check(
48              PermissionChecker permissionChecker, long plid, String actionId)
49          throws PortalException, SystemException {
50  
51          if (!contains(permissionChecker, plid, actionId)) {
52              throw new PrincipalException();
53          }
54      }
55  
56      public void check(
57              PermissionChecker permissionChecker, long groupId,
58              boolean privateLayout, long layoutId, String actionId)
59          throws PortalException, SystemException {
60  
61          if (!contains(
62                  permissionChecker, groupId, privateLayout, layoutId,
63                  actionId)) {
64  
65              throw new PrincipalException();
66          }
67      }
68  
69      public void check(
70              PermissionChecker permissionChecker, Layout layout, String actionId)
71          throws PortalException, SystemException {
72  
73          if (!contains(permissionChecker, layout, actionId)) {
74              throw new PrincipalException();
75          }
76      }
77  
78      public boolean contains(
79              PermissionChecker permissionChecker, long plid, String actionId)
80          throws PortalException, SystemException {
81  
82          Layout layout = LayoutLocalServiceUtil.getLayout(plid);
83  
84          return contains(permissionChecker, layout, actionId);
85      }
86  
87      public boolean contains(
88              PermissionChecker permissionChecker, long groupId,
89              boolean privateLayout, long layoutId, String actionId)
90          throws PortalException, SystemException {
91  
92          if (layoutId == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
93              if (GroupPermissionUtil.contains(
94                      permissionChecker, groupId, ActionKeys.MANAGE_LAYOUTS)) {
95  
96                  return true;
97              }
98              else {
99                  return false;
100             }
101         }
102         else {
103             Layout layout = LayoutLocalServiceUtil.getLayout(
104                 groupId, privateLayout, layoutId);
105 
106             return contains(permissionChecker, layout, actionId);
107         }
108     }
109 
110     public boolean contains(
111             PermissionChecker permissionChecker, Layout layout, String actionId)
112         throws PortalException, SystemException {
113 
114         if ((layout.isPrivateLayout() &&
115              !PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_MODIFIABLE) ||
116             (layout.isPublicLayout() &&
117              !PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_MODIFIABLE)) {
118 
119             if (actionId.equals(ActionKeys.UPDATE)) {
120                 Group group = GroupLocalServiceUtil.getGroup(
121                     layout.getGroupId());
122 
123                 if (group.isUser()) {
124                     return false;
125                 }
126             }
127         }
128 
129         if (GroupPermissionUtil.contains(
130                 permissionChecker, layout.getGroupId(),
131                 ActionKeys.MANAGE_LAYOUTS)) {
132 
133             return true;
134         }
135 
136         try {
137             if (PropsValues.PERMISSIONS_USER_CHECK_ALGORITHM == 6) {
138                 if (ResourcePermissionLocalServiceUtil.
139                         getResourcePermissionsCount(
140                             layout.getCompanyId(), Layout.class.getName(),
141                             ResourceConstants.SCOPE_INDIVIDUAL,
142                             String.valueOf(layout.getPlid())) == 0) {
143 
144                     throw new NoSuchResourceException();
145                 }
146             }
147             else {
148                 ResourceLocalServiceUtil.getResource(
149                     layout.getCompanyId(), Layout.class.getName(),
150                     ResourceConstants.SCOPE_INDIVIDUAL,
151                     String.valueOf(layout.getPlid()));
152             }
153         }
154         catch (NoSuchResourceException nsre) {
155             boolean addCommunityPermission = true;
156             boolean addGuestPermission = true;
157 
158             if (layout.isPrivateLayout()) {
159                 addGuestPermission = false;
160             }
161 
162             ResourceLocalServiceUtil.addResources(
163                 layout.getCompanyId(), layout.getGroupId(), 0,
164                 Layout.class.getName(), layout.getPlid(), false,
165                 addCommunityPermission, addGuestPermission);
166         }
167 
168         return permissionChecker.hasPermission(
169             layout.getGroupId(), Layout.class.getName(), layout.getPlid(),
170             actionId);
171     }
172 
173 }