/*! * Copyright 2010 - 2015 Pentaho Corporation. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.pentaho.di.ui.repository.pur.repositoryexplorer.model; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; import org.pentaho.di.repository.RepositorySecurityManager; import org.pentaho.di.repository.pur.model.IRole; import org.pentaho.di.ui.repository.pur.repositoryexplorer.IUIEEUser; import org.pentaho.di.ui.repository.pur.repositoryexplorer.IUIRole; import org.pentaho.di.ui.repository.pur.repositoryexplorer.UIEEObjectRegistery; import org.pentaho.di.ui.repository.pur.services.IRoleSupportSecurityManager; import org.pentaho.di.ui.repository.repositoryexplorer.model.IUIUser; import org.pentaho.di.ui.repository.repositoryexplorer.model.UISecurity; public class UIEESecurity extends UISecurity implements java.io.Serializable { private static final long serialVersionUID = -1835729731278502930L; /* EESOURCE: UPDATE SERIALVERUID */ protected IUIRole selectedRole; private int selectedRoleIndex; protected List<IUIRole> roleList; protected IUIRole selectedSystemRole; private int selectedSystemRoleIndex; protected List<IUIRole> systemRoleList; private static final String AUTHENTICATED = "Authenticated"; private static final String ANONYMOUS = "Anonymous"; public UIEESecurity() { super(); roleList = new ArrayList<IUIRole>(); systemRoleList = new ArrayList<IUIRole>(); } public UIEESecurity( RepositorySecurityManager rsm ) throws Exception { super( rsm ); roleList = new ArrayList<IUIRole>(); systemRoleList = new ArrayList<IUIRole>(); if ( rsm instanceof IRoleSupportSecurityManager ) { for ( IRole role : ( (IRoleSupportSecurityManager) rsm ).getRoles() ) { // For a NON-MANAGED SERVER( I.E LDAP) We don't want to show // Authenticated and Anonymous in the Roles List. These will appear in the // System Roles Deck if ( role.getName().equals( AUTHENTICATED ) || role.getName().equals( ANONYMOUS ) ) { continue; } else { IUIRole newRole = UIEEObjectRegistery.getInstance().constructUIRepositoryRole( role ); roleList.add( newRole ); } } } Collections.sort( roleList ); this.firePropertyChange( "roleList", null, roleList ); //$NON-NLS-1$ // Hardcoding the System Roles IRole authenticatedSystemRole = ( (IRoleSupportSecurityManager) rsm ).constructRole(); IRole anonymousSystemRole = ( (IRoleSupportSecurityManager) rsm ).constructRole(); authenticatedSystemRole.setName( AUTHENTICATED ); authenticatedSystemRole.setDescription( AUTHENTICATED ); anonymousSystemRole.setName( ANONYMOUS ); anonymousSystemRole.setDescription( ANONYMOUS ); systemRoleList.add( UIEEObjectRegistery.getInstance().constructUIRepositoryRole( authenticatedSystemRole ) ); systemRoleList.add( UIEEObjectRegistery.getInstance().constructUIRepositoryRole( anonymousSystemRole ) ); Collections.sort( systemRoleList ); this.firePropertyChange( "systemRoleList", null, systemRoleList ); //$NON-NLS-1$ } public int getSelectedRoleIndex() { return selectedRoleIndex; } public void setSelectedRoleIndex( int selectedRoleIndex ) { this.selectedRoleIndex = selectedRoleIndex; this.firePropertyChange( "selectedRoleIndex", null, selectedRoleIndex ); //$NON-NLS-1$ } public int getSelectedSystemRoleIndex() { return selectedSystemRoleIndex; } public void setSelectedSystemRoleIndex( int selectedSystemRoleIndex ) { this.selectedSystemRoleIndex = selectedSystemRoleIndex; this.firePropertyChange( "selectedSystemRoleIndex", null, selectedSystemRoleIndex ); //$NON-NLS-1$ } public IUIRole getSelectedRole() { return selectedRole; } public void setSelectedRole( IUIRole selectedRole ) { this.selectedRole = selectedRole; this.firePropertyChange( "selectedRole", null, selectedRole ); //$NON-NLS-1$ setSelectedRoleIndex( getIndexOfRole( selectedRole ) ); } public IUIRole getSelectedSystemRole() { return selectedSystemRole; } public void setSelectedSystemRole( IUIRole selectedSystemRole ) { this.selectedSystemRole = selectedSystemRole; this.firePropertyChange( "selectedSystemRole", null, selectedSystemRole ); //$NON-NLS-1$ setSelectedSystemRoleIndex( getIndexOfSystemRole( selectedSystemRole ) ); } public List<IUIRole> getRoleList() { return roleList; } public void setRoleList( List<IUIRole> roleList ) { this.roleList.clear(); this.roleList.addAll( roleList ); this.firePropertyChange( "roleList", null, roleList ); //$NON-NLS-1$ } public List<IUIRole> getSystemRoleList() { return systemRoleList; } public void setSystemRoleList( List<IUIRole> systemRoleList ) { this.systemRoleList.clear(); this.systemRoleList.addAll( systemRoleList ); this.firePropertyChange( "systemRoleList", null, systemRoleList ); //$NON-NLS-1$ } public void addRole( IUIRole roleToAdd ) { roleList.add( roleToAdd ); Collections.sort( roleList ); this.firePropertyChange( "roleList", null, roleList ); //$NON-NLS-1$ // We need to make sure this new role is added to all users as well for ( IUIUser userInfo : roleToAdd.getUsers() ) { assignRoleToUser( userInfo, roleToAdd ); } setSelectedRole( roleToAdd ); } public void updateUser( IUIUser userToUpdate, Set<IUIRole> previousRoleList ) { IUIUser user = getUser( userToUpdate.getName() ); user.setDescription( userToUpdate.getDescription() ); if ( userToUpdate instanceof IUIEEUser ) { ( (IUIEEUser) user ).setRoles( ( (IUIEEUser) userToUpdate ).getRoles() ); } this.firePropertyChange( "userList", null, userList ); //$NON-NLS-1$ /* * Now update this current user to all the roles. So if any roles were added to this user then add the user to the * roles as well. Similarly if some roles were remove from this user, remove the user from those roles. */ updateUserInRoles( userToUpdate, previousRoleList, ( (IUIEEUser) userToUpdate ).getRoles() ); setSelectedUser( user ); } public void updateRole( IUIRole roleToUpdate, Set<IUIUser> previousUserList ) { IUIRole role = getRole( roleToUpdate.getName() ); role.setDescription( roleToUpdate.getDescription() ); role.setUsers( roleToUpdate.getUsers() ); this.firePropertyChange( "roleList", null, roleList ); //$NON-NLS-1$ /* * Now update this current role to all the users. So if any users were added to this role then add the role to the * users as well. Similarly if some users were remove from this role, remove the role from those users. */ updateRoleInUsers( roleToUpdate, previousUserList, roleToUpdate.getUsers() ); setSelectedRole( role ); } public void removeRole( String name ) { removeRole( getRole( name ) ); } public void removeRole( IUIRole roleToRemove ) { int index = getIndexOfRole( roleToRemove ); roleList.remove( roleToRemove ); this.firePropertyChange( "roleList", null, roleList ); //$NON-NLS-1$ // We need to make sure this new role is added to all users as well for ( IUIUser userInfo : roleToRemove.getUsers() ) { unassignRoleFromUser( userInfo, roleToRemove ); } if ( index - 1 >= 0 ) { setSelectedRole( getRoleAtIndex( index - 1 ) ); } } @Override public void addUser( IUIUser userToAdd ) { userList.add( userToAdd ); Collections.sort( userList ); this.firePropertyChange( "userList", null, userList ); //$NON-NLS-1$ // We need to make sure this recently removed user is removed from all roles as well if ( userToAdd instanceof IUIEEUser ) { for ( IUIRole role : ( (IUIEEUser) userToAdd ).getRoles() ) { assignUserToRole( role, userToAdd ); } } setSelectedUser( userToAdd ); } @Override public void removeUser( IUIUser userToRemove ) { int index = getIndexOfUser( userToRemove ); userList.remove( userToRemove ); this.firePropertyChange( "userList", null, userList ); //$NON-NLS-1$ // We need to make sure this recently removed user is removed to all roles as well if ( userToRemove instanceof IUIEEUser ) { for ( IUIRole role : ( (IUIEEUser) userToRemove ).getRoles() ) { unassignUserFromRole( role, userToRemove ); } } if ( index - 1 >= 0 ) { setSelectedUser( getUserAtIndex( index - 1 ) ); } } private void updateUserInRoles( IUIUser user, Set<IUIRole> userRolesBeforeUpdate, Set<IUIRole> userRolesAfterUpdate ) { // unassign user from the roles which were unassigned for ( IUIRole role : userRolesBeforeUpdate ) { if ( !exist( role, userRolesAfterUpdate ) ) { unassignUserFromRole( role, user ); } } // assign user to the roles which were assigned for ( IUIRole role : userRolesAfterUpdate ) { if ( !exist( role, userRolesBeforeUpdate ) ) { assignUserToRole( role, user ); } } } private boolean exist( IUIRole role, Set<IUIRole> roleSet ) { for ( IUIRole roleInfo : roleSet ) { if ( role.getName().equals( roleInfo.getName() ) ) { return true; } } return false; } private void updateRoleInUsers( IUIRole role, Set<IUIUser> roleUsersBeforeUpdate, Set<IUIUser> roleUsersAfterUpdate ) { // unassign user from the roles which were unassigned for ( IUIUser userInfo : roleUsersBeforeUpdate ) { if ( !exist( userInfo, roleUsersAfterUpdate ) ) { unassignRoleFromUser( userInfo, role ); } } // assign user to the roles which were assigned for ( IUIUser userInfo : roleUsersAfterUpdate ) { if ( !exist( userInfo, roleUsersBeforeUpdate ) ) { assignRoleToUser( userInfo, role ); } } } private boolean exist( IUIUser ruser, Set<IUIUser> users ) { for ( IUIUser user : users ) { if ( user.getName().equals( ruser.getName() ) ) { return true; } } return false; } private IUIRole getRole( String name ) { for ( IUIRole role : roleList ) { if ( role.getName().equals( name ) ) { return role; } } return null; } public void removeRolesFromSelectedUser( Collection<Object> roles ) { for ( Object o : roles ) { UIRepositoryRole role = (UIRepositoryRole) o; removeRoleFromSelectedUser( role.getName() ); } this.firePropertyChange( "selectedUser", null, selectedUser ); //$NON-NLS-1$ } private void removeRoleFromSelectedUser( String roleName ) { IUIRole role = findRoleInSelectedUser( roleName ); if ( selectedUser instanceof IUIEEUser ) { ( (IUIEEUser) selectedUser ).removeRole( role ); } unassignUserFromRole( role, selectedUser ); } public void removeUsersFromSelectedRole( Collection<Object> users ) { for ( Object o : users ) { IUIUser user = (IUIUser) o; removeUserFromSelectedRole( user.getName() ); } this.firePropertyChange( "selectedRole", null, selectedRole ); //$NON-NLS-1$ } private void removeUserFromSelectedRole( String userName ) { IUIUser user = findUserInSelectedRole( userName ); selectedRole.removeUser( user ); unassignRoleFromUser( user, selectedRole ); } private IUIRole findRoleInSelectedUser( String roleName ) { if ( selectedUser instanceof IUIEEUser ) { Set<IUIRole> roles = ( (IUIEEUser) selectedUser ).getRoles(); for ( IUIRole role : roles ) { if ( role.getName().equals( roleName ) ) { return role; } } } return null; } private IUIUser findUserInSelectedRole( String userName ) { Set<IUIUser> users = selectedRole.getUsers(); for ( IUIUser user : users ) { if ( user.getName().equals( userName ) ) { return user; } } return null; } private IUIUser getUserAtIndex( int index ) { return this.userList.get( index ); } private int getIndexOfUser( IUIUser ru ) { for ( int i = 0; i < this.userList.size(); i++ ) { IUIUser user = this.userList.get( i ); if ( ru.getName().equals( user.getName() ) ) { return i; } } return -1; } private IUIRole getRoleAtIndex( int index ) { return this.roleList.get( index ); } protected int getIndexOfRole( IUIRole rr ) { for ( int i = 0; i < this.roleList.size(); i++ ) { IUIRole role = this.roleList.get( i ); if ( rr.getName().equals( role.getName() ) ) { return i; } } return -1; } protected int getIndexOfSystemRole( IUIRole rr ) { for ( int i = 0; i < this.systemRoleList.size(); i++ ) { IUIRole role = this.systemRoleList.get( i ); if ( rr.getName().equals( role.getName() ) ) { return i; } } return -1; } private void assignRoleToUser( IUIUser userInfo2, IUIRole role ) { IUIEEUser userInfo = findEEUser( userInfo2 ); if ( userInfo != null ) { userInfo.addRole( role ); } } private void unassignRoleFromUser( IUIUser user, IUIRole role ) { IUIEEUser userInfo = findEEUser( user ); if ( userInfo != null ) { userInfo.removeRole( role ); } } private void assignUserToRole( IUIRole role, IUIUser user ) { IUIRole roleInfo = findRole( role ); if ( roleInfo != null ) { roleInfo.addUser( user ); } } private void unassignUserFromRole( IUIRole role, IUIUser user ) { IUIRole roleInfo = findRole( role ); if ( roleInfo != null ) { roleInfo.removeUser( user ); } } private IUIEEUser findEEUser( IUIUser userInfo ) { for ( IUIUser user : userList ) { if ( user.getName().equals( userInfo.getName() ) && user instanceof IUIEEUser ) { return (IUIEEUser) user; } } return null; } private IUIRole findRole( IUIRole role ) { for ( IUIRole roleInfo : roleList ) { if ( roleInfo.getName().equals( role.getName() ) ) { return roleInfo; } } return null; } }