From 392bde20d260cc00dbdf5c80d512f57ebc760c4e Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 16 Nov 2015 16:49:54 +0000
Subject: [PATCH] OPENDJ-2383 REST interface: Implement password modify action

---
 opendj-server-legacy/src/main/java/org/forgerock/opendj/adapter/server3x/Converters.java |   43 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/forgerock/opendj/adapter/server3x/Converters.java b/opendj-server-legacy/src/main/java/org/forgerock/opendj/adapter/server3x/Converters.java
index 5923154..e6b1daa 100644
--- a/opendj-server-legacy/src/main/java/org/forgerock/opendj/adapter/server3x/Converters.java
+++ b/opendj-server-legacy/src/main/java/org/forgerock/opendj/adapter/server3x/Converters.java
@@ -25,7 +25,11 @@
  */
 package org.forgerock.opendj.adapter.server3x;
 
+import static com.forgerock.opendj.ldap.CoreMessages.*;
+import static com.forgerock.opendj.util.StaticUtils.*;
+
 import static org.forgerock.opendj.ldap.LdapException.*;
+import static org.opends.server.extensions.ExtensionsConstants.*;
 import static org.opends.server.util.CollectionUtils.*;
 
 import java.io.IOException;
@@ -51,6 +55,7 @@
 import org.forgerock.opendj.ldap.SearchScope;
 import org.forgerock.opendj.ldap.controls.Control;
 import org.forgerock.opendj.ldap.controls.GenericControl;
+import org.forgerock.opendj.ldap.responses.PasswordModifyExtendedResult;
 import org.forgerock.opendj.ldap.responses.Responses;
 import org.forgerock.opendj.ldap.responses.Result;
 import org.forgerock.opendj.ldap.responses.SearchResultEntry;
@@ -70,10 +75,9 @@
 import org.opends.server.types.LDAPException;
 import org.opends.server.types.Operation;
 import org.opends.server.types.SearchFilter;
+import org.opends.server.util.ServerConstants;
 
-/**
- * Common utility methods.
- */
+/** Common utility methods. */
 public final class Converters {
 
     /** Prevent instantiation. */
@@ -691,18 +695,47 @@
         return getResponseResult(operation, newSDKResult(operation));
     }
 
-    private static Result newSDKResult(final Operation operation) {
+    private static Result newSDKResult(final Operation operation) throws LdapException {
         ResultCode rc = operation.getResultCode();
         if (operation instanceof BindOperation) {
             return Responses.newBindResult(rc);
         } else if (operation instanceof CompareOperation) {
             return Responses.newCompareResult(rc);
         } else if (operation instanceof ExtendedOperation) {
-            return Responses.newGenericExtendedResult(rc);
+            ExtendedOperation extendedOperation = (ExtendedOperation) operation;
+            switch (extendedOperation.getRequestOID()) {
+            case ServerConstants.OID_PASSWORD_MODIFY_REQUEST:
+                PasswordModifyExtendedResult result = Responses.newPasswordModifyExtendedResult(rc);
+                ByteString generatedPwd = getGeneratedPassword(extendedOperation);
+                if (generatedPwd != null) {
+                    result.setGeneratedPassword(generatedPwd.toByteArray());
+                }
+                return result;
+
+            default:
+                return Responses.newGenericExtendedResult(rc);
+            }
         }
         return Responses.newResult(rc);
     }
 
+    private static ByteString getGeneratedPassword(ExtendedOperation op) throws LdapException {
+        // FIXME this code is duplicated with code in the SDK
+        // see PasswordModifyExtendedRequestImpl#ResultDecoder#decodeExtendedResult()
+        ByteString responseValue = op.getResponseValue();
+        if (responseValue != null) {
+            try {
+                ASN1Reader reader = ASN1.getReader(responseValue);
+                reader.readStartSequence();
+                return reader.readOctetString(TYPE_PASSWORD_MODIFY_GENERATED_PASSWORD);
+            } catch (IOException e) {
+                throw LdapException.newLdapException(ResultCode.PROTOCOL_ERROR,
+                        ERR_EXTOP_PASSMOD_CANNOT_DECODE_REQUEST.get(getExceptionMessage(e)), e);
+            }
+        }
+        return null;
+    }
+
     /**
      * Converts from <code>byte[]</code> to OpenDJ server {@link ByteString}.
      *

--
Gitblit v1.10.0