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

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


The following commit(s) were added to refs/heads/RANGER-3923 by this push:
     new 8fe7e5af3 RANGER-4324: enforce ACLs specified in RangerDataSet
8fe7e5af3 is described below

commit 8fe7e5af368cc4765fdceace7ed5f63f2010a040
Author: Prashant Satam <[email protected]>
AuthorDate: Wed Aug 16 14:39:04 2023 +0530

    RANGER-4324: enforce ACLs specified in RangerDataSet
    
    Signed-off-by: Madhan Neethiraj <[email protected]>
---
 .../java/org/apache/ranger/biz/GdsDBStore.java     |  26 ++--
 .../ranger/validation/RangerGdsValidator.java      | 147 ++++++++++++++-------
 2 files changed, 116 insertions(+), 57 deletions(-)

diff --git a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
old mode 100644
new mode 100755
index 1991a3dca..d2bd0789d
--- a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
@@ -31,6 +31,7 @@ import org.apache.ranger.entity.XXGdsDataShareInDataset;
 import org.apache.ranger.entity.XXGdsDataset;
 import org.apache.ranger.entity.XXGdsDatasetInProject;
 import org.apache.ranger.entity.XXGdsProject;
+import org.apache.ranger.plugin.model.RangerGds.GdsPermission;
 import org.apache.ranger.plugin.model.RangerGds.RangerDataShare;
 import org.apache.ranger.plugin.model.RangerGds.RangerDataShareInDataset;
 import org.apache.ranger.plugin.model.RangerGds.RangerDataset;
@@ -60,6 +61,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
+
 import java.util.*;
 
 import static 
org.apache.ranger.db.XXGlobalStateDao.RANGER_GLOBAL_STATE_NAME_DATASET;
@@ -100,7 +102,6 @@ public class GdsDBStore extends AbstractGdsStore {
     @Autowired
     GUIDUtil guidUtil;
 
-
     @PostConstruct
     public void initStore() {
         if (LOG.isDebugEnabled()) {
@@ -187,7 +188,10 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerDataset ret = datasetService.read(datasetId);
 
-        // TODO: enforce RangerDataset.acl
+
+        if (ret != null && !validator.hasPermission(ret.getAcl(), 
GdsPermission.VIEW)) {
+            throw new Exception("no permission on dataset id=" + datasetId);
+        }
 
         LOG.debug("<== getDataset({}): ret={}", datasetId, ret);
 
@@ -207,7 +211,9 @@ public class GdsDBStore extends AbstractGdsStore {
 
         RangerDataset ret = datasetService.getPopulatedViewObject(existing);
 
-        // TODO: enforce RangerDataset.acl
+        if (ret != null && !validator.hasPermission(ret.getAcl(), 
GdsPermission.VIEW)) {
+            throw new Exception("no permission on dataset name=" + name);
+        }
 
         LOG.debug("<== getDatasetByName({}): ret={}", name, ret);
 
@@ -222,9 +228,9 @@ public class GdsDBStore extends AbstractGdsStore {
         List<String>      names  = new ArrayList<>();
 
         for (RangerDataset dataset : result.getList()) {
-            // TODO: enforce RangerDataset.acl
-
-            names.add(dataset.getName());
+            if (dataset != null && validator.hasPermission(dataset.getAcl(), 
GdsPermission.LIST)) {
+               names.add(dataset.getName());
+            }
         }
 
         PList<String> ret = new PList<>(names, 0, names.size(), names.size(), 
names.size(), result.getSortType(), result.getSortBy());
@@ -242,9 +248,9 @@ public class GdsDBStore extends AbstractGdsStore {
         List<RangerDataset> datasets = new ArrayList<>();
 
         for (RangerDataset dataset : result.getList()) {
-            // TODO: enforce RangerDataset.acl
-
-            datasets.add(dataset);
+            if (dataset != null && validator.hasPermission(dataset.getAcl(), 
GdsPermission.VIEW)) {
+                datasets.add(dataset);
+            }
         }
 
         PList<RangerDataset> ret = new PList<>(datasets, 0, datasets.size(), 
datasets.size(), datasets.size(), result.getSortBy(), result.getSortType());
@@ -254,7 +260,6 @@ public class GdsDBStore extends AbstractGdsStore {
         return ret;
     }
 
-
     @Override
     public RangerProject createProject(RangerProject project) throws Exception 
{
         LOG.debug("==> createProject({})", project);
@@ -802,4 +807,5 @@ public class GdsDBStore extends AbstractGdsStore {
             }
         }
     }
+
 }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
old mode 100644
new mode 100755
index 88fc64c98..374ac046d
--- 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidator.java
@@ -519,6 +519,46 @@ public class RangerGdsValidator {
         LOG.debug("<== validateDelete(dsInProjectId={}, existing={})", 
dsInProjectId, existing);
     }
 
+    public boolean hasPermission(RangerGdsObjectACL acl, GdsPermission 
permission) {
+        boolean ret = dataProvider.isAdminUser();
+
+        if (!ret && acl != null) {
+            String userName = dataProvider.getCurrentUserLoginId();
+
+            if (acl.getUsers() != null) {
+                ret = isAllowed(acl.getUsers().get(userName), permission);
+            }
+
+            if (!ret && acl.getGroups() != null) {
+                Set<String> userGroups = 
dataProvider.getGroupsForUser(userName);
+
+                for (String userGroup : userGroups) {
+                    ret = isAllowed(acl.getGroups().get(userGroup), 
permission);
+
+                    if (ret) {
+                        break;
+                    }
+                }
+            }
+
+            if (!ret && acl.getRoles() != null) {
+                Set<String> userRoles = dataProvider.getRolesForUser(userName);
+
+                if (userRoles != null) {
+                    for (String userRole : userRoles) {
+                        ret = isAllowed(acl.getRoles().get(userRole), 
permission);
+
+                        if (ret) {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        return ret;
+    }
+
     private void validateAcl(RangerGdsObjectACL acl, String fieldName, 
ValidationResult result) {
         if (acl != null) {
             if (MapUtils.isNotEmpty(acl.getUsers())) {
@@ -569,67 +609,34 @@ public class RangerGdsValidator {
         boolean isAdmin = false;
 
         if (acl != null) {
-            Set<String> userGroups = null;
-            Set<String> userRoles  = null;
-
             if (MapUtils.isNotEmpty(acl.getUsers())) {
-                for (Map.Entry<String, GdsPermission> entry : 
acl.getUsers().entrySet()) {
-                    GdsPermission permission = entry.getValue();
-
-                    if (permission != GdsPermission.ADMIN) {
-                        continue;
-                    }
-
-                    if (StringUtils.equals(userName, entry.getKey())) {
-                        isAdmin = true;
-
-                        break;
-                    }
-                }
+                isAdmin = isAllowed(acl.getUsers().get(userName), 
GdsPermission.ADMIN);
             }
 
             if (!isAdmin && MapUtils.isNotEmpty(acl.getGroups())) {
-                for (Map.Entry<String, GdsPermission> entry : 
acl.getGroups().entrySet()) {
-                    String        groupName  = entry.getKey();
-                    GdsPermission permission = entry.getValue();
-
-                    if (permission != GdsPermission.ADMIN) {
-                        continue;
-                    }
+                Set<String> userGroups = 
dataProvider.getGroupsForUser(userName);
 
-                    if (userGroups == null) {
-                        userGroups = dataProvider.getGroupsForUser(userName);
-                    }
-
-                    if (userGroups != null && userGroups.contains(groupName)) {
-                        isAdmin = true;
+                if (userGroups != null) {
+                    for (String userGroup : userGroups) {
+                        isAdmin = isAllowed(acl.getGroups().get(userGroup), 
GdsPermission.ADMIN);
 
-                        break;
+                        if (isAdmin) {
+                            break;
+                        }
                     }
                 }
             }
 
             if (!isAdmin && MapUtils.isNotEmpty(acl.getRoles())) {
-                for (Map.Entry<String, GdsPermission> entry : 
acl.getRoles().entrySet()) {
-                    String        roleName   = entry.getKey();
-                    GdsPermission permission = entry.getValue();
+                Set<String> userRoles  = 
dataProvider.getRolesForUser(userName);
 
-                    if (permission != GdsPermission.ADMIN) {
-                        continue;
-                    }
+                if (userRoles != null) {
+                    for (String userRole : userRoles) {
+                        isAdmin = isAllowed(acl.getRoles().get(userRole), 
GdsPermission.ADMIN);
 
-                    if (userRoles == null) {
-                        if (userGroups == null) {
-                            userGroups = 
dataProvider.getGroupsForUser(userName);
+                        if (isAdmin) {
+                            break;
                         }
-
-                        userRoles = dataProvider.getRolesForUser(userName);
-                    }
-
-                    if (userRoles != null && userRoles.contains(roleName)) {
-                        isAdmin = true;
-
-                        break;
                     }
                 }
             }
@@ -696,6 +703,52 @@ public class RangerGdsValidator {
         }
     }
 
+    private boolean isAllowed(GdsPermission hasPermission, GdsPermission 
accessPermission) {
+        final boolean ret;
+
+        switch (accessPermission) {
+            case ADMIN:
+                ret = hasPermission == GdsPermission.ADMIN;
+            break;
+
+            case POLICY_ADMIN:
+                ret = hasPermission == GdsPermission.POLICY_ADMIN ||
+                      hasPermission == GdsPermission.ADMIN;
+            break;
+
+            case AUDIT:
+                ret = hasPermission == GdsPermission.AUDIT ||
+                      hasPermission == GdsPermission.POLICY_ADMIN ||
+                      hasPermission == GdsPermission.ADMIN;
+            break;
+
+            case VIEW:
+                ret = hasPermission == GdsPermission.VIEW ||
+                      hasPermission == GdsPermission.AUDIT ||
+                      hasPermission == GdsPermission.POLICY_ADMIN ||
+                      hasPermission == GdsPermission.ADMIN;
+            break;
+
+            case LIST:
+                ret = hasPermission == GdsPermission.LIST ||
+                      hasPermission == GdsPermission.VIEW ||
+                      hasPermission == GdsPermission.AUDIT ||
+                      hasPermission == GdsPermission.POLICY_ADMIN ||
+                      hasPermission == GdsPermission.ADMIN;
+            break;
+
+            case NONE:
+                ret = true;
+            break;
+
+            default:
+                ret = false;
+            break;
+        }
+
+        return ret;
+    }
+
     public class ValidationResult {
         private final List<ValidationFailureDetails> validationFailures = new 
ArrayList<>();
 

Reply via email to