This is an automated email from the ASF dual-hosted git repository.

mehul pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new 8f177b0  RANGER-3361 : Improve error message while deleting users and 
groups associated with role
8f177b0 is described below

commit 8f177b03b22875ba46537371136d3bd6a330fa48
Author: mateenmansoori <[email protected]>
AuthorDate: Thu Aug 12 14:50:15 2021 +0530

    RANGER-3361 : Improve error message while deleting users and groups 
associated with role
    
    Signed-off-by: Mehul Parikh <[email protected]>
---
 .../main/java/org/apache/ranger/biz/XUserMgr.java  | 64 +++++++++++++++++-----
 .../java/org/apache/ranger/biz/TestXUserMgr.java   | 20 +++++++
 2 files changed, 70 insertions(+), 14 deletions(-)

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 38b06d1..6596bac 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
@@ -74,6 +74,9 @@ import org.apache.ranger.entity.XXPermMap;
 import org.apache.ranger.entity.XXPolicy;
 import org.apache.ranger.entity.XXPortalUser;
 import org.apache.ranger.entity.XXResource;
+import org.apache.ranger.entity.XXRole;
+import org.apache.ranger.entity.XXRoleRefGroup;
+import org.apache.ranger.entity.XXRoleRefUser;
 import org.apache.ranger.entity.XXSecurityZone;
 import org.apache.ranger.entity.XXSecurityZoneRefGroup;
 import org.apache.ranger.entity.XXSecurityZoneRefUser;
@@ -98,6 +101,8 @@ import 
org.springframework.transaction.support.TransactionTemplate;
 public class XUserMgr extends XUserMgrBase {
 
        private static final String RANGER_USER_GROUP_GLOBAL_STATE_NAME = 
"RangerUserStore";
+       private static final String USER = "User";
+       private static final String GROUP = "Group";
        private static final int MAX_DB_TRANSACTION_RETRIES = 5;
 
        @Autowired
@@ -2031,6 +2036,7 @@ public class XUserMgr extends XUserMgrBase {
        public void deleteXGroup(Long id, boolean force) {
                checkAdminAccess();
                blockIfZoneGroup(id);
+               this.blockIfRoleGroup(id);
                xaBizUtil.blockAuditorRoleUser();
                XXGroupDao xXGroupDao = daoManager.getXXGroup();
                XXGroup xXGroup = xXGroupDao.getById(id);
@@ -2207,14 +2213,9 @@ public class XUserMgr extends XUserMgrBase {
                        for(XXSecurityZoneRefGroup zoneRefGrp : zoneRefGrpList) 
{
                                XXSecurityZone 
xSecZone=daoManager.getXXSecurityZoneDao().getById(zoneRefGrp.getZoneId());
                                if(zones.indexOf(xSecZone.getName())<0)
-                                       zones.append(", " + xSecZone.getName());
+                                       zones.append(xSecZone.getName() + ",");
                        }
-                       logger.info("Can Not Delete Group :" + 
zoneRefGrpList.get(0).getGroupName() + "' as its already present in Zone " 
+zones);
-                       VXResponse vXResponse = new VXResponse();
-                       
vXResponse.setStatusCode(HttpServletResponse.SC_BAD_REQUEST);
-                       vXResponse.setMsgDesc(
-                                       "Can Not Delete Group '" + 
zoneRefGrpList.get(0).getGroupName() + "' as its already present in Zone " 
+zones);
-                       throw restErrorUtil.generateRESTException(vXResponse);
+                       
this.prepareAndThrow(zoneRefGrpList.get(0).getGroupName(), 
RangerConstants.MODULE_SECURITY_ZONE, zones, GROUP);
                }
        }
 
@@ -2241,6 +2242,7 @@ public class XUserMgr extends XUserMgrBase {
                }
                restrictSelfAccountDeletion(vXUser.getName().trim());
                blockIfZoneUser(id);
+               this.blockIfRoleUser(id);
                SearchCriteria searchCriteria = new SearchCriteria();
                searchCriteria.addParam("xUserId", id);
                VXGroupUserList vxGroupUserList = 
searchXGroupUsers(searchCriteria);
@@ -2414,17 +2416,51 @@ public class XUserMgr extends XUserMgrBase {
                        for(XXSecurityZoneRefUser zoneRefUser :zoneRefUserList 
) {
                                XXSecurityZone xSecZone = 
daoManager.getXXSecurityZoneDao().getById(zoneRefUser.getZoneId());
                                if(zones.indexOf(xSecZone.getName())<0)
-                                       zones.append(", " + xSecZone.getName());
+                                       zones.append(xSecZone.getName() + ",");
                        }
-                       logger.info("Can Not Delete User :" + 
zoneRefUserList.get(0).getUserName());
-                       VXResponse vXResponse = new VXResponse();
-                       
vXResponse.setStatusCode(HttpServletResponse.SC_BAD_REQUEST);
-                       vXResponse.setMsgDesc(
-                                       "Can Not Delete User '"+ 
zoneRefUserList.get(0).getUserName() +"' as its already present in Zone" + 
zones);
-                       throw restErrorUtil.generateRESTException(vXResponse);
+                       
this.prepareAndThrow(zoneRefUserList.get(0).getUserName(), 
RangerConstants.MODULE_SECURITY_ZONE, zones, USER);
+               }
+       }
+
+       private void blockIfRoleUser(Long id) {
+               List<XXRoleRefUser> roleRefUsers = 
this.daoManager.getXXRoleRefUser().findByUserId(id);
+               if (CollectionUtils.isNotEmpty(roleRefUsers)) {
+                       StringBuilder roles = new StringBuilder();
+                       for (XXRoleRefUser roleRefUser : roleRefUsers) {
+                               XXRole xxRole = 
this.daoManager.getXXRole().getById(roleRefUser.getRoleId());
+                               final String roleName = xxRole.getName();
+                               if (roles.indexOf(roleName) < 0)
+                                       roles.append(roleName + ",");
+                       }
+                       final String roleRefUserName = 
roleRefUsers.get(0).getUserName();
+                       this.prepareAndThrow(roleRefUserName, 
RangerConstants.ROLE_FIELD, roles, USER);
                }
        }
 
+       private void blockIfRoleGroup(Long id) {
+               List<XXRoleRefGroup> roleRefGroups = 
this.daoManager.getXXRoleRefGroup().findByGroupId(id);
+               if (CollectionUtils.isNotEmpty(roleRefGroups)) {
+                       StringBuilder roles = new StringBuilder();
+                       for (XXRoleRefGroup roleRefGroup : roleRefGroups) {
+                               XXRole xxRole = 
this.daoManager.getXXRole().getById(roleRefGroup.getRoleId());
+                               final String roleName = xxRole.getName();
+                               if (roles.indexOf(roleName) < 0)
+                                       roles.append(roleName + ",");
+                       }
+                       final String roleRefGroupName = 
roleRefGroups.get(0).getGroupName();
+                       this.prepareAndThrow(roleRefGroupName, 
RangerConstants.ROLE_FIELD, roles, GROUP);
+               }
+       }
+
+       private void prepareAndThrow(String userGrpName, String moduleName, 
StringBuilder rolesOrZones, String userOrGrp) {
+               logger.error("Can Not Delete " + userOrGrp + ":" + userGrpName);
+               VXResponse vXResponse = new VXResponse();
+               vXResponse.setStatusCode(HttpServletResponse.SC_BAD_REQUEST);
+               vXResponse.setMsgDesc("Can Not Delete " + userOrGrp + ": '" + 
userGrpName + "' as its present in " + moduleName
+                               + " : " + 
rolesOrZones.deleteCharAt(rolesOrZones.length() - 1));
+               throw restErrorUtil.generateRESTException(vXResponse);
+       }
+
        private <T extends RangerPolicyItem> void 
removeUserGroupReferences(List<T> policyItems, String user, String group) {
                List<T> itemsToRemove = null;
                for(T policyItem : policyItems) {
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 cfd66b1..5b201ec 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
@@ -50,6 +50,8 @@ import org.apache.ranger.db.XXPolicyDao;
 import org.apache.ranger.db.XXPortalUserDao;
 import org.apache.ranger.db.XXPortalUserRoleDao;
 import org.apache.ranger.db.XXResourceDao;
+import org.apache.ranger.db.XXRoleRefGroupDao;
+import org.apache.ranger.db.XXRoleRefUserDao;
 import org.apache.ranger.db.XXSecurityZoneRefGroupDao;
 import org.apache.ranger.db.XXSecurityZoneRefUserDao;
 import org.apache.ranger.db.XXUserDao;
@@ -66,6 +68,8 @@ import org.apache.ranger.entity.XXPolicy;
 import org.apache.ranger.entity.XXPortalUser;
 import org.apache.ranger.entity.XXPortalUserRole;
 import org.apache.ranger.entity.XXResource;
+import org.apache.ranger.entity.XXRoleRefGroup;
+import org.apache.ranger.entity.XXRoleRefUser;
 import org.apache.ranger.entity.XXSecurityZoneRefGroup;
 import org.apache.ranger.entity.XXSecurityZoneRefUser;
 import org.apache.ranger.entity.XXUser;
@@ -1063,6 +1067,10 @@ public class TestXUserMgr {
            XXSecurityZoneRefGroupDao 
zoneSecRefGroupDao=Mockito.mock(XXSecurityZoneRefGroupDao.class);
            
Mockito.when(daoManager.getXXSecurityZoneRefGroup()).thenReturn(zoneSecRefGroupDao);
            
Mockito.when(zoneSecRefGroupDao.findByGroupId(userId)).thenReturn(zoneSecRefGroup);
+               List<XXRoleRefGroup> roleRefGroup = new 
ArrayList<XXRoleRefGroup>();
+               XXRoleRefGroupDao roleRefGroupDao = 
Mockito.mock(XXRoleRefGroupDao.class);
+               
Mockito.when(daoManager.getXXRoleRefGroup()).thenReturn(roleRefGroupDao);
+               
Mockito.when(roleRefGroupDao.findByGroupId(userId)).thenReturn(roleRefGroup);
            xUserMgr.deleteXGroup(vXGroup.getId(), force);
        }
 
@@ -1140,6 +1148,10 @@ public class TestXUserMgr {
            XXSecurityZoneRefUserDao 
zoneSecRefUserDao=Mockito.mock(XXSecurityZoneRefUserDao.class);
            
Mockito.when(daoManager.getXXSecurityZoneRefUser()).thenReturn(zoneSecRefUserDao);
            
Mockito.when(zoneSecRefUserDao.findByUserId(userId)).thenReturn(zoneSecRefUser);
+           List<XXRoleRefUser> roleRefUser=new ArrayList<XXRoleRefUser>();
+           XXRoleRefUserDao 
roleRefUserDao=Mockito.mock(XXRoleRefUserDao.class);
+           
Mockito.when(daoManager.getXXRoleRefUser()).thenReturn(roleRefUserDao);
+           
Mockito.when(roleRefUserDao.findByUserId(userId)).thenReturn(roleRefUser);
                xUserMgr.deleteXUser(vXUser.getId(), force);
                force=false;
                xUserMgr.deleteXUser(vXUser.getId(), force);
@@ -2912,6 +2924,10 @@ public class TestXUserMgr {
            XXSecurityZoneRefUserDao 
zoneSecRefUserDao=Mockito.mock(XXSecurityZoneRefUserDao.class);
            
Mockito.when(daoManager.getXXSecurityZoneRefUser()).thenReturn(zoneSecRefUserDao);
            
Mockito.when(zoneSecRefUserDao.findByUserId(userId)).thenReturn(zoneSecRefUser);
+           List<XXRoleRefUser> roleRefUser=new ArrayList<XXRoleRefUser>();
+           XXRoleRefUserDao 
roleRefUserDao=Mockito.mock(XXRoleRefUserDao.class);
+           
Mockito.when(daoManager.getXXRoleRefUser()).thenReturn(roleRefUserDao);
+           
Mockito.when(roleRefUserDao.findByUserId(userId)).thenReturn(roleRefUser);
                xUserMgr.deleteXUser(vXUser.getId(), force);
                
Mockito.when(xGroupUserService.searchXGroupUsers((SearchCriteria) 
Mockito.any())).thenReturn(new VXGroupUserList());
                XXPolicy xXPolicy=getXXPolicy();
@@ -2985,7 +3001,11 @@ public class TestXUserMgr {
                List<XXSecurityZoneRefGroup> zoneSecRefGroup=new 
ArrayList<XXSecurityZoneRefGroup>();
            XXSecurityZoneRefGroupDao 
zoneSecRefGroupDao=Mockito.mock(XXSecurityZoneRefGroupDao.class);
            
Mockito.when(daoManager.getXXSecurityZoneRefGroup()).thenReturn(zoneSecRefGroupDao);
+           List<XXRoleRefGroup> roleRefGroup=new ArrayList<XXRoleRefGroup>();
+           XXRoleRefGroupDao roleRefGroupDao = 
Mockito.mock(XXRoleRefGroupDao.class);
+           
Mockito.when(daoManager.getXXRoleRefGroup()).thenReturn(roleRefGroupDao);
            
Mockito.when(zoneSecRefGroupDao.findByGroupId(userId)).thenReturn(zoneSecRefGroup);
+           
Mockito.when(roleRefGroupDao.findByGroupId(userId)).thenReturn(roleRefGroup);
                XXResource xXResource = new XXResource();
                xXResource.setId(userId);
                xXResource.setName("hadoopdev");

Reply via email to