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.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.bookmarks.model.BookmarksEntry;
028    import com.liferay.portlet.bookmarks.service.permission.BookmarksEntryPermission;
029    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
030    import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
031    import com.liferay.portlet.journal.model.JournalArticle;
032    import com.liferay.portlet.journal.service.permission.JournalPermission;
033    import com.liferay.portlet.messageboards.NoSuchDiscussionException;
034    import com.liferay.portlet.messageboards.model.MBCategory;
035    import com.liferay.portlet.messageboards.model.MBThread;
036    import com.liferay.portlet.messageboards.service.MBDiscussionLocalServiceUtil;
037    import com.liferay.portlet.messageboards.service.MBThreadLocalServiceUtil;
038    import com.liferay.portlet.messageboards.service.permission.MBCategoryPermission;
039    import com.liferay.portlet.messageboards.service.permission.MBMessagePermission;
040    import com.liferay.portlet.messageboards.service.permission.MBPermission;
041    import com.liferay.portlet.wiki.model.WikiNode;
042    import com.liferay.portlet.wiki.model.WikiPage;
043    import com.liferay.portlet.wiki.service.permission.WikiNodePermission;
044    import com.liferay.portlet.wiki.service.permission.WikiPagePermission;
045    
046    /**
047     * @author Mate Thurzo
048     * @author Raymond Aug??
049     */
050    public class SubscriptionPermissionImpl implements SubscriptionPermission {
051    
052            /**
053             * @deprecated As of 6.2.0, replaced by {@link #check(PermissionChecker,
054             *             String, long, String, long)}
055             */
056            @Override
057            public void check(
058                            PermissionChecker permissionChecker, String className, long classPK)
059                    throws PortalException, SystemException {
060    
061                    check(permissionChecker, className, classPK, null, 0);
062            }
063    
064            @Override
065            public void check(
066                            PermissionChecker permissionChecker, String subscriptionClassName,
067                            long subscriptionClassPK, String inferredClassName,
068                            long inferredClassPK)
069                    throws PortalException, SystemException {
070    
071                    if (!contains(
072                                    permissionChecker, subscriptionClassName, subscriptionClassPK,
073                                    inferredClassName, inferredClassPK)) {
074    
075                            throw new PrincipalException();
076                    }
077            }
078    
079            /**
080             * @deprecated As of 6.2.0, replaced by {@link #contains(PermissionChecker,
081             *             String, long, String, long)}
082             */
083            @Override
084            public boolean contains(
085                            PermissionChecker permissionChecker, String className, long classPK)
086                    throws PortalException, SystemException {
087    
088                    return contains(permissionChecker, className, classPK, null, 0);
089            }
090    
091            @Override
092            public boolean contains(
093                            PermissionChecker permissionChecker, String subscriptionClassName,
094                            long subscriptionClassPK, String inferredClassName,
095                            long inferredClassPK)
096                    throws PortalException, SystemException {
097    
098                    if (subscriptionClassName == null) {
099                            return false;
100                    }
101    
102                    try {
103                            MBDiscussionLocalServiceUtil.getDiscussion(
104                                    subscriptionClassName, subscriptionClassPK);
105    
106                            return true;
107                    }
108                    catch (NoSuchDiscussionException nsde) {
109                    }
110    
111                    if (Validator.isNotNull(inferredClassName)) {
112                            Boolean hasPermission = hasPermission(
113                                    permissionChecker, inferredClassName, inferredClassPK,
114                                    ActionKeys.VIEW);
115    
116                            if ((hasPermission == null) || !hasPermission) {
117                                    return false;
118                            }
119                    }
120    
121                    Boolean hasPermission = hasPermission(
122                            permissionChecker, subscriptionClassName, subscriptionClassPK,
123                            ActionKeys.SUBSCRIBE);
124    
125                    if (hasPermission != null) {
126                            return hasPermission;
127                    }
128    
129                    return true;
130            }
131    
132            protected Boolean hasPermission(
133                            PermissionChecker permissionChecker, String className, long classPK,
134                            String actionId)
135                    throws PortalException, SystemException {
136    
137                    if (className.equals(BlogsEntry.class.getName())) {
138                            return BlogsPermission.contains(
139                                    permissionChecker, classPK, actionId);
140                    }
141                    else if (className.equals(BookmarksEntry.class.getName())) {
142                            return BookmarksEntryPermission.contains(
143                                    permissionChecker, classPK, actionId);
144                    }
145                    else if (className.equals(DLFileEntry.class.getName())) {
146                            return DLFileEntryPermission.contains(
147                                    permissionChecker, classPK, actionId);
148                    }
149                    else if (className.equals(JournalArticle.class.getName())) {
150                            return JournalPermission.contains(
151                                    permissionChecker, classPK, actionId);
152                    }
153                    else if (className.equals(MBCategory.class.getName())) {
154                            Group group = GroupLocalServiceUtil.fetchGroup(classPK);
155    
156                            if (group == null) {
157                                    return MBCategoryPermission.contains(
158                                            permissionChecker, classPK, actionId);
159                            }
160    
161                            return MBPermission.contains(permissionChecker, classPK, actionId);
162                    }
163                    else if (className.equals(MBThread.class.getName())) {
164                            MBThread mbThread = MBThreadLocalServiceUtil.fetchThread(classPK);
165    
166                            if (mbThread == null) {
167                                    return false;
168                            }
169    
170                            return MBMessagePermission.contains(
171                                    permissionChecker, mbThread.getRootMessageId(), actionId);
172                    }
173                    else if (className.equals(WikiNode.class.getName())) {
174                            return WikiNodePermission.contains(
175                                    permissionChecker, classPK, actionId);
176                    }
177                    else if (className.equals(WikiPage.class.getName())) {
178                            return WikiPagePermission.contains(
179                                    permissionChecker, classPK, actionId);
180                    }
181    
182                    return null;
183            }
184    
185    }