diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/GetUserList.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/GetUserList.java
index 2727fb4a411..f1a895c8bcf 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/GetUserList.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/GetUserList.java
@@ -67,6 +67,25 @@ public List getUserList(IniRealm r) {
return userList;
}
+
+ /***
+ * Get user roles from shiro.ini
+ * @param r
+ * @return
+ */
+ public List getRolesList(IniRealm r) {
+ List roleList = new ArrayList<>();
+ Map getIniRoles = r.getIni().get("roles");
+ if (getIniRoles != null) {
+ Iterator it = getIniRoles.entrySet().iterator();
+ while (it.hasNext()) {
+ Map.Entry pair = (Map.Entry) it.next();
+ roleList.add(pair.getKey().toString().trim());
+ }
+ }
+ return roleList;
+ }
+
/**
* function to extract users from LDAP
*/
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java
index a079a4460c9..7af52c8c8ba 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java
@@ -18,9 +18,9 @@
package org.apache.zeppelin.rest;
+import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.jdbc.JdbcRealm;
-import org.apache.shiro.realm.ldap.AbstractLdapRealm;
import org.apache.shiro.realm.ldap.JndiLdapRealm;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.zeppelin.annotation.ZeppelinApi;
@@ -98,6 +98,7 @@ public Response ticket() {
public Response getUserList(@PathParam("searchText") final String searchText) {
List usersList = new ArrayList<>();
+ List rolesList = new ArrayList<>();
try {
GetUserList getUserListObj = new GetUserList();
Collection realmsList = SecurityUtils.getRealmsList();
@@ -107,6 +108,7 @@ public Response getUserList(@PathParam("searchText") final String searchText) {
String name = realm.getName();
if (name.equals("iniRealm")) {
usersList.addAll(getUserListObj.getUserList((IniRealm) realm));
+ rolesList.addAll(getUserListObj.getRolesList((IniRealm) realm));
} else if (name.equals("ldapRealm")) {
usersList.addAll(getUserListObj.getUserList((JndiLdapRealm) realm, searchText));
} else if (name.equals("activeDirectoryRealm")) {
@@ -120,8 +122,10 @@ public Response getUserList(@PathParam("searchText") final String searchText) {
} catch (Exception e) {
LOG.error("Exception in retrieving Users from realms ", e);
}
- List autoSuggestList = new ArrayList<>();
+ List autoSuggestUserList = new ArrayList<>();
+ List autoSuggestRoleList = new ArrayList<>();
Collections.sort(usersList);
+ Collections.sort(rolesList);
Collections.sort(usersList, new Comparator() {
@Override
public int compare(String o1, String o2) {
@@ -134,18 +138,28 @@ public int compare(String o1, String o2) {
}
});
int maxLength = 0;
- for (int i = 0; i < usersList.size(); i++) {
- String userLowerCase = usersList.get(i).toLowerCase();
- String searchTextLowerCase = searchText.toLowerCase();
- if (userLowerCase.indexOf(searchTextLowerCase) != -1) {
+ for (String user : usersList) {
+ if (StringUtils.containsIgnoreCase(user, searchText)) {
+ autoSuggestUserList.add(user);
maxLength++;
- autoSuggestList.add(usersList.get(i));
}
if (maxLength == 5) {
break;
}
}
- return new JsonResponse<>(Response.Status.OK, "", autoSuggestList).build();
+
+ for (String role : rolesList) {
+ if (StringUtils.containsIgnoreCase(role, searchText)) {
+ autoSuggestRoleList.add(role);
+ }
+ }
+
+ Map returnListMap = new HashMap<>();
+ returnListMap.put("users", autoSuggestUserList);
+ returnListMap.put("roles", autoSuggestRoleList);
+
+
+ return new JsonResponse<>(Response.Status.OK, "", returnListMap).build();
}
}
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/integration/AuthenticationIT.java b/zeppelin-server/src/test/java/org/apache/zeppelin/integration/AuthenticationIT.java
index 671b213b471..ea810cbd05e 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/integration/AuthenticationIT.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/integration/AuthenticationIT.java
@@ -161,12 +161,12 @@ public void testGroupPermission() throws Exception {
pollingWait(By.xpath("//span[@tooltip='Note permissions']"),
MAX_BROWSER_TIMEOUT_SEC).click();
- pollingWait(By.xpath("//input[@ng-model='permissions.owners']"), MAX_BROWSER_TIMEOUT_SEC)
- .sendKeys("finance");
- pollingWait(By.xpath("//input[@ng-model='permissions.readers']"), MAX_BROWSER_TIMEOUT_SEC)
- .sendKeys("finance");
- pollingWait(By.xpath("//input[@ng-model='permissions.writers']"), MAX_BROWSER_TIMEOUT_SEC)
- .sendKeys("finance");
+ pollingWait(By.xpath(".//*[@id='selectOwners']/following::span//input"),
+ MAX_BROWSER_TIMEOUT_SEC).sendKeys("finance ");
+ pollingWait(By.xpath(".//*[@id='selectReaders']/following::span//input"),
+ MAX_BROWSER_TIMEOUT_SEC).sendKeys("finance ");
+ pollingWait(By.xpath(".//*[@id='selectWriters']/following::span//input"),
+ MAX_BROWSER_TIMEOUT_SEC).sendKeys("finance ");
pollingWait(By.xpath("//button[@ng-click='savePermissions()']"), MAX_BROWSER_TIMEOUT_SEC)
.sendKeys(Keys.ENTER);
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/SecurityRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/SecurityRestApiTest.java
index 54c31c1fd6a..b4ecd97e375 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/SecurityRestApiTest.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/SecurityRestApiTest.java
@@ -69,7 +69,7 @@ public void testGetUserList() throws IOException {
get.addRequestHeader("Origin", "http://localhost");
Map resp = gson.fromJson(get.getResponseBodyAsString(),
new TypeToken
diff --git a/zeppelin-web/src/index.html b/zeppelin-web/src/index.html
index 9fe9489501c..ff1fa91feeb 100644
--- a/zeppelin-web/src/index.html
+++ b/zeppelin-web/src/index.html
@@ -48,6 +48,7 @@
+
@@ -144,6 +145,7 @@
+
diff --git a/zeppelin-web/test/karma.conf.js b/zeppelin-web/test/karma.conf.js
index 778f0f151fd..f9f03a413fa 100644
--- a/zeppelin-web/test/karma.conf.js
+++ b/zeppelin-web/test/karma.conf.js
@@ -64,6 +64,7 @@ module.exports = function(config) {
'bower_components/pikaday/pikaday.js',
'bower_components/handsontable/dist/handsontable.js',
'bower_components/moment-duration-format/lib/moment-duration-format.js',
+ 'bower_components/select2/dist/js/select2.js',
'bower_components/angular-mocks/angular-mocks.js',
// endbower
'src/app/app.js',