| 
					
				 | 
			
			
				@@ -16,32 +16,27 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package org.springframework.security.ldap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.dao.IncorrectResultSizeDataAccessException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.util.Assert; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.ldap.core.ContextExecutor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.ldap.core.ContextMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.ldap.core.ContextSource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.ldap.core.DirContextAdapter; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.ldap.core.DistinguishedName; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.ldap.core.AttributesMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.ldap.core.AttributesMapperCallbackHandler; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.ldap.core.DirContextOperations; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.ldap.core.DistinguishedName; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.util.Assert; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.logging.Log; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.logging.LogFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.HashSet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.Set; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.ArrayList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.text.MessageFormat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.naming.NamingEnumeration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.naming.NamingException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import javax.naming.NameClassPair; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import javax.naming.directory.Attribute; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.naming.directory.Attributes; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.naming.directory.DirContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.naming.directory.SearchControls; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.naming.directory.SearchResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.text.MessageFormat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.HashSet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Set; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Arrays; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -94,8 +89,6 @@ public class SpringSecurityLdapTemplate extends org.springframework.ldap.core.Ld 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ctls.setReturningAttributes(NO_ATTRS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ctls.setSearchScope(SearchControls.OBJECT_SCOPE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                String relativeName = LdapUtils.getRelativeName(dn, ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 NamingEnumeration results = ctx.search(dn, comparisonFilter, new Object[] {value}, ctls); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return Boolean.valueOf(results.hasMore()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -107,26 +100,6 @@ public class SpringSecurityLdapTemplate extends org.springframework.ldap.core.Ld 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return matches.booleanValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//    public boolean nameExists(final String dn) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        Boolean exists = (Boolean) executeReadOnly(new ContextExecutor() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                public Object executeWithContext(DirContext ctx) throws NamingException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                        Object obj = ctx.lookup(dn); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                        if (obj instanceof Context) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                            LdapUtils.closeContext((Context) obj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    } catch (NameNotFoundException nnfe) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                        return Boolean.FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    return Boolean.TRUE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//        return exists.booleanValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * Composes an object from the attributes of the given DN. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -165,40 +138,18 @@ public class SpringSecurityLdapTemplate extends org.springframework.ldap.core.Ld 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         String formattedFilter = MessageFormat.format(filter, params); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Returns either a string or list of strings from each match, depending on whether the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // specified attribute has one or more values. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        AttributesMapper roleMapper = new AttributesMapper() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            public Object mapFromAttributes(Attributes attributes) throws NamingException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Attribute attribute = attributes.get(attributeName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        final HashSet set = new HashSet(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (attribute == null || attribute.size() == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ContextMapper roleMapper = new ContextMapper() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public Object mapFromContext(Object ctx) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                DirContextAdapter adapter = (DirContextAdapter) ctx; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String[] values = adapter.getStringAttributes(attributeName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (values == null || values.length == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     logger.debug("No attribute value found for '" + attributeName + "'"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (attribute.size() == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return attribute.get(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                NamingEnumeration ne = attribute.getAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                List values = new ArrayList(attribute.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                while (ne.hasMore()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    values.add(ne.next()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return values; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        AttributesMapperCallbackHandler collector = new AttributesMapperCallbackHandler(roleMapper) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            public void handleNameClassPair(NameClassPair nameClassPair) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Object roleObject = getObjectFromNameClassPair(nameClassPair); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (roleObject instanceof String) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    getList().add(roleObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } else if (roleObject instanceof List) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    getList().addAll((List)roleObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    set.addAll(Arrays.asList(values)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -207,9 +158,9 @@ public class SpringSecurityLdapTemplate extends org.springframework.ldap.core.Ld 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ctls.setReturningAttributes(new String[] {attributeName}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ctls.setReturningObjFlag(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        search(base, formattedFilter, ctls, collector); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        search(base, formattedFilter, ctls, roleMapper); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return new HashSet(collector.getList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return set; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -252,13 +203,6 @@ public class SpringSecurityLdapTemplate extends org.springframework.ldap.core.Ld 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         dn.append(base); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    String nameInNamespace = ctx.getNameInNamespace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    if (StringUtils.hasLength(nameInNamespace)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                        dn.append(","); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                        dn.append(nameInNamespace); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-//                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     return new DirContextAdapter(searchResult.getAttributes(), new DistinguishedName(dn.toString())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 |