You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by zs...@apache.org on 2019/06/06 19:05:38 UTC

[ranger] branch master updated: RANGER-2394 : Add ability to search for multiple users, and exclude multiple users from audit logs

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

zsombor 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 444db6e  RANGER-2394 : Add ability to search for multiple users, and exclude multiple users from audit logs
444db6e is described below

commit 444db6edb092f23de89813503dae04f909e5325e
Author: Zsombor Gegesy <zs...@apache.org>
AuthorDate: Wed May 29 22:17:17 2019 +0200

    RANGER-2394 : Add ability to search for multiple users, and exclude multiple users from audit logs
---
 .../java/org/apache/ranger/rest/AssetREST.java     |  6 +-
 .../java/org/apache/ranger/rest/XAuditREST.java    |  5 +-
 .../ranger/solr/SolrAccessAuditsService.java       | 57 +++++++++++-------
 .../src/main/webapp/scripts/utils/XAUtils.js       | 69 +++++++++++++++-------
 .../webapp/scripts/views/reports/AuditLayout.js    | 32 ++++++----
 .../java/org/apache/ranger/rest/TestAssetREST.java | 30 +++++++++-
 6 files changed, 139 insertions(+), 60 deletions(-)

diff --git a/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java b/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
index 037888e..347e247 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
@@ -626,8 +626,10 @@ public class AssetREST {
 				"Access Type", StringUtil.VALIDATION_TEXT);
 		searchUtil.extractString(request, searchCriteria, "sessionId",
 				"Access Type", StringUtil.VALIDATION_TEXT);
-		searchUtil.extractString(request, searchCriteria, "requestUser",
-				"Access Type", StringUtil.VALIDATION_TEXT);
+		searchUtil.extractStringList(request, searchCriteria, "requestUser",
+			"Users", "requestUser", null, StringUtil.VALIDATION_TEXT);
+		searchUtil.extractStringList(request, searchCriteria, "excludeUser",
+			"Exclude Users", "-requestUser", null, StringUtil.VALIDATION_TEXT);
 		searchUtil.extractString(request, searchCriteria, "requestData",
 				"Access Type", StringUtil.VALIDATION_TEXT);
 		searchUtil.extractString(request, searchCriteria, "resourcePath",
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/XAuditREST.java b/security-admin/src/main/java/org/apache/ranger/rest/XAuditREST.java
index fdf5ad8..c4630a1 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/XAuditREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/XAuditREST.java
@@ -141,9 +141,8 @@ public class XAuditREST {
 	@Produces({ "application/xml", "application/json" })
 	@PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + RangerAPIList.SEARCH_X_ACCESS_AUDITS + "\")")
 	public VXAccessAuditList searchXAccessAudits(@Context HttpServletRequest request) {
-		 SearchCriteria searchCriteria = searchUtil.extractCommonCriterias(
-		 request, xAccessAuditService.sortFields);
-		 return xAuditMgr.searchXAccessAudits(searchCriteria);
+		SearchCriteria searchCriteria = searchUtil.extractCommonCriterias(request, xAccessAuditService.sortFields);
+		return xAuditMgr.searchXAccessAudits(searchCriteria);
 	}
 
 	@GET
diff --git a/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java b/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
index 5220f85..0c04fbd 100644
--- a/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
+++ b/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
@@ -22,7 +22,9 @@ package org.apache.ranger.solr;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
@@ -32,11 +34,11 @@ import org.apache.ranger.common.PropertiesUtil;
 import org.apache.ranger.common.RESTErrorUtil;
 import org.apache.ranger.common.SearchCriteria;
 import org.apache.ranger.common.SearchField;
-import org.apache.ranger.common.SortField;
-import org.apache.ranger.common.StringUtil;
 import org.apache.ranger.common.SearchField.DATA_TYPE;
 import org.apache.ranger.common.SearchField.SEARCH_TYPE;
+import org.apache.ranger.common.SortField;
 import org.apache.ranger.common.SortField.SORT_ORDER;
+import org.apache.ranger.common.StringUtil;
 import org.apache.ranger.db.RangerDaoManager;
 import org.apache.ranger.entity.XXServiceDef;
 import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
@@ -54,7 +56,7 @@ import org.springframework.stereotype.Service;
 @Service
 @Scope("singleton")
 public class SolrAccessAuditsService {
-	private static final Logger logger = Logger.getLogger(SolrAccessAuditsService.class);
+	private static final Logger LOGGER = Logger.getLogger(SolrAccessAuditsService.class);
 
 	@Autowired
 	SolrMgr solrMgr;
@@ -71,8 +73,8 @@ public class SolrAccessAuditsService {
 	@Autowired
 	RangerDaoManager daoManager;
 
-	public List<SortField> sortFields = new ArrayList<SortField>();
-	public List<SearchField> searchFields = new ArrayList<SearchField>();
+	private List<SortField> sortFields = new ArrayList<SortField>();
+	private List<SearchField> searchFields = new ArrayList<SearchField>();
 
 	public SolrAccessAuditsService() {
 
@@ -89,7 +91,9 @@ public class SolrAccessAuditsService {
 		searchFields.add(new SearchField("sessionId", "sess",
 				SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL));
 		searchFields.add(new SearchField("requestUser", "reqUser",
-				SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL));
+			SearchField.DATA_TYPE.STR_LIST, SearchField.SEARCH_TYPE.FULL));
+		searchFields.add(new SearchField("excludeUser", "exlUser",
+			SearchField.DATA_TYPE.STR_LIST, SearchField.SEARCH_TYPE.FULL));
 		searchFields.add(new SearchField("requestData", "reqData", SearchField.DATA_TYPE.STRING,
 				SearchField.SEARCH_TYPE.PARTIAL));
 		searchFields.add(new SearchField("resourcePath", "resource", SearchField.DATA_TYPE.STRING,
@@ -142,22 +146,16 @@ public class SolrAccessAuditsService {
 		SolrClient solrClient = solrMgr.getSolrClient();
 		final boolean hiveQueryVisibility = PropertiesUtil.getBooleanProperty("ranger.audit.hive.query.visibility", true);
 		if (solrClient == null) {
-			logger.warn("Solr client is null, so not running the query.");
+			LOGGER.warn("Solr client is null, so not running the query.");
 			throw restErrorUtil.createRESTException(
 					"Error connecting to search engine",
 					MessageEnums.ERROR_SYSTEM);
 		}
-		List<String> excludeUsersList = new ArrayList<String>();
 		List<VXAccessAudit> xAccessAuditList = new ArrayList<VXAccessAudit>();
 
-		String val = (String) searchCriteria.getParamList().get("excludeServiceUser");
+		Map<String, Object> paramList = searchCriteria.getParamList();
+		updateUserExclusion(paramList);
 
-		if(val !=null && Boolean.valueOf(val.trim())) { //add param to negate requestUsers which will be added as filter query in solr
-			excludeUsersList = getExcludeUsersList();
-			if(CollectionUtils.isNotEmpty(excludeUsersList)) {
-				searchCriteria.getParamList().put("-requestUser", excludeUsersList);
-			}
-        }
 		QueryResponse response = solrUtil.searchResources(searchCriteria,
 				searchFields, sortFields, solrClient);
 		SolrDocumentList docs = response.getResults();
@@ -176,7 +174,7 @@ public class SolrAccessAuditsService {
                                                 logger.warn("Error in request data of audit from solr. AuditData: "  + vXAccessAudit.toString());
                                             }
                                         } catch (UnsupportedEncodingException e) {
-                                                logger.warn("Error while encoding request data");
+                                                LOGGER.warn("Error while encoding request data");
                                         }
                                 }
                         }
@@ -192,11 +190,28 @@ public class SolrAccessAuditsService {
 		return returnList;
 	}
 
+
+	private void updateUserExclusion(Map<String, Object> paramList) {
+		String val = (String) paramList.get("excludeServiceUser");
+
+		if (val != null && Boolean.valueOf(val.trim())) { // add param to negate requestUsers which will be added as
+			// filter query in solr
+			List<String> excludeUsersList = getExcludeUsersList();
+			if (CollectionUtils.isNotEmpty(excludeUsersList)) {
+				Object oldUserExclusions = paramList.get("-requestUser");
+				if (oldUserExclusions instanceof Collection && (!((Collection<?>)oldUserExclusions).isEmpty())) {
+					excludeUsersList.addAll((Collection<String>)oldUserExclusions);
+					paramList.put("-requestUser", excludeUsersList);
+				} else {
+					paramList.put("-requestUser", excludeUsersList);
+				}
+			}
+		}
+	}
+
 	private List<String> getExcludeUsersList() {
-		List<String> excludeUsersList = new ArrayList<String>();
 		//for excluding serviceUsers using existing property in ranger-admin-site
-		List<String> serviceUsersList = getServiceUserList();
-		excludeUsersList.addAll(serviceUsersList);
+		List<String> excludeUsersList = new ArrayList<String>(getServiceUserList());
 
 		//for excluding additional users using new property in ranger-admin-site
 		String additionalExcludeUsers = PropertiesUtil.getProperty("ranger.accesslogs.exclude.users.list");
@@ -233,8 +248,8 @@ public class SolrAccessAuditsService {
 		VXAccessAudit accessAudit = new VXAccessAudit();
 
 		Object value = null;
-		if(logger.isDebugEnabled()) {
-			logger.debug("doc=" + doc.toString());
+		if(LOGGER.isDebugEnabled()) {
+			LOGGER.debug("doc=" + doc.toString());
 		}
 
 		value = doc.getFieldValue("id");
diff --git a/security-admin/src/main/webapp/scripts/utils/XAUtils.js b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
index a7c4497..79f397e 100644
--- a/security-admin/src/main/webapp/scripts/utils/XAUtils.js
+++ b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
@@ -762,27 +762,45 @@ define(function(require) {
 	XAUtils.addVisualSearch = function(searchOpt, serverAttrName, collection,
 			pluginAttr) {
 		var visualSearch, that = this;
-		var search = function(searchCollection, serverAttrName, searchOpt,
-				collection) {
+		var supportMultipleItems = pluginAttr.supportMultipleItems || false;
+		var multipleFacet = serverAttrName.filter(function(elem) { 
+			return elem['addMultiple'];
+		}).map(function(elem) {
+			return elem.text;
+		});
+		var search = function(searchCollection, collection) {
 			var params = {};
-                        if($('.popover')){
-                                $('.popover').remove();
-                        }
+			if($('.popover')){
+					$('.popover').remove();
+			}
 			searchCollection.each(function(m) {
 				var serverParamName = _.findWhere(serverAttrName, {
 					text : m.attributes.category
 				});
 				var extraParam = {};
-				if (!_.isUndefined(serverParamName)) {
-					if (_.has(serverParamName, 'multiple')
-							&& serverParamName.multiple) {
-						extraParam[serverParamName.label] = XAUtils
-								.enumLabelToValue(serverParamName.optionsArr, m
-										.get('value'));
-						$.extend(params, extraParam);
-					} else {
-						extraParam[serverParamName.label] = m.get('value');
-						$.extend(params, extraParam);
+				if (_.has(serverParamName, 'multiple')
+						&& serverParamName.multiple) {
+					extraParam[serverParamName.label] = XAUtils
+							.enumLabelToValue(serverParamName.optionsArr, m
+									.get('value'));
+					;
+					$.extend(params, extraParam);
+				} else {
+					if (!_.isUndefined(serverParamName)) {
+						var oldValue = params[serverParamName.label];
+						var newValue = m.get('value');
+						if (oldValue && serverParamName.addMultiple) {
+							// if a value is already there
+							if (Array.isArray(oldValue)) {
+								// if it's a list, append to the end
+								oldValue.push(newValue);
+							} else {
+								// convert to a list
+								params[serverParamName.label] = [oldValue, newValue];
+							}
+						} else {
+							params[serverParamName.label] = newValue;
+						}
 					}
 				}
 			});
@@ -791,6 +809,7 @@ define(function(require) {
 			collection.fetch({
 				reset : true,
 				cache : false,
+				traditional: supportMultipleItems, // for sending multiple values without []
 				error : function(coll, response, options) {
 					that.blockUI('unblock');
                                         if(response && response.responseJSON && response.responseJSON.msgDesc){
@@ -806,7 +825,7 @@ define(function(require) {
 		var callbackCommon = {
 			search : function(query, searchCollection) {
 				collection.VSQuery = query;
-				search(searchCollection, serverAttrName, searchOpt, collection);
+				search(searchCollection, collection);
 			},
 			clearSearch : function(callback) {
                                 //Remove search history when click on clear search
@@ -823,8 +842,9 @@ define(function(require) {
 				// console.log(visualSearch);
 				var searchOptTemp = $.extend(true, [], searchOpt);
 				visualSearch.searchQuery.each(function(m) {
-					if ($.inArray(m.get('category'), searchOptTemp) >= 0) {
-						searchOptTemp.splice($.inArray(m.get('category'),
+					var cat = m.get('category');
+					if ($.inArray(cat, searchOptTemp) >= 0 && $.inArray(cat, multipleFacet) < 0) {
+						searchOptTemp.splice($.inArray(cat,
 								searchOptTemp), 1);
 					}
 				});
@@ -841,7 +861,15 @@ define(function(require) {
 					text : removedFacet.get('category')
 				});
 				if (!_.isUndefined(removedFacetSeverName)) {
-					delete collection.queryParams[removedFacetSeverName.label];
+					var queryValue = collection.queryParams[removedFacetSeverName.label];
+					if ($.inArray(removedFacetSeverName.text, multipleFacet) && Array.isArray(queryValue)) {
+						var idx = queryValue.indexOf(removedFacet.get("value"));
+						if (idx != -1) {
+							queryValue.splice(idx);
+						}
+					} else {
+						delete collection.queryParams[removedFacetSeverName.label];
+					}
 					collection.state.currentPage = collection.state.firstPage;
 				}
 				// TODO Added for Demo to remove datapicker popups
@@ -858,8 +886,7 @@ define(function(require) {
 		}));
 
 		if (visualSearch.searchQuery.length > 0) // For On Load Visual Search
-			search(visualSearch.searchQuery, serverAttrName, searchOpt,
-					collection);
+			search(visualSearch.searchQuery, collection);
 
 		return visualSearch;
 	};
diff --git a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
index 9c01eb7..def5e22 100644
--- a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
@@ -337,7 +337,9 @@ define(function(require) {
             var serviceUser = [{'label' : 'True' , 'value' : true},{'label' : 'False' , 'value' : false}]
 			var serverAttrName = [{text : 'Start Date',label :'startDate'},{text : 'End Date',label :'endDate'},
 				                  {text : 'Application',label : 'agentId'},
-			                      {text : 'User',label :'requestUser'},{text : 'Resource Name',label :'resourcePath'},
+				                  {text : 'User',label :'requestUser', 'addMultiple': true},
+				                  {text : 'Exclude User',label :'excludeUser', 'addMultiple': true},
+				                  {text : 'Resource Name',label :'resourcePath'},
 			                      {text : 'Service Name',label :'repoName'},{text : 'Policy ID',label :'policyId'},
 			                      {text : 'Service Type',label :'repoType','multiple' : true, 'optionsArr' : serverListForRepoType},
 			                      {text : 'Result',label :'accessResult', 'multiple' : true, 'optionsArr' : XAUtils.enumToSelectLabelValuePairs(XAEnums.AccessResult)},
@@ -346,21 +348,22 @@ define(function(require) {
 			                      {text : 'Resource Type',label : 'resourceType'},{text : 'Cluster Name',label : 'cluster'},
                                   {text : 'Zone Name',label : 'zoneName'},{text : localization.tt("lbl.agentHost"), label :"agentHost"}];
             var searchOpt = ['Resource Type','Start Date','End Date','Application','User','Service Name','Service Type','Resource Name','Access Type','Result','Access Enforcer',
-            'Client IP','Tags','Cluster Name', 'Zone Name', localization.tt("lbl.agentHost")];//,'Policy ID'
+            'Client IP','Tags','Cluster Name', 'Zone Name', 'Exclude User', localization.tt("lbl.agentHost")];//,'Policy ID'
                         this.clearVisualSearch(this.accessAuditList, serverAttrName);
                         this.searchInfoArr =[{text :'Access Enforcer', info :localization.tt('msg.accessEnforcer')},
                                             {text :'Access Type' 	, info :localization.tt('msg.accessTypeMsg')},
                                             {text :'Client IP' 		, info :localization.tt('msg.clientIP')},
-                                            {text : 'Cluster Name'  , info :localization.tt('h.clusterName')},
+                                            {text :'Cluster Name'	, info :localization.tt('h.clusterName')},
                                             {text :'Zone Name'      , info :localization.tt('h.zoneName')},
                                             {text :'End Date'       , info :localization.tt('h.endDate')},
                                             {text :'Resource Name' 	, info :localization.tt('msg.resourceName')},
                                             {text :'Resource Type'  , info :localization.tt('msg.resourceTypeMsg')},
                                             {text :'Result'			, info :localization.tt('msg.resultMsg')},
                                             {text :'Service Name' 	, info :localization.tt('h.serviceNameMsg')},
-                                        {text :'Service Type' 	, info :localization.tt('h.serviceTypeMsg')},
+                                            {text :'Service Type' 	, info :localization.tt('h.serviceTypeMsg')},
                                             {text :'Start Date'     , info :localization.tt('h.startDate')},
                                             {text :'User' 			, info :localization.tt('h.userMsg')},
+                                            {text :'Exclude User' 	, info :localization.tt('h.userMsg')},
                                             {text :'Application' 	, info :localization.tt('h.application')},
                                             {text :'Tags' 			, info :localization.tt('h.tagsMsg')} ];
                         //initilize info popover
@@ -376,7 +379,8 @@ define(function(require) {
 			      placeholder :localization.tt('h.searchForYourAccessAudit'),
 			      container : this.ui.visualSearch,
 			      query     : query,
-                              type		: 'bigData',
+			      supportMultipleItems: true,
+			      type		: 'bigData',
 			      callbacks :  { 
 					valueMatches : function(facet, searchTerm, callback) {
 						var auditList = [];
@@ -462,9 +466,9 @@ define(function(require) {
                 this.accessAuditList.queryParams.excludeServiceUser = true;
                 this.ui.serviceUsersExclude.prop('checked', true);
             }
-			this.visualSearch = XAUtils.addVisualSearch(searchOpt,serverAttrName, this.accessAuditList, pluginAttr);
-                        this.setEventsToFacets(this.visualSearch, App.vsHistory.bigData);
-		},
+            this.visualSearch = XAUtils.addVisualSearch(searchOpt,serverAttrName, this.accessAuditList, pluginAttr);
+            this.setEventsToFacets(this.visualSearch, App.vsHistory.bigData);
+        },
 		addSearchForAdminTab : function(){
 			var that = this;
 			var searchOpt = ["Audit Type", "User", "Actions", "Session ID", "Start Date", "End Date"];
@@ -678,14 +682,20 @@ define(function(require) {
                                 value.push(model) ;
                         });
                         vs.searchQuery.bind('remove', function(model){
-                                value = _.filter(value, function(m){ return m.get('category') != model.get('category');})
+                                value = _.filter(value, function(m){
+                                    return m.get('category') != model.get('category') || m.get('value') != model.get('value');
+                                });
                                 App.vsHistory[vs.options.type] = value;
                         });
                         vs.searchQuery.bind('change', function(model){
                                 _.each(App.vsHistory[vs.options.type],function(m){
-                                        if(m.get('category') == model.get('category')){
-                                                m.attributes.value = model.get('value');
+                                    if(m.cid == model.cid) {
+                                        m.attributes.value = model.get('value');
+                                    } else if (model._previousAttributes) {
+                                        if (model._previousAttributes.category === m.attributes.category && model._previousAttributes.value === m.attributes.value ) {
+                                            m.attributes.value = model.get('value');
                                         }
+                                    }
                                 })
                         });
 		},
diff --git a/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java b/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
index ef149d5..dce3b0b 100644
--- a/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
+++ b/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
@@ -40,6 +40,7 @@ import org.apache.ranger.common.RangerSearchUtil;
 import org.apache.ranger.common.SearchCriteria;
 import org.apache.ranger.common.ServiceUtil;
 import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.StringUtil;
 import org.apache.ranger.db.RangerDaoManager;
 import org.apache.ranger.db.XXServiceDefDao;
 import org.apache.ranger.entity.XXServiceDef;
@@ -761,7 +762,7 @@ public class TestAssetREST {
 		Mockito.verify(msBizUtil).isKeyAdmin();
 		Mockito.verify(assetMgr).getAccessLogs(searchCriteria);
 		Mockito.verify(daoManager).getXXServiceDef();
-		Mockito.verify(searchUtil, Mockito.times(14)).extractString((HttpServletRequest) Mockito.any(),
+		Mockito.verify(searchUtil, Mockito.times(13)).extractString((HttpServletRequest) Mockito.any(),
 				(SearchCriteria) Mockito.any(), Mockito.anyString(), Mockito.anyString(), Mockito.nullable(String.class));
 		Mockito.verify(searchUtil, Mockito.times(4)).extractInt((HttpServletRequest) Mockito.any(),
 				(SearchCriteria) Mockito.any(), Mockito.anyString(), Mockito.anyString());
@@ -769,6 +770,19 @@ public class TestAssetREST {
 				(SearchCriteria) Mockito.any(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString());
 		Mockito.verify(searchUtil).extractLong((HttpServletRequest) Mockito.any(),
 				(SearchCriteria) Mockito.any(), Mockito.anyString(), Mockito.anyString());
+		Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+			(SearchCriteria) Mockito.any(), Mockito.eq("requestUser"), Mockito.eq("Users"), Mockito.eq("requestUser"),
+			Mockito.any(), Mockito.eq(StringUtil.VALIDATION_TEXT));
+		Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+				(SearchCriteria) Mockito.any(), Mockito.eq("excludeUser"), Mockito.eq("Exclude Users"), Mockito.eq("-requestUser"),
+				Mockito.any(), Mockito.eq(StringUtil.VALIDATION_TEXT));
+		Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+				(SearchCriteria) Mockito.any(), Mockito.eq("zoneName"), Mockito.eq("Zone Name List"), Mockito.eq("zoneName"),
+				Mockito.eq(null), Mockito.eq(null));
+		Mockito.verify(searchUtil).extractCommonCriterias(Mockito.any(HttpServletRequest.class),
+			(List<SortField>) Mockito.any());
+		Mockito.verifyNoMoreInteractions(searchUtil, assetMgr, daoManager);
+
 	}
 
 	@Test
@@ -804,7 +818,7 @@ public class TestAssetREST {
 		Mockito.verify(msBizUtil).isKeyAdmin();
 		Mockito.verify(assetMgr).getAccessLogs(searchCriteria);
 		Mockito.verify(daoManager).getXXServiceDef();
-		Mockito.verify(searchUtil, Mockito.times(14)).extractString((HttpServletRequest) Mockito.any(),
+		Mockito.verify(searchUtil, Mockito.times(13)).extractString((HttpServletRequest) Mockito.any(),
 				(SearchCriteria) Mockito.any(), Mockito.anyString(), Mockito.anyString(), Mockito.nullable(String.class));
 		Mockito.verify(searchUtil, Mockito.times(4)).extractInt((HttpServletRequest) Mockito.any(),
 				(SearchCriteria) Mockito.any(), Mockito.anyString(), Mockito.anyString());
@@ -812,6 +826,18 @@ public class TestAssetREST {
 				(SearchCriteria) Mockito.any(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString());
 		Mockito.verify(searchUtil).extractLong((HttpServletRequest) Mockito.any(),
 				(SearchCriteria) Mockito.any(), Mockito.anyString(), Mockito.anyString());
+		Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+			(SearchCriteria) Mockito.any(), Mockito.eq("requestUser"), Mockito.eq("Users"), Mockito.eq("requestUser"),
+			Mockito.any(), Mockito.eq(StringUtil.VALIDATION_TEXT));
+		Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+			(SearchCriteria) Mockito.any(), Mockito.eq("excludeUser"), Mockito.eq("Exclude Users"), Mockito.eq("-requestUser"),
+			Mockito.any(), Mockito.eq(StringUtil.VALIDATION_TEXT));
+		Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+				(SearchCriteria) Mockito.any(), Mockito.eq("zoneName"), Mockito.eq("Zone Name List"), Mockito.eq("zoneName"),
+				Mockito.eq(null), Mockito.eq(null));
+		Mockito.verify(searchUtil).extractCommonCriterias(Mockito.any(HttpServletRequest.class),
+			(List<SortField>) Mockito.any());
+		Mockito.verifyNoMoreInteractions(searchUtil, assetMgr, daoManager);
 	}
 
 	@Test