/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License, version 2 as published by the Free Software * Foundation. * * You should have received a copy of the GNU General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.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 General Public License for more details. * * * Copyright 2006 - 2013 Pentaho Corporation. All rights reserved. */ package org.pentaho.test.mock; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import org.pentaho.platform.api.engine.IPentahoSession; import org.pentaho.platform.api.engine.security.userroledao.AlreadyExistsException; import org.pentaho.platform.api.engine.security.userroledao.IPentahoRole; import org.pentaho.platform.api.engine.security.userroledao.IPentahoUser; import org.pentaho.platform.api.engine.security.userroledao.IUserRoleDao; import org.pentaho.platform.api.engine.security.userroledao.NotFoundException; import org.pentaho.platform.api.engine.security.userroledao.UncategorizedUserRoleDaoException; import org.pentaho.platform.api.mt.ITenant; import org.pentaho.platform.api.mt.ITenantedPrincipleNameResolver; import org.pentaho.platform.api.repository2.unified.RepositoryFile; import org.pentaho.platform.core.mt.Tenant; import org.pentaho.platform.engine.core.system.PentahoSessionHolder; public class MockUserRoleDao implements IUserRoleDao { HashSet<ITenant> tenants = new HashSet<ITenant>(); HashMap<ITenant, HashSet<IPentahoUser>> tenantUsers = new HashMap<ITenant, HashSet<IPentahoUser>>(); HashMap<ITenant, HashSet<IPentahoRole>> tenantRoles = new HashMap<ITenant, HashSet<IPentahoRole>>(); HashMap<IPentahoUser, HashSet<IPentahoRole>> userRoles = new HashMap<IPentahoUser, HashSet<IPentahoRole>>(); HashMap<IPentahoRole, HashSet<IPentahoUser>> roleMembers = new HashMap<IPentahoRole, HashSet<IPentahoUser>>(); protected ITenantedPrincipleNameResolver userNameResolver; protected ITenantedPrincipleNameResolver roleNameResolver; protected String authenticatedRoleName; public MockUserRoleDao( ITenantedPrincipleNameResolver userNameResolver, ITenantedPrincipleNameResolver roleNameResolver, String authenticatedRoleName ) { this.userNameResolver = userNameResolver; this.roleNameResolver = roleNameResolver; this.authenticatedRoleName = authenticatedRoleName; } private void addTenant( ITenant tenant ) { if ( !tenants.contains( tenant ) ) { tenants.add( tenant ); tenantUsers.put( tenant, new HashSet<IPentahoUser>() ); tenantRoles.put( tenant, new HashSet<IPentahoRole>() ); //createRole( tenant, authenticatedRoleName, "", new String[0] ); } } public IPentahoRole createRole( ITenant tenant, String roleName, String description, String[] memberUserNames ) throws AlreadyExistsException, UncategorizedUserRoleDaoException { if ( tenant == null ) { tenant = getTenant( roleName, false ); roleName = getPrincipalName( roleName, false ); } if ( tenant == null || tenant.getId() == null ) { tenant = getCurrentTenant(); } addTenant( tenant ); MockPentahoRole role = null; HashSet<IPentahoRole> set = tenantRoles.get( tenant ); if ( set != null ) { for ( IPentahoRole iRole : set ) { if ( iRole.getName() == roleName ) { role = (MockPentahoRole) iRole; } } } if ( role == null ) { role = new MockPentahoRole( tenant, roleName, description ); } if ( !tenantRoles.get( tenant ).contains( role ) ) { tenantRoles.get( tenant ).add( role ); roleMembers.put( role, new HashSet<IPentahoUser>() ); } else { throw new AlreadyExistsException( roleName.toString() ); } setRoleMembers( tenant, roleName, memberUserNames ); return role; } public IPentahoUser createUser( ITenant tenant, String username, String password, String description, String[] roles ) throws AlreadyExistsException, UncategorizedUserRoleDaoException { if ( tenant == null ) { tenant = getTenant( username, true ); username = getPrincipalName( username, true ); } if ( tenant == null || tenant.getId() == null ) { tenant = getCurrentTenant(); } addTenant( tenant ); //TODO: Same logic as role MockPentahoUser user = new MockPentahoUser( tenant, username, password, description, true ); if ( !tenantUsers.get( tenant ).contains( user ) ) { tenantUsers.get( tenant ).add( user ); userRoles.put( user, new HashSet<IPentahoRole>() ); } else { throw new AlreadyExistsException( username ); } setUserRoles( tenant, username, roles ); return user; } public RepositoryFile createUserHomeFolder( ITenant tenant, String arg1 ) { throw new UnsupportedOperationException(); } public void deleteRole( IPentahoRole role ) throws NotFoundException, UncategorizedUserRoleDaoException { boolean removed = tenantRoles.get( role.getTenant() ).remove( role ); roleMembers.remove( role ); for ( HashSet<IPentahoRole> roles : userRoles.values() ) { roles.remove( role ); } if ( !removed ) { throw new NotFoundException( role.getName() ); } } public void deleteUser( IPentahoUser user ) throws NotFoundException, UncategorizedUserRoleDaoException { boolean removed = tenantUsers.get( user.getTenant() ).remove( user ); userRoles.remove( user ); for ( HashSet<IPentahoUser> users : roleMembers.values() ) { users.remove( user ); } if ( !removed ) { throw new NotFoundException( user.getUsername() ); } } public IPentahoRole getRole( ITenant tenant, String roleName ) throws UncategorizedUserRoleDaoException { if ( tenant == null ) { tenant = getTenant( roleName, false ); roleName = getPrincipalName( roleName, false ); } if ( tenant == null || tenant.getId() == null ) { tenant = getCurrentTenant(); } HashSet<IPentahoRole> roles = tenantRoles.get( tenant ); if ( roles != null ) { for ( IPentahoRole role : roles ) { if ( role.getName().equals( roleName ) ) { return role; } } } return null; } public List<IPentahoUser> getRoleMembers( ITenant tenant, String roleName ) throws UncategorizedUserRoleDaoException { if ( tenant == null ) { tenant = getTenant( roleName, false ); roleName = getPrincipalName( roleName, false ); } if ( tenant == null || tenant.getId() == null ) { tenant = getCurrentTenant(); } IPentahoRole role = getRole( tenant, roleName ); return Collections.list( Collections.enumeration( roleMembers.get( role ) ) ); } public List<IPentahoRole> getRoles() throws UncategorizedUserRoleDaoException { return getRoles( getCurrentTenant() ); } public List<IPentahoRole> getRoles( ITenant tenant, boolean includeSubTenants ) throws UncategorizedUserRoleDaoException { ArrayList<IPentahoRole> roles = new ArrayList<IPentahoRole>(); roles.addAll( getRoles( tenant ) ); if ( includeSubTenants ) { for ( ITenant tmpTenant : tenants ) { if ( tmpTenant.getRootFolderAbsolutePath().startsWith( tenant.getRootFolderAbsolutePath() + "/", 0 ) ) { roles.addAll( getRoles( tmpTenant ) ); } } } return roles; } public List<IPentahoRole> getRoles( ITenant tenant ) throws UncategorizedUserRoleDaoException { return Collections.list( Collections.enumeration( tenantRoles.get( tenant ) ) ); } public IPentahoUser getUser( ITenant tenant, String userName ) throws UncategorizedUserRoleDaoException { if ( tenant == null ) { tenant = getTenant( userName, true ); userName = getPrincipalName( userName, true ); } if ( tenant == null || tenant.getId() == null ) { tenant = getCurrentTenant(); } HashSet<IPentahoUser> users = tenantUsers.get( tenant ); if ( users != null ) { for ( IPentahoUser user : users ) { if ( user.getUsername().equals( userName ) ) { return user; } } } return null; } public List<IPentahoRole> getUserRoles( ITenant tenant, String userName ) throws UncategorizedUserRoleDaoException { if ( tenant == null ) { tenant = getTenant( userName, true ); userName = getPrincipalName( userName, true ); } if ( tenant == null || tenant.getId() == null ) { tenant = getCurrentTenant(); } IPentahoUser user = getUser( tenant, userName ); return Collections.list( Collections.enumeration( userRoles.get( user ) ) ); } public List<IPentahoUser> getUsers() throws UncategorizedUserRoleDaoException { return getUsers( getCurrentTenant() ); } public List<IPentahoUser> getUsers( ITenant tenant, boolean includeSubTenants ) throws UncategorizedUserRoleDaoException { ArrayList<IPentahoUser> users = new ArrayList<IPentahoUser>(); users.addAll( getUsers( tenant ) ); if ( includeSubTenants ) { for ( ITenant tmpTenant : tenants ) { if ( tmpTenant.getRootFolderAbsolutePath().startsWith( tenant.getRootFolderAbsolutePath() + "/", 0 ) ) { users.addAll( getUsers( tmpTenant ) ); } } } return users; } public List<IPentahoUser> getUsers( ITenant tenant ) throws UncategorizedUserRoleDaoException { return Collections.list( Collections.enumeration( tenantUsers.get( tenant ) ) ); } public void setPassword( ITenant tenant, String userName, String password ) throws NotFoundException, UncategorizedUserRoleDaoException { IPentahoUser user = getUser( tenant, userName ); if ( user == null ) { throw new NotFoundException( userName ); } user.setPassword( password ); } public void setRoleDescription( ITenant tenant, String roleName, String description ) throws NotFoundException, UncategorizedUserRoleDaoException { IPentahoRole role = getRole( tenant, roleName ); if ( role == null ) { throw new NotFoundException( roleName ); } role.setDescription( description ); } public void setRoleMembers( ITenant tenant, String roleName, String[] userNames ) throws NotFoundException, UncategorizedUserRoleDaoException { if ( tenant == null ) { tenant = getTenant( roleName, false ); roleName = getPrincipalName( roleName, false ); } if ( tenant == null || tenant.getId() == null ) { tenant = getCurrentTenant(); } IPentahoRole role = getRole( tenant, roleName ); HashSet<IPentahoUser> users = roleMembers.get( role ); users.clear(); if ( userNames != null ) { for ( String userName : userNames ) { IPentahoUser user = getUser( tenant, userName ); if ( !userRoles.containsKey( user ) ) { userRoles.put( user, new HashSet<IPentahoRole>() ); } userRoles.get( user ).add( role ); if ( user != null ) { users.add( user ); } } } } public void setUserDescription( ITenant tenant, String userName, String description ) throws NotFoundException, UncategorizedUserRoleDaoException { IPentahoUser user = getUser( tenant, userName ); if ( user == null ) { throw new NotFoundException( userName ); } user.setDescription( description ); } public void setUserRoles( ITenant tenant, String userName, String[] roleNames ) throws NotFoundException, UncategorizedUserRoleDaoException { if ( tenant == null ) { tenant = getTenant( userName, true ); userName = getPrincipalName( userName, true ); } if ( tenant == null || tenant.getId() == null ) { tenant = getCurrentTenant(); } Set<String> roleSet = new HashSet<String>(); if ( roleNames != null ) { roleSet.addAll( Arrays.asList( roleNames ) ); } roleSet.add( authenticatedRoleName ); IPentahoRole authRole = getRole( tenant, authenticatedRoleName ); IPentahoUser user = getUser( tenant, userName ); roleMembers.get( authRole ).add( user ); HashSet<IPentahoRole> roles = userRoles.get( user ); roles.clear(); for ( String roleName : roleSet ) { IPentahoRole role = getRole( tenant, roleName ); if ( role != null ) { roles.add( role ); roleMembers.get( role ).add( user ); } } } protected ITenant getCurrentTenant() { if ( PentahoSessionHolder.getSession() != null ) { String tenantId = (String) PentahoSessionHolder.getSession().getAttribute( IPentahoSession.TENANT_ID_KEY ); return tenantId != null ? new Tenant( tenantId, true ) : null; } return null; } protected ITenant getTenant( String principalId, boolean isUser ) { ITenant tenant = null; ITenantedPrincipleNameResolver nameUtils = isUser ? userNameResolver : roleNameResolver; if ( nameUtils != null ) { tenant = nameUtils.getTenant( principalId ); } if ( tenant == null || tenant.getId() == null ) { tenant = getCurrentTenant(); } return tenant; } protected String getPrincipalName( String principalId, boolean isUser ) { String principalName = null; ITenantedPrincipleNameResolver nameUtils = isUser ? userNameResolver : roleNameResolver; if ( nameUtils != null ) { principalName = nameUtils.getPrincipleName( principalId ); } return principalName; } }