RANGER-4669: updated GDS APIs for retreiving datasets shared with the caller to consider roles assigned to user

Signed-off-by: Madhan Neethiraj <madhan@apache.org>
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 69b43f2..4fa9c48 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 @@
 
         if (isSharedWithMe) {
             groups = validationDBProvider.getGroupsForUser(userName);
-            roles  = validationDBProvider.getRolesForUser(userName);
+            roles  = validationDBProvider.getRolesForUserAndGroups(userName, groups);
         }
 
         for (RangerProject project : result.getList()) {
@@ -1635,7 +1635,7 @@
 
         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 97d4b25..41056c9 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 @@
 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 @@
 
                 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 30d2317..43e73f9 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.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.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 @@
         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 @@
 
         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 2c8721e..f8efaa6 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.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 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);