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

rmani pushed a commit to branch RANGER-5130
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/RANGER-5130 by this push:
     new 7a94c08199 RANGER-5130:DatSet policies fail to authorize when 
condition expression is present --fix review comments
7a94c08199 is described below

commit 7a94c081999f25d1abbca1c3b9c47c9812d880db
Author: Ramesh Mani <[email protected]>
AuthorDate: Thu Feb 6 20:54:45 2025 -0800

    RANGER-5130:DatSet policies fail to authorize when condition expression is 
present --fix review comments
---
 .../apache/ranger/plugin/model/RangerGrant.java    | 26 ++++++++++++-----
 .../main/java/org/apache/ranger/rest/GdsREST.java  | 33 ++++++++++++++++------
 .../java/org/apache/ranger/rest/TestGdsREST.java   |  8 +++---
 3 files changed, 47 insertions(+), 20 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGrant.java 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGrant.java
index d6c358fd7f..0a3e3dc215 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGrant.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGrant.java
@@ -35,15 +35,17 @@ public class RangerGrant implements java.io.Serializable {
     private RangerPrincipal principal;
     private List<String>    accessTypes;
     private List<String>    conditions;
+    private List<String>    validitySchedules;
 
     public RangerGrant() {
-        this(null, null, null);
+        this(null, null, null, null);
     }
 
-    public RangerGrant(RangerPrincipal principal, List<String> accessTypes, 
List<String> conditions) {
-        this.principal   = principal;
-        this.accessTypes = accessTypes;
-        this.conditions  = conditions;
+    public RangerGrant(RangerPrincipal principal, List<String> accessTypes, 
List<String> conditions, List<String> validitySchedules) {
+        this.principal         = principal;
+        this.accessTypes       = accessTypes;
+        this.conditions        = conditions;
+        this.validitySchedules = validitySchedules;
     }
 
     public RangerPrincipal getPrincipal() {
@@ -70,9 +72,17 @@ public void setConditions(List<String> conditions) {
         this.conditions = conditions;
     }
 
+    public List<String> getValiditySchedules() {
+        return validitySchedules;
+    }
+
+    public void setValiditySchedules(List<String> validitySchedules) {
+        this.validitySchedules = validitySchedules;
+    }
+
     @Override
     public int hashCode() {
-        return Objects.hash(principal, accessTypes, conditions);
+        return Objects.hash(principal, accessTypes, conditions, 
validitySchedules);
     }
 
     @Override
@@ -89,7 +99,8 @@ public boolean equals(Object obj) {
 
         return Objects.equals(principal, other.principal) &&
                 Objects.equals(accessTypes, other.accessTypes) &&
-                Objects.equals(conditions, other.conditions);
+                Objects.equals(conditions, other.conditions) &&
+                Objects.equals(validitySchedules, other.validitySchedules);
     }
 
     @Override
@@ -98,6 +109,7 @@ public String toString() {
                 "principal='" + principal.toString() +
                 ", accessTypes=" + accessTypes +
                 ", conditions=" + conditions +
+                ", validitySchedules=" + validitySchedules +
                 '}';
     }
 }
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
index 0d7f90dba2..30d9d20c53 100755
--- a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
@@ -115,7 +115,8 @@ public class GdsREST {
     private static final RangerAdminConfig config                          = 
RangerAdminConfig.getInstance();
     private static final int               SHARED_RESOURCES_MAX_BATCH_SIZE = 
config.getInt("ranger.admin.rest.gds.shared.resources.max.batch.size", 100);
 
-    public  static final String  GDS_POLICY_VALIDITY_SCHEDULE_CONDITION    = 
"validitySchedule";
+    public static final String GDS_POLICY_EXPR_CONDITION                   = 
"expression";
+    public static final String GDS_POLICY_VALIDITY_SCHEDULE_CONDITION      = 
"validitySchedule";
 
     @Autowired
     GdsDBStore gdsStore;
@@ -1911,18 +1912,23 @@ List<RangerGrant> 
transformPolicyItemsToGrants(List<RangerPolicyItem> policyItem
             List<RangerPolicyItemCondition> policyItemConditions = 
policyItem.getConditions();
 
             List<String> policyItemAccessTypes     = 
policyItemAccesses.stream().map(RangerPolicyItemAccess::getType).collect(Collectors.toList());
-            List<String> policyItemConditionValues = 
policyItemConditions.stream().flatMap(x -> 
x.getValues().stream()).collect(Collectors.toList());
+
+            List<RangerPolicy.RangerPolicyItemCondition> 
policyItemConditionExpressions = policyItemConditions.stream().filter(c -> 
c.getType().equals(GDS_POLICY_EXPR_CONDITION)).collect(Collectors.toList());
+            List<String> expressions = 
policyItemConditionExpressions.stream().flatMap(x -> 
x.getValues().stream()).collect(Collectors.toList());
+
+            List<RangerPolicy.RangerPolicyItemCondition> 
policyItemConditionValiditySchedules = policyItemConditions.stream().filter(c 
-> 
c.getType().equals(GDS_POLICY_VALIDITY_SCHEDULE_CONDITION)).collect(Collectors.toList());
+            List<String> validitySchedules = 
policyItemConditionValiditySchedules.stream().flatMap(x -> 
x.getValues().stream()).collect(Collectors.toList());
 
             if (CollectionUtils.isNotEmpty(policyItemUsers)) {
-                policyItemUsers.forEach(x -> ret.add(new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.USER, x), policyItemAccessTypes, 
policyItemConditionValues)));
+                policyItemUsers.forEach(x -> ret.add(new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.USER, x), policyItemAccessTypes, 
expressions, validitySchedules)));
             }
 
             if (CollectionUtils.isNotEmpty(policyItemGroups)) {
-                policyItemGroups.forEach(x -> ret.add(new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.GROUP, x), policyItemAccessTypes, 
policyItemConditionValues)));
+                policyItemGroups.forEach(x -> ret.add(new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.GROUP, x), policyItemAccessTypes, 
expressions, validitySchedules)));
             }
 
             if (CollectionUtils.isNotEmpty(policyItemRoles)) {
-                policyItemRoles.forEach(x -> ret.add(new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.ROLE, x), policyItemAccessTypes, 
policyItemConditionValues)));
+                policyItemRoles.forEach(x -> ret.add(new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.ROLE, x), policyItemAccessTypes, 
expressions, validitySchedules)));
             }
         }
 
@@ -2125,18 +2131,27 @@ private RangerPolicyItem 
transformGrantToPolicyItem(RangerGrant grant) {
             return null;
         }
 
-        RangerPolicyItem policyItem  = new RangerPolicyItem();
-        List<String>     permissions = grant.getAccessTypes();
-        List<String>     conditions  = grant.getConditions();
+        RangerPolicyItem policyItem        = new RangerPolicyItem();
+        List<String>     permissions       = grant.getAccessTypes();
+        List<String>     conditions        = grant.getConditions();
+        List<String>     validitySchedules = grant.getValiditySchedules();
 
         if (CollectionUtils.isNotEmpty(permissions)) {
             policyItem.setAccesses(permissions.stream().map(accessType -> new 
RangerPolicyItemAccess(accessType, true)).collect(Collectors.toList()));
         }
 
+        List<RangerPolicyItemCondition> policyItemConditions = new 
ArrayList<>();
         if (CollectionUtils.isNotEmpty(conditions)) {
-            policyItem.setConditions(conditions.stream().map(condition -> new 
RangerPolicyItemCondition(GDS_POLICY_VALIDITY_SCHEDULE_CONDITION, 
Collections.singletonList(condition))).collect(Collectors.toList()));
+            conditions.stream().map(expr -> new 
RangerPolicyItemCondition(GDS_POLICY_EXPR_CONDITION, 
Collections.singletonList(expr))).forEach(policyItemConditions::add);
+        }
+
+        if (CollectionUtils.isNotEmpty(validitySchedules)) {
+            validitySchedules.stream().map(valditySchedule -> new 
RangerPolicyItemCondition(GDS_POLICY_VALIDITY_SCHEDULE_CONDITION, 
Collections.singletonList(valditySchedule))).forEach(policyItemConditions::add);
         }
 
+        policyItem.setConditions(policyItemConditions);
+
+
         switch (grant.getPrincipal().getType()) {
             case USER:
                 
policyItem.setUsers(Collections.singletonList(grant.getPrincipal().getName()));
diff --git 
a/security-admin/src/test/java/org/apache/ranger/rest/TestGdsREST.java 
b/security-admin/src/test/java/org/apache/ranger/rest/TestGdsREST.java
index 68d62fc31a..0303c38af7 100644
--- a/security-admin/src/test/java/org/apache/ranger/rest/TestGdsREST.java
+++ b/security-admin/src/test/java/org/apache/ranger/rest/TestGdsREST.java
@@ -87,7 +87,7 @@ public void testUpdateDataSetGrants() {
 
         List<RangerPolicy.RangerPolicyItem> hdfsPolicyItems = new 
ArrayList<>(gdsREST.filterPolicyItemsByRequest(policy, request));
 
-        RangerGrant grant3 = new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.GROUP, "hdfs"), 
Collections.singletonList("_READ"), Collections.emptyList());
+        RangerGrant grant3 = new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.GROUP, "hdfs"), 
Collections.singletonList("_READ"), Collections.emptyList(), 
Collections.emptyList());
         policy = gdsREST.updatePolicyWithModifiedGrants(policy, 
Collections.singletonList(grant3));
 
         List<RangerPolicy.RangerPolicyItem> updatedHdfsPolicyItems = new 
ArrayList<>(gdsREST.filterPolicyItemsByRequest(policy, request));
@@ -111,7 +111,7 @@ public void testRemoveDataSetGrants() {
 
         List<RangerPolicy.RangerPolicyItem> existingHdfsPolicyItems = new 
ArrayList<>(gdsREST.filterPolicyItemsByRequest(policy, request));
 
-        RangerGrant grant4 = new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.GROUP, "hdfs"), 
Collections.emptyList(), Collections.emptyList());
+        RangerGrant grant4 = new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.GROUP, "hdfs"), 
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
         policy = gdsREST.updatePolicyWithModifiedGrants(policy, 
Collections.singletonList(grant4));
 
         List<RangerPolicy.RangerPolicyItem> updatedHdfsPolicyItems = 
gdsREST.filterPolicyItemsByRequest(policy, request);
@@ -238,8 +238,8 @@ private RangerPolicy 
createPolicyForDataSet(RangerGds.RangerDataset dataset) {
     }
 
     private List<RangerGrant> createAndGetSampleGrantData() {
-        RangerGrant grant1 = new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.USER, "hive"), 
Collections.singletonList("_READ"), 
Collections.singletonList("IS_ACCESSED_BEFORE('2024/12/12')"));
-        RangerGrant grant2 = new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.GROUP, "hdfs"), 
Collections.singletonList("_MANAGE"), Collections.emptyList());
+        RangerGrant grant1 = new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.USER, "hive"), 
Collections.singletonList("_READ"), 
Collections.singletonList("IS_ACCESSED_BEFORE('2024/12/12')"), 
Collections.singletonList("{\"startTime\":\"1970/01/01 
00:00:00\",\"endTime\":\"2025/03/08 00:35:28\",\"timeZone\":\"UTC\"}"));
+        RangerGrant grant2 = new RangerGrant(new 
RangerPrincipal(RangerPrincipal.PrincipalType.GROUP, "hdfs"), 
Collections.singletonList("_MANAGE"), Collections.emptyList(), 
Collections.emptyList());
 
         return Arrays.asList(grant1, grant2);
     }

Reply via email to