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

copilot-swe-agent[bot]
2 days ago 364094f3d961751c5482f6ea36feff1965fee6af
perf/fix: clamp minSubstringLength≥1 and precompute lowercase strings in containsSubstring

Agent-Logs-Url: https://github.com/OpenIdentityPlatform/OpenDJ/sessions/03d57c68-16a0-43e7-8a5f-045a080213af

Co-authored-by: vharseko <6818498+vharseko@users.noreply.github.com>
1 files modified
21 ■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/extensions/AttributeValuePasswordValidator.java 21 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/extensions/AttributeValuePasswordValidator.java
@@ -19,6 +19,7 @@
import org.forgerock.i18n.LocalizableMessage;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Set;
@@ -83,16 +84,28 @@
  private boolean containsSubstring(String password, int minSubstringLength,
      Attribute a)
  {
    // Clamp to at least 1 so an empty substring never matches unconditionally.
    final int minLen = Math.max(1, minSubstringLength);
    final int passwordLength = password.length();
    // Precompute the lowercase password once to avoid repeated conversions.
    final String passwordLower = password.toLowerCase(Locale.ROOT);
    // Precompute lowercase attribute values once, outside the substring loops.
    final List<String> attrValuesLower = new ArrayList<>(a.size());
    for (ByteString val : a)
    {
      attrValuesLower.add(val.toString().toLowerCase(Locale.ROOT));
    }
    for (int i = 0; i < passwordLength; i++)
    {
      for (int j = i + minSubstringLength; j <= passwordLength; j++)
      for (int j = i + minLen; j <= passwordLength; j++)
      {
        final String pwdSubstring = password.substring(i, j).toLowerCase(Locale.ROOT);
        for (ByteString val : a)
        final String pwdSubstring = passwordLower.substring(i, j);
        for (String attrValueLower : attrValuesLower)
        {
          if (val.toString().toLowerCase(Locale.ROOT).contains(pwdSubstring))
          if (attrValueLower.contains(pwdSubstring))
          {
            return true;
          }