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

nikhil 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 f11d297  RANGER-2617 : Provide descriptive error message when role 
delete not allowed
f11d297 is described below

commit f11d297ad74407e51707ba890b4f07db8ddb3be4
Author: Nikhil P <[email protected]>
AuthorDate: Thu Oct 17 16:12:52 2019 +0530

    RANGER-2617 : Provide descriptive error message when role delete not allowed
---
 .../java/org/apache/ranger/biz/RoleDBStore.java    | 28 ++++++++++++++++++++++
 .../org/apache/ranger/db/XXPolicyRefRoleDao.java   | 12 ++++++++++
 .../org/apache/ranger/db/XXRoleRefRoleDao.java     | 12 ++++++++++
 .../main/resources/META-INF/jpa_named_queries.xml  |  8 +++++++
 4 files changed, 60 insertions(+)

diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/RoleDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/RoleDBStore.java
index 5d432f8..0854ff2 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/RoleDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/RoleDBStore.java
@@ -152,6 +152,8 @@ public class RoleDBStore implements RoleStore {
             throw restErrorUtil.createRESTException("Role with name: " + 
roleName + " does not exist");
         }
 
+        ensureRoleDeleteAllowed(roleName);
+
         
daoMgr.getXXGlobalState().onGlobalAppDataChange(RANGER_ROLE_GLOBAL_STATE_NAME);
 
         RangerRole role = roleService.read(xxRole.getId());
@@ -166,6 +168,8 @@ public class RoleDBStore implements RoleStore {
     public void deleteRole(Long roleId) throws Exception {
         RangerRole role = roleService.read(roleId);
 
+        ensureRoleDeleteAllowed(role.getName());
+
         
daoMgr.getXXGlobalState().onGlobalAppDataChange(RANGER_ROLE_GLOBAL_STATE_NAME);
 
         roleRefUpdater.cleanupRefTables(role);
@@ -174,6 +178,30 @@ public class RoleDBStore implements RoleStore {
         bizUtil.createTrxLog(trxLogList);
     }
 
+    private void ensureRoleDeleteAllowed(String roleName) throws Exception {
+        boolean roleNotInPolicy = ensureRoleNotInPolicy(roleName);
+        if(!roleNotInPolicy) {
+            throw new Exception("Role '"+ roleName +"' can not be deleted as 
it is referenced in one or more policies");
+        }
+
+        boolean roleNotInOtherRole = ensureRoleNotInRole(roleName);
+        if(!roleNotInOtherRole) {
+            throw new Exception("Role '"+ roleName + "' can not be deleted as 
it is referenced in one or more other roles");
+        }
+    }
+
+       private boolean ensureRoleNotInPolicy(String roleName) {
+               Long roleRefPolicyCount = 
daoMgr.getXXPolicyRefRole().findRoleRefPolicyCount(roleName);
+
+               return roleRefPolicyCount < 1;
+       }
+
+       private boolean ensureRoleNotInRole(String roleName) {
+               Long roleRefRoleCount = 
daoMgr.getXXRoleRefRole().findRoleRefRoleCount(roleName);
+
+               return roleRefRoleCount < 1;
+       }
+
     @Override
     public RangerRole getRole(Long id) throws Exception {
         return roleService.read(id);
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefRoleDao.java 
b/security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefRoleDao.java
index b92f806..dbcacb7 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefRoleDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXPolicyRefRoleDao.java
@@ -96,5 +96,17 @@ public class XXPolicyRefRoleDao extends 
BaseDao<XXPolicyRefRole>{
         return ret;
     }
 
+       public Long findRoleRefPolicyCount(String roleName) {
+               Long ret = -1L;
+
+               try {
+                       ret = 
getEntityManager().createNamedQuery("XXPolicyRefRole.findRoleRefPolicyCount", 
Long.class)
+                                       .setParameter("roleName", 
roleName).getSingleResult();
+               } catch (Exception e) {
+               }
+
+               return ret;
+       }
+
 }
 
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXRoleRefRoleDao.java 
b/security-admin/src/main/java/org/apache/ranger/db/XXRoleRefRoleDao.java
index 4194810..8f6fc8c 100644
--- a/security-admin/src/main/java/org/apache/ranger/db/XXRoleRefRoleDao.java
+++ b/security-admin/src/main/java/org/apache/ranger/db/XXRoleRefRoleDao.java
@@ -76,6 +76,18 @@ public class XXRoleRefRoleDao extends BaseDao<XXRoleRefRole>{
         }
     }
 
+       public Long findRoleRefRoleCount(String subRoleName) {
+               Long ret = -1L;
+
+               try {
+                       ret = 
getEntityManager().createNamedQuery("XXRoleRefRole.findRoleRefRoleCount", 
Long.class)
+                                       .setParameter("subRoleName", 
subRoleName).getSingleResult();
+               } catch (Exception e) {
+               }
+
+               return ret;
+       }
+
     public Set<Long> getContainingRoles(Long subRoleId) {
         Set<Long> ret;
 
diff --git a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml 
b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
index 7e21399..6cc4799 100755
--- a/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
+++ b/security-admin/src/main/resources/META-INF/jpa_named_queries.xml
@@ -1546,6 +1546,11 @@
         <query>select obj from XXRoleRefRole obj where obj.subRoleName = 
:subRoleName </query>
     </named-query>
 
+       <named-query name="XXRoleRefRole.findRoleRefRoleCount">
+        <query>select count(obj.roleId) from XXRoleRefRole obj where 
obj.subRoleName = :subRoleName </query>
+    </named-query>
+
+
        <!-- XXPolicyRefRole -->
        <named-query name="XXPolicyRefRole.findByPolicyId">
                <query>select obj from XXPolicyRefRole obj where obj.policyId = 
:policyId </query>
@@ -1574,6 +1579,9 @@
                </query>
        </named-query>
 
+       <named-query name="XXPolicyRefRole.findRoleRefPolicyCount">
+        <query>select count(obj.policyId) from XXPolicyRefRole obj where 
obj.roleName = :roleName </query>
+    </named-query>
 
        <!-- XXTagChangeLog -->
        <named-query name="XXTagChangeLog.findSinceVersion">

Reply via email to