You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/06/11 07:37:07 UTC

[james-project] 11/18: JAMES-3594 LDAP user listing: avoid extra requests for each users

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

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit bfd78ca918f98f613452d948ba672f724ad4ee67
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Jun 9 11:21:11 2021 +0700

    JAMES-3594 LDAP user listing: avoid extra requests for each users
    
    Because we needed a conversion DN <-> username.
---
 .../james/user/ldap/ReadOnlyLDAPUsersDAO.java      | 25 ++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPUsersDAO.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPUsersDAO.java
index 9a4d707..f1c1819 100644
--- a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPUsersDAO.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyLDAPUsersDAO.java
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Stream;
 
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
@@ -45,6 +46,7 @@ import org.slf4j.LoggerFactory;
 
 import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
+import com.unboundid.ldap.sdk.Attribute;
 import com.unboundid.ldap.sdk.Entry;
 import com.unboundid.ldap.sdk.Filter;
 import com.unboundid.ldap.sdk.LDAPConnection;
@@ -169,7 +171,7 @@ public class ReadOnlyLDAPUsersDAO implements UsersDAO, Configurable {
         return result;
     }
 
-    private Set<String> getAllUsersFromLDAP() throws LDAPException {
+    private Set<String> getAllUsersDNFromLDAP() throws LDAPException {
         SearchRequest searchRequest = new SearchRequest(ldapConfiguration.getUserBase(),
             SearchScope.SUB,
             createFilter(),
@@ -183,6 +185,21 @@ public class ReadOnlyLDAPUsersDAO implements UsersDAO, Configurable {
             .collect(Guavate.toImmutableSet());
     }
 
+    private Stream<Username> getAllUsernamesFromLDAP() throws LDAPException {
+        SearchRequest searchRequest = new SearchRequest(ldapConfiguration.getUserBase(),
+            SearchScope.SUB,
+            createFilter(),
+            ldapConfiguration.getUserIdAttribute());
+
+        SearchResult searchResult = ldapConnectionPool.search(searchRequest);
+
+        return searchResult.getSearchEntries()
+            .stream()
+            .flatMap(entry -> Optional.ofNullable(entry.getAttribute(ldapConfiguration.getUserIdAttribute())).stream())
+            .map(Attribute::getValue)
+            .map(Username::of);
+    }
+
     /**
      * Extract the user attributes for the given collection of userDNs, and
      * encapsulates the user list as a collection of {@link ReadOnlyLDAPUser}s.
@@ -315,6 +332,10 @@ public class ReadOnlyLDAPUsersDAO implements UsersDAO, Configurable {
     }
 
     private Iterator<Username> doList() throws LDAPException {
+        if (!ldapConfiguration.getRestriction().isActivated()) {
+            return getAllUsernamesFromLDAP().iterator();
+        }
+
         return buildUserCollection(getValidUsers())
             .stream()
             .map(ReadOnlyLDAPUser::getUserName)
@@ -322,7 +343,7 @@ public class ReadOnlyLDAPUsersDAO implements UsersDAO, Configurable {
     }
 
     private Collection<String> getValidUsers() throws LDAPException {
-        Set<String> userDNs = getAllUsersFromLDAP();
+        Set<String> userDNs = getAllUsersDNFromLDAP();
         Collection<String> validUserDNs;
         if (ldapConfiguration.getRestriction().isActivated()) {
             final LDAPConnection connection = ldapConnectionPool.getConnection();

---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org