/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * 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 Lesser General Public License for more details. * * Copyright 2010 Pentaho Corporation. All rights reserved. */ package org.pentaho.platform.engine.security.userroledao.ws; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.jws.WebService; import org.pentaho.platform.engine.core.system.PentahoSessionHolder; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.engine.security.SecurityHelper; import org.pentaho.platform.engine.security.userroledao.IPentahoRole; import org.pentaho.platform.engine.security.userroledao.IPentahoUser; import org.pentaho.platform.engine.security.userroledao.IUserRoleDao; import org.pentaho.platform.engine.security.userroledao.PentahoRole; import org.pentaho.platform.engine.security.userroledao.messages.Messages; /** * This class implements a concrete form of IUserRoleDao, wrapping the underlying IUserRoleDao implementation. * * @author Will Gorman (wgorman@pentaho.com) */ @WebService(endpointInterface = "org.pentaho.platform.engine.security.userroledao.ws.IUserRoleWebService", name = "UserRoleWebService", portName = "UserRoleWebServicePort", targetNamespace = "http://www.pentaho.org/ws/1.0") public class UserRoleWebService implements IUserRoleWebService { public UserRoleWebService() {} protected boolean isAdmin() { return SecurityHelper.isPentahoAdministrator(PentahoSessionHolder.getSession()); } protected IUserRoleDao getDao() throws UserRoleException { if (!isAdmin()) { throw new UserRoleException(Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0001_NOT_ADMIN")); //$NON-NLS-1$ } IUserRoleDao dao = PentahoSystem.get(IUserRoleDao.class, "userRoleDao", PentahoSessionHolder.getSession()); //$NON-NLS-1$ if (dao == null) { throw new UserRoleException(Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0002_IUSERROLEDAO_NOT_AVAILABLE")); //$NON-NLS-1$ } return dao; } @SuppressWarnings("unchecked") public UserRoleSecurityInfo getUserRoleSecurityInfo() throws UserRoleException { UserRoleSecurityInfo userRoleSecurityInfo = new UserRoleSecurityInfo(); List<IPentahoUser> users = getDao().getUsers(); if (users != null) { for (IPentahoUser user : users) { userRoleSecurityInfo.getUsers().add(ProxyPentahoUserRoleHelper.toProxyUser(user)); Set<IPentahoRole> roles = user.getRoles(); if (roles != null) { for (IPentahoRole role : roles) { userRoleSecurityInfo.getAssignments().add(new UserToRoleAssignment(user.getUsername(), role.getName())); } } } } userRoleSecurityInfo.getRoles().addAll(Arrays.asList(getRoles())); // add default roles List<ProxyPentahoRole> defaultRoles = new ArrayList<ProxyPentahoRole>(); List<String> defaultRoleStrings = PentahoSystem.get(List.class, "defaultRolesList", PentahoSessionHolder.getSession()); //$NON-NLS-1$ if (defaultRoleStrings != null) { for (String defaultRoleString : defaultRoleStrings) { defaultRoles.add(new ProxyPentahoRole(defaultRoleString)); } } userRoleSecurityInfo.getDefaultRoles().addAll(defaultRoles); return userRoleSecurityInfo; } // ~ User/Role Methods =============================================================================================== public boolean createUser(ProxyPentahoUser proxyUser) throws UserRoleException { IPentahoUser user = ProxyPentahoUserRoleHelper.syncUsers(null, proxyUser); getDao().createUser(user); return true; } public boolean deleteUsers(ProxyPentahoUser[] users) throws UserRoleException { IPentahoUser[] persistedUsers = new IPentahoUser[users.length]; for (int i = 0; i < users.length; i++) { persistedUsers[i] = getDao().getUser(users[i].getName()); if (persistedUsers[i] == null) { throw new UserRoleException(Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0003_USER_DELETION_FAILED_NO_USER", users[i].getName())); //$NON-NLS-1$ } } for (int i = 0; i < persistedUsers.length; i++) { getDao().deleteUser(persistedUsers[i]); } return true; } public ProxyPentahoUser getUser(String pUserName) throws UserRoleException { ProxyPentahoUser proxyPentahoUser = null; IPentahoUser user = getDao().getUser(pUserName); if (user != null) { proxyPentahoUser = ProxyPentahoUserRoleHelper.toProxyUser(user); } return proxyPentahoUser; } public ProxyPentahoUser[] getUsers() throws UserRoleException { List<IPentahoUser> users = getDao().getUsers(); if (users != null) { ProxyPentahoUser[] proxyUsers = new ProxyPentahoUser[users.size()]; int i = 0; for (IPentahoUser user : users) { proxyUsers[i++] = ProxyPentahoUserRoleHelper.toProxyUser(user); } return proxyUsers; } return null; } public ProxyPentahoUser[] getUsersForRole(ProxyPentahoRole proxyRole) throws UserRoleException { ArrayList<ProxyPentahoUser> users = new ArrayList<ProxyPentahoUser>(); IPentahoRole role = getDao().getRole(proxyRole.getName()); if (role != null && role.getUsers() != null) { for (IPentahoUser user : role.getUsers()) { users.add(ProxyPentahoUserRoleHelper.toProxyUser(user)); } } else { throw new UserRoleException(Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0005_FAILED_TO_FIND_ROLE", proxyRole.getName())); //$NON-NLS-1$ } return users.toArray(new ProxyPentahoUser[0]); } public boolean updateUser(ProxyPentahoUser proxyUser) throws UserRoleException { IPentahoUser user = getDao().getUser(proxyUser.getName()); if (user == null) { throw new UserRoleException(Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0004_FAILED_TO_FIND_USER", proxyUser.getName())); //$NON-NLS-1$ } getDao().updateUser(ProxyPentahoUserRoleHelper.syncUsers(user, proxyUser)); return true; } public void setRoles(ProxyPentahoUser proxyUser, ProxyPentahoRole[] assignedRoles) throws UserRoleException { IPentahoUser user = getDao().getUser( proxyUser.getName() ); if (user == null) { throw new UserRoleException(Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0004_FAILED_TO_FIND_USER", proxyUser.getName())); //$NON-NLS-1$ } Set<IPentahoRole> rolesToSet = new HashSet<IPentahoRole>(); for (ProxyPentahoRole proxyRole : assignedRoles) { rolesToSet.add(ProxyPentahoUserRoleHelper.syncRoles(null, proxyRole)); } user.setRoles(rolesToSet); getDao().updateUser(user); } public void setUsers( ProxyPentahoRole proxyRole, ProxyPentahoUser[] assignedUsers ) throws UserRoleException { IPentahoRole role = getDao().getRole(proxyRole.getName()); if (role == null) { throw new UserRoleException(Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0005_FAILED_TO_FIND_ROLE", proxyRole.getName() )); //$NON-NLS-1$ } Set<IPentahoUser> usersToSet = new HashSet<IPentahoUser>(); for (ProxyPentahoUser proxyUser : assignedUsers) { usersToSet.add(ProxyPentahoUserRoleHelper.syncUsers(null, proxyUser)); } role.setUsers(usersToSet); getDao().updateRole(role); } public void updateRole(String roleName, String description, List<String> usernames) throws UserRoleException { IPentahoRole role = getDao().getRole(roleName); if (role == null) { throw new UserRoleException(Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0006_ROLE_UPDATE_FAILED", roleName)); //$NON-NLS-1$ } Set<IPentahoUser> users = new HashSet<IPentahoUser>(); for (String username : usernames) { IPentahoUser user = getDao().getUser(username); if (user == null) { throw new UserRoleException(Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0006_ROLE_UPDATE_FAILED", roleName)); //$NON-NLS-1$ } users.add(user); } role.setDescription(description); role.setUsers(users); getDao().updateRole(role); } public boolean createRole(ProxyPentahoRole proxyRole) throws UserRoleException { IPentahoRole role = new PentahoRole(proxyRole.getName()); getDao().createRole(ProxyPentahoUserRoleHelper.syncRoles(role, proxyRole)); return false; } public boolean deleteRoles(ProxyPentahoRole[] roles) throws UserRoleException { IPentahoRole[] persistedRoles; persistedRoles = new IPentahoRole[roles.length]; for (int i = 0; i < roles.length; i++) { persistedRoles[i] = getDao().getRole(roles[i].getName()); if (persistedRoles[i] == null) { throw new UserRoleException( Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0007_ROLE_DELETION_FAILED_NO_ROLE", roles[i].getName() ) ); //$NON-NLS-1$ } } for (int i = 0; i < persistedRoles.length; i++) { getDao().deleteRole( persistedRoles[i] ); } return true; } public ProxyPentahoRole[] getRolesForUser(ProxyPentahoUser proxyUser) throws UserRoleException { List<ProxyPentahoRole> proxyRoles = new ArrayList<ProxyPentahoRole>(); IPentahoUser user = getDao().getUser( proxyUser.getName()); if (user != null && user.getRoles() != null) { for (IPentahoRole role : user.getRoles()) { proxyRoles.add(ProxyPentahoUserRoleHelper.toProxyRole(role)); } } else { throw new UserRoleException(Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0004_FAILED_TO_FIND_USER", proxyUser.getName() )); //$NON-NLS-1$ } return proxyRoles.toArray(new ProxyPentahoRole[0]); } public ProxyPentahoRole[] getRoles() throws UserRoleException { List<ProxyPentahoRole> proxyRoles = new ArrayList<ProxyPentahoRole>(); List<IPentahoRole> roles = getDao().getRoles(); if (roles != null) { for (IPentahoRole role : roles) { proxyRoles.add(ProxyPentahoUserRoleHelper.toProxyRole(role)); } } return proxyRoles.toArray(new ProxyPentahoRole[0]); } public boolean updateRoleObject(ProxyPentahoRole proxyPentahoRole) throws UserRoleException { IPentahoRole role = getDao().getRole(proxyPentahoRole.getName()); if (role == null) { throw new UserRoleException( Messages.getInstance().getErrorString("UserRoleWebService.ERROR_0008_ROLE_UPDATE_FAILED_DOES_NOT_EXIST", proxyPentahoRole.getName()) ); //$NON-NLS-1$ } getDao().updateRole(ProxyPentahoUserRoleHelper.syncRoles(role, proxyPentahoRole)); return true; } }