|  | @@ -1,11 +1,18 @@
 | 
	
		
			
				|  |  |  package net.sf.acegisecurity.providers.dao.ldap;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.util.Hashtable;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  |  import javax.naming.Context;
 | 
	
		
			
				|  |  |  import javax.naming.NamingException;
 | 
	
		
			
				|  |  |  import javax.naming.directory.InitialDirContext;
 | 
	
		
			
				|  |  | +import org.springframework.dao.DataAccessResourceFailureException;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * @see http://java.sun.com/products/jndi/tutorial/ldap/connect/config.html
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  | + * @author robert.sanders
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  |  public class LdapSupport {
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -45,16 +52,45 @@ public class LdapSupport {
 | 
	
		
			
				|  |  |       **/
 | 
	
		
			
				|  |  |      private String initialContextFactory = "com.sun.jndi.ldap.LdapCtxFactory";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public InitialDirContext getInitialContext() throws NamingException {
 | 
	
		
			
				|  |  | +    /** Allows extra environment variables to be added at config time. */
 | 
	
		
			
				|  |  | +    private Map extraEnvVars = null;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    /** Use the LDAP Connection pool (in SUN JVMs)?; if true, then the 
 | 
	
		
			
				|  |  | +     *  LDAP environment property "com.sun.jndi.ldap.connect.pool" is added 
 | 
	
		
			
				|  |  | +     *  to any other JNDI properties. 
 | 
	
		
			
				|  |  | +     *  @see http://java.sun.com/products/jndi/tutorial/ldap/connect/pool.html 
 | 
	
		
			
				|  |  | +     *  @see http://java.sun.com/products/jndi/tutorial/ldap/connect/config.html
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private boolean connectionPoolEnabled = true;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    public InitialDirContext getInitialContext() throws DataAccessResourceFailureException {
 | 
	
		
			
				|  |  | +        Hashtable env = getEnvironment();
 | 
	
		
			
				|  |  | +        if (managerUser != null) {
 | 
	
		
			
				|  |  | +            env.put(Context.SECURITY_PRINCIPAL, managerUser);
 | 
	
		
			
				|  |  | +            env.put(Context.SECURITY_CREDENTIALS, managerPassword);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            return new InitialDirContext(env);
 | 
	
		
			
				|  |  | +        } catch (NamingException nx) {
 | 
	
		
			
				|  |  | +            throw new DataAccessResourceFailureException("Unable to connect to LDAP Server; check managerUser and managerPassword.", nx);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    /** 
 | 
	
		
			
				|  |  | +     * @return The Hashtable describing the base DirContext that will be created; minus the username/password if any.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    protected Hashtable getEnvironment() {
 | 
	
		
			
				|  |  |          Hashtable env = new Hashtable(11);
 | 
	
		
			
				|  |  |          env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
 | 
	
		
			
				|  |  |          env.put(Context.PROVIDER_URL, getInitialContextURL());
 | 
	
		
			
				|  |  |          env.put(Context.SECURITY_AUTHENTICATION, authenticationType);
 | 
	
		
			
				|  |  | -        if (managerUser != null) {
 | 
	
		
			
				|  |  | -            env.put(Context.SECURITY_PRINCIPAL, managerUser);
 | 
	
		
			
				|  |  | -            env.put(Context.SECURITY_CREDENTIALS, managerPassword);
 | 
	
		
			
				|  |  | +        if (connectionPoolEnabled) {
 | 
	
		
			
				|  |  | +            env.put("com.sun.jndi.ldap.connect.pool", "true");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        return new InitialDirContext(env);
 | 
	
		
			
				|  |  | +        if ((extraEnvVars != null) && (extraEnvVars.size() > 0)) {
 | 
	
		
			
				|  |  | +            env.putAll(extraEnvVars);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return env;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      /** 
 | 
	
	
		
			
				|  | @@ -156,5 +192,19 @@ public class LdapSupport {
 | 
	
		
			
				|  |  |      public void setURL(String url) {
 | 
	
		
			
				|  |  |          URL = url;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @return Allows extra environment variables to be added at config time.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public Map getExtraEnvVars() {
 | 
	
		
			
				|  |  | +        return extraEnvVars;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * @param extraEnvVars Allows extra environment variables to be added at config time.
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void setExtraEnvVars(Map extraEnvVars) {
 | 
	
		
			
				|  |  | +        this.extraEnvVars = extraEnvVars;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |  }
 |