001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
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.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    /**
051     * @author Mate Thurzo
052     * @author Raymond Aug??
053     */
054    public class SubscriptionPermissionImpl implements SubscriptionPermission {
055    
056            /**
057             * @deprecated As of 6.2.0, replaced by {@link #check(PermissionChecker,
058             *             String, long, String, long)}
059             */
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            /**
084             * @deprecated As of 6.2.0, replaced by {@link #contains(PermissionChecker,
085             *             String, long, String, long)}
086             */
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    }