Merge "ChooseLockPassword: convert to use PasswordMetrics#validateCredential()" into main am: 00f5d9e7a6 am: 335752ed98 am: be262063a7

Original change: https://android-review.googlesource.com/c/platform/packages/apps/Settings/+/2776714

Change-Id: Ie1cba1fa73d9cfbf12aca28027854bf9afcfcd7f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Eric Biggers
2023-10-09 22:21:50 +00:00
committed by Automerger Merge Worker
2 changed files with 33 additions and 16 deletions

View File

@@ -705,18 +705,17 @@ public class ChooseLockPassword extends SettingsActivity {
/** /**
* Validates PIN/Password and returns the validation result and updates mValidationErrors * 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. * @param credential credential the user typed in.
* @return whether password satisfies all the requirements. * @return whether password satisfies all the requirements.
*/ */
@VisibleForTesting @VisibleForTesting
boolean validatePassword(LockscreenCredential credential) { boolean validatePassword(LockscreenCredential credential) {
final byte[] password = credential.getCredential(); mValidationErrors = PasswordMetrics.validateCredential(mMinMetrics, mMinComplexity,
mValidationErrors = PasswordMetrics.validatePassword( credential);
mMinMetrics, mMinComplexity, !mIsAlphaMode, password); if (mValidationErrors.isEmpty() && mLockPatternUtils.checkPasswordHistory(
if (mValidationErrors.isEmpty() && mLockPatternUtils.checkPasswordHistory( credential.getCredential(), getPasswordHistoryHashFactor(), mUserId)) {
password, getPasswordHistoryHashFactor(), mUserId)) {
mValidationErrors = mValidationErrors =
Collections.singletonList(new PasswordValidationError(RECENTLY_USED)); Collections.singletonList(new PasswordValidationError(RECENTLY_USED));
} }
@@ -893,8 +892,8 @@ public class ChooseLockPassword extends SettingsActivity {
final boolean canInput = mSaveAndFinishWorker == null; final boolean canInput = mSaveAndFinishWorker == null;
LockscreenCredential password = mIsAlphaMode LockscreenCredential password = mIsAlphaMode
? LockscreenCredential.createPasswordOrNone(mPasswordEntry.getText()) ? LockscreenCredential.createPassword(mPasswordEntry.getText())
: LockscreenCredential.createPinOrNone(mPasswordEntry.getText()); : LockscreenCredential.createPin(mPasswordEntry.getText());
final int length = password.size(); final int length = password.size();
if (mUiStage == Stage.Introduction) { if (mUiStage == Stage.Introduction) {
mPasswordRestrictionView.setVisibility(View.VISIBLE); mPasswordRestrictionView.setVisibility(View.VISIBLE);

View File

@@ -184,6 +184,24 @@ public class ChooseLockPasswordTest {
assertThat(flags & FLAG_SECURE).isEqualTo(FLAG_SECURE); assertThat(flags & FLAG_SECURE).isEqualTo(FLAG_SECURE);
} }
@Test
public void processAndValidatePasswordRequirements_cannotIncludeInvalidChar() {
PasswordPolicy policy = new PasswordPolicy();
policy.quality = PASSWORD_QUALITY_UNSPECIFIED;
// Only ASCII 31127 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 @Test
public void processAndValidatePasswordRequirements_noMinPasswordComplexity() { public void processAndValidatePasswordRequirements_noMinPasswordComplexity() {
PasswordPolicy policy = new PasswordPolicy(); PasswordPolicy policy = new PasswordPolicy();
@@ -194,7 +212,7 @@ public class ChooseLockPasswordTest {
/* minMetrics */ policy.getMinMetrics(), /* minMetrics */ policy.getMinMetrics(),
/* minComplexity= */ PASSWORD_COMPLEXITY_NONE, /* minComplexity= */ PASSWORD_COMPLEXITY_NONE,
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
/* userEnteredPassword= */ LockscreenCredential.createNone(), /* userEnteredPassword= */ LockscreenCredential.createPassword(""),
"Must contain at least 1 non-numerical character", "Must contain at least 1 non-numerical character",
"Must be at least 10 characters"); "Must be at least 10 characters");
} }
@@ -208,7 +226,7 @@ public class ChooseLockPasswordTest {
/* minMetrics */ policy.getMinMetrics(), /* minMetrics */ policy.getMinMetrics(),
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
/* passwordType= */ PASSWORD_QUALITY_NUMERIC, /* passwordType= */ PASSWORD_QUALITY_NUMERIC,
/* userEnteredPassword= */ LockscreenCredential.createNone(), /* userEnteredPassword= */ LockscreenCredential.createPin(""),
"PIN must be at least 8 digits"); "PIN must be at least 8 digits");
} }
@@ -221,7 +239,7 @@ public class ChooseLockPasswordTest {
/* minMetrics */ policy.getMinMetrics(), /* minMetrics */ policy.getMinMetrics(),
/* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM, /* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM,
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
/* userEnteredPassword= */ LockscreenCredential.createNone(), /* userEnteredPassword= */ LockscreenCredential.createPassword(""),
"Must be at least 4 characters"); "Must be at least 4 characters");
} }
@@ -235,7 +253,7 @@ public class ChooseLockPasswordTest {
/* minMetrics */ policy.getMinMetrics(), /* minMetrics */ policy.getMinMetrics(),
/* minComplexity= */ PASSWORD_COMPLEXITY_LOW, /* minComplexity= */ PASSWORD_COMPLEXITY_LOW,
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
/* userEnteredPassword= */ LockscreenCredential.createNone(), /* userEnteredPassword= */ LockscreenCredential.createPassword(""),
"Must contain at least 1 non-numerical character", "Must contain at least 1 non-numerical character",
"Must contain at least 1 numerical digit", "Must contain at least 1 numerical digit",
"Must be at least 9 characters"); "Must be at least 9 characters");
@@ -251,7 +269,7 @@ public class ChooseLockPasswordTest {
/* minMetrics */ policy.getMinMetrics(), /* minMetrics */ policy.getMinMetrics(),
/* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM, /* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM,
/* passwordType= */ PASSWORD_QUALITY_NUMERIC, /* passwordType= */ PASSWORD_QUALITY_NUMERIC,
/* userEnteredPassword= */ LockscreenCredential.createNone(), /* userEnteredPassword= */ LockscreenCredential.createPin(""),
"PIN must be at least 11 digits"); "PIN must be at least 11 digits");
} }
@@ -265,7 +283,7 @@ public class ChooseLockPasswordTest {
/* minMetrics */ policy.getMinMetrics(), /* minMetrics */ policy.getMinMetrics(),
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
/* userEnteredPassword= */ LockscreenCredential.createNone(), /* userEnteredPassword= */ LockscreenCredential.createPassword(""),
"Must contain at least 2 special symbols", "Must contain at least 2 special symbols",
"Must be at least 6 characters", "Must be at least 6 characters",
"Must contain at least 1 letter", "Must contain at least 1 letter",
@@ -351,7 +369,7 @@ public class ChooseLockPasswordTest {
/* minMetrics */ policy.getMinMetrics(), /* minMetrics */ policy.getMinMetrics(),
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
/* userEnteredPassword= */ LockscreenCredential.createNone(), /* userEnteredPassword= */ LockscreenCredential.createPassword(""),
"Must be at least 6 characters", "Must be at least 6 characters",
"If using only numbers, must be at least 8 digits"); "If using only numbers, must be at least 8 digits");
} }
@@ -448,7 +466,7 @@ public class ChooseLockPasswordTest {
/* minMetrics */ null, /* minMetrics */ null,
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
/* passwordType= */ PASSWORD_QUALITY_NUMERIC, /* passwordType= */ PASSWORD_QUALITY_NUMERIC,
/* userEnteredPassword= */ LockscreenCredential.createNone(), /* userEnteredPassword= */ LockscreenCredential.createPin(""),
"PIN must be at least 8 digits"); "PIN must be at least 8 digits");
} }