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