Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 25 additions & 11 deletions core/src/org/labkey/core/security/SecurityApiActions.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;
import org.junit.Test;
import org.labkey.api.action.ApiResponse;
Expand Down Expand Up @@ -104,8 +105,19 @@ public class SecurityApiActions
{
public static class GetGroupPermsForm
{
private boolean _includeEmptyPermGroups = true;
private boolean _includeSubfolders = false;

public boolean isIncludeEmptyPermGroups()
{
return _includeEmptyPermGroups;
}

public void setIncludeEmptyPermGroups(boolean includeEmptyPermGroups)
{
_includeEmptyPermGroups = includeEmptyPermGroups;
}

public boolean isIncludeSubfolders()
{
return _includeSubfolders;
Expand All @@ -131,21 +143,21 @@ public ApiResponse execute(GetGroupPermsForm form, BindException errors)
//from the container's project and pass that down the recursion stack
response.put("container", getContainerPerms(container,
SecurityManager.getGroups(container.getProject(), true),
form.isIncludeSubfolders()));
form.isIncludeSubfolders(), form.isIncludeEmptyPermGroups()));

return response;
}

protected Map<String, Object> getContainerPerms(Container container, List<Group> groups, boolean recurse)
protected Map<String, Object> getContainerPerms(Container container, @NotNull List<Group> groups, boolean includeSubfolders, boolean includeEmptyPermGroups)
{
Map<String, Object> containerPerms = new HashMap<>();
containerPerms.put("path", container.getPath());
containerPerms.put("id", container.getId());
containerPerms.put("name", container.getName());
containerPerms.put("isInheritingPerms", container.isInheritedAcl());
containerPerms.put("groups", getGroupPerms(container, groups));
containerPerms.put("groups", getGroupPerms(container, groups, includeEmptyPermGroups));

if (recurse && container.hasChildren())
if (includeSubfolders && container.hasChildren())
{
List<Map<String, Object>> childPerms = new ArrayList<>();
for (Container child : container.getChildren())
Expand All @@ -154,7 +166,7 @@ protected Map<String, Object> getContainerPerms(Container container, List<Group>
{
childPerms.add(getContainerPerms(child,
child.isProject() ? SecurityManager.getGroups(child, true) : groups,
recurse));
includeSubfolders, includeEmptyPermGroups));
}
}

Expand All @@ -164,15 +176,17 @@ protected Map<String, Object> getContainerPerms(Container container, List<Group>
return containerPerms;
}

protected List<Map<String, Object>> getGroupPerms(Container container, List<Group> groups)
protected List<Map<String, Object>> getGroupPerms(Container container, @NotNull List<Group> groups, boolean includeEmptyPermGroups)
{
if (null == groups)
return null;

List<Map<String, Object>> groupsPerms = new ArrayList<>();
boolean isAdmin = container.hasPermission(getUser(), AdminPermission.class);

for (Group group : groups)
{
List<String> effectivePermissions = SecurityManager.getPermissionNames(container, group);
if (effectivePermissions.isEmpty() && !includeEmptyPermGroups)
continue;

Map<String, Object> groupPerms = new HashMap<>();
groupPerms.put("id", group.getUserId());
groupPerms.put("name", SecurityManager.getDisambiguatedGroupName(group));
Expand All @@ -183,9 +197,9 @@ protected List<Map<String, Object>> getGroupPerms(Container container, List<Grou
//add effective roles
List<String> effectiveRoleList = SecurityManager.getEffectiveRoles(container, group).map(Role::getUniqueName).toList();
groupPerms.put("roles", effectiveRoleList);
groupPerms.put("effectivePermissions", SecurityManager.getPermissionNames(container, group));
groupPerms.put("effectivePermissions", effectivePermissions);

if (container.hasPermission(getUser(), AdminPermission.class))
if (isAdmin)
{
List<Map<String, Object>> parentGroupInfos = new ArrayList<>();
group.getGroups().stream().forEach(parentGroupId -> {
Expand Down