001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
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    /**
058     * @author Mate Thurzo
059     * @author Raymond Aug??
060     */
061    public class SubscriptionPermissionImpl implements SubscriptionPermission {
062    
063            /**
064             * @deprecated As of 6.2.0, replaced by {@link #check(PermissionChecker,
065             *             String, long, String, long)}
066             */
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            /**
091             * @deprecated As of 6.2.0, replaced by {@link #contains(PermissionChecker,
092             *             String, long, String, long)}
093             */
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    }