diff --git a/fcli-core/fcli-ssc/src/main/java/com/fortify/cli/ssc/access_control/cli/cmd/SSCUserCreateLocalCommand.java b/fcli-core/fcli-ssc/src/main/java/com/fortify/cli/ssc/access_control/cli/cmd/SSCUserCreateLocalCommand.java index 41a831c0c20..053e0d35009 100644 --- a/fcli-core/fcli-ssc/src/main/java/com/fortify/cli/ssc/access_control/cli/cmd/SSCUserCreateLocalCommand.java +++ b/fcli-core/fcli-ssc/src/main/java/com/fortify/cli/ssc/access_control/cli/cmd/SSCUserCreateLocalCommand.java @@ -21,6 +21,8 @@ import com.fortify.cli.common.output.cli.mixin.OutputHelperMixins; import com.fortify.cli.ssc._common.output.cli.cmd.AbstractSSCJsonNodeOutputCommand; import com.fortify.cli.ssc._common.rest.ssc.SSCUrls; +import com.fortify.cli.ssc.access_control.helper.SSCRoleDescriptor; +import com.fortify.cli.ssc.access_control.helper.SSCRoleHelper; import com.fortify.cli.ssc.access_control.helper.SSCUserCreateRequest; import kong.unirest.UnirestInstance; @@ -65,7 +67,13 @@ public JsonNode getJsonNode(UnirestInstance unirest) { .requirePasswordChange(requirePwChange) .suspended(suspend) .build(); - userCreateRequest.addRoles(roles); + // Resolve each role name/ID to its actual ID + ArrayList resolvedRoles = new ArrayList<>(); + for (String roleNameOrId : roles) { + SSCRoleDescriptor descriptor = SSCRoleHelper.getRoleDescriptor(unirest, roleNameOrId, "id"); + resolvedRoles.add(descriptor.getRoleId()); + } + userCreateRequest.addRoles(resolvedRoles); ObjectNode body = objectMapper.valueToTree(userCreateRequest); return unirest.post(SSCUrls.LOCAL_USERS) diff --git a/fcli-core/fcli-ssc/src/main/java/com/fortify/cli/ssc/access_control/cli/cmd/SSCUserUpdateLocalCommand.java b/fcli-core/fcli-ssc/src/main/java/com/fortify/cli/ssc/access_control/cli/cmd/SSCUserUpdateLocalCommand.java index f945f415d24..f1baafd9bd4 100644 --- a/fcli-core/fcli-ssc/src/main/java/com/fortify/cli/ssc/access_control/cli/cmd/SSCUserUpdateLocalCommand.java +++ b/fcli-core/fcli-ssc/src/main/java/com/fortify/cli/ssc/access_control/cli/cmd/SSCUserUpdateLocalCommand.java @@ -26,6 +26,8 @@ import com.fortify.cli.ssc._common.output.cli.cmd.AbstractSSCJsonNodeOutputCommand; import com.fortify.cli.ssc._common.rest.ssc.SSCUrls; import com.fortify.cli.ssc.access_control.cli.mixin.SSCUserResolverMixin; +import com.fortify.cli.ssc.access_control.helper.SSCRoleDescriptor; +import com.fortify.cli.ssc.access_control.helper.SSCRoleHelper; import kong.unirest.UnirestInstance; import lombok.Getter; @@ -65,7 +67,7 @@ public JsonNode getJsonNode(UnirestInstance unirest) { String userId = resolveUserId(unirest); ObjectNode userData = getLocalUser(unirest, userId); setUserAttributes(userData); - setUserRoles(userData); + setUserRoles(unirest, userData); return unirest.put(SSCUrls.LOCAL_USER(userId)) .body(userData) .asObject(JsonNode.class).getBody(); @@ -95,35 +97,40 @@ private void setUserAttributes(ObjectNode userData) { if (suspend != null) { userData.put("suspended", suspend); } } - private void setUserRoles(ObjectNode userData) { + private void setUserRoles(UnirestInstance unirest, ObjectNode userData) { if (roles != null) { ArrayNode rolesArray = userData.putArray("roles"); - for (String roleId : roles) { + for (String roleNameOrId : roles) { + String roleId = resolveRoleId(unirest, roleNameOrId); rolesArray.addObject().put("id", roleId); } } if (addRoles != null) { - addRolesToUser(userData); + addRolesToUser(unirest, userData); } if (rmRoles != null) { - removeRolesFromUser(userData); + removeRolesFromUser(unirest, userData); } } - private void addRolesToUser(ObjectNode userData) { + private void addRolesToUser(UnirestInstance unirest, ObjectNode userData) { ArrayNode existingRoles = getOrCreateRolesArray(userData); Set existingRoleIds = collectRoleIds(existingRoles); - for (String roleId : addRoles) { + for (String roleNameOrId : addRoles) { + String roleId = resolveRoleId(unirest, roleNameOrId); if (!existingRoleIds.contains(roleId)) { existingRoles.addObject().put("id", roleId); } } } - private void removeRolesFromUser(ObjectNode userData) { + private void removeRolesFromUser(UnirestInstance unirest, ObjectNode userData) { ArrayNode existingRoles = (ArrayNode) userData.get("roles"); if (existingRoles == null) { return; } - Set idsToRemove = new HashSet<>(rmRoles); + Set idsToRemove = new HashSet<>(); + for (String roleNameOrId : rmRoles) { + idsToRemove.add(resolveRoleId(unirest, roleNameOrId)); + } ArrayNode filteredRoles = userData.putArray("roles"); for (JsonNode role : existingRoles) { if (!idsToRemove.contains(role.get("id").asText())) { @@ -145,6 +152,11 @@ private Set collectRoleIds(ArrayNode rolesArray) { return ids; } + private String resolveRoleId(UnirestInstance unirest, String roleNameOrId) { + SSCRoleDescriptor descriptor = SSCRoleHelper.getRoleDescriptor(unirest, roleNameOrId, "id"); + return descriptor.getRoleId(); + } + @Override public String getActionCommandResult() { return "UPDATED";