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

rmani 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 74351d624 RANGER-4585:Support multiple columns policy creation in 
ranger for Grant / Revoke request
74351d624 is described below

commit 74351d624fed1581e9db6ab7fe51ef2a3cbd4978
Author: Ramesh Mani <[email protected]>
AuthorDate: Thu Dec 7 13:19:25 2023 -0800

    RANGER-4585:Support multiple columns policy creation in ranger for Grant / 
Revoke request
---
 .../java/org/apache/ranger/rest/ServiceREST.java   | 49 ++++++++++----
 .../org/apache/ranger/rest/TestServiceREST.java    | 79 +++++++++++++++++++---
 2 files changed, 108 insertions(+), 20 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 cffd177be..cc9df27d6 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
@@ -1255,7 +1255,7 @@ public class ServiceREST {
                                        String               userName   = 
grantRequest.getGrantor();
                                        Set<String>          userGroups = 
CollectionUtils.isNotEmpty(grantRequest.getGrantorGroups()) ? 
grantRequest.getGrantorGroups() : userMgr.getGroupsForUser(userName);
                                        String                           
ownerUser  = grantRequest.getOwnerUser();
-                                       RangerAccessResource resource   = new 
RangerAccessResourceImpl(StringUtil.toStringObjectMap(grantRequest.getResource()),
 ownerUser);
+                                       RangerAccessResource resource   = new 
RangerAccessResourceImpl(getAccessResourceObjectMap(grantRequest.getResource()),
 ownerUser);
                                        Set<String>                      
accessTypes = grantRequest.getAccessTypes();
                                        VXUser               vxUser = 
xUserService.getXUserByUserName(userName);
 
@@ -1300,10 +1300,7 @@ public class ServiceREST {
                        
                                                if(! 
CollectionUtils.isEmpty(resourceNames)) {
                                                        for(String resourceName 
: resourceNames) {
-                                                               
RangerPolicyResource policyResource = new RangerPolicyResource((String) 
resource.getValue(resourceName));
-                                                               
policyResource.setIsRecursive(grantRequest.getIsRecursive());
-               
-                                                               
policyResources.put(resourceName, policyResource);
+                                                               
policyResources.put(resourceName, 
getPolicyResource(resource.getValue(resourceName), grantRequest));
                                                        }
                                                }
                                                
policy.setResources(policyResources);
@@ -1376,7 +1373,7 @@ public class ServiceREST {
                                        Set<String>          userGroups = 
grantRequest.getGrantorGroups();
                                        String                           
ownerUser  = grantRequest.getOwnerUser();
 
-                                       RangerAccessResource resource   = new 
RangerAccessResourceImpl(StringUtil.toStringObjectMap(grantRequest.getResource()),
 ownerUser);
+                                       RangerAccessResource resource   = new 
RangerAccessResourceImpl(getAccessResourceObjectMap(grantRequest.getResource()),
 ownerUser);
                                        Set<String>                      
accessTypes = grantRequest.getAccessTypes();
                                        String               zoneName   = 
getRangerAdminZoneName(serviceName, grantRequest);
 
@@ -1417,10 +1414,7 @@ public class ServiceREST {
 
                                                        if(! 
CollectionUtils.isEmpty(resourceNames)) {
                                                                for(String 
resourceName : resourceNames) {
-                                                                       
RangerPolicyResource policyResource = new RangerPolicyResource((String) 
resource.getValue(resourceName));
-                                                                       
policyResource.setIsRecursive(grantRequest.getIsRecursive());
-
-                                                                       
policyResources.put(resourceName, policyResource);
+                                                                       
policyResources.put(resourceName, 
getPolicyResource(resource.getValue(resourceName), grantRequest));
                                                                }
                                                        }
                                                        
policy.setResources(policyResources);
@@ -1493,7 +1487,7 @@ public class ServiceREST {
                                        String               userName   = 
revokeRequest.getGrantor();
                                        Set<String>          userGroups = 
CollectionUtils.isNotEmpty(revokeRequest.getGrantorGroups()) ? 
revokeRequest.getGrantorGroups() : userMgr.getGroupsForUser(userName);
                                        String                           
ownerUser  = revokeRequest.getOwnerUser();
-                                       RangerAccessResource resource   = new 
RangerAccessResourceImpl(StringUtil.toStringObjectMap(revokeRequest.getResource()),
 ownerUser);
+                                       RangerAccessResource resource   = new 
RangerAccessResourceImpl(getAccessResourceObjectMap(revokeRequest.getResource()),
 ownerUser);
                                        Set<String>                      
accessTypes = revokeRequest.getAccessTypes();
                                        VXUser vxUser = 
xUserService.getXUserByUserName(userName);
 
@@ -1578,7 +1572,7 @@ public class ServiceREST {
                                        Set<String> userGroups = 
revokeRequest.getGrantorGroups();
                                        String ownerUser = 
revokeRequest.getOwnerUser();
 
-                                       RangerAccessResource resource = new 
RangerAccessResourceImpl(StringUtil.toStringObjectMap(revokeRequest.getResource()),
 ownerUser);
+                                       RangerAccessResource resource = new 
RangerAccessResourceImpl(getAccessResourceObjectMap(revokeRequest.getResource()),
 ownerUser);
                                        Set<String>                      
accessTypes = revokeRequest.getAccessTypes();
                                        String               zoneName = 
getRangerAdminZoneName(serviceName, revokeRequest);
 
@@ -4013,6 +4007,37 @@ public class ServiceREST {
                return ret;
        }
 
+       public RangerPolicyResource getPolicyResource(Object resourceName, 
GrantRevokeRequest grantRequest) {
+               RangerPolicyResource ret;
+               if (resourceName instanceof List) {
+                       List<String> resourceValues = (List<String>) 
resourceName;
+                       ret = new RangerPolicyResource(resourceValues, false, 
grantRequest.getIsRecursive());
+               } else {
+                       ret = new RangerPolicyResource((String) resourceName);
+                       ret.setIsRecursive(grantRequest.getIsRecursive());
+               }
+               return ret;
+       }
+
+       public static Map<String, Object> 
getAccessResourceObjectMap(Map<String, String> map) {
+               Map<String, Object> ret = null;
+
+               if (map != null) {
+                       ret = new HashMap<>(map.size());
+
+                       for (Map.Entry<String, String> e : map.entrySet()) {
+                               if (e.getValue().contains(",")) {
+                                       List<String> values = 
Arrays.asList(e.getValue().split(","));
+                                       ret.put(e.getKey(),values);
+                               } else {
+                                       ret.put(e.getKey(), e.getValue());
+                               }
+                       }
+               }
+
+               return ret;
+       }
+
        private HashMap<String, Object> getCSRFPropertiesMap(HttpServletRequest 
request) {
                HashMap<String, Object> map = new HashMap<String, Object>();
                map.put(isCSRF_ENABLED, 
PropertiesUtil.getBooleanProperty(isCSRF_ENABLED, true));
diff --git 
a/security-admin/src/test/java/org/apache/ranger/rest/TestServiceREST.java 
b/security-admin/src/test/java/org/apache/ranger/rest/TestServiceREST.java
index d049f9949..a630e575b 100644
--- a/security-admin/src/test/java/org/apache/ranger/rest/TestServiceREST.java
+++ b/security-admin/src/test/java/org/apache/ranger/rest/TestServiceREST.java
@@ -21,19 +21,13 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.WebApplicationException;
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.admin.client.datatype.RESTResponse;
@@ -78,6 +72,8 @@ import 
org.apache.ranger.plugin.model.RangerServiceDef.RangerServiceConfigDef;
 import org.apache.ranger.plugin.model.validation.RangerPolicyValidator;
 import org.apache.ranger.plugin.model.validation.RangerServiceDefValidator;
 import org.apache.ranger.plugin.model.validation.RangerServiceValidator;
+import org.apache.ranger.plugin.policyengine.RangerAccessResource;
+import org.apache.ranger.plugin.policyengine.RangerAccessResourceImpl;
 import org.apache.ranger.plugin.policyengine.RangerPolicyEngineImpl;
 import org.apache.ranger.plugin.service.ResourceLookupContext;
 import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
@@ -820,6 +816,73 @@ public class TestServiceREST {
                                request);
        }
 
+       @Test
+       public void test14_1_grantAccessWithMultiColumns() throws Exception {
+               HttpServletRequest request = 
Mockito.mock(HttpServletRequest.class);
+
+               String serviceName = "HIVE";
+               Set<String> userList = new HashSet<String>();
+               userList.add("user1");
+               userList.add("user2");
+               userList.add("user3");
+
+               Map<String, String> grantResource = new HashMap<>();
+               grantResource.put("database", "demo");
+               grantResource.put("table", "testtbl");
+               grantResource.put("column", "column1,column2,colum3");
+               GrantRevokeRequest grantRequestObj = new GrantRevokeRequest();
+
+               grantRequestObj.setResource(grantResource);
+               grantRequestObj.setUsers(userList);
+               grantRequestObj.setAccessTypes(new 
HashSet<>(Arrays.asList("select")));
+               grantRequestObj.setDelegateAdmin(true);
+               grantRequestObj.setEnableAudit(true);
+               grantRequestObj.setGrantor("systest");
+               grantRequestObj.setIsRecursive(true);
+
+               RangerAccessResource resource = new 
RangerAccessResourceImpl(serviceREST.getAccessResourceObjectMap(grantRequestObj.getResource()),
 "systest");
+
+               RangerPolicy createPolicy = new RangerPolicy();
+               createPolicy.setService(serviceName);
+               createPolicy.setName("grant-" + System.currentTimeMillis());
+               createPolicy.setDescription("created by grant");
+               
createPolicy.setIsAuditEnabled(grantRequestObj.getEnableAudit());
+
+               Map<String, RangerPolicyResource> policyResources = new 
HashMap<>();
+               Set<String> resourceNames = resource.getKeys();
+
+               if (!CollectionUtils.isEmpty(resourceNames)) {
+                       for (String resourceName : resourceNames) {
+                               policyResources.put(resourceName, 
serviceREST.getPolicyResource(resource.getValue(resourceName), 
grantRequestObj));
+                       }
+               }
+               createPolicy.setResources(policyResources);
+
+               RangerPolicyItem policyItem = new RangerPolicyItem();
+               policyItem.setDelegateAdmin(grantRequestObj.getDelegateAdmin());
+               policyItem.getUsers().addAll(grantRequestObj.getUsers());
+               for (String accessType : grantRequestObj.getAccessTypes()) {
+                       policyItem.getAccesses().add(new 
RangerPolicyItemAccess(accessType, Boolean.TRUE));
+               }
+               createPolicy.getPolicyItems().add(policyItem);
+               createPolicy.setZoneName(null);
+
+               List<String> grantColumns = (List<String>) 
resource.getValue("column");
+               Map<String, RangerPolicyResource> policyResourceMap = 
createPolicy.getResources();
+               List<String> createdPolicyColumns = 
policyResourceMap.get("column").getValues();
+
+               
Assert.assertTrue(createdPolicyColumns.containsAll(grantColumns));
+
+               Mockito.when(
+                                               
serviceUtil.isValidateHttpsAuthentication(serviceName, request))
+                               .thenReturn(false);
+               RESTResponse restResponse = serviceREST.grantAccess(serviceName,
+                               grantRequestObj, request);
+               Assert.assertNotNull(restResponse);
+               
Mockito.verify(serviceUtil).isValidateHttpsAuthentication(serviceName,
+                               request);
+       }
+
        @Test
        public void test15revokeAccess() throws Exception {
                HttpServletRequest request = 
Mockito.mock(HttpServletRequest.class);

Reply via email to