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 cfc0330  RANGER-3259 : [Ranger Audit Filter] Ranger role is allowed to 
delete, even if its used in audit filters
cfc0330 is described below

commit cfc033007bcafb1d115825a5c9ed23d4a1a30ee0
Author: Dineshkumar Yadav <dineshkumar.ya...@outlook.com>
AuthorDate: Thu Jul 29 11:59:52 2021 +0530

    RANGER-3259 : [Ranger Audit Filter] Ranger role is allowed to delete, even 
if its used in audit filters
    
    Signed-off-by: Mehul Parikh <me...@apache.org>
---
 .../java/org/apache/ranger/biz/RoleDBStore.java    |   8 ++
 .../java/org/apache/ranger/biz/ServiceDBStore.java | 126 +++++++++++++++++++++
 .../main/java/org/apache/ranger/biz/XUserMgr.java  |   5 +
 .../apache/ranger/db/XXServiceConfigMapDao.java    |  13 +++
 .../main/resources/META-INF/jpa_named_queries.xml  |   4 +
 5 files changed, 156 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 df3fabb..13a3d1f 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
@@ -30,6 +30,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ranger.authorization.hadoop.config.RangerAdminConfig;
+import org.apache.ranger.biz.ServiceDBStore.REMOVE_REF_TYPE;
 import org.apache.ranger.common.ContextUtil;
 import org.apache.ranger.common.MessageEnums;
 import org.apache.ranger.common.RESTErrorUtil;
@@ -82,6 +83,9 @@ public class RoleDBStore implements RoleStore {
     @Autowired
        RangerTransactionSynchronizationAdapter 
transactionSynchronizationAdapter;
 
+       @Autowired
+       ServiceDBStore svcStore;
+
     RangerAdminConfig config;
 
     private Boolean populateExistingBaseFields = true;
@@ -197,6 +201,8 @@ public class RoleDBStore implements RoleStore {
 
         RangerRole role = roleService.read(xxRole.getId());
         roleRefUpdater.cleanupRefTables(role);
+               // delete role from audit filter configs
+               svcStore.updateServiceAuditConfig(role.getName(), 
REMOVE_REF_TYPE.ROLE);
         roleService.delete(role);
 
         List<XXTrxLog> trxLogList = roleService.getTransactionLog(role, null, 
"delete");
@@ -213,6 +219,8 @@ public class RoleDBStore implements RoleStore {
         
transactionSynchronizationAdapter.executeOnTransactionCommit(roleVersionUpdater);
 
         roleRefUpdater.cleanupRefTables(role);
+               // delete role from audit filter configs
+               svcStore.updateServiceAuditConfig(role.getName(), 
REMOVE_REF_TYPE.ROLE);
         roleService.delete(role);
         List<XXTrxLog> trxLogList = roleService.getTransactionLog(role, null, 
"delete");
         bizUtil.createTrxLog(trxLogList);
diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index a888d91..c5add3a 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -61,6 +61,7 @@ import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.ranger.audit.provider.MiscUtil;
 import org.apache.ranger.authorization.hadoop.config.RangerAdminConfig;
+import org.apache.ranger.authorization.utils.JsonUtils;
 import org.apache.ranger.common.AppConstants;
 import org.apache.ranger.common.ContextUtil;
 import org.apache.ranger.common.MessageEnums;
@@ -133,6 +134,7 @@ import org.apache.ranger.entity.XXServiceDef;
 import org.apache.ranger.entity.XXServiceVersionInfo;
 import org.apache.ranger.entity.XXTrxLog;
 import org.apache.ranger.entity.XXUser;
+import org.apache.ranger.plugin.model.AuditFilter;
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerDataMaskPolicyItem;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem;
@@ -5799,5 +5801,129 @@ public class ServiceDBStore extends 
AbstractServiceStore {
                return ret;
        }
 
+       private List<XXServiceConfigMap> 
getAuditFiltersServiceConfigByName(String searchUsrGrpRoleName) {
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("===> 
ServiceDBStore.getAuditFiltersServiceConfigByName( searchUsrGrpRoleName : "
+                                       + searchUsrGrpRoleName + ")");
+               }
+               List<XXServiceConfigMap> configMapToBeModified = null;
+
+               if (StringUtils.isNotBlank(searchUsrGrpRoleName)) {
+                       configMapToBeModified = new 
ArrayList<XXServiceConfigMap>();
+                       XXServiceConfigMapDao configDao = 
daoMgr.getXXServiceConfigMap();
+                       List<XXServiceConfigMap> configs = 
configDao.findByConfigKey(ServiceDBStore.RANGER_PLUGIN_AUDIT_FILTERS);
+                       for (XXServiceConfigMap configMap : configs) {
+                               if 
(StringUtils.contains(configMap.getConfigvalue(), searchUsrGrpRoleName)) {
+                                       configMapToBeModified.add(configMap);
+                               }
+                       }
+               }
+
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<=== 
ServiceDBStore.getAuditFiltersServiceConfigByName( searchUsrGrpRoleName : "
+                                       + searchUsrGrpRoleName + ") 
configMapToBeModified : " + configMapToBeModified);
+               }
+               return configMapToBeModified;
+       }
+
+       public enum REMOVE_REF_TYPE { USER, GROUP, ROLE }
 
+       public void updateServiceAuditConfig(String searchUsrGrpRoleName, 
REMOVE_REF_TYPE removeRefType) {
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("===> 
ServiceDBStore.updateServiceAuditConfig( searchUsrGrpRoleName : " + 
searchUsrGrpRoleName + " removeRefType : "
+                                       + removeRefType + ")");
+               }
+               List<XXServiceConfigMap> configMapToBeModified = 
getAuditFiltersServiceConfigByName(searchUsrGrpRoleName);
+               if (CollectionUtils.isNotEmpty(configMapToBeModified)) {
+                       for (XXServiceConfigMap xConfigMap : 
configMapToBeModified) {
+                               String jsonStr = xConfigMap.getConfigvalue() != 
null ? xConfigMap.getConfigvalue() : null;
+                               if (StringUtils.isNotBlank(jsonStr)) {
+                                       List<AuditFilter> auditFilters = 
JsonUtils.jsonToAuditFilterList(jsonStr);
+                                       int filterCount = auditFilters != null 
? auditFilters.size() : 0;
+                                       RangerService rangerService = null;
+                                       if (filterCount > 0) {
+                                               String userName = null;
+                                               String groupName = null;
+                                               String roleName = null;
+                                               if (removeRefType == 
REMOVE_REF_TYPE.USER) {
+                                                       userName = 
searchUsrGrpRoleName;
+                                               } else if (removeRefType == 
REMOVE_REF_TYPE.GROUP) {
+                                                       groupName = 
searchUsrGrpRoleName;
+                                               } else if (removeRefType == 
REMOVE_REF_TYPE.ROLE) {
+                                                       roleName = 
searchUsrGrpRoleName;
+                                               }
+                                               
removeUserGroupRoleReferences(auditFilters, userName, groupName, roleName);
+                                               String updatedJsonStr = 
JsonUtils.listToJson(auditFilters);
+                                               XXService xService = 
daoMgr.getXXService().getById(xConfigMap.getServiceId());
+                                               rangerService = 
svcService.getPopulatedViewObject(xService);
+                                               Map<String, String> configs = 
rangerService.getConfigs();
+                                               if 
(configs.containsKey(ServiceDBStore.RANGER_PLUGIN_AUDIT_FILTERS)) {
+                                                       updatedJsonStr = 
StringUtils.isBlank(updatedJsonStr) ? ""
+                                                                       : 
updatedJsonStr.replaceAll("\"", "'");
+
+                                                       
configs.put(ServiceDBStore.RANGER_PLUGIN_AUDIT_FILTERS, updatedJsonStr);
+
+                                                       try {
+                                                               
LOG.info("==>ServiceDBStore.updateServiceAuditConfig updating audit-filter of 
service : "+rangerService.getName()  +" as part of delete request for : " + 
searchUsrGrpRoleName);
+                                                               
updateService(rangerService, null);
+                                                       } catch (Throwable 
excp) {
+                                                               
LOG.error("updateService(" + rangerService + ") failed", excp);
+
+                                                               throw 
restErrorUtil.createRESTException(excp.getMessage());
+                                                       }
+                                               }
+                                       } else {
+                                               if (LOG.isDebugEnabled()) {
+                                                       
LOG.debug("ServiceDBStore.updateServiceAuditConfig audit filter count is zero 
");
+                                               }
+                                       }
+                               }
+                       }
+               } else {
+                       if (LOG.isDebugEnabled()) {
+                               
LOG.info("ServiceDBStore.updateServiceAuditConfig no service audit filter 
Config map found for : "
+                                       + searchUsrGrpRoleName);
+                       }
+               }
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<=== 
ServiceDBStore.updateServiceAuditConfig( searchUsrGrpRoleName : " + 
searchUsrGrpRoleName + " removeRefType : "
+                                       + removeRefType  + ")");
+               }
+       }
+
+       private void removeUserGroupRoleReferences(List<AuditFilter> 
auditFilters, String user, String group, String role) {
+               List<AuditFilter> itemsToRemove = null;
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("===> 
ServiceDBStore.removeUserGroupRoleReferences( user : "+ user + " group : "+ 
group + " role : " + role + " auditFilters : " + auditFilters +")");
+               }
+               for (AuditFilter auditFilter : auditFilters) {
+                       boolean isAuditFilterModified = false;
+                       if (StringUtils.isNotEmpty(user) && 
CollectionUtils.isNotEmpty(auditFilter.getUsers())) {
+                               auditFilter.getUsers().remove(user);
+                               isAuditFilterModified = true;
+                       }
+                       if (StringUtils.isNotEmpty(group) && 
CollectionUtils.isNotEmpty(auditFilter.getGroups())) {
+                               auditFilter.getGroups().remove(group);
+                               isAuditFilterModified = true;
+                       }
+                       if (StringUtils.isNotEmpty(role) && 
CollectionUtils.isNotEmpty(auditFilter.getRoles())) {
+                               auditFilter.getRoles().remove(role);
+                               isAuditFilterModified = true;
+                       }
+                       if (isAuditFilterModified && 
CollectionUtils.isEmpty(auditFilter.getUsers())
+                                       && 
CollectionUtils.isEmpty(auditFilter.getGroups())
+                                       && 
CollectionUtils.isEmpty(auditFilter.getRoles())) {
+                               if (itemsToRemove == null) {
+                                       itemsToRemove = new 
ArrayList<AuditFilter>();
+                               }
+                               itemsToRemove.add(auditFilter);
+                       }
+               }
+               if (CollectionUtils.isNotEmpty(itemsToRemove)) {
+                       auditFilters.removeAll(itemsToRemove);
+               }
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("<=== 
ServiceDBStore.removeUserGroupRoleReferences( user : "+ user + " group : "+ 
group + " role : " + role + " auditFilters : " + auditFilters +")");
+               }
+       }
 }
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 f395225..38b06d1 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
@@ -33,6 +33,7 @@ import java.util.Set;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.ranger.biz.ServiceDBStore.REMOVE_REF_TYPE;
 import org.apache.ranger.common.*;
 import org.apache.ranger.entity.XXGroupPermission;
 import org.apache.ranger.entity.XXModuleDef;
@@ -2153,6 +2154,8 @@ public class XUserMgr extends XUserMgrBase {
                                        }
                                }
                        }
+                       //delete group from audit filter configs
+                       svcStore.updateServiceAuditConfig(vXGroup.getName(), 
REMOVE_REF_TYPE.GROUP);
                        //delete XXGroup
                        xXGroupDao.remove(id);
                        //Create XXTrxLog
@@ -2345,6 +2348,8 @@ public class XUserMgr extends XUserMgrBase {
                                        throw 
restErrorUtil.createRESTException(excp.getMessage());
                                }
                        }
+                       //delete user from audit filter configs
+                       svcStore.updateServiceAuditConfig(vXUser.getName(), 
REMOVE_REF_TYPE.USER);
                        //delete XXUser entry of user
                        xXUserDao.remove(id);
                        //delete XXPortal entry of user
diff --git 
a/security-admin/src/main/java/org/apache/ranger/db/XXServiceConfigMapDao.java 
b/security-admin/src/main/java/org/apache/ranger/db/XXServiceConfigMapDao.java
index 00d1a32..b99a7df 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/db/XXServiceConfigMapDao.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/db/XXServiceConfigMapDao.java
@@ -116,4 +116,17 @@ public class XXServiceConfigMapDao extends 
BaseDao<XXServiceConfigMap> {
                        return Collections.emptyList();
                }
        }
+
+       public List<XXServiceConfigMap> findByConfigKey(String configKey) {
+               if(configKey == null) {
+                       return Collections.emptyList();
+               }
+               try {
+                       return getEntityManager()
+                                       
.createNamedQuery("XXServiceConfigMap.findByConfigKey", tClass)
+                                       .setParameter("configKey", 
configKey).getResultList();
+               } catch (NoResultException e) {
+                       return Collections.emptyList();
+               }
+       }
 }
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 3ef8ba3..8eff336 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
@@ -497,6 +497,10 @@
                <query>select obj from XXServiceConfigMap obj where 
obj.serviceId = :serviceId</query>
        </named-query>
 
+       <named-query name="XXServiceConfigMap.findByConfigKey">
+               <query>select obj from XXServiceConfigMap obj where 
obj.configKey = :configKey</query>
+       </named-query>
+
        <named-query name="XXServiceConfigMap.findByServiceAndConfigKey">
                <query>select obj from XXServiceConfigMap obj where
                        obj.serviceId = :serviceId and obj.configKey = 
:configKey</query>

Reply via email to