diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java index 429da84f3d..466dbcf1d3 100755 --- a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java +++ b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java @@ -1653,6 +1653,29 @@ public VXGroupUser updateXGroupUser(VXGroupUser vXGroupUser) { xaBizUtil.blockAuditorRoleUser(); + if (vXGroupUser == null) { + throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, "Groupuser not found", true); + } + + if (vXGroupUser.getId() != null && daoManager.getXXGroupUser().getById(vXGroupUser.getId()) == null) { + throw restErrorUtil.createRESTException("Group-User mapping not found with ID: " + vXGroupUser.getId(), + MessageEnums.DATA_NOT_FOUND); + } + + XXGroup xGroup = daoManager.getXXGroup().findByGroupName(vXGroupUser.getName()); + if (xGroup == null) { + throw restErrorUtil.createRESTException("Group not found: " + vXGroupUser.getName(), + MessageEnums.DATA_NOT_FOUND); + } + + XXUser xUser = daoManager.getXXUser().getById(vXGroupUser.getUserId()); + if (xUser == null) { + throw restErrorUtil.createRESTException("User not found with ID: " + vXGroupUser.getUserId(), + MessageEnums.DATA_NOT_FOUND); + } + + vXGroupUser.setParentGroupId(xGroup.getId()); + return super.updateXGroupUser(vXGroupUser); } diff --git a/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java b/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java index 54b37319f2..1cd362ecd3 100644 --- a/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java +++ b/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java @@ -2028,14 +2028,47 @@ public void test54modifyUserActiveStatus() { @Test public void test55updateXGroupUser() { setup(); - VXUser vxUser = vxUser(); - vxUser.setUserSource(RangerCommonEnums.USER_EXTERNAL); + VXGroupUser vxGroupUser = vxGroupUser(); + + // Mock GroupUser + XXGroupUserDao xxGroupUserDao = Mockito.mock(XXGroupUserDao.class); + XXGroupUser xxGroupUser = new XXGroupUser(); + + Mockito.when(daoManager.getXXGroupUser()).thenReturn(xxGroupUserDao); + Mockito.when(xxGroupUserDao.getById(vxGroupUser.getId())).thenReturn(xxGroupUser); + + // Mock Group + XXGroupDao xxGroupDao = Mockito.mock(XXGroupDao.class); + XXGroup xxGroup = new XXGroup(); + xxGroup.setId(1L); + + Mockito.when(daoManager.getXXGroup()).thenReturn(xxGroupDao); + Mockito.when(xxGroupDao.findByGroupName(vxGroupUser.getName())).thenReturn(xxGroup); + + // Mock User + XXUserDao xxUserDao = Mockito.mock(XXUserDao.class); + XXUser xxUser = new XXUser(); + + Mockito.when(daoManager.getXXUser()).thenReturn(xxUserDao); + Mockito.when(xxUserDao.getById(vxGroupUser.getUserId())).thenReturn(xxUser); + + // Mock update Mockito.when(xGroupUserService.updateResource(Mockito.any())).thenReturn(vxGroupUser); - VXGroupUser dbvxUser = xUserMgr.updateXGroupUser(vxGroupUser); - Assertions.assertNotNull(dbvxUser); - Assertions.assertEquals(dbvxUser.getId(), vxGroupUser.getId()); - Assertions.assertEquals(dbvxUser.getName(), vxGroupUser.getName()); + + VXGroupUser result = xUserMgr.updateXGroupUser(vxGroupUser); + + Assertions.assertNotNull(result); + Assertions.assertEquals(vxGroupUser.getId(), result.getId()); + Assertions.assertEquals(vxGroupUser.getName(), result.getName()); + + // addition of parent group id + Assertions.assertEquals(1L, result.getParentGroupId()); + + Mockito.verify(xxGroupUserDao).getById(vxGroupUser.getId()); + Mockito.verify(xxGroupDao).findByGroupName(vxGroupUser.getName()); + Mockito.verify(xxUserDao).getById(vxGroupUser.getUserId()); + Mockito.verify(xGroupUserService).updateResource(Mockito.any()); } @@ -2478,24 +2511,14 @@ public void test81checkAdminAccess() { } @Test - public void test82updateXgroupUserForGroupUpdate() { + public void test82updateXGroupUser_nullVXGroupUser() { setup(); - XXGroupUserDao xxGroupUserDao = Mockito.mock(XXGroupUserDao.class); - VXGroup vXGroup = vxGroup(); - List xXGroupUserList = new ArrayList<>(); - VXGroupUser vxGroupUser = vxGroupUser(); - XXGroupUser xXGroupUser = new XXGroupUser(); - xXGroupUser.setId(vxGroupUser.getId()); - xXGroupUser.setName(vxGroupUser.getName()); - xXGroupUser.setParentGroupId(vxGroupUser.getParentGroupId()); - xXGroupUser.setUserId(vxGroupUser.getUserId()); - xXGroupUserList.add(xXGroupUser); - Mockito.when(daoManager.getXXGroupUser()).thenReturn(xxGroupUserDao); - Mockito.when(xxGroupUserDao.findByGroupId(vXGroup.getId())).thenReturn(xXGroupUserList); - Mockito.when(xGroupUserService.populateViewBean(xXGroupUser)).thenReturn(vxGroupUser); - xUserMgr.updateXgroupUserForGroupUpdate(vXGroup); - Mockito.verify(daoManager).getXXGroupUser(); - Mockito.verify(xxGroupUserDao).findByGroupId(vXGroup.getId()); + + Mockito.when(restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST, "Groupuser not found", true)).thenThrow(new WebApplicationException()); + + Assertions.assertThrows(WebApplicationException.class, () -> { + xUserMgr.updateXGroupUser(null); + }); } @Test @@ -4457,6 +4480,79 @@ public void test01CreateXUser_federated() { }); } + @Test + public void test133updateXGroupUser_groupUserMappingNotFound() { + setup(); + + VXGroupUser vxGroupUser = vxGroupUser(); + + XXGroupUserDao xxGroupUserDao = Mockito.mock(XXGroupUserDao.class); + + Mockito.when(daoManager.getXXGroupUser()).thenReturn(xxGroupUserDao); + Mockito.when(xxGroupUserDao.getById(vxGroupUser.getId())).thenReturn(null); + + Mockito.when(restErrorUtil.createRESTException(Mockito.contains("Group-User mapping not found"), Mockito.eq(MessageEnums.DATA_NOT_FOUND))).thenThrow(new WebApplicationException()); + + Assertions.assertThrows(WebApplicationException.class, () -> { + xUserMgr.updateXGroupUser(vxGroupUser); + }); + } + + @Test + public void test134updateXGroupUser_groupNotFound() { + setup(); + + VXGroupUser vxGroupUser = vxGroupUser(); + + XXGroupUserDao xxGroupUserDao = Mockito.mock(XXGroupUserDao.class); + XXGroupUser xxGroupUser = new XXGroupUser(); + + Mockito.when(daoManager.getXXGroupUser()).thenReturn(xxGroupUserDao); + Mockito.when(xxGroupUserDao.getById(vxGroupUser.getId())).thenReturn(xxGroupUser); + + XXGroupDao xxGroupDao = Mockito.mock(XXGroupDao.class); + + Mockito.when(daoManager.getXXGroup()).thenReturn(xxGroupDao); + Mockito.when(xxGroupDao.findByGroupName(vxGroupUser.getName())).thenReturn(null); + + Mockito.when(restErrorUtil.createRESTException(Mockito.contains("Group not found"), Mockito.eq(MessageEnums.DATA_NOT_FOUND))).thenThrow(new WebApplicationException()); + + Assertions.assertThrows(WebApplicationException.class, () -> { + xUserMgr.updateXGroupUser(vxGroupUser); + }); + } + + @Test + public void test135updateXGroupUser_userNotFound() { + setup(); + + VXGroupUser vxGroupUser = vxGroupUser(); + + XXGroupUserDao xxGroupUserDao = Mockito.mock(XXGroupUserDao.class); + XXGroupUser xxGroupUser = new XXGroupUser(); + + Mockito.when(daoManager.getXXGroupUser()).thenReturn(xxGroupUserDao); + Mockito.when(xxGroupUserDao.getById(vxGroupUser.getId())).thenReturn(xxGroupUser); + + XXGroupDao xxGroupDao = Mockito.mock(XXGroupDao.class); + XXGroup xxGroup = new XXGroup(); + xxGroup.setId(1L); + + Mockito.when(daoManager.getXXGroup()).thenReturn(xxGroupDao); + Mockito.when(xxGroupDao.findByGroupName(vxGroupUser.getName())).thenReturn(xxGroup); + + XXUserDao xxUserDao = Mockito.mock(XXUserDao.class); + + Mockito.when(daoManager.getXXUser()).thenReturn(xxUserDao); + Mockito.when(xxUserDao.getById(vxGroupUser.getUserId())).thenReturn(null); + + Mockito.when(restErrorUtil.createRESTException(Mockito.contains("User not found"), Mockito.eq(MessageEnums.DATA_NOT_FOUND))).thenThrow(new WebApplicationException()); + + Assertions.assertThrows(WebApplicationException.class, () -> { + xUserMgr.updateXGroupUser(vxGroupUser); + }); + } + private VXUser vxUser() { Collection userRoleList = new ArrayList<>(); userRoleList.add("ROLE_USER");