Loading src/com/android/settings/password/ChooseLockPassword.java +7 −8 Original line number Diff line number Diff line Loading @@ -705,18 +705,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); mValidationErrors = PasswordMetrics.validateCredential(mMinMetrics, mMinComplexity, credential); if (mValidationErrors.isEmpty() && mLockPatternUtils.checkPasswordHistory( password, getPasswordHistoryHashFactor(), mUserId)) { credential.getCredential(), getPasswordHistoryHashFactor(), mUserId)) { mValidationErrors = Collections.singletonList(new PasswordValidationError(RECENTLY_USED)); } Loading Loading @@ -893,8 +892,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); Loading tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java +26 −8 Original line number Diff line number Diff line Loading @@ -184,6 +184,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(); Loading @@ -194,7 +212,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"); } Loading @@ -208,7 +226,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"); } Loading @@ -221,7 +239,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"); } Loading @@ -235,7 +253,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"); Loading @@ -251,7 +269,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"); } Loading @@ -265,7 +283,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", Loading Loading @@ -351,7 +369,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"); } Loading Loading @@ -448,7 +466,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"); } Loading Loading
src/com/android/settings/password/ChooseLockPassword.java +7 −8 Original line number Diff line number Diff line Loading @@ -705,18 +705,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); mValidationErrors = PasswordMetrics.validateCredential(mMinMetrics, mMinComplexity, credential); if (mValidationErrors.isEmpty() && mLockPatternUtils.checkPasswordHistory( password, getPasswordHistoryHashFactor(), mUserId)) { credential.getCredential(), getPasswordHistoryHashFactor(), mUserId)) { mValidationErrors = Collections.singletonList(new PasswordValidationError(RECENTLY_USED)); } Loading Loading @@ -893,8 +892,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); Loading
tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java +26 −8 Original line number Diff line number Diff line Loading @@ -184,6 +184,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(); Loading @@ -194,7 +212,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"); } Loading @@ -208,7 +226,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"); } Loading @@ -221,7 +239,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"); } Loading @@ -235,7 +253,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"); Loading @@ -251,7 +269,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"); } Loading @@ -265,7 +283,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", Loading Loading @@ -351,7 +369,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"); } Loading Loading @@ -448,7 +466,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"); } Loading