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

madhan 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 6e9485801 RANGER-4669: updated GDS APIs for retreiving datasets shared 
with the caller to consider roles assigned to user
6e9485801 is described below

commit 6e9485801bcbd3069a45a41cb267692b2e9ba231
Author: Subhrat Chaudhary <[email protected]>
AuthorDate: Tue Jan 23 22:00:05 2024 -0800

    RANGER-4669: updated GDS APIs for retreiving datasets shared with the 
caller to consider roles assigned to user
    
    Signed-off-by: Madhan Neethiraj <[email protected]>
---
 .../java/org/apache/ranger/biz/GdsDBStore.java     |  4 +--
 .../org/apache/ranger/biz/GdsPolicyAdminCache.java |  9 +++--
 .../validation/RangerGdsValidationDBProvider.java  | 38 ++++++++++++++++++++++
 .../RangerGdsValidationDataProvider.java           |  3 ++
 4 files changed, 50 insertions(+), 4 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
index 69b43f2dc..4fa9c48df 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
@@ -1602,7 +1602,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         if (isSharedWithMe) {
             groups = validationDBProvider.getGroupsForUser(userName);
-            roles  = validationDBProvider.getRolesForUser(userName);
+            roles  = validationDBProvider.getRolesForUserAndGroups(userName, 
groups);
         }
 
         for (RangerProject project : result.getList()) {
@@ -1635,7 +1635,7 @@ public class GdsDBStore extends AbstractGdsStore {
 
         if (isSharedWithMe) {
             groups = validationDBProvider.getGroupsForUser(userName);
-            roles  = validationDBProvider.getRolesForUser(userName);
+            roles  = validationDBProvider.getRolesForUserAndGroups(userName, 
groups);
         }
 
         for (RangerDataset dataset : result.getList()) {
diff --git 
a/security-admin/src/main/java/org/apache/ranger/biz/GdsPolicyAdminCache.java 
b/security-admin/src/main/java/org/apache/ranger/biz/GdsPolicyAdminCache.java
index 97d4b2579..41056c9c2 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/biz/GdsPolicyAdminCache.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/biz/GdsPolicyAdminCache.java
@@ -22,6 +22,7 @@ package org.apache.ranger.biz;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.ranger.plugin.model.RangerPolicy;
 import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem;
+import org.apache.ranger.plugin.policyengine.RangerPolicyEngine;
 import org.apache.ranger.plugin.policyengine.gds.GdsPolicyEngine;
 import org.apache.ranger.plugin.util.ServicePolicies;
 import org.slf4j.Logger;
@@ -89,8 +90,12 @@ public class GdsPolicyAdminCache {
 
                 ret = policyItem.getUsers() != null && 
policyItem.getUsers().contains(user);
 
-                if (!ret && groups != null && policyItem.getGroups() != null) {
-                    ret = CollectionUtils.containsAny(groups, 
policyItem.getGroups());
+                if (!ret && policyItem.getGroups() != null) {
+                    ret = 
policyItem.getGroups().contains(RangerPolicyEngine.GROUP_PUBLIC);
+
+                    if (!ret && groups != null) {
+                        ret = CollectionUtils.containsAny(groups, 
policyItem.getGroups());
+                    }
                 }
 
                 if (!ret && roles != null && policyItem.getRoles() != null) {
diff --git 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDBProvider.java
 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDBProvider.java
index 30d231797..43e73f919 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDBProvider.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDBProvider.java
@@ -17,6 +17,8 @@
 
 package org.apache.ranger.validation;
 
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.apache.ranger.biz.RangerBizUtil;
 import org.apache.ranger.biz.RoleDBStore;
 import org.apache.ranger.biz.ServiceMgr;
@@ -29,6 +31,7 @@ import org.apache.ranger.plugin.model.RangerGds.RangerDataset;
 import org.apache.ranger.plugin.model.RangerGds.RangerProject;
 import org.apache.ranger.plugin.model.RangerPolicyResourceSignature;
 import org.apache.ranger.plugin.model.RangerService;
+import org.apache.ranger.plugin.policyengine.RangerPolicyEngine;
 import org.apache.ranger.plugin.util.RangerRoles;
 import org.apache.ranger.plugin.util.RangerRolesUtil;
 import org.apache.ranger.plugin.util.ServiceDefUtil;
@@ -41,9 +44,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.Map;
 
 import static 
org.apache.ranger.db.XXGlobalStateDao.RANGER_GLOBAL_STATE_NAME_ROLE;
 
@@ -164,6 +169,27 @@ public class RangerGdsValidationDBProvider extends 
RangerGdsValidationDataProvid
         return rolesUtil != null && rolesUtil.getUserRoleMapping() != null ? 
rolesUtil.getUserRoleMapping().get(userName) : null;
     }
 
+    public Set<String> getRolesForUserAndGroups(String userName, 
Collection<String> groups) {
+        RangerRolesUtil rolesUtil = initGetRolesUtil();
+        Set<String>     ret       = getRolesForUser(userName);
+
+        if (rolesUtil != null) {
+            final Map<String, Set<String>> groupRoleMapping = 
rolesUtil.getGroupRoleMapping();
+
+            if (MapUtils.isNotEmpty(groupRoleMapping)) {
+                if (CollectionUtils.isNotEmpty(groups)) {
+                    for (String group : groups) {
+                        ret = addRoles(ret, groupRoleMapping.get(group));
+                    }
+                }
+
+                ret = addRoles(ret, 
groupRoleMapping.get(RangerPolicyEngine.GROUP_PUBLIC));
+            }
+        }
+
+        return ret;
+    }
+
     public Set<String> getAccessTypes(String serviceName) {
         List<String> accessTypes = 
daoMgr.getXXAccessTypeDef().getNamesByServiceName(serviceName);
         Set<String>  ret         = new HashSet<>(accessTypes);
@@ -266,4 +292,16 @@ public class RangerGdsValidationDBProvider extends 
RangerGdsValidationDataProvid
 
         return ret;
     }
+
+    private Set<String> addRoles(Set<String> allRoles, Set<String> rolesToAdd) 
{
+        if (CollectionUtils.isNotEmpty(rolesToAdd)) {
+            if (allRoles == null) {
+                allRoles = new HashSet<>();
+            }
+
+            allRoles.addAll(rolesToAdd);
+        }
+
+        return allRoles;
+    }
 }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDataProvider.java
 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDataProvider.java
index 2c8721e1e..f8efaa677 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDataProvider.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/validation/RangerGdsValidationDataProvider.java
@@ -23,6 +23,7 @@ import 
org.apache.ranger.plugin.model.RangerGds.RangerDataShare;
 import org.apache.ranger.plugin.model.RangerGds.RangerDataset;
 import org.apache.ranger.plugin.model.RangerGds.RangerProject;
 
+import java.util.Collection;
 import java.util.Set;
 
 public abstract class RangerGdsValidationDataProvider {
@@ -57,6 +58,8 @@ public abstract class RangerGdsValidationDataProvider {
 
     public abstract Set<String> getRolesForUser(String userName);
 
+    public abstract Set<String> getRolesForUserAndGroups(String userName, 
Collection<String> groups);
+
     public abstract Set<String> getAccessTypes(String serviceName);
 
     public abstract Set<String> getMaskTypes(String serviceName);

Reply via email to