summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorChaohui Wang <chaohuiw@google.com>2022-04-18 23:25:36 +0800
committerChaohui Wang <chaohuiw@google.com>2022-05-05 00:09:25 +0800
commitfabf6dcd448237487337e9cf6b784736535ffab7 (patch)
tree12131ecd96eea575a5de0a729f5378cc3b687f2c /core/java/android
parent92d87441e874b1501e4c306645de5bfdfd9ebf7f (diff)
Add validation TOO_SHORT_WHEN_ALL_NUMERIC
To distinguish the requirement between all numeric and not all numeric when COMPLEXITY_HIGH. Note: The second param of applyComplexity() changed back from withNonNumericCharacters to isPin. This was changed from isPin to withNonNumericCharacters in Change I3227d4d8e6825b5c4ea525828d7e09f52702065b without changing the caller. This currently not causing any issues because applyComplexity() only used by KeyguardManager.getMinLockLength(), which currently never be called with COMPLEXITY_HIGH. Fix: 227149118 Fix: 173167839 Test: manual & robolectric Change-Id: I7e0d4a1edf42327452b7d9a564258b26865c056e
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/app/admin/PasswordMetrics.java39
1 files changed, 21 insertions, 18 deletions
diff --git a/core/java/android/app/admin/PasswordMetrics.java b/core/java/android/app/admin/PasswordMetrics.java
index 4c1a36340d5d..ab48791d43ef 100644
--- a/core/java/android/app/admin/PasswordMetrics.java
+++ b/core/java/android/app/admin/PasswordMetrics.java
@@ -41,6 +41,7 @@ import static com.android.internal.widget.PasswordValidationError.NOT_ENOUGH_SYM
import static com.android.internal.widget.PasswordValidationError.NOT_ENOUGH_UPPER_CASE;
import static com.android.internal.widget.PasswordValidationError.TOO_LONG;
import static com.android.internal.widget.PasswordValidationError.TOO_SHORT;
+import static com.android.internal.widget.PasswordValidationError.TOO_SHORT_WHEN_ALL_NUMERIC;
import static com.android.internal.widget.PasswordValidationError.WEAK_CREDENTIAL_TYPE;
import android.annotation.IntDef;
@@ -569,21 +570,15 @@ public final class PasswordMetrics implements Parcelable {
result.add(new PasswordValidationError(TOO_LONG, MAX_PASSWORD_LENGTH));
}
- // A flag indicating whether the provided password already has non-numeric characters in
- // it or if the admin imposes the requirement of any non-numeric characters.
- final boolean hasOrWouldNeedNonNumeric =
- actualMetrics.nonNumeric > 0 || adminMetrics.nonNumeric > 0
- || adminMetrics.letters > 0 || adminMetrics.lowerCase > 0
- || adminMetrics.upperCase > 0 || adminMetrics.symbols > 0;
- final PasswordMetrics minMetrics =
- applyComplexity(adminMetrics, hasOrWouldNeedNonNumeric, bucket);
+ final PasswordMetrics minMetrics = applyComplexity(adminMetrics,
+ actualMetrics.credType == CREDENTIAL_TYPE_PIN, bucket);
// Clamp required length between maximum and minimum valid values.
minMetrics.length = Math.min(MAX_PASSWORD_LENGTH,
Math.max(minMetrics.length, MIN_LOCK_PASSWORD_SIZE));
minMetrics.removeOverlapping();
- comparePasswordMetrics(minMetrics, actualMetrics, result);
+ comparePasswordMetrics(minMetrics, bucket, actualMetrics, result);
return result;
}
@@ -591,11 +586,23 @@ public final class PasswordMetrics implements Parcelable {
/**
* TODO: move to PasswordPolicy
*/
- private static void comparePasswordMetrics(PasswordMetrics minMetrics,
+ private static void comparePasswordMetrics(PasswordMetrics minMetrics, ComplexityBucket bucket,
PasswordMetrics actualMetrics, ArrayList<PasswordValidationError> result) {
if (actualMetrics.length < minMetrics.length) {
result.add(new PasswordValidationError(TOO_SHORT, minMetrics.length));
}
+ if (actualMetrics.nonNumeric == 0 && minMetrics.nonNumeric == 0 && minMetrics.letters == 0
+ && minMetrics.lowerCase == 0 && minMetrics.upperCase == 0
+ && minMetrics.symbols == 0) {
+ // When provided password is all numeric and all numeric password is allowed.
+ int allNumericMinimumLength = bucket.getMinimumLength(false);
+ if (allNumericMinimumLength > minMetrics.length
+ && allNumericMinimumLength > minMetrics.numeric
+ && actualMetrics.length < allNumericMinimumLength) {
+ result.add(new PasswordValidationError(
+ TOO_SHORT_WHEN_ALL_NUMERIC, allNumericMinimumLength));
+ }
+ }
if (actualMetrics.letters < minMetrics.letters) {
result.add(new PasswordValidationError(NOT_ENOUGH_LETTERS, minMetrics.letters));
}
@@ -668,15 +675,12 @@ public final class PasswordMetrics implements Parcelable {
*
* TODO: move to PasswordPolicy
*/
- public static PasswordMetrics applyComplexity(
- PasswordMetrics adminMetrics, boolean withNonNumericCharacters,
+ public static PasswordMetrics applyComplexity(PasswordMetrics adminMetrics, boolean isPin,
int complexity) {
- return applyComplexity(adminMetrics, withNonNumericCharacters,
- ComplexityBucket.forComplexity(complexity));
+ return applyComplexity(adminMetrics, isPin, ComplexityBucket.forComplexity(complexity));
}
- private static PasswordMetrics applyComplexity(
- PasswordMetrics adminMetrics, boolean withNonNumericCharacters,
+ private static PasswordMetrics applyComplexity(PasswordMetrics adminMetrics, boolean isPin,
ComplexityBucket bucket) {
final PasswordMetrics minMetrics = new PasswordMetrics(adminMetrics);
@@ -684,8 +688,7 @@ public final class PasswordMetrics implements Parcelable {
minMetrics.seqLength = Math.min(minMetrics.seqLength, MAX_ALLOWED_SEQUENCE);
}
- minMetrics.length = Math.max(minMetrics.length,
- bucket.getMinimumLength(withNonNumericCharacters));
+ minMetrics.length = Math.max(minMetrics.length, bucket.getMinimumLength(!isPin));
return minMetrics;
}