Repository: zeppelin
Updated Branches:
  refs/heads/master d2e789714 -> 36f7d3da7


ZEPPELIN-3570. Fix for doing user search for LDAPRealm

To enable user search for LdapRealm.

Bug Fix

https://issues.apache.org/jira/browse/ZEPPELIN-3570

For the below config
```
[main]
ldapRealm = org.apache.zeppelin.realm.LdapRealm
ldapRealm.userDnTemplate = cn={0},ou=Users,dc=company,dc=com
ldapRealm.contextFactory.url = ldap://<ldap-server-host>:389
ldapRealm.contextFactory.authenticationMechanism = SIMPLE
ldapRealm.searchBase = dc=company,dc=com
ldapRealm.userSearchBase = dc=company,dc=com
ldapRealm.groupSearchBase = dc=company,dc=com
ldapRealm.userSearchAttributeName = uid

sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
securityManager.sessionManager = $sessionManager
securityManager.sessionManager.globalSessionTimeout = 86400000
shiro.loginUrl = /api/login
[urls]
/api/version = anon
/** = authc
```
user search in notebook/interpreter should work for partial string.

Author: Supreeth Sharma <ssharma@HW11607.local>

Closes #3045 from ssharma555/ZEPPELIN-3570 and squashes the following commits:

6a5a38e67 [Supreeth Sharma] ZEPPELIN-3570. Fix for doing user search for 
LDAPRealm

Change-Id: I46fd67b44f2632c430a0d2b9c7545a30974cc3a5


Project: http://git-wip-us.apache.org/repos/asf/zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/zeppelin/commit/36f7d3da
Tree: http://git-wip-us.apache.org/repos/asf/zeppelin/tree/36f7d3da
Diff: http://git-wip-us.apache.org/repos/asf/zeppelin/diff/36f7d3da

Branch: refs/heads/master
Commit: 36f7d3da7af273a4458905727bfeda6473b16be9
Parents: d2e7897
Author: Supreeth Sharma <ssharma@HW11607.local>
Authored: Fri Jun 29 15:35:48 2018 +0530
Committer: Prabhjyot Singh <prabhjyotsi...@gmail.com>
Committed: Thu Jul 5 12:31:35 2018 +0530

----------------------------------------------------------------------
 .../zeppelin/realm/ActiveDirectoryGroupRealm.java      |  4 +++-
 .../java/org/apache/zeppelin/rest/GetUserList.java     | 13 ++++++++-----
 .../java/org/apache/zeppelin/rest/SecurityRestApi.java | 12 ++++++++----
 3 files changed, 19 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zeppelin/blob/36f7d3da/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
----------------------------------------------------------------------
diff --git 
a/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
 
b/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
index 40d28fe..41d9f5d 100644
--- 
a/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
+++ 
b/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
@@ -238,12 +238,14 @@ public class ActiveDirectoryGroupRealm extends 
AbstractLdapRealm {
     return new SimpleAuthorizationInfo(roleNames);
   }
 
-  public List<String> searchForUserName(String containString, LdapContext 
ldapContext)
+  public List<String> searchForUserName(String containString, LdapContext 
ldapContext,
+      int numUsersToFetch)
           throws NamingException {
     List<String> userNameList = new ArrayList<>();
 
     SearchControls searchCtls = new SearchControls();
     searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+    searchCtls.setCountLimit(numUsersToFetch);
 
     String searchFilter = "(&(objectClass=*)(userPrincipalName=*" + 
containString + "*))";
     Object[] searchArguments = new Object[]{containString};

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/36f7d3da/zeppelin-server/src/main/java/org/apache/zeppelin/rest/GetUserList.java
----------------------------------------------------------------------
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 1cbb4a6..0b47819 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
@@ -91,7 +91,7 @@ public class GetUserList {
   /**
    * Function to extract users from LDAP.
    */
-  public List<String> getUserList(JndiLdapRealm r, String searchText) {
+  public List<String> getUserList(JndiLdapRealm r, String searchText, int 
numUsersToFetch) {
     List<String> userList = new ArrayList<>();
     String userDnTemplate = r.getUserDnTemplate();
     String userDn[] = userDnTemplate.split(",", 2);
@@ -101,6 +101,7 @@ public class GetUserList {
     try {
       LdapContext ctx = cf.getSystemLdapContext();
       SearchControls constraints = new SearchControls();
+      constraints.setCountLimit(numUsersToFetch);
       constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
       String[] attrIDs = {userDnPrefix};
       constraints.setReturningAttributes(attrIDs);
@@ -123,7 +124,7 @@ public class GetUserList {
   /**
    * Function to extract users from Zeppelin LdapRealm.
    */
-  public List<String> getUserList(LdapRealm r, String searchText) {
+  public List<String> getUserList(LdapRealm r, String searchText, int 
numUsersToFetch) {
     List<String> userList = new ArrayList<>();
     if (LOG.isDebugEnabled()) {
       LOG.debug("SearchText: " + searchText);
@@ -136,11 +137,12 @@ public class GetUserList {
       LdapContext ctx = cf.getSystemLdapContext();
       SearchControls constraints = new SearchControls();
       constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
+      constraints.setCountLimit(numUsersToFetch);
       String[] attrIDs = {userAttribute};
       constraints.setReturningAttributes(attrIDs);
       NamingEnumeration result = ctx.search(userSearchRealm, "(&(objectclass=" 
+ 
             userObjectClass + ")(" 
-            + userAttribute + "=" + searchText + "))", constraints);
+            + userAttribute + "=*" + searchText + "*))", constraints);
       while (result.hasMore()) {
         Attributes attrs = ((SearchResult) result.next()).getAttributes();
         if (attrs.get(userAttribute) != null) {
@@ -187,11 +189,12 @@ public class GetUserList {
     return roleList;
   }
 
-  public List<String> getUserList(ActiveDirectoryGroupRealm r, String 
searchText) {
+  public List<String> getUserList(ActiveDirectoryGroupRealm r, String 
searchText,
+      int numUsersToFetch) {
     List<String> userList = new ArrayList<>();
     try {
       LdapContext ctx = r.getLdapContextFactory().getSystemLdapContext();
-      userList = r.searchForUserName(searchText, ctx);
+      userList = r.searchForUserName(searchText, ctx, numUsersToFetch);
     } catch (Exception e) {
       LOG.error("Error retrieving User list from ActiveDirectory Realm", e);
     }

http://git-wip-us.apache.org/repos/asf/zeppelin/blob/36f7d3da/zeppelin-server/src/main/java/org/apache/zeppelin/rest/SecurityRestApi.java
----------------------------------------------------------------------
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 18d23c1..0bb4d95 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
@@ -109,6 +109,8 @@ public class SecurityRestApi {
   @GET
   @Path("userlist/{searchText}")
   public Response getUserList(@PathParam("searchText") final String 
searchText) {
+
+    final int numUsersToFetch = 5;
     List<String> usersList = new ArrayList<>();
     List<String> rolesList = new ArrayList<>();
     try {
@@ -125,13 +127,15 @@ public class SecurityRestApi {
             usersList.addAll(getUserListObj.getUserList((IniRealm) realm));
             rolesList.addAll(getUserListObj.getRolesList((IniRealm) realm));
           } else if (name.equals("org.apache.zeppelin.realm.LdapGroupRealm")) {
-            usersList.addAll(getUserListObj.getUserList((JndiLdapRealm) realm, 
searchText));
+            usersList.addAll(getUserListObj.getUserList((JndiLdapRealm) realm, 
searchText,
+                numUsersToFetch));
           } else if (name.equals("org.apache.zeppelin.realm.LdapRealm")) {
-            usersList.addAll(getUserListObj.getUserList((LdapRealm) realm, 
searchText));
+            usersList.addAll(getUserListObj.getUserList((LdapRealm) realm, 
searchText,
+                numUsersToFetch));
             rolesList.addAll(getUserListObj.getRolesList((LdapRealm) realm));
           } else if 
(name.equals("org.apache.zeppelin.realm.ActiveDirectoryGroupRealm")) {
             
usersList.addAll(getUserListObj.getUserList((ActiveDirectoryGroupRealm) realm,
-                searchText));
+                searchText, numUsersToFetch));
           } else if (name.equals("org.apache.shiro.realm.jdbc.JdbcRealm")) {
             usersList.addAll(getUserListObj.getUserList((JdbcRealm) realm));
           }
@@ -161,7 +165,7 @@ public class SecurityRestApi {
         autoSuggestUserList.add(user);
         maxLength++;
       }
-      if (maxLength == 5) {
+      if (maxLength == numUsersToFetch) {
         break;
       }
     }

Reply via email to