/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.auth; import java.util.Arrays; import org.ldaptive.BindOperation; import org.ldaptive.BindRequest; import org.ldaptive.Connection; import org.ldaptive.LdapException; import org.ldaptive.Response; import org.ldaptive.ResultCode; import org.ldaptive.pool.PooledConnectionFactory; import org.ldaptive.pool.PooledConnectionFactoryManager; /** * Provides an LDAP authentication implementation that leverages a pool of LDAP connections to perform the LDAP bind * operation. * * @author Middleware Services */ public class PooledBindAuthenticationHandler extends AbstractBindAuthenticationHandler implements PooledConnectionFactoryManager { /** Connection factory. */ private PooledConnectionFactory factory; /** Default constructor. */ public PooledBindAuthenticationHandler() {} /** * Creates a new pooled bind authentication handler. * * @param cf connection factory */ public PooledBindAuthenticationHandler(final PooledConnectionFactory cf) { setConnectionFactory(cf); } @Override public PooledConnectionFactory getConnectionFactory() { return factory; } @Override public void setConnectionFactory(final PooledConnectionFactory cf) { factory = cf; } @Override protected Connection getConnection() throws LdapException { return factory.getConnection(); } @Override protected AuthenticationHandlerResponse authenticateInternal( final Connection c, final AuthenticationCriteria criteria) throws LdapException { AuthenticationHandlerResponse response; final BindRequest request = new BindRequest(criteria.getDn(), criteria.getCredential()); request.setSaslConfig(getAuthenticationSaslConfig()); request.setControls(getAuthenticationControls()); final BindOperation op = new BindOperation(c); try { final Response<Void> bindResponse = op.execute(request); response = new AuthenticationHandlerResponse( ResultCode.SUCCESS == bindResponse.getResultCode(), bindResponse.getResultCode(), c, bindResponse.getMessage(), bindResponse.getControls(), bindResponse.getMessageId()); } catch (LdapException e) { if (e.getResultCode() != null) { response = new AuthenticationHandlerResponse( false, e.getResultCode(), c, e.getMessage(), e.getControls(), e.getMessageId()); } else { throw e; } } return response; } @Override public String toString() { return String.format( "[%s@%d::factory=%s, saslConfig=%s, controls=%s]", getClass().getName(), hashCode(), factory, getAuthenticationSaslConfig(), Arrays.toString(getAuthenticationControls())); } }