diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index ed155bcb10c..45db22c66fc 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -733,18 +733,17 @@ public class ChooseLockPassword extends SettingsActivity { /** * Validates PIN/Password and returns the validation result and updates mValidationErrors - * and mPasswordReused to reflect validation results. + * to reflect validation results. * * @param credential credential the user typed in. * @return whether password satisfies all the requirements. */ @VisibleForTesting boolean validatePassword(LockscreenCredential credential) { - final byte[] password = credential.getCredential(); - mValidationErrors = PasswordMetrics.validatePassword( - mMinMetrics, mMinComplexity, !mIsAlphaMode, password); - if (mValidationErrors.isEmpty() && mLockPatternUtils.checkPasswordHistory( - password, getPasswordHistoryHashFactor(), mUserId)) { + mValidationErrors = PasswordMetrics.validateCredential(mMinMetrics, mMinComplexity, + credential); + if (mValidationErrors.isEmpty() && mLockPatternUtils.checkPasswordHistory( + credential.getCredential(), getPasswordHistoryHashFactor(), mUserId)) { mValidationErrors = Collections.singletonList(new PasswordValidationError(RECENTLY_USED)); } @@ -921,8 +920,8 @@ public class ChooseLockPassword extends SettingsActivity { final boolean canInput = mSaveAndFinishWorker == null; LockscreenCredential password = mIsAlphaMode - ? LockscreenCredential.createPasswordOrNone(mPasswordEntry.getText()) - : LockscreenCredential.createPinOrNone(mPasswordEntry.getText()); + ? LockscreenCredential.createPassword(mPasswordEntry.getText()) + : LockscreenCredential.createPin(mPasswordEntry.getText()); final int length = password.size(); if (mUiStage == Stage.Introduction) { mPasswordRestrictionView.setVisibility(View.VISIBLE); diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java index feea7680e4a..dea936d1602 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java @@ -177,6 +177,24 @@ public class ChooseLockPasswordTest { assertThat(flags & FLAG_SECURE).isEqualTo(FLAG_SECURE); } + @Test + public void processAndValidatePasswordRequirements_cannotIncludeInvalidChar() { + PasswordPolicy policy = new PasswordPolicy(); + policy.quality = PASSWORD_QUALITY_UNSPECIFIED; + // Only ASCII 31–127 should be allowed. The invalid character error should also take + // priority over the error that says the password is too short. + String[] passwords = new String[] { "§µ¿¶¥£", "™™™™", "\n\n\n\n", "¡", "é" }; + + for (String password : passwords) { + assertPasswordValidationResult( + /* minMetrics */ policy.getMinMetrics(), + /* minComplexity= */ PASSWORD_COMPLEXITY_NONE, + /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, + /* userEnteredPassword= */ LockscreenCredential.createPassword(password), + "This can't include an invalid character"); + } + } + @Test public void processAndValidatePasswordRequirements_noMinPasswordComplexity() { PasswordPolicy policy = new PasswordPolicy(); @@ -187,7 +205,7 @@ public class ChooseLockPasswordTest { /* minMetrics */ policy.getMinMetrics(), /* minComplexity= */ PASSWORD_COMPLEXITY_NONE, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, - /* userEnteredPassword= */ LockscreenCredential.createNone(), + /* userEnteredPassword= */ LockscreenCredential.createPassword(""), "Must contain at least 1 non-numerical character", "Must be at least 10 characters"); } @@ -201,7 +219,7 @@ public class ChooseLockPasswordTest { /* minMetrics */ policy.getMinMetrics(), /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* passwordType= */ PASSWORD_QUALITY_NUMERIC, - /* userEnteredPassword= */ LockscreenCredential.createNone(), + /* userEnteredPassword= */ LockscreenCredential.createPin(""), "PIN must be at least 8 digits"); } @@ -214,7 +232,7 @@ public class ChooseLockPasswordTest { /* minMetrics */ policy.getMinMetrics(), /* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, - /* userEnteredPassword= */ LockscreenCredential.createNone(), + /* userEnteredPassword= */ LockscreenCredential.createPassword(""), "Must be at least 4 characters"); } @@ -228,7 +246,7 @@ public class ChooseLockPasswordTest { /* minMetrics */ policy.getMinMetrics(), /* minComplexity= */ PASSWORD_COMPLEXITY_LOW, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, - /* userEnteredPassword= */ LockscreenCredential.createNone(), + /* userEnteredPassword= */ LockscreenCredential.createPassword(""), "Must contain at least 1 non-numerical character", "Must contain at least 1 numerical digit", "Must be at least 9 characters"); @@ -244,7 +262,7 @@ public class ChooseLockPasswordTest { /* minMetrics */ policy.getMinMetrics(), /* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM, /* passwordType= */ PASSWORD_QUALITY_NUMERIC, - /* userEnteredPassword= */ LockscreenCredential.createNone(), + /* userEnteredPassword= */ LockscreenCredential.createPin(""), "PIN must be at least 11 digits"); } @@ -258,7 +276,7 @@ public class ChooseLockPasswordTest { /* minMetrics */ policy.getMinMetrics(), /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, - /* userEnteredPassword= */ LockscreenCredential.createNone(), + /* userEnteredPassword= */ LockscreenCredential.createPassword(""), "Must contain at least 2 special symbols", "Must be at least 6 characters", "Must contain at least 1 letter", @@ -344,7 +362,7 @@ public class ChooseLockPasswordTest { /* minMetrics */ policy.getMinMetrics(), /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, - /* userEnteredPassword= */ LockscreenCredential.createNone(), + /* userEnteredPassword= */ LockscreenCredential.createPassword(""), "Must be at least 6 characters", "If using only numbers, must be at least 8 digits"); } @@ -424,7 +442,7 @@ public class ChooseLockPasswordTest { /* minMetrics */ null, /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* passwordType= */ PASSWORD_QUALITY_NUMERIC, - /* userEnteredPassword= */ LockscreenCredential.createNone(), + /* userEnteredPassword= */ LockscreenCredential.createPin(""), "PIN must be at least 8 digits"); }