001/*
002 *  Copyright 2018 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.plugins.workspaces.wall;
017
018import java.util.ArrayList;
019import java.util.Arrays;
020import java.util.HashMap;
021import java.util.List;
022import java.util.Map;
023import java.util.Set;
024
025import org.apache.avalon.framework.service.ServiceException;
026import org.apache.avalon.framework.service.ServiceManager;
027import org.apache.avalon.framework.service.Serviceable;
028import org.apache.commons.collections.MapUtils;
029
030import org.ametys.cms.contenttype.ContentTypesHelper;
031import org.ametys.cms.repository.Content;
032import org.ametys.core.group.GroupIdentity;
033import org.ametys.core.right.AccessController;
034import org.ametys.core.right.AccessControllerExtensionPoint;
035import org.ametys.core.user.UserIdentity;
036import org.ametys.plugins.workspaces.project.ProjectManager;
037import org.ametys.plugins.workspaces.project.objects.Project;
038import org.ametys.plugins.workspaces.project.rights.ProjectAccessController;
039import org.ametys.web.repository.content.WebContent;
040
041/**
042 * {@link AccessController} for a wall content
043 *
044 */
045public class WallContentAccessController implements AccessController, Serviceable
046{
047    private static final String _EDIT_SUPER_RIGHT = "Plugins_Workspaces_Right_Edit_WallContent";
048    private static final String _DELETE_SUPER_RIGHT = "Plugins_Workspaces_Right_Delete_WallContent";
049    private static final String _PIN_SUPER_RIGHT = "Plugins_Workspaces_Right_Pin_WallContent";
050    
051    private static final String __FO_EDITION_RIGHT_ID = "Front_Edition_Access_Right";
052    private static final String __BO_EDITION_RIGHT_ID = "Workflow_Rights_Edition_Online";
053    private static final String __DELETION_RIGHT_ID = "CMS_Rights_DeleteContent";
054    
055    private static final List<String> __AUTHOR_RIGHTS = Arrays.asList(__FO_EDITION_RIGHT_ID, __BO_EDITION_RIGHT_ID, __DELETION_RIGHT_ID);
056    private static final List<String> __KNOWN_RIGHTS = Arrays.asList(__FO_EDITION_RIGHT_ID, __BO_EDITION_RIGHT_ID, __DELETION_RIGHT_ID, _EDIT_SUPER_RIGHT, _DELETE_SUPER_RIGHT, _PIN_SUPER_RIGHT);
057    
058    private ContentTypesHelper _cTypeHelper;
059    private ProjectManager _projectManager;
060    private AccessControllerExtensionPoint _accessControllerExtensionPoint;
061    
062    private AccessController _projectAccessController;
063    private AccessController _workspaceAccessController;
064    
065    public void service(ServiceManager smanager) throws ServiceException
066    {
067        _cTypeHelper = (ContentTypesHelper) smanager.lookup(ContentTypesHelper.ROLE);
068        _projectManager = (ProjectManager) smanager.lookup(ProjectManager.ROLE);
069        _accessControllerExtensionPoint = (AccessControllerExtensionPoint) smanager.lookup(AccessControllerExtensionPoint.ROLE);
070    }
071    
072    public boolean isSupported(Object object)
073    {
074        return object instanceof WebContent && _cTypeHelper.isInstanceOf((WebContent) object, WallContentManager.WALL_CONTENT_CONTENT_TYPE_ID);
075    }
076    
077    private AccessController _getProjectAccessController()
078    {
079        if (_projectAccessController == null)
080        {
081            _projectAccessController = _accessControllerExtensionPoint.getExtension(ProjectAccessController.class.getName());
082        }
083        return _projectAccessController;
084    }
085    
086    private AccessController _getWorkspaceAccessController()
087    {
088        if (_workspaceAccessController == null)
089        {
090            _workspaceAccessController = _accessControllerExtensionPoint.getExtension("workspace");
091        }
092        return _workspaceAccessController;
093    }
094    
095    public AccessResult getPermission(UserIdentity user, Set<GroupIdentity> userGroups, String rightId, Object object)
096    {
097        if (((Content) object).getCreator().equals(user))
098        {
099            return __AUTHOR_RIGHTS.contains(rightId) ? AccessResult.USER_ALLOWED : AccessResult.UNKNOWN;
100        }
101        else if (__KNOWN_RIGHTS.contains(rightId))
102        {
103            return _getWorkspaceAccessController().getPermission(user, userGroups, _convertRightToSuperRight(rightId), "/cms/" + ((WebContent) object).getSiteName());
104        }
105        
106        return AccessResult.UNKNOWN;
107    }
108    
109    private String _convertRightToSuperRight(String rightId)
110    {
111        if (__DELETION_RIGHT_ID.equals(rightId))
112        {
113            return _DELETE_SUPER_RIGHT;
114        }
115        else if (__FO_EDITION_RIGHT_ID.equals(rightId) || __BO_EDITION_RIGHT_ID.equals(rightId))
116        {
117            return _EDIT_SUPER_RIGHT;
118        }
119        return rightId;
120    }
121
122    public AccessResult getReadAccessPermission(UserIdentity user, Set<GroupIdentity> userGroups, Object object)
123    {
124        List<Project> projects = _getProjects(object);
125        for (Project project : projects)
126        {
127            if (_getProjectAccessController().getReadAccessPermission(user, userGroups, project) == AccessResult.USER_ALLOWED)
128            {
129                return AccessResult.USER_ALLOWED;
130            }
131        }
132        return AccessResult.UNKNOWN;
133    }
134
135    public Map<String, AccessResult> getPermissionByRight(UserIdentity user, Set<GroupIdentity> userGroups, Object object)
136    {
137        Map<String, AccessResult> permissionByRight = new HashMap<>();
138        
139        if (((Content) object).getCreator().equals(user))
140        {
141            permissionByRight.put(__BO_EDITION_RIGHT_ID, AccessResult.USER_ALLOWED);
142            permissionByRight.put(__BO_EDITION_RIGHT_ID, AccessResult.USER_ALLOWED);
143            permissionByRight.put(__DELETION_RIGHT_ID, AccessResult.USER_ALLOWED);
144        }
145        
146        return permissionByRight;
147    }
148
149    public AccessResult getPermissionForAnonymous(String rightId, Object object)
150    {
151        return AccessResult.UNKNOWN;
152    }
153
154    public AccessResult getReadAccessPermissionForAnonymous(Object object)
155    {
156        return AccessResult.UNKNOWN;
157    }
158
159    public AccessResult getPermissionForAnyConnectedUser(String rightId, Object object)
160    {
161        return AccessResult.UNKNOWN;
162    }
163
164    public AccessResult getReadAccessPermissionForAnyConnectedUser(Object object)
165    {
166        return AccessResult.UNKNOWN;
167    }
168
169    public Map<UserIdentity, AccessResult> getPermissionByUser(String rightId, Object object)
170    {
171        Map<UserIdentity, AccessResult> permissionByUser = new HashMap<>();
172        
173        if (__AUTHOR_RIGHTS.contains(rightId))
174        {
175            permissionByUser.put(((Content) object).getCreator(), AccessResult.USER_ALLOWED);
176        }
177        return permissionByUser;
178    }
179
180    public Map<UserIdentity, AccessResult> getReadAccessPermissionByUser(Object object)
181    {
182        Map<UserIdentity, AccessResult> permissionByUser = new HashMap<>();
183        
184        List<Project> projects = _getProjects(object);
185        for (Project project : projects)
186        {
187            permissionByUser.putAll(_getProjectAccessController().getReadAccessPermissionByUser(project));
188        }
189        
190        return permissionByUser;
191    }
192
193    public Map<GroupIdentity, AccessResult> getPermissionByGroup(String rightId, Object object)
194    {
195        return MapUtils.EMPTY_MAP;
196    }
197
198    public Map<GroupIdentity, AccessResult> getReadAccessPermissionByGroup(Object object)
199    {
200        Map<GroupIdentity, AccessResult> permissionByGroup = new HashMap<>();
201        
202        List<Project> projects = _getProjects(object);
203        for (Project project : projects)
204        {
205            permissionByGroup.putAll(_getProjectAccessController().getReadAccessPermissionByGroup(project));
206        }
207        
208        return permissionByGroup;
209    }
210
211    public boolean hasUserAnyPermissionOnWorkspace(Set<Object> workspacesContexts, UserIdentity user, Set<GroupIdentity> userGroups, String rightId)
212    {
213        return false;
214    }
215
216    public boolean hasUserAnyReadAccessPermissionOnWorkspace(Set<Object> workspacesContexts, UserIdentity user, Set<GroupIdentity> userGroups)
217    {
218        return false;
219    }
220
221    public boolean hasAnonymousAnyPermissionOnWorkspace(Set<Object> workspacesContexts, String rightId)
222    {
223        return false;
224    }
225
226    public boolean hasAnonymousAnyReadAccessPermissionOnWorkspace(Set<Object> workspacesContexts)
227    {
228        return false;
229    }
230
231    public boolean hasAnyConnectedUserAnyPermissionOnWorkspace(Set<Object> workspacesContexts, String rightId)
232    {
233        return false;
234    }
235
236    public boolean hasAnyConnectedUserAnyReadAccessPermissionOnWorkspace(Set<Object> workspacesContexts)
237    {
238        return false;
239    }
240    
241    private List<Project> _getProjects(Object object)
242    {
243        if (object instanceof WebContent && _cTypeHelper.isInstanceOf((WebContent) object, WallContentManager.WALL_CONTENT_CONTENT_TYPE_ID))
244        {
245            // Find project
246            return _projectManager.getProjectsForSite(((WebContent) object).getSite());
247        }
248        
249        return new ArrayList<>();
250    }
251
252}