/** * Koya is an alfresco module that provides a corporate orientated dataroom. * * Copyright (C) Itl Developpement 2014 * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see `<http://www.gnu.org/licenses/>`. */ package fr.itldev.koya.services.impl; import java.io.Serializable; import java.util.List; import org.codehaus.jackson.type.TypeReference; import fr.itldev.koya.model.KoyaNode; import fr.itldev.koya.model.Permissions; import fr.itldev.koya.model.impl.Company; import fr.itldev.koya.model.impl.Space; import fr.itldev.koya.model.impl.User; import fr.itldev.koya.model.impl.UserConnection; import fr.itldev.koya.model.impl.UserRole; import fr.itldev.koya.model.permissions.KoyaPermission; import fr.itldev.koya.model.permissions.KoyaPermissionCollaborator; import fr.itldev.koya.services.SecuService; import fr.itldev.koya.services.cache.CacheManager; import fr.itldev.koya.services.exceptions.AlfrescoServiceException; public class SecuServiceImpl extends AlfrescoRestService implements SecuService, Serializable { /** * */ private static final long serialVersionUID = 1L; private static final String REST_GET_AVAILABLEROLES = "/s/fr/itldev/koya/security/roles/{nodeId}?alf_ticket={alf_ticket}"; private static final String REST_GET_USERROLE = "/s/fr/itldev/koya/security/role/{userName}?nodeId={nodeId}&alf_ticket={alf_ticket}"; private static final String REST_GET_SETUSERROLE = "/s/fr/itldev/koya/user/setrole/{companyName}/{userName}/{roleName}?alf_ticket={alf_ticket}"; private static final String REST_GET_LISTUSERCONNECTIONS = "/s/fr/itldev/koya/user/listconnect/{userName}?" + "companiesFilter={companiesFilter}&maxResults={maxResults}&alf_ticket={alf_ticket}"; private static final String REST_GET_REVOKEUSERACCESS = "/s/fr/itldev/koya/user/revoke/{companyName}/{userName}?alf_ticket={alf_ticket}"; private static final String REST_GET_ISCOMPANYMANAGER = "/s/fr/itldev/koya/company/ismanager/{companyName}?alf_ticket={alf_ticket}"; private static final String REST_GET_PERMISSIONS = "/s/fr/itldev/koya/global/secu/permissions/{nodeRef}?alf_ticket={alf_ticket}"; public static final String REST_GET_LISTMEMBERSHIP = "/s/fr/itldev/koya/security/membership/{rolename}/{noderef}?alf_ticket={alf_ticket}"; public static final String REST_GET_LISTSPACESACCESS = "/s/fr/itldev/koya/security/listspacesaccess/{userName}/{companyName}/{roleName}?alf_ticket={alf_ticket}"; private CacheManager cacheManager; public void setCacheManager(CacheManager cacheManager) { this.cacheManager = cacheManager; } @Override public List<UserRole> listAvailableRoles(User userLogged, KoyaNode k) throws AlfrescoServiceException { return fromJSON(new TypeReference<List<UserRole>>() { }, getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_AVAILABLEROLES, String.class, k.getNodeRef().getId(), userLogged.getTicketAlfresco())); } @Override public UserRole getUserRole(User userLogged, KoyaNode k, User userToGetRole) throws AlfrescoServiceException { return fromJSON(new TypeReference<UserRole>() { }, getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_USERROLE, String.class, userToGetRole.getUserName(),k.getNodeRef().getId(), userLogged.getTicketAlfresco())); } @Override public void setUserRole(User userLogged, Company c, String userNameSetRole, String roleName) throws AlfrescoServiceException { getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_SETUSERROLE, String.class, c.getName(), userNameSetRole, roleName, userLogged.getTicketAlfresco()); } /** * * @param userLogged * @param userToGetConnections * @param companyFilter * @param maxResults * @return * @throws AlfrescoServiceException */ @Override public List<UserConnection> listUserConnections(User userLogged, User userToGetConnections, List<Company> companyFilter, Integer maxResults) throws AlfrescoServiceException { String companiesFilter = ""; String maxRes = ""; if (companyFilter != null && companyFilter.size() > 0) { String sep = ""; for (Company c : companyFilter) { companiesFilter += sep + c.getName(); sep = ","; } } if (maxResults != null && maxResults > 0) { maxRes = maxResults.toString(); } return fromJSON(new TypeReference<List<UserConnection>>() { }, getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_LISTUSERCONNECTIONS, String.class, userToGetConnections.getUserName(), companiesFilter, maxRes, userLogged.getTicketAlfresco())); } /** * revoke all user Acces on specified company. * * @param userLogged * @param c * @param u * @throws AlfrescoServiceException */ @Override public void revokeAccess(User userLogged, Company c, User u) throws AlfrescoServiceException { getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_REVOKEUSERACCESS, String.class, c.getName(), u.getUserName(), userLogged.getTicketAlfresco()); } /** * Checks if user logged is company manager. * * @param userLogged * @param c * @return * @throws AlfrescoServiceException */ @Override public Boolean isCompanyManager(User userLogged, Company c) throws AlfrescoServiceException { if (c == null) { return false; } Boolean isManager = cacheManager.getIsManager(userLogged, c); if (isManager != null) { return isManager; } isManager = getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_ISCOMPANYMANAGER, Boolean.class, c.getName(), userLogged.getTicketAlfresco()); cacheManager.setIsManager(userLogged, c, isManager); return isManager; } /** * Get permissions on defined secured Item * * @param user * @param s * @return * @throws AlfrescoServiceException */ @Override public Permissions getPermissions(User user, KoyaNode s) throws AlfrescoServiceException { if (s == null) { return null; } Permissions p = cacheManager.getPermission(user, s.getNodeRef()); if (p != null) { return p; } p = fromJSON(new TypeReference<Permissions>() { }, getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_PERMISSIONS, String.class, s.getNodeRef(), user.getTicketAlfresco())); cacheManager.setPermission(user, s.getNodeRef(), p); return p; } /** * List all users member of KoyaResponsibles Group on Space. * * @param user * @param dossier * @return * @throws AlfrescoServiceException */ @Override public List<User> listResponsibles(User user, Space space) throws AlfrescoServiceException { return listUsers(user, space, KoyaPermissionCollaborator.RESPONSIBLE); } /** * List all users member of KoyaMember Group on Space. * * @param user * @param dossier * @return * @throws AlfrescoServiceException */ @Override public List<User> listMembers(User user, Space space) throws AlfrescoServiceException { return listUsers(user, space, KoyaPermissionCollaborator.MEMBER); } protected List<User> listUsers(User user, KoyaNode item, KoyaPermission permission) throws AlfrescoServiceException { return fromJSON(new TypeReference<List<User>>() { }, getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_LISTMEMBERSHIP, String.class, permission, item.getNodeRef(), user.getTicketAlfresco())); } /** * List all spaces a user can access with given permission in company * context * * @param user * @param checked * @param company * @param permission * @return * @throws AlfrescoServiceException */ @Override public List<Space> listSpacesAccess(User user, User checked, Company company, KoyaPermission permission) throws AlfrescoServiceException { return fromJSON(new TypeReference<List<Space>>() { }, getTemplate().getForObject(getAlfrescoServerUrl() + REST_GET_LISTSPACESACCESS, String.class, checked.getUserName(), company.getName(), permission.toString(), user.getTicketAlfresco())); } }