diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GroupManagementService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GroupManagementService.java index 33614a7328..c447c48a5b 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GroupManagementService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/api/GroupManagementService.java @@ -533,7 +533,14 @@ public interface GroupManagementService { defaultValue = "1") @DefaultValue("1") @QueryParam("depth") - int depth); + int depth, + @ApiParam( + name = "allowed", + value = "Whether to return allowed group", + defaultValue = "false") + @QueryParam("allowed") + @DefaultValue("false") + boolean allowed); @Path("/name/{groupName}") @GET diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImpl.java index de2991e7a7..4c43698395 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/main/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImpl.java @@ -176,10 +176,11 @@ public class GroupManagementServiceImpl implements GroupManagementService { } @Override - public Response getGroup(int groupId, boolean requireGroupProps, int depth) { + public Response getGroup(int groupId, boolean requireGroupProps, int depth, boolean allowed) { try { GroupManagementProviderService service = DeviceMgtAPIUtils.getGroupManagementProviderService(); - DeviceGroup deviceGroup = service.getGroup(groupId, requireGroupProps, depth); + DeviceGroup deviceGroup = allowed ? service.getUserOwnGroup(groupId, requireGroupProps, depth): + service.getGroup(groupId, requireGroupProps, depth); if (deviceGroup != null) { return Response.status(Response.Status.OK).entity(deviceGroup).build(); } else { diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImplTest.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImplTest.java index d648120b0d..4c069623c7 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImplTest.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.api/src/test/java/io/entgra/device/mgt/core/device/mgt/api/jaxrs/service/impl/GroupManagementServiceImplTest.java @@ -176,13 +176,13 @@ public class GroupManagementServiceImplTest { Mockito.doReturn(new DeviceGroup()).when(groupManagementProviderService).getGroup(1, false, 1); Mockito.doReturn(null).when(groupManagementProviderService).getGroup(2, false, 1); Mockito.doThrow(new GroupManagementException()).when(groupManagementProviderService).getGroup(3, false, 1); - Response response = groupManagementService.getGroup(1, false, 1); + Response response = groupManagementService.getGroup(1, false, 1, false); Assert.assertEquals(response.getStatus(), Response.Status.OK.getStatusCode(), "getGroup request failed for a request with valid parameters"); - response = groupManagementService.getGroup(2, false, 1); + response = groupManagementService.getGroup(2, false, 1, false); Assert.assertEquals(response.getStatus(), Response.Status.NOT_FOUND.getStatusCode(), "getGroup request returned a group for a non-existing group"); - response = groupManagementService.getGroup(3, false, 1); + response = groupManagementService.getGroup(3, false, 1, false); Assert.assertEquals(response.getStatus(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), "getGroup request returned a group for a in-valid request"); } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderService.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderService.java index 20d9bbd386..9447f6a9ea 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderService.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderService.java @@ -351,4 +351,6 @@ public interface GroupManagementProviderService { * @throws GroupManagementException */ DeviceTypesOfGroups getDeviceTypesOfGroups(List identifiers) throws GroupManagementException; + + DeviceGroup getUserOwnGroup(int groupId, boolean requireGroupProps, int depth) throws GroupManagementException; } diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderServiceImpl.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderServiceImpl.java index d5ef09b14e..0a5782ffed 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderServiceImpl.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/service/GroupManagementProviderServiceImpl.java @@ -636,8 +636,8 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid List tree = new ArrayList<>(); for (DeviceGroup deviceGroup : groups) { DeviceGroup treeNode = tree.stream(). - filter(node -> deviceGroup.getParentPath(). - contains(Integer.toString(node.getGroupId()))). + filter(node -> Arrays.stream(deviceGroup.getParentPath().split("/")). + collect(Collectors.toList()).contains(Integer.toString(node.getGroupId()))). findFirst().orElse(null); if (treeNode != null) { if (Objects.equals(treeNode.getParentPath(), deviceGroup.getParentPath())) { @@ -657,6 +657,47 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid return tree; } + private DeviceGroup findGroupFromTree(List tree, int groupId) { + for (DeviceGroup node: tree) { + if (node.getGroupId() == groupId) return node; + if (node.getChildrenGroups() != null) + return findGroupFromTree(node.getChildrenGroups(), groupId); + } + return null; + } + + @Override + public DeviceGroup getUserOwnGroup(int groupId, boolean requireGroupProps, int depth) throws GroupManagementException { + PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext(); + String username = ctx.getUsername(); + int tenantId = ctx.getTenantId(); + List userOwnGroupIds = this.getGroupIds(username); + if (userOwnGroupIds == null) { + String msg = "Retrieved null when getting group ids for user " + username; + log.error(msg); + throw new GroupManagementException(msg); + } + try { + GroupManagementDAOFactory.openConnection(); + DeviceGroup deviceGroup = findGroupFromTree( + getGroups(userOwnGroupIds, tenantId), groupId); + if (deviceGroup != null && requireGroupProps) + populateGroupProperties(deviceGroup, tenantId); + return deviceGroup; + } catch (GroupManagementDAOException e) { + String msg = "Error occurred while obtaining group '" + groupId + "'"; + log.error(msg, e); + throw new GroupManagementException(msg, e); + } catch (SQLException e) { + String msg = "Error occurred while opening a connection to the data source to retrieve all groups " + + "with hierarchy"; + log.error(msg, e); + throw new GroupManagementException(msg, e); + } finally { + GroupManagementDAOFactory.closeConnection(); + } + } + @Override public List getGroups(String username, boolean requireGroupProps) throws GroupManagementException { if (username == null || username.isEmpty()) {