diff options
| author | Chaohui Wang <chaohuiw@google.com> | 2022-04-18 23:25:36 +0800 |
|---|---|---|
| committer | Chaohui Wang <chaohuiw@google.com> | 2022-05-05 00:09:25 +0800 |
| commit | fabf6dcd448237487337e9cf6b784736535ffab7 (patch) | |
| tree | 12131ecd96eea575a5de0a729f5378cc3b687f2c /core/java/android | |
| parent | 92d87441e874b1501e4c306645de5bfdfd9ebf7f (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.java | 39 |
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; } |
