/* * The contents of this file are subject to the terms of the Common Development and * Distribution License (the License). You may not use this file except in compliance with the * License. * * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the * specific language governing permission and limitations under the License. * * When distributing Covered Software, include this CDDL Header Notice in each file and include * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL * Header, with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions Copyright [year] [name of copyright owner]". * * Copyright 2016 ForgeRock AS. */ package com.forgerock.opendj.ldap.tools; import static com.forgerock.opendj.cli.CliMessages.ERR_ARG_CANNOT_DECODE_AS_INT; import static com.forgerock.opendj.cli.CliMessages.ERR_FILEARG_NO_SUCH_FILE; import static com.forgerock.opendj.cli.CliMessages.ERR_INTARG_VALUE_ABOVE_UPPER_BOUND; import static com.forgerock.opendj.cli.CliMessages.ERR_TOOL_CONFLICTING_ARGS; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.addValueNeededLongArgs; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.addValueNeededShortArgs; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.args; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.buildArgs; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.createTempFile; import static com.forgerock.opendj.ldap.tools.ToolsTestUtils.toDataProviderArray; import static org.assertj.core.api.Assertions.fail; import static org.fest.assertions.Assertions.assertThat; import java.util.ArrayList; import java.util.List; import com.forgerock.opendj.ldap.controls.AccountUsabilityRequestControl; import com.forgerock.opendj.ldap.tools.ToolsTestUtils.Args; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.opendj.ldap.DecodeException; import org.forgerock.opendj.ldap.DecodeOptions; import org.forgerock.opendj.ldap.IntermediateResponseHandler; import org.forgerock.opendj.ldap.LdapResultHandler; import org.forgerock.opendj.ldap.ResultCode; import org.forgerock.opendj.ldap.controls.PasswordPolicyRequestControl; import org.forgerock.opendj.ldap.requests.ExtendedRequest; import org.forgerock.opendj.ldap.responses.ExtendedResult; import org.forgerock.opendj.ldap.responses.Responses; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** A set of test cases for the LDAPPasswordModify tool. */ @Test public class LDAPPasswordModifyTestCase extends LDAPToolsTestCase { private final class LdapPasswordModifyToolLdapServer extends ToolLdapServer { private final class LdapPasswordModifyRequestHandler extends ToolLdapServer.ToolLdapServerConnection { @Override public void handleExtendedRequest(final Integer requestContext, final ExtendedRequest request, final IntermediateResponseHandler irh, final LdapResultHandler resultHandler) { assertThat(request.getOID()).isEqualTo("1.3.6.1.4.1.4203.1.11.1"); assertThat(request.getValue().toASCIIString()).isEqualTo( "0*%80%0Edn: uid=marvin%81%0Boldpassword%82%0Bnewpassword"); assertThatControlsHaveBeenSentInRequest(request.getControls()); try { resultHandler.handleResult(request.getResultDecoder().decodeExtendedResult( Responses.newPasswordModifyExtendedResult(ResultCode.SUCCESS), new DecodeOptions())); } catch (DecodeException e) { fail("Unexpected error occurred while mocking server password modify response.", e); } } } @Override ToolLdapServerConnection newServerConnection() { return new LdapPasswordModifyRequestHandler(); } } @Override ToolLdapServer createFakeServer() { return new LdapPasswordModifyToolLdapServer(); } /** * Retrieves sets of invalid arguments that may not be used to initialize * the LDAPPasswordModify tool. * * @return Sets of invalid arguments that may not be used to initialize the * LDAPPasswordModify tool. */ @DataProvider(name = "invalidArgs") public Object[][] getInvalidArgumentLists() { final List> argLists = new ArrayList<>(); final List reasonList = new ArrayList<>(); addValueNeededShortArgs(argLists, reasonList, "a", "N", "n", "c", "C", "D", "w", "j", "K", "P", "W", "h", "p"); addValueNeededLongArgs(argLists, reasonList, "hostname", "port", "control", "keyStorePasswordFile", "trustStorePassword", "trustStorePasswordFile"); argLists.add(args("-D", "cn=Directory Manager", "-j", "no.such.file")); reasonList.add(ERR_FILEARG_NO_SUCH_FILE.get("no.such.file", "bindPasswordFile")); argLists.add(args("-D", "cn=Directory Manager", "-w", "password", "-j", "src/test/resources/dummy-truststore")); reasonList.add(ERR_TOOL_CONFLICTING_ARGS.get("bindPassword", "bindPasswordFile")); argLists.add(args("-D", "cn=Directory Manager", "-c", "password", "-C", "src/test/resources/dummy-truststore")); reasonList.add(ERR_TOOL_CONFLICTING_ARGS.get("currentPassword", "currentPasswordFile")); argLists.add(args("-D", "cn=Directory Manager", "-n", "password", "-F", "src/test/resources/dummy-truststore")); reasonList.add(ERR_TOOL_CONFLICTING_ARGS.get("newPassword", "newPasswordFile")); argLists.add(args("-Z", "-q")); reasonList.add(ERR_TOOL_CONFLICTING_ARGS.get("useStartTLS", "useSSL")); argLists.add(args("-p", "nonnumeric")); reasonList.add(ERR_ARG_CANNOT_DECODE_AS_INT.get("nonnumeric", "port")); argLists.add(args("-p", "999999")); reasonList.add(ERR_INTARG_VALUE_ABOVE_UPPER_BOUND.get("port", 999999, 65535)); return toDataProviderArray(argLists, reasonList); } @Test public void testLdapPasswordModify() throws Exception { runToolOnMockedServer("-c", "oldpassword", "-n", "newpassword"); } @Test public void testLdapPasswordModifyWithPasswordInFiles() throws Exception { final String oldPwdFilePath = createTempFile("oldpassword"); final String newPwdFilePath = createTempFile("newpassword"); runToolOnMockedServer("-C", oldPwdFilePath, "-F", newPwdFilePath); } @Test public void testLdapPasswordModifyWithControls() throws Exception { controls.add(PasswordPolicyRequestControl.newControl(false)); controls.add(AccountUsabilityRequestControl.newControl(false)); runToolOnMockedServer("-J", "1.3.6.1.4.1.42.2.27.8.5.1:false", "-J", "1.3.6.1.4.1.42.2.27.9.5.8:false", "-c", "oldpassword", "-n", "newpassword"); } @Override Args toolConstantArguments() { return buildArgs().add("-a", "dn: uid=marvin"); } @Override ToolConsoleApplication createInstance() { return new LDAPPasswordModify(outStream, errStream); } }