1026N/A/*
1026N/A * CDDL HEADER START
1026N/A *
1026N/A * The contents of this file are subject to the terms of the
1026N/A * Common Development and Distribution License, Version 1.0 only
1026N/A * (the "License"). You may not use this file except in compliance
1026N/A * with the License.
1026N/A *
1026N/A * You can obtain a copy of the license at
1026N/A * trunk/opends/resource/legal-notices/OpenDS.LICENSE
1026N/A * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
1026N/A * See the License for the specific language governing permissions
1026N/A * and limitations under the License.
1026N/A *
1026N/A * When distributing Covered Code, include this CDDL HEADER in each
1026N/A * file and include the License file at
1026N/A * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
1026N/A * add the following below this CDDL HEADER, with the fields enclosed
1026N/A * by brackets "[]" replaced with your own identifying information:
1026N/A * Portions Copyright [yyyy] [name of copyright owner]
1026N/A *
1026N/A * CDDL HEADER END
1026N/A *
1026N/A *
3232N/A * Copyright 2006-2008 Sun Microsystems, Inc.
1026N/A */
1026N/Apackage org.opends.server.extensions;
1026N/A
1026N/A
1026N/A
1026N/Aimport java.util.ArrayList;
1026N/Aimport java.util.HashSet;
1026N/Aimport java.util.List;
1026N/A
1026N/Aimport org.testng.annotations.BeforeClass;
1026N/Aimport org.testng.annotations.DataProvider;
1026N/Aimport org.testng.annotations.Test;
1026N/A
1026N/Aimport org.opends.server.TestCaseUtils;
2086N/Aimport org.opends.messages.MessageBuilder;
2086N/Aimport org.opends.messages.Message;
1026N/Aimport org.opends.server.admin.std.meta.
1026N/A UniqueCharactersPasswordValidatorCfgDefn;
1026N/Aimport org.opends.server.admin.std.server.
1026N/A UniqueCharactersPasswordValidatorCfg;
1026N/Aimport org.opends.server.admin.server.AdminTestCaseUtils;
1026N/Aimport org.opends.server.config.ConfigException;
1689N/Aimport org.opends.server.core.ModifyOperationBasis;
1026N/Aimport org.opends.server.protocols.internal.InternalClientConnection;
3853N/Aimport org.opends.server.types.Attributes;
1026N/Aimport org.opends.server.types.ByteString;
1026N/Aimport org.opends.server.types.ConfigChangeResult;
1026N/Aimport org.opends.server.types.Control;
1026N/Aimport org.opends.server.types.DN;
1026N/Aimport org.opends.server.types.Entry;
1026N/Aimport org.opends.server.types.InitializationException;
1026N/Aimport org.opends.server.types.Modification;
1026N/Aimport org.opends.server.types.ModificationType;
1026N/Aimport org.opends.server.types.ResultCode;
1026N/A
1026N/Aimport static org.testng.Assert.*;
1026N/A
1026N/A
1026N/A
1026N/A/**
1026N/A * A set of test cases for the unique characters password validator.
1026N/A */
1026N/Apublic class UniqueCharactersPasswordValidatorTestCase
1026N/A extends ExtensionsTestCase
1026N/A{
1026N/A /**
1026N/A * Ensures that the Directory Server is running.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @BeforeClass()
1026N/A public void startServer()
1026N/A throws Exception
1026N/A {
1026N/A TestCaseUtils.startServer();
1026N/A }
1026N/A
1026N/A
1026N/A
1026N/A /**
1026N/A * Retrieves a set of valid configuration entries that may be used to
1026N/A * initialize the validator.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @DataProvider(name = "validConfigs")
1026N/A public Object[][] getValidConfigs()
1026N/A throws Exception
1026N/A {
1026N/A List<Entry> entries = TestCaseUtils.makeEntries(
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 5",
1026N/A "ds-cfg-case-sensitive-validation: false",
1026N/A "",
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 5",
1026N/A "ds-cfg-case-sensitive-validation: true",
1026N/A "",
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 0",
1026N/A "ds-cfg-case-sensitive-validation: false");
1026N/A
1026N/A Object[][] array = new Object[entries.size()][1];
1026N/A for (int i=0; i < array.length; i++)
1026N/A {
1026N/A array[i] = new Object[] { entries.get(i) };
1026N/A }
1026N/A
1026N/A return array;
1026N/A }
1026N/A
1026N/A
1026N/A
1026N/A /**
1026N/A * Tests the process of initializing the server with valid configurations.
1026N/A *
1026N/A * @param entry The configuration entry to use for the initialization.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @Test(dataProvider = "validConfigs")
1026N/A public void testInitializeWithValidConfigs(Entry e)
1026N/A throws Exception
1026N/A {
1026N/A UniqueCharactersPasswordValidatorCfg configuration =
1026N/A AdminTestCaseUtils.getConfiguration(
1026N/A UniqueCharactersPasswordValidatorCfgDefn.getInstance(), e);
1026N/A
1026N/A UniqueCharactersPasswordValidator validator =
1026N/A new UniqueCharactersPasswordValidator();
1026N/A validator.initializePasswordValidator(configuration);
1026N/A validator.finalizePasswordValidator();
1026N/A }
1026N/A
1026N/A
1026N/A
1026N/A /**
1026N/A * Retrieves a set of invalid configuration entries.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @DataProvider(name = "invalidConfigs")
1026N/A public Object[][] getInvalidConfigs()
1026N/A throws Exception
1026N/A {
1026N/A List<Entry> entries = TestCaseUtils.makeEntries(
1026N/A // Missing minimum unique characters
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
1026N/A "ds-cfg-case-sensitive-validation: false",
1026N/A "",
1026N/A // Missing case-sensitive validation
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 5",
1026N/A "",
1026N/A // Non-numeric minimum unique characters
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: non-numeric",
1026N/A "ds-cfg-case-sensitive-validation: false",
1026N/A "",
1026N/A // Non-boolean case-sensitive validation
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 5",
1026N/A "ds-cfg-case-sensitive-validation: non-boolean",
1026N/A "",
1026N/A // Minimum unique characters out of range.
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: -1",
1026N/A "ds-cfg-case-sensitive-validation: false");
1026N/A
1026N/A Object[][] array = new Object[entries.size()][1];
1026N/A for (int i=0; i < array.length; i++)
1026N/A {
1026N/A array[i] = new Object[] { entries.get(i) };
1026N/A }
1026N/A
1026N/A return array;
1026N/A }
1026N/A
1026N/A
1026N/A
1026N/A /**
1026N/A * Tests the process of initializing the server with invalid configurations.
1026N/A *
1026N/A * @param entry The configuration entry to use for the initialization.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @Test(dataProvider = "invalidConfigs",
1026N/A expectedExceptions = { ConfigException.class,
1026N/A InitializationException.class })
1026N/A public void testInitializeWithInvalidConfigs(Entry e)
1026N/A throws Exception
1026N/A {
1026N/A UniqueCharactersPasswordValidatorCfg configuration =
1026N/A AdminTestCaseUtils.getConfiguration(
1026N/A UniqueCharactersPasswordValidatorCfgDefn.getInstance(), e);
1026N/A
1026N/A UniqueCharactersPasswordValidator validator =
1026N/A new UniqueCharactersPasswordValidator();
1026N/A validator.initializePasswordValidator(configuration);
1026N/A }
1026N/A
1026N/A
1026N/A
1026N/A /**
1026N/A * Tests the {@code passwordIsAcceptable} method with a password that falls
1026N/A * within the constraints of the password validator. Case-sensitivity will
1026N/A * not be an issue.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @Test()
1026N/A public void testPasswordIsAcceptable7Unique()
1026N/A throws Exception
1026N/A {
1026N/A TestCaseUtils.initializeTestBackend(true);
1026N/A Entry userEntry = TestCaseUtils.makeEntry(
1026N/A "dn: uid=test.user,o=test",
1026N/A "objectClass: top",
1026N/A "objectClass: person",
1026N/A "objectClass: organizationalPerson",
1026N/A "objectClass: inetOrgPerson",
1026N/A "uid: test.user",
1026N/A "givenName: Test",
1026N/A "sn: User",
1026N/A "cn: Test User",
1026N/A "userPassword: doesntmatter");
1026N/A
1026N/A Entry validatorEntry = TestCaseUtils.makeEntry(
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 5",
1026N/A "ds-cfg-case-sensitive-validation: false");
1026N/A
1026N/A UniqueCharactersPasswordValidatorCfg configuration =
1026N/A AdminTestCaseUtils.getConfiguration(
1026N/A UniqueCharactersPasswordValidatorCfgDefn.getInstance(),
1026N/A validatorEntry);
1026N/A
1026N/A UniqueCharactersPasswordValidator validator =
1026N/A new UniqueCharactersPasswordValidator();
1026N/A validator.initializePasswordValidator(configuration);
1026N/A
4134N/A ByteString password = ByteString.valueOf("password");
1026N/A ArrayList<Modification> mods = new ArrayList<Modification>();
1026N/A mods.add(new Modification(ModificationType.REPLACE,
3853N/A Attributes.create("userpassword", "password")));
1026N/A
1026N/A InternalClientConnection conn =
1026N/A InternalClientConnection.getRootConnection();
1689N/A ModifyOperationBasis modifyOperation =
5902N/A new ModifyOperationBasis(conn, InternalClientConnection.nextOperationID(),
5902N/A InternalClientConnection.nextMessageID(),
1026N/A new ArrayList<Control>(),
1026N/A DN.decode("uid=test.user,o=test"), mods);
1026N/A
2086N/A MessageBuilder invalidReason = new MessageBuilder();
1026N/A assertTrue(validator.passwordIsAcceptable(password,
1026N/A new HashSet<ByteString>(0), modifyOperation,
1026N/A userEntry, invalidReason),
1026N/A invalidReason.toString());
1026N/A
1026N/A validator.finalizePasswordValidator();
1026N/A }
1026N/A
1026N/A
1026N/A
1026N/A /**
1026N/A * Tests the {@code passwordIsAcceptable} method with a password that falls
1026N/A * outside the constraints of the password validator. Case-sensitivity will
1026N/A * not be an issue.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @Test()
1026N/A public void testPasswordIsAcceptable4Unique()
1026N/A throws Exception
1026N/A {
1026N/A TestCaseUtils.initializeTestBackend(true);
1026N/A Entry userEntry = TestCaseUtils.makeEntry(
1026N/A "dn: uid=test.user,o=test",
1026N/A "objectClass: top",
1026N/A "objectClass: person",
1026N/A "objectClass: organizationalPerson",
1026N/A "objectClass: inetOrgPerson",
1026N/A "uid: test.user",
1026N/A "givenName: Test",
1026N/A "sn: User",
1026N/A "cn: Test User",
1026N/A "userPassword: doesntmatter");
1026N/A
1026N/A Entry validatorEntry = TestCaseUtils.makeEntry(
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 5",
1026N/A "ds-cfg-case-sensitive-validation: false");
1026N/A
1026N/A UniqueCharactersPasswordValidatorCfg configuration =
1026N/A AdminTestCaseUtils.getConfiguration(
1026N/A UniqueCharactersPasswordValidatorCfgDefn.getInstance(),
1026N/A validatorEntry);
1026N/A
1026N/A UniqueCharactersPasswordValidator validator =
1026N/A new UniqueCharactersPasswordValidator();
1026N/A validator.initializePasswordValidator(configuration);
1026N/A
4134N/A ByteString password = ByteString.valueOf("passw");
1026N/A ArrayList<Modification> mods = new ArrayList<Modification>();
1026N/A mods.add(new Modification(ModificationType.REPLACE,
3853N/A Attributes.create("userpassword", "passw")));
1026N/A
1026N/A InternalClientConnection conn =
1026N/A InternalClientConnection.getRootConnection();
1689N/A ModifyOperationBasis modifyOperation =
5902N/A new ModifyOperationBasis(conn, InternalClientConnection.nextOperationID(),
5902N/A InternalClientConnection.nextMessageID(),
1026N/A new ArrayList<Control>(),
1026N/A DN.decode("uid=test.user,o=test"), mods);
1026N/A
2086N/A MessageBuilder invalidReason = new MessageBuilder();
1026N/A assertFalse(validator.passwordIsAcceptable(password,
1026N/A new HashSet<ByteString>(0), modifyOperation,
1026N/A userEntry, invalidReason));
1026N/A
1026N/A validator.finalizePasswordValidator();
1026N/A }
1026N/A
1026N/A
1026N/A
1026N/A /**
1026N/A * Tests the {@code passwordIsAcceptable} method with a password that falls
1026N/A * within the constraints of the password validator only because it uses
1026N/A * case-sensitive validation.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @Test()
1026N/A public void testPasswordIsAcceptableCaseSensitive()
1026N/A throws Exception
1026N/A {
1026N/A TestCaseUtils.initializeTestBackend(true);
1026N/A Entry userEntry = TestCaseUtils.makeEntry(
1026N/A "dn: uid=test.user,o=test",
1026N/A "objectClass: top",
1026N/A "objectClass: person",
1026N/A "objectClass: organizationalPerson",
1026N/A "objectClass: inetOrgPerson",
1026N/A "uid: test.user",
1026N/A "givenName: Test",
1026N/A "sn: User",
1026N/A "cn: Test User",
1026N/A "userPassword: doesntmatter");
1026N/A
1026N/A Entry validatorEntry = TestCaseUtils.makeEntry(
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 5",
1026N/A "ds-cfg-case-sensitive-validation: true");
1026N/A
1026N/A UniqueCharactersPasswordValidatorCfg configuration =
1026N/A AdminTestCaseUtils.getConfiguration(
1026N/A UniqueCharactersPasswordValidatorCfgDefn.getInstance(),
1026N/A validatorEntry);
1026N/A
1026N/A UniqueCharactersPasswordValidator validator =
1026N/A new UniqueCharactersPasswordValidator();
1026N/A validator.initializePasswordValidator(configuration);
1026N/A
4134N/A ByteString password = ByteString.valueOf("pasSw");
1026N/A ArrayList<Modification> mods = new ArrayList<Modification>();
1026N/A mods.add(new Modification(ModificationType.REPLACE,
3853N/A Attributes.create("userpassword", "pasSw")));
1026N/A
1026N/A InternalClientConnection conn =
1689N/A InternalClientConnection.getRootConnection();
1689N/A ModifyOperationBasis modifyOperation =
5902N/A new ModifyOperationBasis(conn, InternalClientConnection.nextOperationID(),
5902N/A InternalClientConnection.nextMessageID(),
1026N/A new ArrayList<Control>(),
1026N/A DN.decode("uid=test.user,o=test"), mods);
1026N/A
2086N/A MessageBuilder invalidReason = new MessageBuilder();
1026N/A assertTrue(validator.passwordIsAcceptable(password,
1026N/A new HashSet<ByteString>(0), modifyOperation,
1026N/A userEntry, invalidReason),
1026N/A invalidReason.toString());
1026N/A
1026N/A validator.finalizePasswordValidator();
1026N/A }
1026N/A
1026N/A
1026N/A
1026N/A /**
1026N/A * Tests the {@code passwordIsAcceptable} method with a password that falls
1026N/A * outside the constraints of the password validator because it uses
1026N/A * case-insensitive validation.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @Test()
1026N/A public void testPasswordIsAcceptableCaseInsensitive()
1026N/A throws Exception
1026N/A {
1026N/A TestCaseUtils.initializeTestBackend(true);
1026N/A Entry userEntry = TestCaseUtils.makeEntry(
1026N/A "dn: uid=test.user,o=test",
1026N/A "objectClass: top",
1026N/A "objectClass: person",
1026N/A "objectClass: organizationalPerson",
1026N/A "objectClass: inetOrgPerson",
1026N/A "uid: test.user",
1026N/A "givenName: Test",
1026N/A "sn: User",
1026N/A "cn: Test User",
1026N/A "userPassword: doesntmatter");
1026N/A
1026N/A Entry validatorEntry = TestCaseUtils.makeEntry(
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 5",
1026N/A "ds-cfg-case-sensitive-validation: false");
1026N/A
1026N/A UniqueCharactersPasswordValidatorCfg configuration =
1026N/A AdminTestCaseUtils.getConfiguration(
1026N/A UniqueCharactersPasswordValidatorCfgDefn.getInstance(),
1026N/A validatorEntry);
1026N/A
1026N/A UniqueCharactersPasswordValidator validator =
1026N/A new UniqueCharactersPasswordValidator();
1026N/A validator.initializePasswordValidator(configuration);
1026N/A
4134N/A ByteString password = ByteString.valueOf("pasSw");
1026N/A ArrayList<Modification> mods = new ArrayList<Modification>();
1026N/A mods.add(new Modification(ModificationType.REPLACE,
3853N/A Attributes.create("userpassword", "pasSw")));
1026N/A
1026N/A InternalClientConnection conn =
1026N/A InternalClientConnection.getRootConnection();
1689N/A ModifyOperationBasis modifyOperation =
5902N/A new ModifyOperationBasis(conn, InternalClientConnection.nextOperationID(),
5902N/A InternalClientConnection.nextMessageID(),
1026N/A new ArrayList<Control>(),
1026N/A DN.decode("uid=test.user,o=test"), mods);
1026N/A
2086N/A MessageBuilder invalidReason = new MessageBuilder();
1026N/A assertFalse(validator.passwordIsAcceptable(password,
1026N/A new HashSet<ByteString>(0), modifyOperation,
1026N/A userEntry, invalidReason));
1026N/A
1026N/A validator.finalizePasswordValidator();
1026N/A }
1026N/A
1026N/A
1026N/A
1026N/A /**
1026N/A * Tests the {@code passwordIsAcceptable} method when the validator is
1026N/A * configured to accept any number of unique characters.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @Test()
1026N/A public void testPasswordIsAcceptableAnyNumberOfCharacters()
1026N/A throws Exception
1026N/A {
1026N/A TestCaseUtils.initializeTestBackend(true);
1026N/A Entry userEntry = TestCaseUtils.makeEntry(
1026N/A "dn: uid=test.user,o=test",
1026N/A "objectClass: top",
1026N/A "objectClass: person",
1026N/A "objectClass: organizationalPerson",
1026N/A "objectClass: inetOrgPerson",
1026N/A "uid: test.user",
1026N/A "givenName: Test",
1026N/A "sn: User",
1026N/A "cn: Test User",
1026N/A "userPassword: doesntmatter");
1026N/A
1026N/A Entry validatorEntry = TestCaseUtils.makeEntry(
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 0",
1026N/A "ds-cfg-case-sensitive-validation: true");
1026N/A
1026N/A UniqueCharactersPasswordValidatorCfg configuration =
1026N/A AdminTestCaseUtils.getConfiguration(
1026N/A UniqueCharactersPasswordValidatorCfgDefn.getInstance(),
1026N/A validatorEntry);
1026N/A
1026N/A UniqueCharactersPasswordValidator validator =
1026N/A new UniqueCharactersPasswordValidator();
1026N/A validator.initializePasswordValidator(configuration);
1026N/A
4134N/A ByteString password = ByteString.valueOf("aaaaaaaa");
1026N/A ArrayList<Modification> mods = new ArrayList<Modification>();
1026N/A mods.add(new Modification(ModificationType.REPLACE,
3853N/A Attributes.create("userpassword", "aaaaaaaa")));
1026N/A
1026N/A InternalClientConnection conn =
1026N/A InternalClientConnection.getRootConnection();
1689N/A ModifyOperationBasis modifyOperation =
5902N/A new ModifyOperationBasis(conn, InternalClientConnection.nextOperationID(),
5902N/A InternalClientConnection.nextMessageID(),
1026N/A new ArrayList<Control>(),
1026N/A DN.decode("uid=test.user,o=test"), mods);
1026N/A
2086N/A MessageBuilder invalidReason = new MessageBuilder();
1026N/A assertTrue(validator.passwordIsAcceptable(password,
1026N/A new HashSet<ByteString>(0), modifyOperation,
1026N/A userEntry, invalidReason),
1026N/A invalidReason.toString());
1026N/A
1026N/A validator.finalizePasswordValidator();
1026N/A }
1026N/A
1026N/A
1026N/A
1026N/A /**
1026N/A * Tests the ability of the password validator to change its behavior when
1026N/A * the configuration is updated.
1026N/A *
1026N/A * @throws Exception If an unexpected problem occurs.
1026N/A */
1026N/A @Test()
1026N/A public void testPasswordIsAcceptableConfigurationChange()
1026N/A throws Exception
1026N/A {
1026N/A TestCaseUtils.initializeTestBackend(true);
1026N/A Entry userEntry = TestCaseUtils.makeEntry(
1026N/A "dn: uid=test.user,o=test",
1026N/A "objectClass: top",
1026N/A "objectClass: person",
1026N/A "objectClass: organizationalPerson",
1026N/A "objectClass: inetOrgPerson",
1026N/A "uid: test.user",
1026N/A "givenName: Test",
1026N/A "sn: User",
1026N/A "cn: Test User",
1026N/A "userPassword: doesntmatter");
1026N/A
1026N/A Entry validatorEntry = TestCaseUtils.makeEntry(
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 0",
1026N/A "ds-cfg-case-sensitive-validation: true");
1026N/A
1026N/A UniqueCharactersPasswordValidatorCfg configuration =
1026N/A AdminTestCaseUtils.getConfiguration(
1026N/A UniqueCharactersPasswordValidatorCfgDefn.getInstance(),
1026N/A validatorEntry);
1026N/A
1026N/A UniqueCharactersPasswordValidator validator =
1026N/A new UniqueCharactersPasswordValidator();
1026N/A validator.initializePasswordValidator(configuration);
1026N/A
4134N/A ByteString password = ByteString.valueOf("aaaaaaaa");
1026N/A ArrayList<Modification> mods = new ArrayList<Modification>();
1026N/A mods.add(new Modification(ModificationType.REPLACE,
3853N/A Attributes.create("userpassword", "aaaaaaaa")));
1026N/A
1026N/A InternalClientConnection conn =
1026N/A InternalClientConnection.getRootConnection();
1689N/A ModifyOperationBasis modifyOperation =
5902N/A new ModifyOperationBasis(conn, InternalClientConnection.nextOperationID(),
5902N/A InternalClientConnection.nextMessageID(),
1026N/A new ArrayList<Control>(),
1026N/A DN.decode("uid=test.user,o=test"), mods);
1026N/A
2086N/A MessageBuilder invalidReason = new MessageBuilder();
1026N/A assertTrue(validator.passwordIsAcceptable(password,
1026N/A new HashSet<ByteString>(0), modifyOperation,
1026N/A userEntry, invalidReason),
1026N/A invalidReason.toString());
1026N/A
1026N/A Entry updatedValidatorEntry = TestCaseUtils.makeEntry(
1026N/A "dn: cn=Unique Characters,cn=Password Validators,cn=config",
1026N/A "objectClass: top",
1026N/A "objectClass: ds-cfg-password-validator",
1026N/A "objectClass: ds-cfg-unique-characters-password-validator",
1026N/A "cn: Unique Characters",
2624N/A "ds-cfg-java-class: org.opends.server.extensions." +
1026N/A "UniqueCharactersPasswordValidator",
2624N/A "ds-cfg-enabled: true",
2624N/A "ds-cfg-min-unique-characters: 5",
1026N/A "ds-cfg-case-sensitive-validation: true");
1026N/A
1026N/A UniqueCharactersPasswordValidatorCfg updatedConfiguration =
1026N/A AdminTestCaseUtils.getConfiguration(
1026N/A UniqueCharactersPasswordValidatorCfgDefn.getInstance(),
1026N/A updatedValidatorEntry);
1026N/A
2086N/A ArrayList<Message> unacceptableReasons = new ArrayList<Message>();
1026N/A assertTrue(validator.isConfigurationChangeAcceptable(updatedConfiguration,
1026N/A unacceptableReasons),
1026N/A String.valueOf(unacceptableReasons));
1026N/A
1026N/A ConfigChangeResult changeResult =
1026N/A validator.applyConfigurationChange(updatedConfiguration);
1026N/A assertEquals(changeResult.getResultCode(), ResultCode.SUCCESS);
1026N/A
1026N/A assertFalse(validator.passwordIsAcceptable(password,
1026N/A new HashSet<ByteString>(0), modifyOperation,
1026N/A userEntry, invalidReason));
1026N/A
1026N/A validator.finalizePasswordValidator();
1026N/A }
1026N/A}
1026N/A