Browse Source

ldapchai 0.8.3 update

Jason Rivard 2 years ago
parent
commit
97f4c80e49
2 changed files with 21 additions and 46 deletions
  1. 1 1
      server/pom.xml
  2. 20 45
      server/src/main/java/password/pwm/ldap/LdapBrowser.java

+ 1 - 1
server/pom.xml

@@ -171,7 +171,7 @@
         <dependency>
         <dependency>
             <groupId>com.github.ldapchai</groupId>
             <groupId>com.github.ldapchai</groupId>
             <artifactId>ldapchai</artifactId>
             <artifactId>ldapchai</artifactId>
-            <version>0.8.2</version>
+            <version>0.8.3</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.jrivard.xmlchai</groupId>
             <groupId>org.jrivard.xmlchai</groupId>

+ 20 - 45
server/src/main/java/password/pwm/ldap/LdapBrowser.java

@@ -21,6 +21,7 @@
 package password.pwm.ldap;
 package password.pwm.ldap;
 
 
 import com.novell.ldapchai.ChaiEntry;
 import com.novell.ldapchai.ChaiEntry;
+import com.novell.ldapchai.ChaiEntryFactory;
 import com.novell.ldapchai.exception.ChaiOperationException;
 import com.novell.ldapchai.exception.ChaiOperationException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.exception.ChaiUnavailableException;
 import com.novell.ldapchai.provider.ChaiProvider;
 import com.novell.ldapchai.provider.ChaiProvider;
@@ -51,6 +52,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Set;
 import java.util.Set;
@@ -174,7 +176,7 @@ public class LdapBrowser
         for ( final Map.Entry<String, DnType> entry : childDNs.entrySet() )
         for ( final Map.Entry<String, DnType> entry : childDNs.entrySet() )
         {
         {
             final String childDN = entry.getKey();
             final String childDN = entry.getKey();
-            final DNInformation dnInformation = new DNInformation( entryNameFromDN( childDN ), childDN );
+            final DNInformation dnInformation = new DNInformation( rdnNameFromDN( childDN ), childDN );
 
 
             if ( entry.getValue() == DnType.navigable )
             if ( entry.getValue() == DnType.navigable )
             {
             {
@@ -226,67 +228,42 @@ public class LdapBrowser
             ) ) );
             ) ) );
         }
         }
 
 
-        final Map<String, Map<String, List<String>>> results = doLdapSearch( dn, chaiProvider );
+        final Set<String> results = doLdapSearch( dn, chaiProvider );
 
 
-        final HashMap<String, DnType> returnMap = new HashMap<>( results.size() );
-        for ( final Map.Entry<String, Map<String, List<String>>> entry : results.entrySet() )
+        final HashMap<String, DnType> returnMap = new LinkedHashMap<>( results.size() );
+        for ( final String resultDN : results )
         {
         {
-            final String resultDN = entry.getKey();
-            final Map<String, List<String>> attributeResults = entry.getValue();
-
-            final DnType dnType = dnHasSubordinates( dn, chaiProvider, resultDN, attributeResults );
+            final DnType dnType = dnHasSubordinates( resultDN, chaiProvider );
             returnMap.put( resultDN, dnType );
             returnMap.put( resultDN, dnType );
         }
         }
+
         return Collections.unmodifiableMap( returnMap );
         return Collections.unmodifiableMap( returnMap );
     }
     }
 
 
     private DnType dnHasSubordinates(
     private DnType dnHasSubordinates(
             final String dn,
             final String dn,
-            final ChaiProvider chaiProvider,
-            final String resultDN,
-            final Map<String, List<String>> attributeResults
+            final ChaiProvider chaiProvider
     )
     )
+            throws ChaiUnavailableException, ChaiOperationException
     {
     {
-        if ( attributeResults.containsKey( ATTR_SUBORDINATE_COUNT ) )
-        {
-            // only eDir actually returns this operational attribute
-            final int subordinateCount = Integer.parseInt( attributeResults.get( ATTR_SUBORDINATE_COUNT ).get( 0 ) );
-            return subordinateCount > 0 ? DnType.navigable : DnType.selectable;
-        }
-        else
-        {
-            final SearchHelper searchHelper = new SearchHelper();
-            searchHelper.setFilter( "(objectclass=*)" );
-            searchHelper.setMaxResults( 1 );
-            searchHelper.setAttributes( Collections.emptyList() );
-            searchHelper.setSearchScope( SearchScope.ONE );
-            try
-            {
-                final Map<String, Map<String, String>> subSearchResults = chaiProvider.search( resultDN, searchHelper );
-                return !subSearchResults.isEmpty() ? DnType.navigable : DnType.selectable;
-            }
-            catch ( final Exception e )
-            {
-                LOGGER.debug( sessionLabel, () -> "error during subordinate entry count of " + dn + ", error: " + e.getMessage() );
-            }
-        }
-        return DnType.selectable;
+        final ChaiEntry chaiEntry = ChaiEntryFactory.newChaiFactory( chaiProvider ).newChaiEntry( dn );
+        return chaiEntry.hasChildren()
+                ? DnType.navigable
+                : DnType.selectable;
     }
     }
 
 
-    private Map<String, Map<String, List<String>>> doLdapSearch(
+    private Set<String> doLdapSearch(
             final String dn, final ChaiProvider chaiProvider
             final String dn, final ChaiProvider chaiProvider
     )
     )
             throws ChaiUnavailableException, ChaiOperationException
             throws ChaiUnavailableException, ChaiOperationException
     {
     {
-        final Map<String, Map<String, List<String>>> results;
-
         final SearchHelper searchHelper = new SearchHelper();
         final SearchHelper searchHelper = new SearchHelper();
-        searchHelper.setFilter( "(objectclass=*)" );
+        searchHelper.setFilter( SearchHelper.DEFAULT_FILTER );
+        searchHelper.setAttributes( Collections.emptyList() );
         searchHelper.setMaxResults( getMaxSizeLimit() );
         searchHelper.setMaxResults( getMaxSizeLimit() );
-        searchHelper.setAttributes( ATTR_SUBORDINATE_COUNT );
         searchHelper.setSearchScope( SearchScope.ONE );
         searchHelper.setSearchScope( SearchScope.ONE );
 
 
-        return chaiProvider.searchMultiValues( dn, searchHelper );
+        return chaiProvider.search( dn, searchHelper ).keySet();
     }
     }
 
 
     private Set<String> adRootDNList( final DomainID domainID, final ProfileID profile )
     private Set<String> adRootDNList( final DomainID domainID, final ProfileID profile )
@@ -302,17 +279,15 @@ public class LdapBrowser
         return adRootValues;
         return adRootValues;
     }
     }
 
 
-    private static String entryNameFromDN( final String dn )
+    private static String rdnNameFromDN( final String dn )
     {
     {
-        int start = dn.indexOf( '=' );
-        start = start == -1 ? 0 : start + 1;
         int end = dn.indexOf( ',' );
         int end = dn.indexOf( ',' );
         if ( end == -1 )
         if ( end == -1 )
         {
         {
             end = dn.length();
             end = dn.length();
         }
         }
 
 
-        return dn.substring( start, end );
+        return dn.substring( 0, end );
     }
     }
 
 
     @Value
     @Value