in redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/DefaultRoleManagementService.java [890:959]
protected List<? extends org.apache.archiva.redback.rbac.Role> filterRolesForCurrentUserAccess(
List<? extends org.apache.archiva.redback.rbac.Role> roleList )
throws RedbackServiceException
{
RedbackRequestInformation redbackRequestInformation = RedbackAuthenticationThreadLocal.get();
// olamy: should not happened normally as annotations check this first
if ( redbackRequestInformation == null || redbackRequestInformation.getUser() == null )
{
throw new RedbackServiceException( new ErrorMessage( "login.mandatory" ) );
}
String currentUser = redbackRequestInformation.getUser().getUsername();
List<org.apache.archiva.redback.rbac.Role> filteredRoleList = new ArrayList<>();
try
{
Map<String, List<? extends Permission>> assignedPermissionMap = rbacManager.getAssignedPermissionMap( currentUser );
List<String> resourceGrants = new ArrayList<String>();
if ( assignedPermissionMap.containsKey( RedbackRoleConstants.USER_MANAGEMENT_ROLE_GRANT_OPERATION ) )
{
List<? extends Permission> roleGrantPermissions =
assignedPermissionMap.get( RedbackRoleConstants.USER_MANAGEMENT_ROLE_GRANT_OPERATION );
for ( Permission permission : roleGrantPermissions )
{
if ( permission.getResource().getIdentifier().equals( Resource.GLOBAL ) )
{
// the current user has the rights to assign any given role
return roleList;
}
else
{
resourceGrants.add( permission.getResource().getIdentifier() );
}
}
}
else
{
return Collections.emptyList();
}
String delimiter = " - ";
// we should have a list of resourceGrants now, this will provide us with the information necessary to restrict
// the role list
for ( org.apache.archiva.redback.rbac.Role role : roleList )
{
int delimiterIndex = role.getName().indexOf( delimiter );
for ( String resourceIdentifier : resourceGrants )
{
if ( ( role.getName().indexOf( resourceIdentifier ) != -1 ) && ( delimiterIndex != -1 ) )
{
String resourceName = role.getName().substring( delimiterIndex + delimiter.length() );
if ( resourceName.equals( resourceIdentifier ) )
{
filteredRoleList.add( role );
}
}
}
}
}
catch ( RbacManagerException rme )
{
// ignore, this can happen when the user has no roles assigned
}
Collections.sort( filteredRoleList, new RoleSorter() );
return filteredRoleList;
}