You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by pr...@apache.org on 2018/03/07 06:40:53 UTC

[2/5] ranger git commit: RANGER-1889: List Users belonging to Group in Group tab.

RANGER-1889: List Users belonging to Group in Group tab.

Signed-off-by: pradeep <pr...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/ranger/commit/0e1169a5
Tree: http://git-wip-us.apache.org/repos/asf/ranger/tree/0e1169a5
Diff: http://git-wip-us.apache.org/repos/asf/ranger/diff/0e1169a5

Branch: refs/heads/ranger-1.0
Commit: 0e1169a5bb3202caec32f23ae83ace2d879caa2c
Parents: 72ed7d3
Author: ni3galave <ni...@gmail.com>
Authored: Thu Mar 1 18:26:37 2018 +0530
Committer: pradeep <pr...@apache.org>
Committed: Wed Mar 7 11:30:18 2018 +0530

----------------------------------------------------------------------
 .../java/org/apache/ranger/biz/XUserMgr.java    |  17 ++-
 .../java/org/apache/ranger/rest/XUserREST.java  |   5 +-
 .../scripts/modules/globalize/message/en.js     |   4 +-
 .../scripts/views/users/UserTableLayout.js      | 117 ++++++++++++++++++-
 security-admin/src/main/webapp/styles/xa.css    |  28 +++++
 .../org/apache/ranger/biz/TestXUserMgr.java     |  18 ++-
 .../org/apache/ranger/rest/TestXUserREST.java   |  11 +-
 7 files changed, 187 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ranger/blob/0e1169a5/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
index 71298a4..6acef0c 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
@@ -816,12 +816,13 @@ public class XUserMgr extends XUserMgrBase {
 		return ret;
 	}
 
-	public VXUserList getXGroupUsers(Long xGroupId) {
-		SearchCriteria searchCriteria = new SearchCriteria();
-		searchCriteria.addParam("xGroupId", xGroupId);
+        public VXUserList getXGroupUsers(SearchCriteria searchCriteria) {
+
+                VXUserList vXUserList = new VXUserList();
+
 		VXGroupUserList vXGroupUserList = xGroupUserService
 				.searchXGroupUsers(searchCriteria);
-		VXUserList vXUserList = new VXUserList();
+
 
 		List<VXUser> vXUsers = new ArrayList<VXUser>();
 		if (vXGroupUserList != null) {
@@ -836,8 +837,14 @@ public class XUserMgr extends XUserMgrBase {
 
 			}
 			vXUserList.setVXUsers(vXUsers);
+                        vXUserList.setStartIndex(searchCriteria.getStartIndex());
+                        vXUserList.setResultSize(vXGroupUserList.getList().size());
+                        vXUserList.setTotalCount(vXGroupUserList.getTotalCount());
+                        vXUserList.setPageSize(searchCriteria.getMaxRows());
+                        vXUserList.setSortBy(vXGroupUserList.getSortBy());
+                        vXUserList.setSortType(vXGroupUserList.getSortType());
 		} else {
-			logger.debug("No users found for group id : " + xGroupId);
+                        logger.debug("No users found for group id : " + searchCriteria.getParamValue("xGroupId"));
 		}
 		return vXUserList;
 	}

http://git-wip-us.apache.org/repos/asf/ranger/blob/0e1169a5/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java b/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
index a07c243..9a5c823 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/XUserREST.java
@@ -770,7 +770,10 @@ public class XUserREST {
 	@PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + RangerAPIList.GET_X_GROUP_USERS + "\")")
 	public VXUserList getXGroupUsers(@Context HttpServletRequest request,
 			@PathParam("groupId") Long id){
-		return xUserMgr.getXGroupUsers(id);
+                SearchCriteria searchCriteria = searchUtil.extractCommonCriterias(
+                                request, xGroupUserService.sortFields);
+                searchCriteria.addParam("xGroupId", id);
+                return xUserMgr.getXGroupUsers(searchCriteria);
 	}
 
 	@GET

http://git-wip-us.apache.org/repos/asf/ranger/blob/0e1169a5/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
index 8aaf705..c3b41c1 100644
--- a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
+++ b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
@@ -424,7 +424,9 @@ define(function(require) {
                 activationTimeDelayMsg       :'Policy activation time delayed by more than 1hr from last update time.',
                 pleaseSelectAccessTypeForTagMasking : 'Please select access type first to enable add masking options.',
                 addUserOrGroupForDelegateAdmin      : 'Please select user/group for the selected permission(s)',
-                policyLabelsinfo		: 'Enter label of policy'
+                policyLabelsinfo		: 'Enter label of policy',
+                noUserFoundText			: 'No user associate with this group.',
+                showInitialHundredUser  : 'Initially search filter is applied for first hundred users. To get more users click on '
  
 			},
 			plcHldr : {

http://git-wip-us.apache.org/repos/asf/ranger/blob/0e1169a5/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js b/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
index 410a8ad..886b789 100644
--- a/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
@@ -64,7 +64,8 @@ define(function(require){
     		btnShowHide		: '[data-action="showHide"]',
 			visibilityDropdown		: '[data-id="visibilityDropdown"]',
 			addNewBtnDiv	: '[data-id="addNewBtnDiv"]',
-			deleteUser: '[data-id="deleteUserGroup"]'
+                        deleteUser: '[data-id="deleteUserGroup"]',
+                       showUserList:'[data-js="showUserList"]',
     	},
 
 		/** ui events hash */
@@ -76,7 +77,8 @@ define(function(require){
 			events['click ' + this.ui.btnSave]  = 'onSave';
 			events['click ' + this.ui.visibilityDropdown +' li a']  = 'onVisibilityChange';
 			events['click ' + this.ui.deleteUser] = 'onDeleteUser';
-			return events;
+            events['click ' + this.ui.showUserList] = 'showUserList';
+            return events;
 		},
 
     	/**
@@ -468,7 +470,20 @@ define(function(require){
 					}),
 					editable:false,
 					sortable:false
-				}
+                },
+                member	:{
+                    label : "Users",
+                    click : false,
+                    cell  : Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
+                    drag  : false,
+                    editable  : false,
+                    formatter : _.extend({}, Backgrid.CellFormatter.prototype, {
+                        fromRaw : function (rawValue,model) {
+                            return ('<div align="center"><button class="userViewicon" title = "View Users" data-js="showUserList" data-name="' + model.get('name')
+                                + '" data-id="' + model.id + '"<font color="black"><i class="icon-group"> </i></font></button></div>');
+                        }
+                    }),
+                }
 			};
             if(!SessionMgr.isSystemAdmin()){
                 delete cols.select;
@@ -479,6 +494,100 @@ define(function(require){
 			return this.groupList.constructor.getTableCols(cols, this.groupList);
 		},
 
+        showUserList :function(e){
+            XAUtil.blockUI();
+            var that = this , name , msg = "", content = "" , totalRecords, infoMsg = "";
+            var anchor = $(e.currentTarget);
+            this.groupId = anchor.attr('data-id');
+            name = anchor.attr('data-name');
+            this.grpUserList = new VXUserList();
+            this.grpUserList.url  = "service/xusers/"+ this.groupId +"/users";
+            this.grpUserList.setPageSize(100);
+            this.grpUserList.fetch({
+                async : true,
+                cache : false,
+                reset : true,
+            }).then(function(){
+                XAUtil.blockUI('unblock');
+                totalRecords = this.state.totalRecords;
+                var title =  "<h4>User's List: " + name + "</h4>";
+                    _.each(that.grpUserList.models , function(model){
+                        msg +='<span class="label label-info userLists span-margin" >'+ model.get('name') + '</span>';
+                    });
+                    var html = '<div class="row-fluid">\
+                                    <div class="span12"><input type="text" data-id="userInput" placeholder="Search Users" class= "users-list-search"></div>\
+                                </div>';
+                    if(totalRecords > 100){
+                        var showAllUserbtn = '<button class="btn btn-mini showMore" data-id="'+ that.groupId +'" data-id="showMore" title="Show All Users">Show All Users</button>'
+                        infoMsg = '<div class="alert alert-warning infoWidth">'+localization.tt('msg.showInitialHundredUser')+showAllUserbtn+'</div>'
+                    }
+                    if(_.isEmpty(msg)){
+                            content = localization.tt("msg.noUserFoundText");
+                    }else{
+                            content = infoMsg + html + '<div class="usernames clearfix">' + msg +'</div>';
+                    }
+                    var modal = new Backbone.BootstrapModal({
+                        animate : true,
+                        content	: content,
+                        title   : title,
+                        okText  : localization.tt("lbl.ok"),
+                        allowCancel : true,
+                    }).open();
+                    modal.$el.find('.cancel').hide();
+                    that.showAllUser(modal, totalRecords, msg);
+            })
+        },
+
+        showAllUser : function(modal, totalRecords, msg){
+            var that = this;
+            var filterUserLists = _.clone(modal.$content.find('span'));
+            modal.$content.find('.showMore').on("click" ,function(){
+                modal.$el.find('.modal-body').scrollTop(0);
+                modal.$el.find('.modal-body').addClass('pointer-event');
+                modal.$el.find('.modal-body').append('<div class="loaderForModal"></div>');
+                this.grpUserList = new VXUserList();
+                this.grpUserList.url  = "service/xusers/"+ that.groupId +"/users";
+                this.grpUserList.setPageSize(totalRecords);
+                this.grpUserList.fetch({
+                    async : true,
+                    cache : false,
+                    reset : true,
+                }).then(function(){
+                    var tag ="";
+                    modal.$content.find('.showMore').attr('disabled',true);
+                    modal.$el.find('.modal-body').removeClass('pointer-event');
+                    modal.$el.find('.loaderForModal').remove();
+                    _.each(this.models, function(m){
+                        tag +='<span class="label label-info userLists span-margin" >'+ m.get('name') + '</span>';
+                    });
+                    modal.$el.find(".usernames").empty();
+                    modal.$el.find(".usernames").append(tag);
+                    filterUserLists = _.clone(modal.$content.find('span'));
+                    msg = tag;
+                })
+            });
+            modal.$el.find('[data-id="userInput"]').on("keyup" ,function(){
+                var input, users;
+                input = $('input[data-id="userInput"]');
+                users = msg;
+                if(!_.isEmpty(input.val())){
+                    users = _.filter(filterUserLists, function(v) {
+                        if(v.innerText.toLowerCase().indexOf(input.val().toLowerCase()) > -1){
+                            return v;
+                        }
+                    });
+                }
+                modal.$el.find(".usernames").empty();
+                if(_.isEmpty(users)){
+                    users = "No users found."
+                }
+                modal.$el.find(".usernames").append(users);
+                if(_.isEmpty(input.val())){
+                    that.showAllUser(modal, totalRecords, msg);
+                }
+            })
+        },
+
 		onUserGroupDeleteSuccess: function(jsonUsers,collection){
 			_.each(jsonUsers.vXStrings,function(ob){
 				var model = _.find(collection.models, function(mo){
@@ -696,6 +805,8 @@ define(function(require){
 		/** on close */
 		onClose: function(){
 			XAUtil.allowNavigation();
+			$('.fade.modal').hide();
+			$('.modal-backdrop').hide();
 		}
 
 	});

http://git-wip-us.apache.org/repos/asf/ranger/blob/0e1169a5/security-admin/src/main/webapp/styles/xa.css
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/styles/xa.css b/security-admin/src/main/webapp/styles/xa.css
index 5ccbbc2..d57d169 100644
--- a/security-admin/src/main/webapp/styles/xa.css
+++ b/security-admin/src/main/webapp/styles/xa.css
@@ -1836,6 +1836,9 @@ margin-top: -29px;
   font-weight: normal;
   text-shadow: none;
 }
+.tr-inactive td button.userViewicon i{
+  color: #BCBCBC;
+}
 td.select-row-cell {
   text-align: center;
 }
@@ -2256,3 +2259,28 @@ textarea:read-only{
 	max-height: 200px;
 	overflow-y: auto;
 }
+.userViewicon {
+    float: center;
+    line-height: 12px;
+}
+.users-list-search{
+    width : 500px;
+    padding : 10px;
+}
+.span-margin{
+    margin: 2px;
+}
+.loaderForModal{
+  background: url(../images/loading.gif) no-repeat center center rgba(0,0,0,0.3);
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+.pointer-event{
+    pointer-events: none;
+}
+.infoWidth{
+  width: 475px;
+}

http://git-wip-us.apache.org/repos/asf/ranger/blob/0e1169a5/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
----------------------------------------------------------------------
diff --git a/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java b/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
index 0b71695..39c60a9 100644
--- a/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
+++ b/security-admin/src/test/java/org/apache/ranger/biz/TestXUserMgr.java
@@ -589,7 +589,9 @@ public class TestXUserMgr {
 
 	@Test
 	public void test23GetXGroupUsers() {
-		VXUserList dbVXUserList = xUserMgr.getXGroupUsers(userId);
+                SearchCriteria testSearchCriteria = createsearchCriteria();
+                testSearchCriteria.addParam("xGroupId", userId);
+                VXUserList dbVXUserList = xUserMgr.getXGroupUsers(testSearchCriteria);
 		VXGroup vXGroup = new VXGroup();
 		vXGroup.setId(userId);
 		vXGroup.setDescription("group test");
@@ -1659,4 +1661,18 @@ public class TestXUserMgr {
 				.getLoginId());
 		Assert.assertNotNull(vXStringList);
 	}
+
+        private SearchCriteria createsearchCriteria(){
+                SearchCriteria testsearchCriteria = new SearchCriteria();
+                testsearchCriteria.setStartIndex(0);
+                testsearchCriteria.setMaxRows(Integer.MAX_VALUE);
+                testsearchCriteria.setSortBy("id");
+                testsearchCriteria.setSortType("asc");
+                testsearchCriteria.setGetCount(true);
+                testsearchCriteria.setOwnerId(null);
+                testsearchCriteria.setGetChildren(false);
+                testsearchCriteria.setDistinct(false);
+
+                return testsearchCriteria;
+        }
 }

http://git-wip-us.apache.org/repos/asf/ranger/blob/0e1169a5/security-admin/src/test/java/org/apache/ranger/rest/TestXUserREST.java
----------------------------------------------------------------------
diff --git a/security-admin/src/test/java/org/apache/ranger/rest/TestXUserREST.java b/security-admin/src/test/java/org/apache/ranger/rest/TestXUserREST.java
index 1bf3099..529fd5b 100644
--- a/security-admin/src/test/java/org/apache/ranger/rest/TestXUserREST.java
+++ b/security-admin/src/test/java/org/apache/ranger/rest/TestXUserREST.java
@@ -105,11 +105,13 @@ import org.apache.ranger.db.XXUserDao;
 import org.apache.ranger.entity.XXPolicy;
 import org.apache.ranger.entity.XXUser;
 import org.apache.ranger.db.XXAuditMapDao;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+
 import javax.servlet.http.HttpServletRequest;
 
 @RunWith(MockitoJUnitRunner.class)
@@ -1259,10 +1261,15 @@ public class TestXUserREST {
 		assertEquals(groupList.getResultSize(),retVxGroupList.getResultSize());
 		Mockito.verify(xUserMgr).getXUserGroups(id);
 	}
+        @SuppressWarnings("unchecked")
 	@Test
 	public void test73getXGroupUsers() {
 		
 		HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+                SearchCriteria testSearchCriteria=createsearchCriteria();
+                testSearchCriteria.addParam("xGroupId", id);
+
+                Mockito.when(searchUtil.extractCommonCriterias((HttpServletRequest)Mockito.any() ,(List<SortField>)Mockito.any())).thenReturn(testSearchCriteria);
 		
 		VXUser testVXUser=createVXUser();
 		VXUserList testVXUserList= new VXUserList();
@@ -1271,13 +1278,13 @@ public class TestXUserREST {
 		testVXUserList.setVXUsers(testVXUsers);
 		testVXUserList.setStartIndex(1);
 		testVXUserList.setTotalCount(1);
-		Mockito.when(xUserMgr.getXGroupUsers(id)).thenReturn(testVXUserList);
+                Mockito.when(xUserMgr.getXGroupUsers(testSearchCriteria)).thenReturn(testVXUserList);
 		VXUserList retVxGroupList= xUserRest.getXGroupUsers(request,id);
 		
 		assertNotNull(retVxGroupList);
 		assertEquals(testVXUserList.getTotalCount(),retVxGroupList.getTotalCount());
 		assertEquals(testVXUserList.getStartIndex(),retVxGroupList.getStartIndex());
-		Mockito.verify(xUserMgr).getXGroupUsers(id);
+                Mockito.verify(xUserMgr).getXGroupUsers(testSearchCriteria);
 	}
 	@SuppressWarnings("unchecked")
 	@Test