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

Chris Ridd
25.42.2012 a030e2933d31f9fa47988508298b2651dfaa5e03
Fix OPENDJ-624 DSML servlet should encode some kinds of extended responses as strings
3 files modified
73 ■■■■■ changed files
opends/resource/dsml/webapp/web.xml 8 ●●●●● patch | view | raw | blame | history
opends/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java 38 ●●●● patch | view | raw | blame | history
opends/src/dsml/org/opends/dsml/protocol/DSMLServlet.java 27 ●●●●● patch | view | raw | blame | history
opends/resource/dsml/webapp/web.xml
@@ -72,6 +72,14 @@
  </context-param>
-->
<!-- Add an extra <context-param> like the one below for each extended operation
     that is known to return a string in the LDAP response. -->
  <context-param>
    <description>The Who Am I? [RFC 4532] extended operation returns a string.</description>
    <param-name>ldap.exop.string.1.3.6.1.4.1.4203.1.11.3</param-name>
    <param-value>true</param-value>
  </context-param>
  <servlet>
    <servlet-name>DSMLServlet</servlet-name>
    <servlet-class>org.opends.dsml.protocol.DSMLServlet</servlet-class>
opends/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java
@@ -30,6 +30,7 @@
import java.io.IOException;
import java.util.Set;
import org.opends.messages.Message;
import org.opends.server.protocols.asn1.ASN1Exception;
@@ -51,17 +52,39 @@
public class DSMLExtendedOperation
{
  private LDAPConnection connection;
  private Set<String> stringResponses;
  /**
   * Create an instance with the specified LDAP connection.
   *
   * @param connection    The LDAP connection to send the request on.
   * @param stringResponses The OIDs of any operations that have results that
   *                        should be returned as strings instead of binary.
   */
  public DSMLExtendedOperation(LDAPConnection connection)
  public DSMLExtendedOperation(LDAPConnection connection,
      Set<String> stringResponses)
  {
    this.connection = connection;
    this.stringResponses = stringResponses;
  }
  /**
   * Determine if the response to a given LDAP extended operation (specified by
   * OID) should be treated as a string. The default is binary.
   *
   * @param oid The OID of the extended operation.
   * @return <CODE>true</CODE> if the extended operation is known to return a
   *         string, <CODE>false</CODE> otherwise.
   */
  public boolean responseIsString(String oid)
  {
    return stringResponses.contains(oid);
  }
  /**
   * Perform the LDAP EXTENDED operation and send the result back to the
   * client.
@@ -132,11 +155,18 @@
    // Set the result code and error message for the DSML response.
    extendedResponse.setResponseName(extendedOp.getOID());
    asnValue = extendedOp.getValue();
    ByteString rawValue = extendedOp.getValue();
    value = null;
    if (asnValue != null)
    if (rawValue != null)
    {
      value = asnValue.toByteArray();
      if (responseIsString(requestName))
      {
        value = rawValue.toString();
      }
      else
      {
        value = rawValue.toByteArray();
      }
    }
    extendedResponse.setResponse(value);
    extendedResponse.setErrorMessage(
opends/src/dsml/org/opends/dsml/protocol/DSMLServlet.java
@@ -23,7 +23,7 @@
 *
 *
 *      Copyright 2006-2010 Sun Microsystems, Inc.
 *      Portions Copyright 2011 ForgeRock AS
 *      Portions Copyright 2011-2012 ForgeRock AS
 */
package org.opends.dsml.protocol;
@@ -39,6 +39,7 @@
import java.text.ParseException;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
@@ -97,6 +98,7 @@
  private static final String TRUSTSTOREPASSWORD = "ldap.truststore.password";
  private static final String TRUSTALLCERTS = "ldap.trustall";
  private static final String USEHTTPAUTHZID = "ldap.authzidtypeisid";
  private static final String EXOPSTRINGPREFIX = "ldap.exop.string.";
  private static final long serialVersionUID = -3748022009593442973L;
  private static final AtomicInteger nextMessageID = new AtomicInteger(1);
@@ -134,6 +136,8 @@
  private String trustStorePasswordValue;
  private Boolean trustAll;
  private Boolean useHTTPAuthzID;
  private HashSet<String> exopStrings = new HashSet<String>();
  /**
   * This method will be called by the Servlet Container when
   * this servlet is being placed into service.
@@ -172,6 +176,24 @@
      useHTTPAuthzID = Boolean.valueOf(
          config.getServletContext().getInitParameter(USEHTTPAUTHZID));
      /*
       * Find all the param-names matching the pattern:
       * ldap.exop.string.1.2.3.4.5
       * and if the value's true then mark that OID (1.2.3.4.5) as one returning
       * a string value.
       */
      Enumeration<String> names = config.getServletContext()
          .getInitParameterNames();
      while (names.hasMoreElements())
      {
        String name = names.nextElement().toString();
        if (name.startsWith(EXOPSTRINGPREFIX) &&
            Boolean.valueOf(config.getServletContext().getInitParameter(name)))
        {
          exopStrings.add(name.substring(EXOPSTRINGPREFIX.length()));
        }
      }
      if(jaxbContext==null)
        jaxbContext = JAXBContext.newInstance(PKG_NAME,
                this.getClass().getClassLoader());
@@ -545,7 +567,8 @@
      } else if (request instanceof ExtendedRequest) {
        // Process the extended request.
        ExtendedRequest er = (ExtendedRequest) request;
        DSMLExtendedOperation eo = new DSMLExtendedOperation(connection);
        DSMLExtendedOperation eo = new DSMLExtendedOperation(connection,
            exopStrings);
        ExtendedResponse extendedResponse = eo.doOperation(objFactory, er);
        return objFactory.createBatchResponseExtendedResponse(extendedResponse);