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

Jean-Noël Rouvignac
02.47.2016 cdbc97a66ca18d9f74b58c3fbca253f17d4dcd55
Code cleanups:
- remove isEmpty() checks when lists are iterated immediately after
- extracted methods
- removed {@inheritDoc} javadocs
13 files modified
639 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java 82 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/admin/AdministrationDataSync.java 19 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/api/AuthenticationPolicyState.java 5 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/UserAttr.java 34 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/UserDN.java 6 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/BackupBackend.java 54 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/core/PasswordPolicyState.java 7 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/crypto/CryptoManagerSync.java 27 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/ExternalSASLMechanismHandler.java 84 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/plugins/PasswordPolicyImportPlugin.java 109 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/core/AddOperationTestCase.java 117 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/core/ModifyOperationTestCase.java 38 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/plugins/SambaPasswordPluginTestCase.java 57 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java
@@ -24,7 +24,6 @@
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 *      Portions Copyright 2011-2016 ForgeRock AS
 */
package org.opends.guitools.controlpanel.ui;
import static org.opends.messages.AdminToolMessages.*;
@@ -46,6 +45,7 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.forgerock.opendj.ldap.schema.ObjectClassType;
import org.forgerock.opendj.ldap.schema.Syntax;
import org.opends.guitools.controlpanel.datamodel.BinaryValue;
@@ -57,7 +57,6 @@
import org.opends.guitools.controlpanel.ui.nodes.BasicNode;
import org.opends.guitools.controlpanel.util.Utilities;
import org.opends.server.schema.SchemaConstants;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.Attributes;
import org.opends.server.types.Entry;
import org.opends.server.types.ObjectClass;
@@ -70,39 +69,27 @@
/**
 * Abstract class containing code shared by the different LDAP entry view
 * panels (Simplified View, Attribute View and LDIF View).
 *
 */
public abstract class ViewEntryPanel extends StatusGenericPanel
{
  private static final long serialVersionUID = -1908757626234678L;
  /**
   * The read-only attributes as they appear on the schema.
   */
  /** The read-only attributes as they appear on the schema. */
  protected SortedSet<String> schemaReadOnlyAttributes = new TreeSet<>();
  /**
   * The read-only attributes in lower case.
   */
  /** The read-only attributes in lower case. */
  protected SortedSet<String> schemaReadOnlyAttributesLowerCase = new TreeSet<>();
  /**
   * The editable operational attributes.
   */
  /** The editable operational attributes. */
  protected SortedSet<String> editableOperationalAttrNames = new TreeSet<>();
  private JLabel title= Utilities.createDefaultLabel();
  private Set<LDAPEntryChangedListener> listeners = new LinkedHashSet<>();
  /**
   * Whether the entry change events should be ignored or not.
   */
  /** Whether the entry change events should be ignored or not. */
  protected boolean ignoreEntryChangeEvents;
  /**
   * Static boolean used to know whether only attributes with values should be
   * displayed or not.
   */
  /** Static boolean used to know whether only attributes with values should be displayed or not. */
  protected static boolean displayOnlyWithAttrs = true;
  /** {@inheritDoc} */
  @Override
  public void okClicked()
  {
    // No ok button
@@ -163,7 +150,7 @@
    listeners.remove(listener);
  }
  /** {@inheritDoc} */
  @Override
  public boolean requiresBorder()
  {
    return true;
@@ -281,26 +268,22 @@
          {
            structuralObjectClass = objectClass;
          }
          else
          else if (objectClass.isDescendantOf(structuralObjectClass))
          {
            if (objectClass.isDescendantOf(structuralObjectClass))
            {
              structuralObjectClass = objectClass;
            }
            structuralObjectClass = objectClass;
          }
        }
        else
        {
          String name = objectClass.getNameOrOID();
          if (!name.equals(SchemaConstants.TOP_OBJECTCLASS_NAME))
          if (!SchemaConstants.TOP_OBJECTCLASS_NAME.equals(name))
          {
            auxiliaryClasses.add(objectClass.getNameOrOID());
          }
        }
      }
    }
    String structural = structuralObjectClass != null ?
        structuralObjectClass.getNameOrOID() : null;
    String structural = structuralObjectClass != null ? structuralObjectClass.getNameOrOID() : null;
    return new ObjectClassValue(structural, auxiliaryClasses);
  }
@@ -310,24 +293,18 @@
   */
  protected void addValuesInRDN(Entry entry)
  {
//  Add the values in the RDN if  they are not there
    // Add the values in the RDN if they are not there
    RDN rdn = entry.getName().rdn();
    for (int i=0; i<rdn.getNumValues(); i++)
    {
      String attrName = rdn.getAttributeName(i);
      ByteString value = rdn.getAttributeValue(i);
      List<org.opends.server.types.Attribute> attrs = entry.getAttribute(attrName.toLowerCase());
      boolean done = false;
      for (org.opends.server.types.Attribute attr : attrs)
      for (org.opends.server.types.Attribute attr : entry.getAttribute(attrName.toLowerCase()))
      {
        if (attr.getNameWithOptions().equals(attrName))
        {
          ArrayList<ByteString> newValues = new ArrayList<>();
          Iterator<ByteString> it = attr.iterator();
          while (it.hasNext())
          {
            newValues.add(it.next());
          }
          List<ByteString> newValues = getValues(attr);
          newValues.add(value);
          entry.addAttribute(attr, newValues);
          done = true;
@@ -336,20 +313,29 @@
      }
      if (!done)
      {
        org.opends.server.types.Attribute attr =
          Attributes.create(rdn.getAttributeType(i), value);
        entry.addAttribute(attr, newArrayList(value));
        entry.addAttribute(Attributes.create(rdn.getAttributeType(i), value), newArrayList(value));
      }
    }
  }
  /** {@inheritDoc} */
  private List<ByteString> getValues(org.opends.server.types.Attribute attr)
  {
    List<ByteString> newValues = new ArrayList<>();
    Iterator<ByteString> it = attr.iterator();
    while (it.hasNext())
    {
      newValues.add(it.next());
    }
    return newValues;
  }
  @Override
  public LocalizableMessage getTitle()
  {
    return INFO_CTRL_PANEL_EDIT_LDAP_ENTRY_TITLE.get();
  }
  /** {@inheritDoc} */
  @Override
  public void configurationChanged(ConfigurationChangeEvent ev)
  {
    Schema schema = ev.getNewDescriptor().getSchema();
@@ -494,8 +480,7 @@
        Syntax syntax = attr.getSyntax();
        if (syntax != null)
        {
          isCertificate = syntax.getOID().equals(
              SchemaConstants.SYNTAX_CERTIFICATE_OID);
          isCertificate = SchemaConstants.SYNTAX_CERTIFICATE_OID.equals(syntax.getOID());
        }
      }
    }
@@ -546,12 +531,9 @@
         throw new RuntimeException("Unexpected error: "+pe, pe);
        }
      }
      else
      else if (String.valueOf(value).trim().length() > 0)
      {
        if (String.valueOf(value).trim().length() > 0)
        {
          valuesToSet.add(String.valueOf(value));
        }
        valuesToSet.add(String.valueOf(value));
      }
    }
    if (!valuesToSet.isEmpty())
opendj-server-legacy/src/main/java/org/opends/server/admin/AdministrationDataSync.java
@@ -36,13 +36,13 @@
import org.forgerock.opendj.ldap.ModificationType;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchScope;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.core.DirectoryServer;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.protocols.internal.InternalSearchOperation;
import org.opends.server.protocols.internal.Requests;
import org.opends.server.protocols.internal.SearchRequest;
import org.opends.server.types.Attribute;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.Attributes;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
@@ -250,20 +250,19 @@
    }
    // Read the port from the PORT attribute
    SearchResultEntry adminConnectorEntry = null;
    LinkedList<SearchResultEntry> result = search.getSearchEntries();
    if (!result.isEmpty())
    {
      adminConnectorEntry = result.getFirst();
      SearchResultEntry adminConnectorEntry = result.getFirst();
      AttributeType attrType = DirectoryServer.getAttributeType(attrName);
      List<Attribute> attrs = adminConnectorEntry.getAttribute(attrType);
      if (!attrs.isEmpty())
      {
        // Get the attribute value
        return attrs.get(0).iterator().next().toString();
      }
    }
    AttributeType attrType = DirectoryServer.getAttributeType(attrName);
    List<Attribute> attrs = adminConnectorEntry.getAttribute(attrType);
    if (!attrs.isEmpty())
    {
      // Get the attribute value
      return attrs.get(0).iterator().next().toString();
    }
    // Can not happen. Best effort.
    // TODO Log an Error.
    return null;
opendj-server-legacy/src/main/java/org/opends/server/api/AuthenticationPolicyState.java
@@ -26,8 +26,6 @@
 */
package org.opends.server.api;
import java.util.List;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ByteString;
@@ -108,8 +106,7 @@
  protected static ConditionResult getBoolean(final Entry entry,
      final AttributeType attributeType) throws DirectoryException
  {
    final List<Attribute> attrList = entry.getAttribute(attributeType);
    for (final Attribute a : attrList)
    for (final Attribute a : entry.getAttribute(attributeType))
    {
      if (a.isEmpty())
      {
opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/UserAttr.java
@@ -229,36 +229,28 @@
     */
    private EnumEvalResult evalURL(AciEvalContext evalCtx) {
        EnumEvalResult matched= EnumEvalResult.FALSE;
        boolean undefined=false;
        AttributeType attrType = DirectoryServer.getAttributeType(attrStr);
        List<Attribute> attrs=evalCtx.getResourceEntry().getAttribute(attrType);
        if(!attrs.isEmpty()) {
            for(Attribute a : attrs) {
                for(ByteString v : a) {
                    LDAPURL url;
                    try {
                       url = LDAPURL.decode(v.toString(), true);
                    } catch (DirectoryException e) {
                        break;
                    }
                    matched=UserDN.evalURL(evalCtx, url);
                    if(matched != EnumEvalResult.FALSE)
                    {
                        break;
                    }
                }
                if (matched == EnumEvalResult.TRUE)
                {
        for(Attribute a : attrs) {
            for(ByteString v : a) {
                LDAPURL url;
                try {
                   url = LDAPURL.decode(v.toString(), true);
                } catch (DirectoryException e) {
                    break;
                }
                if (matched == EnumEvalResult.ERR)
                matched=UserDN.evalURL(evalCtx, url);
                if(matched != EnumEvalResult.FALSE)
                {
                    undefined=true;
                    break;
                }
            }
            if (matched == EnumEvalResult.TRUE)
            {
                break;
            }
        }
        return matched.getRet(type, undefined);
        return matched.getRet(type, matched == EnumEvalResult.ERR);
    }
    /**
opendj-server-legacy/src/main/java/org/opends/server/authorization/dseecompat/UserDN.java
@@ -388,20 +388,18 @@
     */
    public static EnumEvalResult evaluate(Entry e, DN clientDN,
                                           AttributeType attrType) {
        EnumEvalResult matched= EnumEvalResult.FALSE;
        List<Attribute> attrs =  e.getAttribute(attrType);
        for(ByteString v : attrs.get(0)) {
            try {
                DN dn = DN.valueOf(v.toString());
                if(dn.equals(clientDN)) {
                    matched=EnumEvalResult.TRUE;
                    break;
                    return EnumEvalResult.TRUE;
                }
            } catch (DirectoryException ex) {
                break;
            }
        }
        return matched;
        return EnumEvalResult.FALSE;
    }
    /** {@inheritDoc} */
opendj-server-legacy/src/main/java/org/opends/server/backends/BackupBackend.java
@@ -35,7 +35,14 @@
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.i18n.slf4j.LocalizedLogger;
@@ -45,6 +52,7 @@
import org.forgerock.opendj.ldap.ConditionResult;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchScope;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.BackupBackendCfg;
import org.opends.server.api.Backend;
@@ -56,8 +64,24 @@
import org.opends.server.core.SearchOperation;
import org.opends.server.core.ServerContext;
import org.opends.server.schema.GeneralizedTimeSyntax;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.*;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.Attributes;
import org.opends.server.types.BackupConfig;
import org.opends.server.types.BackupDirectory;
import org.opends.server.types.BackupInfo;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Entry;
import org.opends.server.types.IndexType;
import org.opends.server.types.InitializationException;
import org.opends.server.types.LDIFExportConfig;
import org.opends.server.types.LDIFImportConfig;
import org.opends.server.types.LDIFImportResult;
import org.opends.server.types.ObjectClass;
import org.opends.server.types.RDN;
import org.opends.server.types.RestoreConfig;
import org.opends.server.types.SearchFilter;
/**
 * This class defines a backend used to present information about Directory
@@ -397,23 +421,19 @@
      long count = 0;
      Entry backupDirEntry = getBackupDirectoryEntry(entryDN);
      AttributeType t =
          DirectoryServer.getAttributeType(ATTR_BACKUP_DIRECTORY_PATH);
      AttributeType t = DirectoryServer.getAttributeType(ATTR_BACKUP_DIRECTORY_PATH);
      List<Attribute> attrList = backupDirEntry.getAttribute(t);
      if (!attrList.isEmpty())
      for (ByteString v : attrList.get(0))
      {
        for (ByteString v : attrList.get(0))
        try
        {
          try
          {
            File dir = new File(v.toString());
            BackupDirectory backupDirectory = backupDirectories.get(dir).getBackupDirectory();
            count += backupDirectory.getBackups().keySet().size();
          }
          catch (Exception e)
          {
            return -1;
          }
          File dir = new File(v.toString());
          BackupDirectory backupDirectory = backupDirectories.get(dir).getBackupDirectory();
          count += backupDirectory.getBackups().keySet().size();
        }
        catch (Exception e)
        {
          return -1;
        }
      }
      return count;
opendj-server-legacy/src/main/java/org/opends/server/core/PasswordPolicyState.java
@@ -56,6 +56,7 @@
import org.forgerock.opendj.ldap.GeneralizedTime;
import org.forgerock.opendj.ldap.ModificationType;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.admin.std.meta.PasswordPolicyCfgDefn;
import org.opends.server.api.AccountStatusNotificationHandler;
import org.opends.server.api.AuthenticationPolicyState;
@@ -72,7 +73,6 @@
import org.opends.server.types.AccountStatusNotificationType;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.Attributes;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Entry;
@@ -2093,14 +2093,13 @@
   */
  public List<ByteString> getClearPasswords()
  {
    LinkedList<ByteString> clearPasswords = new LinkedList<>();
    final List<Attribute> attrList = userEntry.getAttribute(passwordPolicy.getPasswordAttribute());
    if (attrList.isEmpty())
    {
      return clearPasswords;
      return Collections.emptyList();
    }
    LinkedList<ByteString> clearPasswords = new LinkedList<>();
    for (Attribute a : attrList)
    {
      for (ByteString v : a)
opendj-server-legacy/src/main/java/org/opends/server/crypto/CryptoManagerSync.java
@@ -35,6 +35,7 @@
import static org.opends.server.util.ServerConstants.*;
import static org.opends.server.util.StaticUtils.*;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.LinkedHashMap;
@@ -45,6 +46,7 @@
import org.forgerock.i18n.slf4j.LocalizedLogger;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchScope;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.admin.ads.ADSContext;
import org.opends.server.api.Backend;
import org.opends.server.api.BackendInitializationListener;
@@ -60,7 +62,6 @@
import org.opends.server.protocols.internal.SearchRequest;
import org.opends.server.protocols.ldap.LDAPControl;
import org.opends.server.types.Attribute;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.Control;
import org.opends.server.types.CryptoManagerException;
import org.opends.server.types.DN;
@@ -399,18 +400,8 @@
    ocMap.put(ocInstanceKey, OC_CRYPTO_INSTANCE_KEY);
    Map<AttributeType, List<Attribute>> userAttrs = new HashMap<>();
    List<Attribute> attrList;
    attrList = srcEntry.getAttribute(attrAlias);
    if (!attrList.isEmpty())
    {
      userAttrs.put(attrAlias, attrList);
    }
    attrList = srcEntry.getAttribute(attrCert);
    if (!attrList.isEmpty())
    {
      userAttrs.put(attrCert, attrList);
    }
    putAttributeTypeIfExist(userAttrs, srcEntry, attrAlias);
    putAttributeTypeIfExist(userAttrs, srcEntry, attrCert);
    Entry addEntry = new Entry(dstDN, ocMap, userAttrs, null);
    AddOperation addOperation = getRootConnection().processAdd(addEntry);
@@ -420,6 +411,16 @@
    }
  }
  private void putAttributeTypeIfExist(Map<AttributeType, List<Attribute>> userAttrs, Entry srcEntry,
      AttributeType attrType)
  {
    List<Attribute> attrList = srcEntry.getAttribute(attrType);
    if (!attrList.isEmpty())
    {
      userAttrs.put(attrType, new ArrayList<>(attrList));
    }
  }
  @Override
  public PostResponse doPostResponse(PostResponseAddOperation op)
  {
opendj-server-legacy/src/main/java/org/opends/server/extensions/ExternalSASLMechanismHandler.java
@@ -35,6 +35,7 @@
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.server.ExternalSASLMechanismHandlerCfg;
import org.opends.server.admin.std.server.SASLMechanismHandlerCfg;
@@ -44,8 +45,12 @@
import org.opends.server.core.BindOperation;
import org.opends.server.core.DirectoryServer;
import org.opends.server.protocols.ldap.LDAPClientConnection;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.*;
import org.opends.server.types.Attribute;
import org.opends.server.types.AuthenticationInfo;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Entry;
import org.opends.server.types.InitializationException;
import static org.opends.messages.ExtensionMessages.*;
import static org.opends.server.config.ConfigConstants.*;
@@ -94,9 +99,6 @@
    super();
  }
  /** {@inheritDoc} */
  @Override
  public void initializeSASLMechanismHandler(
                   ExternalSASLMechanismHandlerCfg configuration)
@@ -107,18 +109,7 @@
    // See if we should attempt to validate client certificates against those in
    // the corresponding user's entry.
    switch (configuration.getCertificateValidationPolicy())
    {
      case NEVER:
        validationPolicy = CertificateValidationPolicy.NEVER;
        break;
      case IFPRESENT:
        validationPolicy = CertificateValidationPolicy.IFPRESENT;
        break;
      case ALWAYS:
        validationPolicy = CertificateValidationPolicy.ALWAYS;
        break;
    }
    validationPolicy = toCertificateValidationPolicy(configuration);
    // Get the attribute type to use for validating the certificates.  If none
@@ -134,9 +125,19 @@
    DirectoryServer.registerSASLMechanismHandler(SASL_MECHANISM_EXTERNAL, this);
  }
  private CertificateValidationPolicy toCertificateValidationPolicy(ExternalSASLMechanismHandlerCfg cfg)
  {
    switch (cfg.getCertificateValidationPolicy())
    {
    case NEVER:
      return CertificateValidationPolicy.NEVER;
    case IFPRESENT:
      return CertificateValidationPolicy.IFPRESENT;
    default:
      return CertificateValidationPolicy.ALWAYS;
    }
  }
  /** {@inheritDoc} */
  @Override
  public void finalizeSASLMechanismHandler()
  {
@@ -144,10 +145,6 @@
    DirectoryServer.deregisterSASLMechanismHandler(SASL_MECHANISM_EXTERNAL);
  }
  /** {@inheritDoc} */
  @Override
  public void processSASLBind(BindOperation bindOperation)
  {
@@ -240,7 +237,7 @@
          try
          {
            ByteString certBytes = ByteString.wrap(clientCertChain[0].getEncoded());
            if (!find(certAttrList, certBytes))
            if (!findAttributeValue(certAttrList, certBytes))
            {
              bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS);
@@ -269,7 +266,7 @@
          try
          {
            ByteString certBytes = ByteString.wrap(clientCertChain[0].getEncoded());
            if (!find(certAttrList, certBytes))
            if (!findAttributeValue(certAttrList, certBytes))
            {
              bindOperation.setResultCode(ResultCode.INVALID_CREDENTIALS);
@@ -299,9 +296,7 @@
    bindOperation.setResultCode(ResultCode.SUCCESS);
  }
  private boolean find(List<Attribute> certAttrList, ByteString certBytes)
  private boolean findAttributeValue(List<Attribute> certAttrList, ByteString certBytes)
  {
    for (Attribute a : certAttrList)
    {
@@ -313,9 +308,6 @@
    return false;
  }
  /** {@inheritDoc} */
  @Override
  public boolean isPasswordBased(String mechanism)
  {
@@ -323,9 +315,6 @@
    return false;
  }
  /** {@inheritDoc} */
  @Override
  public boolean isSecure(String mechanism)
  {
@@ -333,9 +322,6 @@
    return true;
  }
  /** {@inheritDoc} */
  @Override
  public boolean isConfigurationAcceptable(
                      SASLMechanismHandlerCfg configuration,
@@ -346,9 +332,7 @@
    return isConfigurationChangeAcceptable(config, unacceptableReasons);
  }
  /** {@inheritDoc} */
  @Override
  public boolean isConfigurationChangeAcceptable(
                      ExternalSASLMechanismHandlerCfg configuration,
                      List<LocalizableMessage> unacceptableReasons)
@@ -356,9 +340,7 @@
    return true;
  }
  /** {@inheritDoc} */
  @Override
  public ConfigChangeResult applyConfigurationChange(
              ExternalSASLMechanismHandlerCfg configuration)
  {
@@ -367,20 +349,7 @@
    // See if we should attempt to validate client certificates against those in
    // the corresponding user's entry.
    CertificateValidationPolicy newValidationPolicy =
         CertificateValidationPolicy.ALWAYS;
    switch (configuration.getCertificateValidationPolicy())
    {
      case NEVER:
        newValidationPolicy = CertificateValidationPolicy.NEVER;
        break;
      case IFPRESENT:
        newValidationPolicy = CertificateValidationPolicy.IFPRESENT;
        break;
      case ALWAYS:
        newValidationPolicy = CertificateValidationPolicy.ALWAYS;
        break;
    }
    CertificateValidationPolicy newValidationPolicy = toCertificateValidationPolicy(configuration);
    // Get the attribute type to use for validating the certificates.  If none
@@ -403,4 +372,3 @@
    return ccr;
  }
}
opendj-server-legacy/src/main/java/org/opends/server/plugins/PasswordPolicyImportPlugin.java
@@ -35,6 +35,7 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.forgerock.i18n.LocalizableMessage;
@@ -43,6 +44,7 @@
import org.forgerock.opendj.config.server.ConfigException;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.admin.server.ConfigurationChangeListener;
import org.opends.server.admin.std.meta.PluginCfgDefn;
import org.opends.server.admin.std.server.PasswordPolicyImportPluginCfg;
@@ -59,8 +61,13 @@
import org.opends.server.core.SubentryPasswordPolicy;
import org.opends.server.schema.AuthPasswordSyntax;
import org.opends.server.schema.UserPasswordSyntax;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.*;
import org.opends.server.types.Attribute;
import org.opends.server.types.AttributeBuilder;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Entry;
import org.opends.server.types.LDIFImportConfig;
import org.opends.server.types.SubEntry;
/**
 * This class implements a Directory Server plugin that performs various
@@ -74,37 +81,22 @@
{
  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
  /** The attribute type used to specify the password policy for an entry. */
  private AttributeType customPolicyAttribute;
  /**
   * The set of attribute types defined in the schema with the auth password
   * syntax.
   */
  /** The set of attribute types defined in the schema with the auth password syntax. */
  private AttributeType[] authPasswordTypes;
  /**
   * The set of attribute types defined in the schema with the user password
   * syntax.
   */
  /** The set of attribute types defined in the schema with the user password syntax. */
  private AttributeType[] userPasswordTypes;
  /**
   * The set of password storage schemes to use for the various password
   * policies defined in the server.
   */
  private HashMap<DN,PasswordStorageScheme<?>[]> schemesByPolicy;
  private Map<DN, PasswordStorageScheme<?>[]> schemesByPolicy;
  /** The default password storage schemes for auth password attributes. */
  private PasswordStorageScheme<?>[] defaultAuthPasswordSchemes;
  /** The default password storage schemes for user password attributes. */
  private PasswordStorageScheme<?>[] defaultUserPasswordSchemes;
  /**
   * Creates a new instance of this Directory Server plugin.  Every plugin must
   * implement a default constructor (it is the only one that will be used to
@@ -125,7 +117,6 @@
    customPolicyAttribute = DirectoryServer.getAttributeType(OP_ATTR_PWPOLICY_POLICY_DN);
    // Make sure that the plugin has been enabled for the appropriate types.
    for (PluginType t : pluginTypes)
    {
@@ -140,7 +131,6 @@
      }
    }
    // Get the set of default password storage schemes for auth password
    // attributes.
    PasswordPolicy defaultPolicy = DirectoryServer.getDefaultPasswordPolicy();
@@ -191,7 +181,6 @@
      }
    }
    // Get the set of default password storage schemes for user password
    // attributes.
    Set<DN> userSchemeDNs =
@@ -249,17 +238,16 @@
    HashSet<AttributeType> userPWTypes = new HashSet<>();
    for (AttributeType t : DirectoryServer.getAttributeTypes())
    {
      if (t.getSyntax().getOID().equals(SYNTAX_AUTH_PASSWORD_OID))
      if (SYNTAX_AUTH_PASSWORD_OID.equals(t.getSyntax().getOID()))
      {
        authPWTypes.add(t);
      }
      else if (t.getSyntax().getOID().equals(SYNTAX_USER_PASSWORD_OID))
      else if (SYNTAX_USER_PASSWORD_OID.equals(t.getSyntax().getOID()))
      {
        userPWTypes.add(t);
      }
    }
    // Get the set of password policies defined in the server and get the
    // attribute types associated with them.
    HashMap<DN,PasswordStorageScheme<?>[]> schemeMap = new HashMap<>();
@@ -277,7 +265,6 @@
      }
    }
    AttributeType[] authTypesArray = new AttributeType[authPWTypes.size()];
    AttributeType[] userTypesArray = new AttributeType[userPWTypes.size()];
    authPWTypes.toArray(authTypesArray);
@@ -398,32 +385,28 @@
                  builder.add(value);
                }
              }
              else if (!UserPasswordSyntax.isEncoded(value))
              {
                try
                {
                  for (PasswordStorageScheme<?> s : schemes)
                  {
                    builder.add(s.encodePasswordWithScheme(value));
                  }
                }
                catch (Exception e)
                {
                  logger.traceException(e);
                  logger.error(ERR_PLUGIN_PWPIMPORT_ERROR_ENCODING_PASSWORD, policy.getPasswordAttribute()
                      .getNameOrOID(), entry.getName(), stackTraceToSingleLineString(e));
                  gotError = true;
                  break;
                }
              }
              else
              {
                if (!UserPasswordSyntax.isEncoded(value))
                {
                  try
                  {
                    for (PasswordStorageScheme<?> s : schemes)
                    {
                      builder.add(s.encodePasswordWithScheme(value));
                    }
                  }
                  catch (Exception e)
                  {
                    logger.traceException(e);
                    logger.error(ERR_PLUGIN_PWPIMPORT_ERROR_ENCODING_PASSWORD,
                        policy.getPasswordAttribute().getNameOrOID(), entry.getName(),
                        stackTraceToSingleLineString(e));
                    gotError = true;
                    break;
                  }
                }
                else
                {
                  builder.add(value);
                }
                builder.add(value);
              }
            }
@@ -438,19 +421,12 @@
      }
    }
    // Iterate through the list of auth password attributes.  If any of them
    // are present and their values are not encoded, then encode them with all
    // appropriate schemes.
    for (AttributeType t : authPasswordTypes)
    {
      attrList = entry.getAttribute(t);
      if (attrList.isEmpty())
      {
        continue;
      }
      for (Attribute a : attrList)
      for (Attribute a : entry.getAttribute(t))
      {
        AttributeBuilder builder = new AttributeBuilder(a, true);
        boolean gotError = false;
@@ -488,19 +464,12 @@
      }
    }
    // Iterate through the list of user password attributes.  If any of them
    // are present and their values are not encoded, then encode them with all
    // appropriate schemes.
    for (AttributeType t : userPasswordTypes)
    {
      attrList = entry.getAttribute(t);
      if (attrList.isEmpty())
      {
        continue;
      }
      for (Attribute a : attrList)
      for (Attribute a : entry.getAttribute(t))
      {
        AttributeBuilder builder = new AttributeBuilder(a, true);
        boolean gotError = false;
@@ -538,7 +507,6 @@
      }
    }
    return PluginResult.ImportLDIF.continueEntryProcessing();
  }
@@ -567,14 +535,12 @@
          // This is the only acceptable type.
          break;
        default:
          unacceptableReasons.add(ERR_PLUGIN_PWPIMPORT_INVALID_PLUGIN_TYPE.get(pluginType));
          configAcceptable = false;
      }
    }
    // Get the set of default password storage schemes for auth password
    // attributes.
    Set<DN> authSchemeDNs =
@@ -617,7 +583,6 @@
      }
    }
    // Get the set of default password storage schemes for user password
    // attributes.
    Set<DN> userSchemeDNs =
@@ -655,7 +620,6 @@
      }
    }
    return configAcceptable;
  }
@@ -717,7 +681,6 @@
      }
    }
    // Get the set of default password storage schemes for user password
    // attributes.
    PasswordStorageScheme<?>[] defaultUserSchemes;
opendj-server-legacy/src/test/java/org/opends/server/core/AddOperationTestCase.java
@@ -35,6 +35,7 @@
import org.forgerock.i18n.LocalizableMessage;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.TestCaseUtils;
import org.opends.server.api.Backend;
import org.opends.server.plugins.DisconnectClientPlugin;
@@ -50,7 +51,6 @@
import org.opends.server.tools.LDAPReader;
import org.opends.server.tools.LDAPWriter;
import org.opends.server.types.Attribute;
import org.forgerock.opendj.ldap.schema.AttributeType;
import org.opends.server.types.Attributes;
import org.opends.server.types.CancelRequest;
import org.opends.server.types.CancelResult;
@@ -75,14 +75,11 @@
import static org.opends.server.util.CollectionUtils.*;
import static org.testng.Assert.*;
/**
 * A set of test cases for add operations.
 */
/** A set of test cases for add operations. */
@SuppressWarnings("javadoc")
public class AddOperationTestCase
       extends OperationTestCase
{
  /** Some of the tests disable the backends, so we reenable them here. */
  @AfterMethod(alwaysRun=true)
  public void reenableBackend() throws DirectoryException {
@@ -139,10 +136,6 @@
    return objArray;
  }
  /** {@inheritDoc} */
  @Override
  protected Operation[] createTestOperations() throws Exception
  {
@@ -156,8 +149,6 @@
    return ops;
  }
  /**
   * Tests the <CODE>getRawEntryDN</CODE> and <CODE>setRawEntryDN</CODE>
   * methods.
@@ -180,8 +171,6 @@
    assertEquals(addOperation.getRawEntryDN(), originalDN);
  }
  /**
   * Tests the <CODE>getEntryDN</CODE> method for the case in which we expect
   * the rawEntryDN to be decoded.
@@ -238,8 +227,6 @@
    assertNotNull(addOperation.getEntryDN());
  }
  /**
   * Tests the <CODE>getEntryDN</CODE> method for the case in which we expect
   * the DN to be initially non-null but then becomes null after the raw DN is
@@ -267,8 +254,6 @@
    assertNotNull(addOperation.getEntryDN());
  }
  /**
   * Tests the <CODE>getRawAttributes</CODE>, <CODE>addRawAttribute</CODE>, and
   * <CODE>setRawAttributes</CODE> methods.
@@ -305,8 +290,6 @@
    return false;
  }
  /**
   * Tests the <CODE>addObjectClass</CODE> method.
   *
@@ -338,8 +321,6 @@
    UpdatePreOpPlugin.reset();
  }
  /**
   * Tests the <CODE>removeObjectClass</CODE> method.
   *
@@ -372,8 +353,6 @@
    UpdatePreOpPlugin.reset();
  }
  /**
   * Tests the <CODE>setAttribute</CODE> method for an attribute that already
   * exists.
@@ -426,8 +405,6 @@
    UpdatePreOpPlugin.reset();
  }
  /**
   * Tests the <CODE>setAttribute</CODE> method for an attribute that doesn't
   * exist.
@@ -460,8 +437,6 @@
    UpdatePreOpPlugin.reset();
  }
  /**
   * Tests the <CODE>removeAttribute</CODE> method.
   *
@@ -494,8 +469,6 @@
    UpdatePreOpPlugin.reset();
  }
  /**
   * Invokes methods to retrieve members of an add operation after it has
   * completed.
@@ -511,8 +484,6 @@
    assertTrue(addOperation.getProcessingTime() >= 0);
  }
  /**
   * Tests an internal add operation that should be successful using raw
   * arguments.
@@ -555,8 +526,6 @@
    retrieveCompletedOperationElements(addOperation);
  }
  /**
   * Tests an internal add operation that fails because it contains a malformed
   * DN.
@@ -576,8 +545,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests an internal add operation that fails because it contains the DN of
   * an entry that already exists.
@@ -597,8 +564,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests an internal add operation that fails because it is a suffix that
   * doesn't exist.
@@ -618,8 +583,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests an internal add operation that fails because it is below a suffix
   * that doesn't exist.
@@ -639,8 +602,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests an internal add operation that fails because its parent does not exist.
   *
@@ -659,8 +620,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests an external add operation that fails because it contains an attribute
   * that is marked no-user-modification.
@@ -745,8 +704,6 @@
    retrieveCompletedOperationElements(addOperation);
  }
  /**
   * Tests a successful internal add operation that contains an attribute with
   * multiple values where the values are spread throughout the entry.
@@ -789,8 +746,6 @@
    assertEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests a successful internal add operation that contains raw attributes with
   * options and an attribute that doesn't have any values without options.
@@ -843,8 +798,6 @@
    retrieveCompletedOperationElements(addOperation);
  }
  /**
   * Tests an internal add operation that fails because it attempts to add the
   * root DSE.
@@ -889,8 +842,6 @@
    assertThat(attrList).isNotEmpty();
  }
  /**
   * Tests a failed internal add operation that is missing RDN attributes.
   *
@@ -914,8 +865,6 @@
    DirectoryServer.setAddMissingRDNAttributes(true);
  }
  /**
   * Tests a successful internal add operation that is missing an objectclass
   * in the hierarchical chain.
@@ -942,24 +891,24 @@
    Entry e = DirectoryServer.getEntry(DN.valueOf("uid=test.user,o=test"));
    List<Attribute> attrList = e.getAttribute(DirectoryServer.getObjectClassAttributeType());
    assertTrue(findAttributeValueIgnoreCase(attrList, "top"));
  }
    boolean found = false;
    for (Attribute a : attrList)
  private boolean findAttributeValueIgnoreCase(List<Attribute> attrs, String valueToFind)
  {
    for (Attribute a : attrs)
    {
      for (ByteString v : a)
      {
        if ("top".equalsIgnoreCase(v.toString()))
        if (valueToFind.equalsIgnoreCase(v.toString()))
        {
          found = true;
          break;
          return true;
        }
      }
    }
    assertTrue(found);
    return false;
  }
  /**
   * Tests a failed internal add operation that doesn't have any objectclasses.
   *
@@ -978,8 +927,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests a failed internal add operation that only has an abstract
   * objectclass.
@@ -1000,8 +947,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests a failed internal add operation that doesn't have any structural
   * objectclass (only abstract and auxiliary).
@@ -1023,8 +968,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests a failed internal add operation that has multiple structural
   * objectclasses.
@@ -1049,8 +992,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests a failed internal add operation that is missing a required attribute.
   *
@@ -1076,8 +1017,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests a failed internal add operation that is missing a required attribute
   * but has the extensibleObject objectClass (which shouldn't change anything).
@@ -1105,8 +1044,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests a failed internal add operation that contains an attribute not
   * allowed by any objectclass.
@@ -1135,8 +1072,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests a successful internal add operation that contains an attribute not
   * allowed by any standard objectclass in the entry but is allowed by
@@ -1168,8 +1103,6 @@
    retrieveCompletedOperationElements(addOperation);
  }
  /**
   * Tests the behavior of the server when attempting to perform an add \
   * operation with an entry containing an attribute with zero values.
@@ -1195,8 +1128,6 @@
    assertNotEquals(addOperation.getResultCode(), ResultCode.SUCCESS);
  }
  /**
   * Tests a failed internal add operation with the server in complete read-only
   * mode.
@@ -1228,8 +1159,6 @@
    DirectoryServer.setWritabilityMode(WritabilityMode.ENABLED);
  }
  /**
   * Tests a successful internal add operation with the server in read-only mode
   * for external operations but allowed for internal operations.
@@ -1262,8 +1191,6 @@
    DirectoryServer.setWritabilityMode(WritabilityMode.ENABLED);
  }
  /**
   * Tests a failed external add operation with the server in read-only mode
   * for external operations but allowed for internal operations.
@@ -1354,8 +1281,6 @@
    b.setWritabilityMode(WritabilityMode.ENABLED);
  }
  /**
   * Tests a successful internal add operation with the backend in read-only
   * mode for external operations but allowed for internal operations.
@@ -1389,8 +1314,6 @@
    b.setWritabilityMode(WritabilityMode.ENABLED);
  }
  /**
   * Tests a failed external add operation with the backend in read-only mode
   * for external operations but allowed for internal operations.
@@ -1429,8 +1352,6 @@
    b.setWritabilityMode(WritabilityMode.ENABLED);
  }
  /**
   * Tests to ensure that any registered add notification listeners are invoked
   * for a successful add operation.
@@ -1464,8 +1385,6 @@
    }
  }
  /**
   * Tests to ensure that any registered add notification listeners are not
   * invoked for a failed add operation.
@@ -1498,8 +1417,6 @@
    }
  }
  /**
   * Tests an add operation that gets canceled before startup.
   *
@@ -1561,15 +1478,13 @@
    assertEquals(cancelResult.getResultCode(), ResultCode.TOO_LATE);
  }
  /**
   * Tests an add operation in which the server cannot obtain a lock on the
   * target entry because there is already a read lock held on it.
   *
   * @throws  Exception  If an unexpected problem occurs.
   */
  @Test(groups = { "slow" })
  @Test(groups = "slow")
  public void testCannotLockEntry() throws Exception
  {
    TestCaseUtils.initializeTestBackend(true);
@@ -1592,8 +1507,6 @@
    }
  }
  /**
   * Tests an add operation that should be disconnected in a pre-parse plugin.
   *
@@ -1644,8 +1557,6 @@
    w.writeMessage(new LDAPMessage(2, addRequest, controls));
  }
  /**
   * Tests an add operation that should be disconnected in a pre-operation
   * plugin.
@@ -1813,8 +1724,6 @@
    assertFalse(LDAPModify.mainModify(args, false, null, null) == 0);
  }
  /**
   * Tests an add operation that attempts to add an entry with an operational
   * attribute marked OBSOLETE in the server schema.
@@ -1871,8 +1780,6 @@
    assertFalse(LDAPModify.mainModify(args, false, null, null) == 0);
  }
  /**
   * Tests an add operation that attempts to add an entry with an auxiliary
   * objectclass marked OBSOLETE in the server schema.
@@ -1927,8 +1834,6 @@
    assertFalse(LDAPModify.mainModify(args, false, null, null) == 0);
  }
  /**
   * Tests the behavior of the server when short-circuiting out of an add
   * operation in the pre-parse phase with a success result code.
opendj-server-legacy/src/test/java/org/opends/server/core/ModifyOperationTestCase.java
@@ -3419,15 +3419,7 @@
    List<Attribute> attrList =
         e.getAttribute(DirectoryServer.getAttributeType("userpassword"));
    String passwd = null;
    for (Attribute a : attrList)
    {
      for (ByteString v : a)
      {
        passwd = v.toString();
      }
    }
    String passwd = firstValue(attrList);
    assertNotNull(passwd);
    String path = TestCaseUtils.createTempFile(
@@ -3451,6 +3443,18 @@
    assertEquals(LDAPModify.mainModify(args, false, null, System.err), 0);
  }
  private String firstValue(List<Attribute> attrs)
  {
    for (Attribute a : attrs)
    {
      for (ByteString v : a)
      {
        return v.toString();
      }
    }
    return null;
  }
  /**
   * Tests that it is possible to delete userPassword attributes which have
   * options. Options are not allowed for passwords, but we should allow users
@@ -3485,9 +3489,9 @@
    e = DirectoryServer.getEntry(DN.valueOf("cn=Test User,o=test"));
    List<Attribute> attrList = e.getAttribute("userpassword");
    assertEquals(attrList.size(), 1);
    assertThat(attrList).hasSize(1);
    assertFalse(attrList.get(0).hasOptions());
    assertEquals(attrList.get(0).size(), 1);
    assertThat(attrList.get(0)).hasSize(1);
  }
  /**
@@ -3525,9 +3529,9 @@
    e = DirectoryServer.getEntry(DN.valueOf("cn=Test User,o=test"));
    List<Attribute> attrList = e.getAttribute("userpassword");
    assertEquals(attrList.size(), 1);
    assertThat(attrList).hasSize(1);
    assertFalse(attrList.get(0).hasOptions());
    assertEquals(attrList.get(0).size(), 1);
    assertThat(attrList.get(0)).hasSize(1);
  }
  /**
@@ -3561,9 +3565,9 @@
    Entry e = DirectoryServer.getEntry(DN.valueOf("cn=Test User,o=test"));
    List<Attribute> attrList = e.getAttribute("userpassword");
    assertEquals(attrList.size(), 1);
    assertThat(attrList).hasSize(1);
    assertFalse(attrList.get(0).hasOptions());
    assertEquals(attrList.get(0).size(), 1);
    assertThat(attrList.get(0)).hasSize(1);
  }
  /**
@@ -3597,9 +3601,9 @@
    Entry e = DirectoryServer.getEntry(DN.valueOf("cn=Test User,o=test"));
    List<Attribute> attrList = e.getAttribute("userpassword");
    assertEquals(attrList.size(), 1);
    assertThat(attrList).hasSize(1);
    assertFalse(attrList.get(0).hasOptions());
    assertEquals(attrList.get(0).size(), 1);
    assertThat(attrList.get(0)).hasSize(1);
  }
  /**
opendj-server-legacy/src/test/java/org/opends/server/plugins/SambaPasswordPluginTestCase.java
@@ -22,7 +22,7 @@
 *
 *
 *      Copyright 2011-2012 profiq s.r.o.
 *      Portions Copyright 2011-2015 ForgeRock AS.
 *      Portions Copyright 2011-2016 ForgeRock AS.
 */
package org.opends.server.plugins;
@@ -33,7 +33,6 @@
import static org.testng.Assert.*;
import java.util.LinkedList;
import java.util.List;
import org.forgerock.opendj.io.ASN1;
import org.forgerock.opendj.io.ASN1Writer;
@@ -49,9 +48,19 @@
import org.opends.server.plugins.SambaPasswordPlugin.MD4MessageDigest;
import org.opends.server.plugins.SambaPasswordPlugin.TimeStampProvider;
import org.opends.server.protocols.internal.InternalClientConnection;
import org.opends.server.types.*;
import org.opends.server.types.Attribute;
import org.opends.server.types.Attributes;
import org.opends.server.types.AuthenticationInfo;
import org.opends.server.types.DN;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Entry;
import org.opends.server.types.Modification;
import org.opends.server.util.ServerConstants;
import org.testng.annotations.*;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
 * Unit tests for the Samba password synchronization plugin.
@@ -240,29 +249,22 @@
    Entry entry = DirectoryServer.getEntry(testEntry.getName());
    assertNotNull(entry);
    List<Attribute> sambaAttribute = entry.getAttribute("sambantpassword");
    boolean foundNTPassword = false;
    for (Attribute a : sambaAttribute)
    {
      for (ByteString val : a)
      {
        foundNTPassword = true;
        assertEquals(val.toString(), ntPassword);
      }
    }
    assertTrue(foundNTPassword, "NT password not found in test entry");
    assertTrue(contains(entry, "sambantpassword", ntPassword), "NT password not found in test entry");
    assertTrue(contains(entry, "sambalmpassword", lmPassword), "LanMan password not found in test entry");
  }
    sambaAttribute = entry.getAttribute("sambalmpassword");
    boolean foundLMPassword = false;
    for (Attribute a : sambaAttribute)
  private boolean contains(Entry entry, String attrName, String password)
  {
    boolean foundPwd = false;
    for (Attribute a : entry.getAttribute(attrName))
    {
      for (ByteString val : a)
      {
        foundLMPassword = true;
        assertEquals(val.toString(), lmPassword);
        foundPwd = true;
        assertEquals(val.toString(), password);
      }
    }
    assertTrue(foundLMPassword, "LanMan password not found in test entry");
    return foundPwd;
  }
@@ -793,18 +795,7 @@
      Attribute sambaPwdLastSetAttr =
        Attributes.create("sambapwdlastset", String.valueOf(1339012789L));
      boolean attrPresent = false;
      for (Attribute attr : entry.getAttribute("sambapwdlastset"))
      {
        if (attr.equals(sambaPwdLastSetAttr))
        {
          attrPresent = true;
          break;
        }
      }
      assertTrue(attrPresent);
      assertThat(entry.getAttribute("sambapwdlastset")).contains(sambaPwdLastSetAttr);
      TestCaseUtils.deleteEntry(testEntry);
    }
    finally