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, ActionKeys.VIEW);
176 }
177
178 if (className.equals(BlogsEntry.class.getName())) {
179 Group group = GroupLocalServiceUtil.fetchGroup(classPK);
180
181 if (group == null) {
182 return BlogsEntryPermission.contains(
183 permissionChecker, classPK, actionId);
184 }
185
186 return BlogsPermission.contains(
187 permissionChecker, classPK, actionId);
188 }
189 else if (className.equals(BookmarksEntry.class.getName())) {
190 return BookmarksEntryPermission.contains(
191 permissionChecker, classPK, actionId);
192 }
193 else if (className.equals(DLFileEntry.class.getName())) {
194 return DLFileEntryPermission.contains(
195 permissionChecker, classPK, actionId);
196 }
197 else if (className.equals(JournalArticle.class.getName())) {
198 JournalArticle article =
199 JournalArticleLocalServiceUtil.fetchLatestArticle(classPK);
200
201 if (article == null) {
202 return JournalPermission.contains(
203 permissionChecker, classPK, actionId);
204 }
205
206 if (actionId.equals(ActionKeys.SUBSCRIBE)) {
207 return JournalPermission.contains(
208 permissionChecker, article.getGroupId(), actionId);
209 }
210
211 return JournalArticlePermission.contains(
212 permissionChecker, article, actionId);
213 }
214 else if (className.equals(MBCategory.class.getName())) {
215 Group group = GroupLocalServiceUtil.fetchGroup(classPK);
216
217 if (group == null) {
218 return MBCategoryPermission.contains(
219 permissionChecker, classPK, actionId);
220 }
221
222 return MBPermission.contains(permissionChecker, classPK, actionId);
223 }
224 else if (className.equals(MBThread.class.getName())) {
225 MBThread mbThread = MBThreadLocalServiceUtil.fetchThread(classPK);
226
227 if (mbThread == null) {
228 return false;
229 }
230
231 return MBMessagePermission.contains(
232 permissionChecker, mbThread.getRootMessageId(), actionId);
233 }
234 else if (className.equals(WikiNode.class.getName())) {
235 return WikiNodePermission.contains(
236 permissionChecker, classPK, actionId);
237 }
238 else if (className.equals(WikiPage.class.getName())) {
239 return WikiPagePermission.contains(
240 permissionChecker, classPK, actionId);
241 }
242
243 return null;
244 }
245
246 }