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

Matthew Swift
21.08.2012 3259d2c6e62e37a9f6f7fb4afc82a0820f8848e1
Fix OPENDJ-464: NPE in PasswordPolicyStateExtendedResult results in eternal waiting
5 files modified
207 ■■■■ changed files
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/extensions/GetConnectionIDExtendedRequest.java 38 ●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/extensions/GetConnectionIDExtendedResult.java 15 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/extensions/PasswordPolicyStateExtendedRequest.java 96 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/extensions/PasswordPolicyStateExtendedResult.java 39 ●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/extensions/PasswordPolicyStateOperationContainer.java 19 ●●●●● patch | view | raw | blame | history
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/extensions/GetConnectionIDExtendedRequest.java
@@ -80,7 +80,7 @@
                throw new IllegalArgumentException("No response name and value for result code "
                        + resultCode.intValue());
            }
            return GetConnectionIDExtendedResult.newResult(resultCode, -1).setMatchedDN(matchedDN)
            return GetConnectionIDExtendedResult.newResult(resultCode).setMatchedDN(matchedDN)
                    .setDiagnosticMessage(diagnosticMessage);
        }
@@ -90,30 +90,28 @@
                return (GetConnectionIDExtendedResult) result;
            } else {
                final ResultCode resultCode = result.getResultCode();
                final ByteString responseValue = result.getValue();
                final GetConnectionIDExtendedResult newResult =
                        GetConnectionIDExtendedResult.newResult(resultCode).setMatchedDN(
                                result.getMatchedDN()).setDiagnosticMessage(
                                result.getDiagnosticMessage());
                if (!resultCode.isExceptional()
                        && ((responseValue == null) || (responseValue.length() <= 0))) {
                final ByteString responseValue = result.getValue();
                if (!resultCode.isExceptional() && responseValue == null) {
                    throw DecodeException.error(LocalizableMessage.raw("Empty response value"));
                }
                try {
                    final ASN1Reader reader = ASN1.getReader(responseValue);
                    final int connectionID = (int) reader.readInteger();
                    final GetConnectionIDExtendedResult newResult =
                            GetConnectionIDExtendedResult.newResult(resultCode, connectionID)
                                    .setMatchedDN(result.getMatchedDN()).setDiagnosticMessage(
                                            result.getDiagnosticMessage());
                    for (final Control control : result.getControls()) {
                        newResult.addControl(control);
                if (responseValue != null) {
                    try {
                        final ASN1Reader reader = ASN1.getReader(responseValue);
                        newResult.setConnectionID((int) reader.readInteger());
                    } catch (final IOException e) {
                        throw DecodeException.error(LocalizableMessage
                                .raw("Error decoding response value"), e);
                    }
                    return newResult;
                } catch (final IOException e) {
                    throw DecodeException.error(LocalizableMessage
                            .raw("Error decoding response value"), e);
                }
                for (final Control control : result.getControls()) {
                    newResult.addControl(control);
                }
                return newResult;
            }
        }
    }
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/extensions/GetConnectionIDExtendedResult.java
@@ -46,27 +46,24 @@
public final class GetConnectionIDExtendedResult extends
        AbstractExtendedResult<GetConnectionIDExtendedResult> {
    /**
     * Creates a new get connection ID extended result.
     * Creates a new get connection ID extended result with a default connection
     * ID of -1.
     *
     * @param resultCode
     *            The result code.
     * @param connectionID
     *            The client connection ID.
     * @return The new get connection ID extended result.
     * @throws NullPointerException
     *             If {@code resultCode} was {@code null}.
     */
    public static GetConnectionIDExtendedResult newResult(final ResultCode resultCode,
            final int connectionID) {
    public static GetConnectionIDExtendedResult newResult(final ResultCode resultCode) {
        Validator.ensureNotNull(resultCode);
        return new GetConnectionIDExtendedResult(resultCode, connectionID);
        return new GetConnectionIDExtendedResult(resultCode);
    }
    private int connectionID;
    private int connectionID = -1;
    private GetConnectionIDExtendedResult(final ResultCode resultCode, final int connectionID) {
    private GetConnectionIDExtendedResult(final ResultCode resultCode) {
        super(resultCode);
        this.connectionID = connectionID;
    }
    /**
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/extensions/PasswordPolicyStateExtendedRequest.java
@@ -45,7 +45,6 @@
import org.forgerock.opendj.asn1.ASN1Writer;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.DecodeException;
import org.forgerock.opendj.ldap.DecodeOptions;
import org.forgerock.opendj.ldap.ResultCode;
@@ -57,8 +56,6 @@
import org.forgerock.opendj.ldap.responses.ExtendedResult;
import org.forgerock.opendj.ldap.responses.ExtendedResultDecoder;
import com.forgerock.opendj.util.Validator;
/**
 * This class implements an LDAP extended operation that can be used to query
 * and update elements of the Directory Server password policy state for a given
@@ -170,18 +167,17 @@
                final ExtendedRequest<?> request, final DecodeOptions options)
                throws DecodeException {
            final ByteString requestValue = request.getValue();
            if ((requestValue == null) || (requestValue.length() <= 0)) {
                throw DecodeException.error(ERR_PWPSTATE_EXTOP_NO_REQUEST_VALUE.get());
            }
            try {
                final ASN1Reader reader = ASN1.getReader(requestValue);
                reader.readStartSequence();
                // Read the target user DN
                final PasswordPolicyStateExtendedRequest newRequest =
                        new PasswordPolicyStateExtendedRequest(reader.readOctetStringAsString());
                        new PasswordPolicyStateExtendedRequest();
                newRequest.setTargetUser(reader.readOctetStringAsString());
                decodeOperations(reader, newRequest);
                reader.readEndSequence();
@@ -214,43 +210,39 @@
                        + resultCode.intValue());
            }
            return new PasswordPolicyStateExtendedResult(resultCode, (String) null).setMatchedDN(
            return new PasswordPolicyStateExtendedResult(resultCode).setMatchedDN(
                    matchedDN).setDiagnosticMessage(diagnosticMessage);
        }
        public PasswordPolicyStateExtendedResult decodeExtendedResult(final ExtendedResult result,
                final DecodeOptions options) throws DecodeException {
            final ResultCode resultCode = result.getResultCode();
            final ByteString responseValue = result.getValue();
            final PasswordPolicyStateExtendedResult newResult =
                    new PasswordPolicyStateExtendedResult(resultCode).setMatchedDN(
                            result.getMatchedDN()).setDiagnosticMessage(
                            result.getDiagnosticMessage());
            if (!resultCode.isExceptional()
                    && ((responseValue == null) || (responseValue.length() <= 0))) {
            final ByteString responseValue = result.getValue();
            if (!resultCode.isExceptional() && responseValue == null) {
                throw DecodeException.error(ERR_PWPSTATE_EXTOP_NO_REQUEST_VALUE.get());
            }
            try {
                final ASN1Reader reader = ASN1.getReader(responseValue);
                reader.readStartSequence();
                // Read the target user DN
                final PasswordPolicyStateExtendedResult newResult =
                        new PasswordPolicyStateExtendedResult(resultCode, reader
                                .readOctetStringAsString()).setMatchedDN(result.getMatchedDN())
                                .setDiagnosticMessage(result.getDiagnosticMessage());
                decodeOperations(reader, newResult);
                reader.readEndSequence();
                for (final Control control : result.getControls()) {
                    newResult.addControl(control);
            if (responseValue != null) {
                try {
                    final ASN1Reader reader = ASN1.getReader(responseValue);
                    reader.readStartSequence();
                    newResult.setTargetUser(reader.readOctetStringAsString());
                    decodeOperations(reader, newResult);
                    reader.readEndSequence();
                } catch (final IOException ioe) {
                    final LocalizableMessage message =
                            ERR_PWPSTATE_EXTOP_DECODE_FAILURE.get(getExceptionMessage(ioe));
                    throw DecodeException.error(message, ioe);
                }
                return newResult;
            } catch (final IOException ioe) {
                final LocalizableMessage message =
                        ERR_PWPSTATE_EXTOP_DECODE_FAILURE.get(getExceptionMessage(ioe));
                throw DecodeException.error(message, ioe);
            }
            for (final Control control : result.getControls()) {
                newResult.addControl(control);
            }
            return newResult;
        }
    }
@@ -260,7 +252,7 @@
     */
    public static final String OID = "1.3.6.1.4.1.26027.1.6.1";
    private final String targetUser;
    private String targetUser = "";
    private final List<PasswordPolicyStateOperation> operations =
            new ArrayList<PasswordPolicyStateOperation>();
@@ -392,27 +384,10 @@
    }
    /**
     * Creates a new password policy state extended request using the provided
     * user name.
     *
     * @param targetUser
     *            The name of the user.
     * Creates a new password policy state extended request.
     */
    public PasswordPolicyStateExtendedRequest(final DN targetUser) {
        Validator.ensureNotNull(targetUser);
        this.targetUser = targetUser.toString();
    }
    /**
     * Creates a new password policy state extended request using the provided
     * user name.
     *
     * @param targetUser
     *            The name of the user.
     */
    public PasswordPolicyStateExtendedRequest(final String targetUser) {
        Validator.ensureNotNull(targetUser);
        this.targetUser = targetUser;
    public PasswordPolicyStateExtendedRequest() {
        // Nothing to do.
    }
    /**
@@ -550,6 +525,13 @@
    /**
     * {@inheritDoc}
     */
    public String getTargetUser() {
        return targetUser;
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public ByteString getValue() {
        return encode(targetUser, operations);
@@ -849,6 +831,14 @@
     * {@inheritDoc}
     */
    @Override
    public void setTargetUser(String targetUser) {
        this.targetUser = targetUser != null ? targetUser : "";
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        final StringBuilder builder = new StringBuilder();
        builder.append("PasswordPolicyStateExtendedRequest(requestName=");
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/extensions/PasswordPolicyStateExtendedResult.java
@@ -30,7 +30,6 @@
import java.util.List;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.responses.AbstractExtendedResult;
@@ -40,36 +39,19 @@
public final class PasswordPolicyStateExtendedResult extends
        AbstractExtendedResult<PasswordPolicyStateExtendedResult> implements
        PasswordPolicyStateOperationContainer {
    private final String targetUser;
    private String targetUser = "";
    private final List<PasswordPolicyStateOperation> operations =
            new ArrayList<PasswordPolicyStateOperation>();
    /**
     * Creates a new password policy state extended result with the provided
     * result code and target user.
     * result code.
     *
     * @param resultCode
     *            The result code.
     * @param targetUser
     *            The user name.
     */
    public PasswordPolicyStateExtendedResult(final ResultCode resultCode, final DN targetUser) {
        this(resultCode, String.valueOf(targetUser));
    }
    /**
     * Creates a new password policy state extended result with the provided
     * result code and target user.
     *
     * @param resultCode
     *            The result code.
     * @param targetUser
     *            The user name.
     */
    public PasswordPolicyStateExtendedResult(final ResultCode resultCode, final String targetUser) {
    public PasswordPolicyStateExtendedResult(final ResultCode resultCode) {
        super(resultCode);
        this.targetUser = targetUser;
    }
    /**
@@ -98,6 +80,13 @@
    /**
     * {@inheritDoc}
     */
    public String getTargetUser() {
        return targetUser;
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public ByteString getValue() {
        return PasswordPolicyStateExtendedRequest.encode(targetUser, operations);
@@ -115,6 +104,14 @@
     * {@inheritDoc}
     */
    @Override
    public void setTargetUser(String targetUser) {
        this.targetUser = targetUser != null ? targetUser : "";
    }
    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        final StringBuilder builder = new StringBuilder();
        builder.append("PasswordPolicyStateExtendedResponse(resultCode=");
opendj3/opendj-ldap-sdk/src/main/java/com/forgerock/opendj/ldap/extensions/PasswordPolicyStateOperationContainer.java
@@ -31,6 +31,25 @@
 */
interface PasswordPolicyStateOperationContainer {
    /**
     * Returns the name of the user targeted by this password policy state
     * operation.
     *
     * @return The name of the user targeted by this password policy state
     *         operation.
     */
    String getTargetUser();
    /**
     * Sets the name of the user targeted by this password policy state
     * operation.
     *
     * @param targetUser
     *            The name of the user targeted by this password policy state
     *            operation.
     */
    void setTargetUser(String targetUser);
    /**
     * Adds an operation to this container.
     *
     * @param operation