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.BlogsEntryPermission;
030 import com.liferay.portlet.blogs.service.permission.BlogsPermission;
031 import com.liferay.portlet.bookmarks.model.BookmarksEntry;
032 import com.liferay.portlet.bookmarks.service.permission.BookmarksEntryPermission;
033 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
034 import com.liferay.portlet.documentlibrary.model.DLFolder;
035 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
036 import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
037 import com.liferay.portlet.documentlibrary.service.permission.DLFolderPermission;
038 import com.liferay.portlet.documentlibrary.service.persistence.DLFolderUtil;
039 import com.liferay.portlet.journal.model.JournalArticle;
040 import com.liferay.portlet.journal.service.JournalArticleLocalServiceUtil;
041 import com.liferay.portlet.journal.service.permission.JournalArticlePermission;
042 import com.liferay.portlet.journal.service.permission.JournalPermission;
043 import com.liferay.portlet.messageboards.model.MBCategory;
044 import com.liferay.portlet.messageboards.model.MBDiscussion;
045 import com.liferay.portlet.messageboards.model.MBThread;
046 import com.liferay.portlet.messageboards.service.MBDiscussionLocalServiceUtil;
047 import com.liferay.portlet.messageboards.service.MBThreadLocalServiceUtil;
048 import com.liferay.portlet.messageboards.service.permission.MBCategoryPermission;
049 import com.liferay.portlet.messageboards.service.permission.MBDiscussionPermission;
050 import com.liferay.portlet.messageboards.service.permission.MBMessagePermission;
051 import com.liferay.portlet.messageboards.service.permission.MBPermission;
052 import com.liferay.portlet.wiki.model.WikiNode;
053 import com.liferay.portlet.wiki.model.WikiPage;
054 import com.liferay.portlet.wiki.service.permission.WikiNodePermission;
055 import com.liferay.portlet.wiki.service.permission.WikiPagePermission;
056
057
061 public class SubscriptionPermissionImpl implements SubscriptionPermission {
062
063
067 @Override
068 public void check(
069 PermissionChecker permissionChecker, String className, long classPK)
070 throws PortalException, SystemException {
071
072 check(permissionChecker, className, classPK, null, 0);
073 }
074
075 @Override
076 public void check(
077 PermissionChecker permissionChecker, String subscriptionClassName,
078 long subscriptionClassPK, String inferredClassName,
079 long inferredClassPK)
080 throws PortalException, SystemException {
081
082 if (!contains(
083 permissionChecker, subscriptionClassName, subscriptionClassPK,
084 inferredClassName, inferredClassPK)) {
085
086 throw new PrincipalException();
087 }
088 }
089
090
094 @Override
095 public boolean contains(
096 PermissionChecker permissionChecker, String className, long classPK)
097 throws PortalException, SystemException {
098
099 return contains(permissionChecker, className, classPK, null, 0);
100 }
101
102 @Override
103 public boolean contains(
104 PermissionChecker permissionChecker, String subscriptionClassName,
105 long subscriptionClassPK, String inferredClassName,
106 long inferredClassPK)
107 throws PortalException, SystemException {
108
109 if (subscriptionClassName == null) {
110 return false;
111 }
112
113 if (Validator.isNotNull(inferredClassName)) {
114 Boolean hasPermission = hasPermission(
115 permissionChecker, inferredClassName, inferredClassPK,
116 ActionKeys.VIEW);
117
118 if ((hasPermission == null) || !hasPermission) {
119 return false;
120 }
121 }
122
123 Boolean hasPermission = hasPermission(
124 permissionChecker, subscriptionClassName, subscriptionClassPK,
125 ActionKeys.SUBSCRIBE);
126
127 if (hasPermission != null) {
128 return hasPermission;
129 }
130
131 if (Validator.equals(
132 inferredClassName,
133 "com.liferay.portlet.documentlibrary.model.DLFileEntry")) {
134
135 DLFileEntry dlFileEntry =
136 DLFileEntryLocalServiceUtil.getDLFileEntry(inferredClassPK);
137
138 DLFolder dlFolder = DLFolderUtil.fetchByPrimaryKey(
139 dlFileEntry.getFolderId());
140
141 if (Validator.isNotNull(dlFolder)) {
142 return DLFolderPermission.contains(
143 permissionChecker, dlFolder, ActionKeys.VIEW);
144 }
145 }
146
147 return true;
148 }
149
150 protected Boolean hasPermission(
151 PermissionChecker permissionChecker, String className, long classPK,
152 String actionId)
153 throws PortalException, SystemException {
154
155 MBDiscussion mbDiscussion =
156 MBDiscussionLocalServiceUtil.fetchDiscussion(className, classPK);
157
158 if (mbDiscussion != null) {
159 if (className.equals(Layout.class.getName())) {
160 return LayoutPermissionUtil.contains(
161 permissionChecker, classPK, ActionKeys.VIEW);
162 }
163
164 MBThread mbThread = MBThreadLocalServiceUtil.fetchThread(
165 mbDiscussion.getThreadId());
166
167 if (className.equals(WorkflowInstance.class.getName())) {
168 return permissionChecker.hasPermission(
169 mbThread.getGroupId(), PortletKeys.WORKFLOW_DEFINITIONS,
170 mbThread.getGroupId(), ActionKeys.VIEW);
171 }
172
173 return MBDiscussionPermission.contains(
174 permissionChecker, mbThread.getCompanyId(),
175 mbThread.getGroupId(), className, classPK, mbThread.getUserId(),
176 ActionKeys.VIEW);
177 }
178
179 if (className.equals(BlogsEntry.class.getName())) {
180 Group group = GroupLocalServiceUtil.fetchGroup(classPK);
181
182 if (group == null) {
183 return BlogsEntryPermission.contains(
184 permissionChecker, classPK, actionId);
185 }
186
187 return BlogsPermission.contains(
188 permissionChecker, classPK, actionId);
189 }
190 else if (className.equals(BookmarksEntry.class.getName())) {
191 return BookmarksEntryPermission.contains(
192 permissionChecker, classPK, actionId);
193 }
194 else if (className.equals(DLFileEntry.class.getName())) {
195 return DLFileEntryPermission.contains(
196 permissionChecker, classPK, actionId);
197 }
198 else if (className.equals(JournalArticle.class.getName())) {
199 JournalArticle article =
200 JournalArticleLocalServiceUtil.fetchLatestArticle(classPK);
201
202 if (article == null) {
203 return JournalPermission.contains(
204 permissionChecker, classPK, actionId);
205 }
206
207 if (actionId.equals(ActionKeys.SUBSCRIBE)) {
208 return JournalPermission.contains(
209 permissionChecker, article.getGroupId(), actionId);
210 }
211
212 return JournalArticlePermission.contains(
213 permissionChecker, article, actionId);
214 }
215 else if (className.equals(MBCategory.class.getName())) {
216 Group group = GroupLocalServiceUtil.fetchGroup(classPK);
217
218 if (group == null) {
219 return MBCategoryPermission.contains(
220 permissionChecker, classPK, actionId);
221 }
222
223 return MBPermission.contains(permissionChecker, classPK, actionId);
224 }
225 else if (className.equals(MBThread.class.getName())) {
226 MBThread mbThread = MBThreadLocalServiceUtil.fetchThread(classPK);
227
228 if (mbThread == null) {
229 return false;
230 }
231
232 return MBMessagePermission.contains(
233 permissionChecker, mbThread.getRootMessageId(), actionId);
234 }
235 else if (className.equals(WikiNode.class.getName())) {
236 return WikiNodePermission.contains(
237 permissionChecker, classPK, actionId);
238 }
239 else if (className.equals(WikiPage.class.getName())) {
240 return WikiPagePermission.contains(
241 permissionChecker, classPK, actionId);
242 }
243
244 return null;
245 }
246
247 }