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

abhay 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 b7a2902  RANGER-2772: Adding the functionality of merging the policy - 
Part 3
b7a2902 is described below

commit b7a2902939f0d5ae64ead9fde539e76a766238a2
Author: Abhay Kulkarni <[email protected]>
AuthorDate: Thu Apr 23 19:38:33 2020 -0700

    RANGER-2772: Adding the functionality of merging the policy - Part 3
---
 .../java/org/apache/ranger/rest/ServiceREST.java   | 53 ++++++++++-------
 .../org/apache/ranger/rest/ServiceRESTUtil.java    | 68 +++++++++++++++++-----
 2 files changed, 88 insertions(+), 33 deletions(-)

diff --git 
a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
index 82e67e6..1bdee86 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
@@ -83,6 +83,7 @@ import org.apache.ranger.common.ServiceUtil;
 import org.apache.ranger.common.UserSessionBase;
 import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter;
 import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.entity.XXPolicy;
 import org.apache.ranger.entity.XXPolicyExportAudit;
 import org.apache.ranger.entity.XXSecurityZone;
 import org.apache.ranger.entity.XXSecurityZoneRefService;
@@ -97,6 +98,7 @@ import 
org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItemAccess;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyResource;
 import org.apache.ranger.plugin.model.RangerPolicyDelta;
+import org.apache.ranger.plugin.model.RangerPolicyResourceSignature;
 import org.apache.ranger.plugin.model.RangerSecurityZone;
 import org.apache.ranger.plugin.model.RangerService;
 import org.apache.ranger.plugin.model.RangerServiceDef;
@@ -1661,7 +1663,13 @@ public class ServiceREST {
                                }
                                boolean 
updateIfExists=("true".equalsIgnoreCase(StringUtils.trimToEmpty(request.getParameter(PARAM_UPDATE_IF_EXISTS))))
 ? true : false ;
                                boolean mergeIfExists  = 
"true".equalsIgnoreCase(StringUtils.trimToEmpty(request.getParameter(PARAM_MERGE_IF_EXISTS)))
  ? true : false;
-                               if(updateIfExists || mergeIfExists) {
+
+                               if (mergeIfExists && updateIfExists) {
+                                       LOG.warn("Cannot use both 
updateIfExists and mergeIfExists for a createPolicy. mergeIfExists will 
override updateIfExists for policy :[" + policy.getName() + "]");
+                               }
+                               if (mergeIfExists) {
+                                       ret = applyPolicy(policy, request);
+                               } else if(updateIfExists) {
                                        RangerPolicy existingPolicy = null;
                                        String serviceName = 
request.getParameter(PARAM_SERVICE_NAME);
                                        if (serviceName == null) {
@@ -1699,20 +1707,11 @@ public class ServiceREST {
                                        }
                                        try {
                                                if (existingPolicy != null) {
-                                                       if (updateIfExists) {
-                                                               
policy.setId(existingPolicy.getId());
-                                                               ret = 
updatePolicy(policy);
-                                                       } else 
if(mergeIfExists){
-                                                               
ServiceRESTUtil.mergeExactMatchPolicyForResource(existingPolicy, policy);
-                                                               ret = 
updatePolicy(existingPolicy);
-                                                       }
+                                                       
policy.setId(existingPolicy.getId());
+                                                       ret = 
updatePolicy(policy);
                                                }
                                        } catch (Exception excp){
-                                               if(updateIfExists) {
-                                                       
LOG.error("updatePolicy(" + policy + ") failed", excp);
-                                               }else if(mergeIfExists) {
-                                                       LOG.error("updatePolicy 
for merge (" + existingPolicy + ") failed", excp);
-                                               }
+                                               LOG.error("updatePolicy(" + 
policy + ") failed", excp);
                                                throw 
restErrorUtil.createRESTException(excp.getMessage());
                                        }
                                }
@@ -1775,17 +1774,31 @@ public class ServiceREST {
                RangerPolicy ret = null;
 
                if (policy != null && 
StringUtils.isNotBlank(policy.getService())) {
+
                        try {
-                               // Check if applied policy contains any 
conditions
-                               if 
(ServiceRESTUtil.containsRangerCondition(policy)) {
-                                       LOG.error("Applied policy contains 
condition(s); not supported:" + policy);
-                                       throw new Exception("Applied policy 
contains condition(s); not supported:" + policy);
-                               }
 
-                               String user = request.getRemoteUser();
-                               RangerPolicy existingPolicy = 
getExactMatchPolicyForResource(policy, StringUtils.isNotBlank(user) ? user 
:"admin");
+                               final              RangerPolicy existingPolicy;
+                               String             signature                    
 = (new RangerPolicyResourceSignature(policy)).getSignature();
+                               List<RangerPolicy> 
policiesWithMatchingSignature = 
svcStore.getPoliciesByResourceSignature(policy.getService(), signature, true);
+
+                               if 
(CollectionUtils.isNotEmpty(policiesWithMatchingSignature)) {
+                                       if 
(policiesWithMatchingSignature.size() == 1) {
+                                               existingPolicy = 
policiesWithMatchingSignature.get(0);
+                                       } else {
+                                               throw new Exception("Multiple 
policies with matching policy-signature are found. Cannot determine target for 
applying policy");
+                                       }
+                               } else {
+                                       existingPolicy = null;
+                               }
 
                                if (existingPolicy == null) {
+                                       if 
(StringUtils.isNotEmpty(policy.getName())) {
+                                               XXPolicy dbPolicy = 
daoManager.getXXPolicy().findByPolicyName(policy.getName());
+                                               if (dbPolicy != null) {
+                                                       
policy.setName(policy.getName() + System.currentTimeMillis());
+                                               }
+                                       }
+
                                        ret = createPolicy(policy, null);
                                } else {
                                        
ServiceRESTUtil.processApplyPolicy(existingPolicy, policy);
diff --git 
a/security-admin/src/main/java/org/apache/ranger/rest/ServiceRESTUtil.java 
b/security-admin/src/main/java/org/apache/ranger/rest/ServiceRESTUtil.java
index 640d3c3..76cf92c 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceRESTUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceRESTUtil.java
@@ -215,16 +215,54 @@ public class ServiceRESTUtil {
                        LOG.debug("==> ServiceRESTUtil.processApplyPolicy()");
                }
 
-               processApplyPolicyForItemType(existingPolicy, appliedPolicy, 
POLICYITEM_TYPE.ALLOW);
-               processApplyPolicyForItemType(existingPolicy, appliedPolicy, 
POLICYITEM_TYPE.DENY);
-               processApplyPolicyForItemType(existingPolicy, appliedPolicy, 
POLICYITEM_TYPE.ALLOW_EXCEPTIONS);
-               processApplyPolicyForItemType(existingPolicy, appliedPolicy, 
POLICYITEM_TYPE.DENY_EXCEPTIONS);
+               // Check if applied policy or existing policy contains any 
conditions
+               if (ServiceRESTUtil.containsRangerCondition(existingPolicy) || 
ServiceRESTUtil.containsRangerCondition(appliedPolicy)) {
+                       LOG.info("Applied policy [" + appliedPolicy + "] or 
existing policy [" + existingPolicy + "] contains condition(s). Combining two 
policies.");
+                       combinePolicy(existingPolicy, appliedPolicy);
+
+               } else {
+
+                       processApplyPolicyForItemType(existingPolicy, 
appliedPolicy, POLICYITEM_TYPE.ALLOW);
+                       processApplyPolicyForItemType(existingPolicy, 
appliedPolicy, POLICYITEM_TYPE.DENY);
+                       processApplyPolicyForItemType(existingPolicy, 
appliedPolicy, POLICYITEM_TYPE.ALLOW_EXCEPTIONS);
+                       processApplyPolicyForItemType(existingPolicy, 
appliedPolicy, POLICYITEM_TYPE.DENY_EXCEPTIONS);
+               }
 
                if (LOG.isDebugEnabled()) {
                        LOG.debug("<== ServiceRESTUtil.processApplyPolicy()");
                }
        }
 
+       static private void combinePolicy(RangerPolicy existingPolicy, 
RangerPolicy appliedPolicy) {
+
+               List<RangerPolicy.RangerPolicyItem> appliedPolicyItems;
+
+               // Combine allow policy-items
+               appliedPolicyItems = appliedPolicy.getPolicyItems();
+               if (CollectionUtils.isNotEmpty(appliedPolicyItems)) {
+                       
existingPolicy.getPolicyItems().addAll(appliedPolicyItems);
+               }
+
+               // Combine deny policy-items
+               appliedPolicyItems = appliedPolicy.getDenyPolicyItems();
+               if (CollectionUtils.isNotEmpty(appliedPolicyItems)) {
+                       
existingPolicy.getDenyPolicyItems().addAll(appliedPolicyItems);
+               }
+
+               // Combine allow-exception policy-items
+               appliedPolicyItems = appliedPolicy.getAllowExceptions();
+               if (CollectionUtils.isNotEmpty(appliedPolicyItems)) {
+                       
existingPolicy.getAllowExceptions().addAll(appliedPolicyItems);
+               }
+
+               // Combine deny-exception policy-items
+               appliedPolicyItems = appliedPolicy.getDenyExceptions();
+               if (CollectionUtils.isNotEmpty(appliedPolicyItems)) {
+                       
existingPolicy.getDenyExceptions().addAll(appliedPolicyItems);
+               }
+
+       }
+
        static private void processApplyPolicyForItemType(RangerPolicy 
existingPolicy, RangerPolicy appliedPolicy, POLICYITEM_TYPE policyItemType) {
                if (LOG.isDebugEnabled()) {
                        LOG.debug("==> 
ServiceRESTUtil.processApplyPolicyForItemType()");
@@ -1029,17 +1067,21 @@ public class ServiceRESTUtil {
                }
 
                if (policy != null) {
-                       List<RangerPolicy.RangerPolicyItem> allItems = new 
ArrayList<RangerPolicy.RangerPolicyItem>();
+                       if (CollectionUtils.isNotEmpty(policy.getConditions())) 
{
+                               ret = true;
+                       } else {
+                               List<RangerPolicy.RangerPolicyItem> allItems = 
new ArrayList<RangerPolicy.RangerPolicyItem>();
 
-                       allItems.addAll(policy.getPolicyItems());
-                       allItems.addAll(policy.getDenyPolicyItems());
-                       allItems.addAll(policy.getAllowExceptions());
-                       allItems.addAll(policy.getDenyExceptions());
+                               allItems.addAll(policy.getPolicyItems());
+                               allItems.addAll(policy.getDenyPolicyItems());
+                               allItems.addAll(policy.getAllowExceptions());
+                               allItems.addAll(policy.getDenyExceptions());
 
-                       for (RangerPolicy.RangerPolicyItem policyItem : 
allItems) {
-                               if (!policyItem.getConditions().isEmpty()) {
-                                       ret = true;
-                                       break;
+                               for (RangerPolicy.RangerPolicyItem policyItem : 
allItems) {
+                                       if 
(!policyItem.getConditions().isEmpty()) {
+                                               ret = true;
+                                               break;
+                                       }
                                }
                        }
                }

Reply via email to