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.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    /**
043     * @author Mate Thurzo
044     * @author Raymond Aug??
045     */
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    }