mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Matthew Swift
25.33.2012 263d085885df024dca9250cc03c807912b0a7662
opendj3/opendj-ldap-sdk/src/main/java/org/forgerock/opendj/ldap/requests/SASLBindClientImpl.java
@@ -6,17 +6,16 @@
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * trunk/opendj3/legal-notices/CDDLv1_0.txt
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * trunk/opendj3/legal-notices/CDDLv1_0.txt.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying information:
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
@@ -28,13 +27,20 @@
package org.forgerock.opendj.ldap.requests;
import static org.forgerock.opendj.ldap.CoreMessages.INFO_SASL_UNSUPPORTED_CALLBACK;
import java.io.IOException;
import javax.security.auth.callback.*;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.ChoiceCallback;
import javax.security.auth.callback.ConfirmationCallback;
import javax.security.auth.callback.LanguageCallback;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.TextInputCallback;
import javax.security.auth.callback.TextOutputCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.sasl.AuthorizeCallback;
import javax.security.sasl.RealmCallback;
import javax.security.sasl.RealmChoiceCallback;
@@ -44,233 +50,154 @@
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
/**
 * SASL bind client implementation.
 */
class SASLBindClientImpl extends BindClientImpl implements CallbackHandler
{
  /**
   * The name of the default protocol used.
   */
  static final String SASL_DEFAULT_PROTOCOL = "ldap";
class SASLBindClientImpl extends BindClientImpl implements CallbackHandler {
    /**
     * The name of the default protocol used.
     */
    static final String SASL_DEFAULT_PROTOCOL = "ldap";
  private final String saslMechanism;
    private final String saslMechanism;
    /**
     * Creates a new abstract SASL bind client. The next bind request will be a
     * copy of the provided initial bind request which should be updated in
     * subsequent bind requests forming part of this authentication.
     *
     * @param initialBindRequest
     *            The initial bind request.
     */
    SASLBindClientImpl(final SASLBindRequest initialBindRequest) {
        super(initialBindRequest);
        this.saslMechanism = initialBindRequest.getSASLMechanism();
    }
    public final void handle(final Callback[] callbacks) throws IOException,
            UnsupportedCallbackException {
        for (final Callback callback : callbacks) {
            if (callback instanceof NameCallback) {
                handle((NameCallback) callback);
            } else if (callback instanceof PasswordCallback) {
                handle((PasswordCallback) callback);
            } else if (callback instanceof AuthorizeCallback) {
                handle((AuthorizeCallback) callback);
            } else if (callback instanceof RealmCallback) {
                handle((RealmCallback) callback);
            } else if (callback instanceof RealmChoiceCallback) {
                handle((RealmChoiceCallback) callback);
            } else if (callback instanceof ChoiceCallback) {
                handle((ChoiceCallback) callback);
            } else if (callback instanceof ConfirmationCallback) {
                handle((ConfirmationCallback) callback);
            } else if (callback instanceof LanguageCallback) {
                handle((LanguageCallback) callback);
            } else if (callback instanceof TextInputCallback) {
                handle((TextInputCallback) callback);
            } else if (callback instanceof TextOutputCallback) {
                handle((TextOutputCallback) callback);
            } else {
                final org.forgerock.i18n.LocalizableMessage message =
                        INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
                throw new UnsupportedCallbackException(callback, message.toString());
            }
        }
    }
  /**
   * Creates a new abstract SASL bind client. The next bind request will be a
   * copy of the provided initial bind request which should be updated in
   * subsequent bind requests forming part of this authentication.
   *
   * @param initialBindRequest
   *          The initial bind request.
   */
  SASLBindClientImpl(final SASLBindRequest initialBindRequest)
  {
    super(initialBindRequest);
    this.saslMechanism = initialBindRequest.getSASLMechanism();
  }
  public final void handle(final Callback[] callbacks) throws IOException,
      UnsupportedCallbackException
  {
    for (final Callback callback : callbacks)
    {
      if (callback instanceof NameCallback)
      {
        handle((NameCallback) callback);
      }
      else if (callback instanceof PasswordCallback)
      {
        handle((PasswordCallback) callback);
      }
      else if (callback instanceof AuthorizeCallback)
      {
        handle((AuthorizeCallback) callback);
      }
      else if (callback instanceof RealmCallback)
      {
        handle((RealmCallback) callback);
      }
      else if (callback instanceof RealmChoiceCallback)
      {
        handle((RealmChoiceCallback) callback);
      }
      else if (callback instanceof ChoiceCallback)
      {
        handle((ChoiceCallback) callback);
      }
      else if (callback instanceof ConfirmationCallback)
      {
        handle((ConfirmationCallback) callback);
      }
      else if (callback instanceof LanguageCallback)
      {
        handle((LanguageCallback) callback);
      }
      else if (callback instanceof TextInputCallback)
      {
        handle((TextInputCallback) callback);
      }
      else if (callback instanceof TextOutputCallback)
      {
        handle((TextOutputCallback) callback);
      }
      else
      {
        final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
            .get(saslMechanism, String.valueOf(callback));
    void handle(final AuthorizeCallback callback) throws UnsupportedCallbackException {
        final org.forgerock.i18n.LocalizableMessage message =
                INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
        throw new UnsupportedCallbackException(callback, message.toString());
      }
    }
  }
  void handle(final AuthorizeCallback callback)
      throws UnsupportedCallbackException
  {
    final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
        .get(saslMechanism, String.valueOf(callback));
    throw new UnsupportedCallbackException(callback, message.toString());
  }
  void handle(final ChoiceCallback callback)
      throws UnsupportedCallbackException
  {
    final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
        .get(saslMechanism, String.valueOf(callback));
    throw new UnsupportedCallbackException(callback, message.toString());
  }
  void handle(final ConfirmationCallback callback)
      throws UnsupportedCallbackException
  {
    final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
        .get(saslMechanism, String.valueOf(callback));
    throw new UnsupportedCallbackException(callback, message.toString());
  }
  void handle(final LanguageCallback callback)
      throws UnsupportedCallbackException
  {
    final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
        .get(saslMechanism, String.valueOf(callback));
    throw new UnsupportedCallbackException(callback, message.toString());
  }
  void handle(final NameCallback callback) throws UnsupportedCallbackException
  {
    final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
        .get(saslMechanism, String.valueOf(callback));
    throw new UnsupportedCallbackException(callback, message.toString());
  }
  void handle(final PasswordCallback callback)
      throws UnsupportedCallbackException
  {
    final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
        .get(saslMechanism, String.valueOf(callback));
    throw new UnsupportedCallbackException(callback, message.toString());
  }
  void handle(final RealmCallback callback) throws UnsupportedCallbackException
  {
    final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
        .get(saslMechanism, String.valueOf(callback));
    throw new UnsupportedCallbackException(callback, message.toString());
  }
  void handle(final RealmChoiceCallback callback)
      throws UnsupportedCallbackException
  {
    final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
        .get(saslMechanism, String.valueOf(callback));
    throw new UnsupportedCallbackException(callback, message.toString());
  }
  void handle(final TextInputCallback callback)
      throws UnsupportedCallbackException
  {
    final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
        .get(saslMechanism, String.valueOf(callback));
    throw new UnsupportedCallbackException(callback, message.toString());
  }
  void handle(final TextOutputCallback callback)
      throws UnsupportedCallbackException
  {
    final org.forgerock.i18n.LocalizableMessage message = INFO_SASL_UNSUPPORTED_CALLBACK
        .get(saslMechanism, String.valueOf(callback));
    throw new UnsupportedCallbackException(callback, message.toString());
  }
  /**
   * Sets the SASL credentials to be used in the next bind request.
   *
   * @param saslCredentials
   *          The SASL credentials to be used in the next bind request.
   * @return A reference to this SASL bind client.
   */
  final BindClient setNextSASLCredentials(final byte[] saslCredentials)
  {
    final ByteString value = (saslCredentials != null) ? ByteString
        .wrap(saslCredentials) : null;
    return setNextSASLCredentials(value);
  }
  /**
   * Sets the SASL credentials to be used in the next bind request.
   *
   * @param saslCredentials
   *          The SASL credentials to be used in the next bind request.
   * @return A reference to this SASL bind client.
   */
  final BindClient setNextSASLCredentials(final ByteString saslCredentials)
  {
    final ByteStringBuilder builder = new ByteStringBuilder();
    final ASN1Writer writer = ASN1.getWriter(builder);
    try
    {
      writer.writeOctetString(saslMechanism);
      if (saslCredentials != null)
      {
        writer.writeOctetString(saslCredentials);
      }
    }
    catch (final IOException ioe)
    {
      throw new RuntimeException("Error encoding SaslCredentials");
    }
    return setNextAuthenticationValue(builder.toByteString().toByteArray());
  }
    void handle(final ChoiceCallback callback) throws UnsupportedCallbackException {
        final org.forgerock.i18n.LocalizableMessage message =
                INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
        throw new UnsupportedCallbackException(callback, message.toString());
    }
    void handle(final ConfirmationCallback callback) throws UnsupportedCallbackException {
        final org.forgerock.i18n.LocalizableMessage message =
                INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
        throw new UnsupportedCallbackException(callback, message.toString());
    }
    void handle(final LanguageCallback callback) throws UnsupportedCallbackException {
        final org.forgerock.i18n.LocalizableMessage message =
                INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
        throw new UnsupportedCallbackException(callback, message.toString());
    }
    void handle(final NameCallback callback) throws UnsupportedCallbackException {
        final org.forgerock.i18n.LocalizableMessage message =
                INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
        throw new UnsupportedCallbackException(callback, message.toString());
    }
    void handle(final PasswordCallback callback) throws UnsupportedCallbackException {
        final org.forgerock.i18n.LocalizableMessage message =
                INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
        throw new UnsupportedCallbackException(callback, message.toString());
    }
    void handle(final RealmCallback callback) throws UnsupportedCallbackException {
        final org.forgerock.i18n.LocalizableMessage message =
                INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
        throw new UnsupportedCallbackException(callback, message.toString());
    }
    void handle(final RealmChoiceCallback callback) throws UnsupportedCallbackException {
        final org.forgerock.i18n.LocalizableMessage message =
                INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
        throw new UnsupportedCallbackException(callback, message.toString());
    }
    void handle(final TextInputCallback callback) throws UnsupportedCallbackException {
        final org.forgerock.i18n.LocalizableMessage message =
                INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
        throw new UnsupportedCallbackException(callback, message.toString());
    }
    void handle(final TextOutputCallback callback) throws UnsupportedCallbackException {
        final org.forgerock.i18n.LocalizableMessage message =
                INFO_SASL_UNSUPPORTED_CALLBACK.get(saslMechanism, String.valueOf(callback));
        throw new UnsupportedCallbackException(callback, message.toString());
    }
    /**
     * Sets the SASL credentials to be used in the next bind request.
     *
     * @param saslCredentials
     *            The SASL credentials to be used in the next bind request.
     * @return A reference to this SASL bind client.
     */
    final BindClient setNextSASLCredentials(final byte[] saslCredentials) {
        final ByteString value =
                (saslCredentials != null) ? ByteString.wrap(saslCredentials) : null;
        return setNextSASLCredentials(value);
    }
    /**
     * Sets the SASL credentials to be used in the next bind request.
     *
     * @param saslCredentials
     *            The SASL credentials to be used in the next bind request.
     * @return A reference to this SASL bind client.
     */
    final BindClient setNextSASLCredentials(final ByteString saslCredentials) {
        final ByteStringBuilder builder = new ByteStringBuilder();
        final ASN1Writer writer = ASN1.getWriter(builder);
        try {
            writer.writeOctetString(saslMechanism);
            if (saslCredentials != null) {
                writer.writeOctetString(saslCredentials);
            }
        } catch (final IOException ioe) {
            throw new RuntimeException("Error encoding SaslCredentials");
        }
        return setNextAuthenticationValue(builder.toByteString().toByteArray());
    }
}