From a030e2933d31f9fa47988508298b2651dfaa5e03 Mon Sep 17 00:00:00 2001
From: Chris Ridd <chris.ridd@forgerock.com>
Date: Thu, 25 Oct 2012 15:42:46 +0000
Subject: [PATCH] Fix OPENDJ-624 DSML servlet should encode some kinds of extended responses as strings

---
 opends/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java |   38 ++++++++++++++++++++++++++++++++++----
 1 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/opends/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java b/opends/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java
index 560ed5b..b66b77e 100644
--- a/opends/src/dsml/org/opends/dsml/protocol/DSMLExtendedOperation.java
+++ b/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(

--
Gitblit v1.10.0