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 3a4a313 RANGER-2828:RangerExportPolicy with resource filter fails to
fetch policies
3a4a313 is described below
commit 3a4a313e5ed97c7d36340ef59b6a4038e7bae89f
Author: Ramesh Mani <[email protected]>
AuthorDate: Sat May 23 12:36:06 2020 -0700
RANGER-2828:RangerExportPolicy with resource filter fails to fetch policies
---
.../java/org/apache/ranger/biz/ServiceDBStore.java | 103 ++++++++++++++++-----
.../org/apache/ranger/biz/TestServiceDBStore.java | 1 -
2 files changed, 82 insertions(+), 22 deletions(-)
diff --git
a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index ed69761..c6308ee 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -2544,10 +2544,13 @@ public class ServiceDBStore extends
AbstractServiceStore {
boolean useLegacyResourceSearch = true;
+ Map<String, String> paramsCopy = new
HashMap<>(filter.getParams());
+ SearchFilter searchFilter = new
SearchFilter(paramsCopy);
+
if (MapUtils.isNotEmpty(filterResources) &&
resourceMatchScope != null) {
useLegacyResourceSearch = false;
for (Map.Entry<String, String> entry :
filterResources.entrySet()) {
-
filter.removeParam(SearchFilter.RESOURCE_PREFIX + entry.getKey());
+
searchFilter.removeParam(SearchFilter.RESOURCE_PREFIX + entry.getKey());
}
}
@@ -2556,7 +2559,7 @@ public class ServiceDBStore extends AbstractServiceStore {
}
ret = new ArrayList<>(policies);
- predicateUtil.applyFilter(ret, filter);
+ predicateUtil.applyFilter(ret, searchFilter);
if (!useLegacyResourceSearch &&
CollectionUtils.isNotEmpty(ret)) {
RangerPolicyResourceMatcher.MatchScope scope;
@@ -2593,7 +2596,7 @@ public class ServiceDBStore extends AbstractServiceStore {
break;
}
- ret = applyResourceFilter(serviceDef, ret,
filterResources, filter, scope);
+ ret = applyResourceFilter(serviceDef, ret,
filterResources, searchFilter, scope);
}
} else {
ret = policies;
@@ -4691,7 +4694,6 @@ public class ServiceDBStore extends AbstractServiceStore {
RangerPolicyList retList = new RangerPolicyList();
Map<Long,RangerPolicy> policyMap=new
HashMap<Long,RangerPolicy>();
Set<Long> processedServices=new HashSet<Long>();
- Set<Long> processedServicesForGroup=new HashSet<Long>();
Set<Long> processedPolicies=new HashSet<Long>();
Comparator<RangerPolicy> comparator = new
Comparator<RangerPolicy>() {
public int compare(RangerPolicy c1, RangerPolicy c2) {
@@ -4699,11 +4701,27 @@ public class ServiceDBStore extends
AbstractServiceStore {
}
};
- List<XXPolicy> xPolList = (List<XXPolicy>)
policyService.searchResources(searchFilter, policyService.searchFields,
policyService.sortFields, retList);
- if (!CollectionUtils.isEmpty(xPolList)) {
- for (XXPolicy xXPolicy : xPolList) {
-
if(!processedServices.contains(xXPolicy.getService())){
-
loadRangerPolicies(xXPolicy.getService(),processedServices,policyMap,searchFilter);
+ List<XXPolicy> xPolList = null;
+ Long serviceId = null;
+ String serviceName =
searchFilter.getParam(ServiceREST.PARAM_SERVICE_NAME);
+
+ if (StringUtils.isNotBlank(serviceName)) {
+ serviceId = getRangerServiceByName(serviceName.trim());
+ if (serviceId != null) {
+ loadRangerPolicies(serviceId,
processedServices, policyMap, searchFilter);
+ }
+ } else {
+ xPolList = policyService.searchResources(searchFilter,
policyService.searchFields, policyService.sortFields, retList);
+ if (!CollectionUtils.isEmpty(xPolList)) {
+ if (isSearchQuerybyResource(searchFilter)) {
+ XXPolicy xXPolicy = xPolList.get(0);
+
loadRangerPolicies(xXPolicy.getService(), processedServices, policyMap,
searchFilter);
+ } else {
+ for (XXPolicy xXPolicy : xPolList) {
+ if
(!processedServices.contains(xXPolicy.getService())) {
+
loadRangerPolicies(xXPolicy.getService(), processedServices, policyMap,
searchFilter);
+ }
+ }
}
}
}
@@ -4712,11 +4730,11 @@ public class ServiceDBStore extends
AbstractServiceStore {
searchFilter.removeParam("user");
Set<String> groupNames =
daoMgr.getXXGroupUser().findGroupNamesByUserName(userName);
if (!CollectionUtils.isEmpty(groupNames)) {
- List<XXPolicy> xPolList2 = null;
+ Set<Long> processedServicesForGroup=new
HashSet<Long>();
+ List<XXPolicy> xPolList2;
for (String groupName : groupNames) {
- xPolList2 = new ArrayList<XXPolicy>();
searchFilter.setParam("group",
groupName);
- xPolList2 = (List<XXPolicy>)
policyService.searchResources(searchFilter, policyService.searchFields,
policyService.sortFields, retList);
+ xPolList2 =
policyService.searchResources(searchFilter, policyService.searchFields,
policyService.sortFields, retList);
if
(!CollectionUtils.isEmpty(xPolList2)) {
for (XXPolicy xPol2 :
xPolList2) {
if(xPol2!=null){
@@ -4736,25 +4754,68 @@ public class ServiceDBStore extends
AbstractServiceStore {
}
}
if (!CollectionUtils.isEmpty(xPolList)) {
- for (XXPolicy xPol : xPolList) {
- if(xPol!=null){
-
if(!processedPolicies.contains(xPol.getId())){
-
if(!processedServices.contains(xPol.getService())){
-
loadRangerPolicies(xPol.getService(),processedServices,policyMap,searchFilter);
- }
-
if(policyMap.containsKey(xPol.getId())){
-
policyList.add(policyMap.get(xPol.getId()));
-
processedPolicies.add(xPol.getId());
+ if (isSearchQuerybyResource(searchFilter)) {
+ if (MapUtils.isNotEmpty(policyMap)) {
+ for(Entry<Long,RangerPolicy>
entry:policyMap.entrySet()) {
+
policyList.add(entry.getValue());
+
processedPolicies.add(entry.getKey());
+ }
+ }
+ } else {
+ for (XXPolicy xPol : xPolList) {
+ if (xPol != null) {
+ if
(!processedPolicies.contains(xPol.getId())) {
+ if
(!processedServices.contains(xPol.getService())) {
+
loadRangerPolicies(xPol.getService(), processedServices, policyMap,
searchFilter);
+ }
+ if
(policyMap.containsKey(xPol.getId())) {
+
policyList.add(policyMap.get(xPol.getId()));
+
processedPolicies.add(xPol.getId());
+ }
}
}
}
}
+ } else {
+ if (MapUtils.isNotEmpty(policyMap)) {
+ for(Entry<Long,RangerPolicy>
entry:policyMap.entrySet()) {
+ policyList.add(entry.getValue());
+ processedPolicies.add(entry.getKey());
+ }
+ }
+ }
+
+ if (CollectionUtils.isNotEmpty(policyList)) {
Collections.sort(policyList, comparator);
}
retList.setPolicies(policyList);
return retList;
}
+ private boolean isSearchQuerybyResource(SearchFilter searchFilter) {
+ boolean ret = false;
+ Map<String, String> filterResourcesPrefix =
searchFilter.getParamsWithPrefix(SearchFilter.RESOURCE_PREFIX, true);
+ if(MapUtils.isNotEmpty(filterResourcesPrefix)) {
+ ret = true;
+ }
+ if(!ret) {
+ Map<String, String> filterResourcesPolResource =
searchFilter.getParamsWithPrefix(SearchFilter.POL_RESOURCE, true);
+ if (MapUtils.isNotEmpty(filterResourcesPolResource)) {
+ ret = true;
+ }
+ }
+ return ret;
+ }
+
+ private Long getRangerServiceByName(String name) {
+ XXService xxService = null;
+ XXServiceDao xxServiceDao = daoMgr.getXXService();
+ if (xxServiceDao != null ) {
+ xxService = xxServiceDao.findByName(name);
+ }
+ return xxService == null ? null : xxService.getId();
+ }
+
private void loadRangerPolicies(Long serviceId,Set<Long>
processedServices,Map<Long,RangerPolicy> policyMap,SearchFilter searchFilter){
try {
List<RangerPolicy> tempPolicyList =
getServicePolicies(serviceId,searchFilter);
diff --git
a/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
b/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
index c219e6c..9677b4d 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestServiceDBStore.java
@@ -2145,7 +2145,6 @@ public class TestServiceDBStore {
//PList<RangerPolicy> dbRangerPolicyList =
serviceDBStore.getPaginatedServicePolicies(rangerService.getId(),
filter);
- Mockito.verify(daoManager).getXXService();
}
@Test