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.model.Group;
021 import com.liferay.portal.security.auth.PrincipalException;
022 import com.liferay.portal.security.permission.ActionKeys;
023 import com.liferay.portal.security.permission.PermissionChecker;
024 import com.liferay.portal.service.GroupLocalServiceUtil;
025 import com.liferay.portlet.blogs.model.BlogsEntry;
026 import com.liferay.portlet.blogs.service.permission.BlogsPermission;
027 import com.liferay.portlet.journal.model.JournalArticle;
028 import com.liferay.portlet.journal.service.permission.JournalPermission;
029 import com.liferay.portlet.messageboards.NoSuchDiscussionException;
030 import com.liferay.portlet.messageboards.model.MBCategory;
031 import com.liferay.portlet.messageboards.model.MBThread;
032 import com.liferay.portlet.messageboards.service.MBDiscussionLocalServiceUtil;
033 import com.liferay.portlet.messageboards.service.MBThreadLocalServiceUtil;
034 import com.liferay.portlet.messageboards.service.permission.MBCategoryPermission;
035 import com.liferay.portlet.messageboards.service.permission.MBMessagePermission;
036 import com.liferay.portlet.messageboards.service.permission.MBPermission;
037 import com.liferay.portlet.wiki.model.WikiNode;
038 import com.liferay.portlet.wiki.model.WikiPage;
039 import com.liferay.portlet.wiki.service.permission.WikiNodePermission;
040 import com.liferay.portlet.wiki.service.permission.WikiPagePermission;
041
042
046 public class SubscriptionPermissionImpl implements SubscriptionPermission {
047
048 @Override
049 public void check(
050 PermissionChecker permissionChecker, String subscriptionClassName,
051 long subscriptionClassPK, String inferredClassName,
052 long inferredClassPK)
053 throws PortalException, SystemException {
054
055 if (!contains(
056 permissionChecker, subscriptionClassName, subscriptionClassPK,
057 inferredClassName, inferredClassPK)) {
058
059 throw new PrincipalException();
060 }
061 }
062
063 @Override
064 public boolean contains(
065 PermissionChecker permissionChecker, String subscriptionClassName,
066 long subscriptionClassPK, String inferredClassName,
067 long inferredClassPK)
068 throws PortalException, SystemException {
069
070 if (subscriptionClassName == null) {
071 return false;
072 }
073
074 try {
075 MBDiscussionLocalServiceUtil.getDiscussion(
076 subscriptionClassName, subscriptionClassPK);
077
078 return true;
079 }
080 catch (NoSuchDiscussionException nsde) {
081 }
082
083 if (Validator.isNotNull(inferredClassName)) {
084 Boolean hasPermission = hasPermission(
085 permissionChecker, inferredClassName, inferredClassPK,
086 ActionKeys.VIEW);
087
088 if ((hasPermission == null) || !hasPermission) {
089 return false;
090 }
091 }
092
093 Boolean hasPermission = hasPermission(
094 permissionChecker, subscriptionClassName, subscriptionClassPK,
095 ActionKeys.SUBSCRIBE);
096
097 if (hasPermission != null) {
098 return hasPermission;
099 }
100
101 return true;
102 }
103
104 protected Boolean hasPermission(
105 PermissionChecker permissionChecker, String className, long classPK,
106 String actionId)
107 throws PortalException, SystemException {
108
109 if (className.equals(BlogsEntry.class.getName())) {
110 return BlogsPermission.contains(
111 permissionChecker, classPK, actionId);
112 }
113 else if (className.equals(JournalArticle.class.getName())) {
114 return JournalPermission.contains(
115 permissionChecker, classPK, actionId);
116 }
117 else if (className.equals(MBCategory.class.getName())) {
118 Group group = GroupLocalServiceUtil.fetchGroup(classPK);
119
120 if (group == null) {
121 return MBCategoryPermission.contains(
122 permissionChecker, classPK, actionId);
123 }
124
125 return MBPermission.contains(permissionChecker, classPK, actionId);
126 }
127 else if (className.equals(MBThread.class.getName())) {
128 MBThread mbThread = MBThreadLocalServiceUtil.fetchThread(classPK);
129
130 if (mbThread == null) {
131 return false;
132 }
133
134 return MBMessagePermission.contains(
135 permissionChecker, mbThread.getRootMessageId(), actionId);
136 }
137 else if (className.equals(WikiNode.class.getName())) {
138 return WikiNodePermission.contains(
139 permissionChecker, classPK, actionId);
140 }
141 else if (className.equals(WikiPage.class.getName())) {
142 return WikiPagePermission.contains(
143 permissionChecker, classPK, actionId);
144 }
145
146 return null;
147 }
148
149 }