001
014
015 package com.liferay.portal.service.permission;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.exception.SystemException;
019 import com.liferay.portal.kernel.util.Validator;
020 import com.liferay.portal.kernel.workflow.WorkflowInstance;
021 import com.liferay.portal.model.Group;
022 import com.liferay.portal.model.Layout;
023 import com.liferay.portal.security.auth.PrincipalException;
024 import com.liferay.portal.security.permission.ActionKeys;
025 import com.liferay.portal.security.permission.PermissionChecker;
026 import com.liferay.portal.service.GroupLocalServiceUtil;
027 import com.liferay.portal.util.PortletKeys;
028 import com.liferay.portlet.blogs.model.BlogsEntry;
029 import com.liferay.portlet.blogs.service.permission.BlogsPermission;
030 import com.liferay.portlet.bookmarks.model.BookmarksEntry;
031 import com.liferay.portlet.bookmarks.service.permission.BookmarksEntryPermission;
032 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
033 import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
034 import com.liferay.portlet.journal.model.JournalArticle;
035 import com.liferay.portlet.journal.service.permission.JournalPermission;
036 import com.liferay.portlet.messageboards.model.MBCategory;
037 import com.liferay.portlet.messageboards.model.MBDiscussion;
038 import com.liferay.portlet.messageboards.model.MBThread;
039 import com.liferay.portlet.messageboards.service.MBDiscussionLocalServiceUtil;
040 import com.liferay.portlet.messageboards.service.MBThreadLocalServiceUtil;
041 import com.liferay.portlet.messageboards.service.permission.MBCategoryPermission;
042 import com.liferay.portlet.messageboards.service.permission.MBDiscussionPermission;
043 import com.liferay.portlet.messageboards.service.permission.MBMessagePermission;
044 import com.liferay.portlet.messageboards.service.permission.MBPermission;
045 import com.liferay.portlet.wiki.model.WikiNode;
046 import com.liferay.portlet.wiki.model.WikiPage;
047 import com.liferay.portlet.wiki.service.permission.WikiNodePermission;
048 import com.liferay.portlet.wiki.service.permission.WikiPagePermission;
049
050
054 public class SubscriptionPermissionImpl implements SubscriptionPermission {
055
056
060 @Override
061 public void check(
062 PermissionChecker permissionChecker, String className, long classPK)
063 throws PortalException, SystemException {
064
065 check(permissionChecker, className, classPK, null, 0);
066 }
067
068 @Override
069 public void check(
070 PermissionChecker permissionChecker, String subscriptionClassName,
071 long subscriptionClassPK, String inferredClassName,
072 long inferredClassPK)
073 throws PortalException, SystemException {
074
075 if (!contains(
076 permissionChecker, subscriptionClassName, subscriptionClassPK,
077 inferredClassName, inferredClassPK)) {
078
079 throw new PrincipalException();
080 }
081 }
082
083
087 @Override
088 public boolean contains(
089 PermissionChecker permissionChecker, String className, long classPK)
090 throws PortalException, SystemException {
091
092 return contains(permissionChecker, className, classPK, null, 0);
093 }
094
095 @Override
096 public boolean contains(
097 PermissionChecker permissionChecker, String subscriptionClassName,
098 long subscriptionClassPK, String inferredClassName,
099 long inferredClassPK)
100 throws PortalException, SystemException {
101
102 if (subscriptionClassName == null) {
103 return false;
104 }
105
106 if (Validator.isNotNull(inferredClassName)) {
107 Boolean hasPermission = hasPermission(
108 permissionChecker, inferredClassName, inferredClassPK,
109 ActionKeys.VIEW);
110
111 if ((hasPermission == null) || !hasPermission) {
112 return false;
113 }
114 }
115
116 Boolean hasPermission = hasPermission(
117 permissionChecker, subscriptionClassName, subscriptionClassPK,
118 ActionKeys.SUBSCRIBE);
119
120 if (hasPermission != null) {
121 return hasPermission;
122 }
123
124 return true;
125 }
126
127 protected Boolean hasPermission(
128 PermissionChecker permissionChecker, String className, long classPK,
129 String actionId)
130 throws PortalException, SystemException {
131
132 MBDiscussion mbDiscussion =
133 MBDiscussionLocalServiceUtil.fetchDiscussion(className, classPK);
134
135 if (mbDiscussion != null) {
136 if (className.equals(Layout.class.getName())) {
137 return LayoutPermissionUtil.contains(
138 permissionChecker, classPK, ActionKeys.VIEW);
139 }
140
141 MBThread mbThread = MBThreadLocalServiceUtil.fetchThread(
142 mbDiscussion.getThreadId());
143
144 if (className.equals(WorkflowInstance.class.getName())) {
145 return permissionChecker.hasPermission(
146 mbThread.getGroupId(), PortletKeys.WORKFLOW_DEFINITIONS,
147 mbThread.getGroupId(), ActionKeys.VIEW);
148 }
149
150 return MBDiscussionPermission.contains(
151 permissionChecker, mbThread.getCompanyId(),
152 mbThread.getGroupId(), className, classPK, mbThread.getUserId(),
153 ActionKeys.VIEW);
154 }
155
156 if (className.equals(BlogsEntry.class.getName())) {
157 return BlogsPermission.contains(
158 permissionChecker, classPK, actionId);
159 }
160 else if (className.equals(BookmarksEntry.class.getName())) {
161 return BookmarksEntryPermission.contains(
162 permissionChecker, classPK, actionId);
163 }
164 else if (className.equals(DLFileEntry.class.getName())) {
165 return DLFileEntryPermission.contains(
166 permissionChecker, classPK, actionId);
167 }
168 else if (className.equals(JournalArticle.class.getName())) {
169 return JournalPermission.contains(
170 permissionChecker, classPK, actionId);
171 }
172 else if (className.equals(MBCategory.class.getName())) {
173 Group group = GroupLocalServiceUtil.fetchGroup(classPK);
174
175 if (group == null) {
176 return MBCategoryPermission.contains(
177 permissionChecker, classPK, actionId);
178 }
179
180 return MBPermission.contains(permissionChecker, classPK, actionId);
181 }
182 else if (className.equals(MBThread.class.getName())) {
183 MBThread mbThread = MBThreadLocalServiceUtil.fetchThread(classPK);
184
185 if (mbThread == null) {
186 return false;
187 }
188
189 return MBMessagePermission.contains(
190 permissionChecker, mbThread.getRootMessageId(), actionId);
191 }
192 else if (className.equals(WikiNode.class.getName())) {
193 return WikiNodePermission.contains(
194 permissionChecker, classPK, actionId);
195 }
196 else if (className.equals(WikiPage.class.getName())) {
197 return WikiPagePermission.contains(
198 permissionChecker, classPK, actionId);
199 }
200
201 return null;
202 }
203
204 }