| | |
| | | |
| | | import org.forgerock.i18n.LocalizableMessage; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Locale; |
| | | import java.util.Set; |
| | |
| | | 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; |
| | | } |