Merge "Do not suppress severe exception when password change fails"

This commit is contained in:
Rubin Xu
2019-09-05 09:45:54 +00:00
committed by Android (Google) Code Review
4 changed files with 140 additions and 99 deletions

View File

@@ -42,7 +42,7 @@ interface ILockSettings {
long getLong(in String key, in long defaultValue, in int userId);
@UnsupportedAppUsage
String getString(in String key, in String defaultValue, in int userId);
void setLockCredential(in byte[] credential, int type, in byte[] savedCredential, int requestedQuality, int userId, boolean allowUntrustedChange);
boolean setLockCredential(in byte[] credential, int type, in byte[] savedCredential, int requestedQuality, int userId, boolean allowUntrustedChange);
void resetKeyStore(int userId);
VerifyCredentialResponse checkCredential(in byte[] credential, int type, int userId,
in ICheckCredentialProgressCallback progressCallback);

View File

@@ -680,6 +680,15 @@ public class LockPatternUtils {
/**
* Clear any lock pattern or password.
* <p> This method will fail (returning {@code false}) if the previously
* saved password provided is incorrect, or if the lockscreen verification
* is still being throttled.
*
* @param savedCredential The previously saved credential
* @param userHandle the user whose pattern is to be saved.
* @return whether this was successful or not.
* @throws RuntimeException if password change encountered an unrecoverable error.
*/
public boolean clearLock(byte[] savedCredential, int userHandle) {
return clearLock(savedCredential, userHandle, false);
@@ -687,19 +696,27 @@ public class LockPatternUtils {
/**
* Clear any lock pattern or password, with the option to ignore incorrect existing credential.
* <p> This method will fail (returning {@code false}) if the previously
* saved password provided is incorrect, or if the lockscreen verification
* is still being throttled.
*
* @param savedCredential The previously saved credential
* @param userHandle the user whose pattern is to be saved.
* @return whether this was successful or not.
* @throws RuntimeException if password change encountered an unrecoverable error.
*/
public boolean clearLock(byte[] savedCredential, int userHandle, boolean allowUntrustedChange) {
final int currentQuality = getKeyguardStoredPasswordQuality(userHandle);
setKeyguardStoredPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED, userHandle);
try{
getLockSettings().setLockCredential(null, CREDENTIAL_TYPE_NONE,
savedCredential, PASSWORD_QUALITY_UNSPECIFIED, userHandle,
allowUntrustedChange);
} catch (Exception e) {
Log.e(TAG, "Failed to clear lock", e);
try {
if (!getLockSettings().setLockCredential(null, CREDENTIAL_TYPE_NONE, savedCredential,
PASSWORD_QUALITY_UNSPECIFIED, userHandle, allowUntrustedChange)) {
return false;
}
} catch (RemoteException | RuntimeException e) {
setKeyguardStoredPasswordQuality(currentQuality, userHandle);
return false;
throw new RuntimeException("Failed to clear lock", e);
}
if (userHandle == UserHandle.USER_SYSTEM) {
@@ -747,11 +764,15 @@ public class LockPatternUtils {
/**
* Save a lock pattern.
*
* <p> This method will fail (returning {@code false}) if the previously saved pattern provided
* is incorrect, or if the lockscreen verification is still being throttled.
*
* @param pattern The new pattern to save.
* @param savedPattern The previously saved pattern, converted to byte[] format
* @param userId the user whose pattern is to be saved.
*
* @return whether this was successful or not.
* @throws RuntimeException if password change encountered an unrecoverable error.
*/
public boolean saveLockPattern(List<LockPatternView.Cell> pattern, byte[] savedPattern,
int userId) {
@@ -760,13 +781,17 @@ public class LockPatternUtils {
/**
* Save a lock pattern.
*
* <p> This method will fail (returning {@code false}) if the previously saved pattern provided
* is incorrect, or if the lockscreen verification is still being throttled.
*
* @param pattern The new pattern to save.
* @param savedPattern The previously saved pattern, converted to byte[] format
* @param userId the user whose pattern is to be saved.
* @param allowUntrustedChange whether we want to allow saving a new password if the existing
* password being provided is incorrect.
*
* @return whether this was successful or not.
* @throws RuntimeException if password change encountered an unrecoverable error.
*/
public boolean saveLockPattern(List<LockPatternView.Cell> pattern, byte[] savedPattern,
int userId, boolean allowUntrustedChange) {
@@ -783,12 +808,13 @@ public class LockPatternUtils {
final int currentQuality = getKeyguardStoredPasswordQuality(userId);
setKeyguardStoredPasswordQuality(PASSWORD_QUALITY_SOMETHING, userId);
try {
getLockSettings().setLockCredential(bytePattern, CREDENTIAL_TYPE_PATTERN, savedPattern,
PASSWORD_QUALITY_SOMETHING, userId, allowUntrustedChange);
} catch (Exception e) {
Log.e(TAG, "Couldn't save lock pattern", e);
if (!getLockSettings().setLockCredential(bytePattern, CREDENTIAL_TYPE_PATTERN,
savedPattern, PASSWORD_QUALITY_SOMETHING, userId, allowUntrustedChange)) {
return false;
}
} catch (RemoteException | RuntimeException e) {
setKeyguardStoredPasswordQuality(currentQuality, userId);
return false;
throw new RuntimeException("Couldn't save lock pattern", e);
}
// Update the device encryption password.
if (userId == UserHandle.USER_SYSTEM
@@ -906,14 +932,18 @@ public class LockPatternUtils {
* Save a lock password. Does not ensure that the password is as good
* as the requested mode, but will adjust the mode to be as good as the
* password.
*
* <p> This method will fail (returning {@code false}) if the previously
* saved password provided is incorrect, or if the lockscreen verification
* is still being throttled.
*
* @param password The password to save
* @param savedPassword The previously saved lock password, or null if none
* @param requestedQuality {@see DevicePolicyManager#getPasswordQuality(
* android.content.ComponentName)}
* @param userHandle The userId of the user to change the password for
*
* @return whether this was successful or not.
*
* @throws RuntimeException if password change encountered an unrecoverable error.
* @deprecated Pass password as a byte array
*/
@Deprecated
@@ -928,13 +958,18 @@ public class LockPatternUtils {
* Save a lock password. Does not ensure that the password is as good
* as the requested mode, but will adjust the mode to be as good as the
* password.
*
* <p> This method will fail (returning {@code false}) if the previously
* saved password provided is incorrect, or if the lockscreen verification
* is still being throttled.
*
* @param password The password to save
* @param savedPassword The previously saved lock password, or null if none
* @param requestedQuality {@see DevicePolicyManager#getPasswordQuality(
* android.content.ComponentName)}
* @param userHandle The userId of the user to change the password for
*
* @return whether this was successful or not.
* @throws RuntimeException if password change encountered an unrecoverable error.
*/
public boolean saveLockPassword(byte[] password, byte[] savedPassword, int requestedQuality,
int userHandle) {
@@ -946,6 +981,11 @@ public class LockPatternUtils {
* Save a lock password. Does not ensure that the password is as good
* as the requested mode, but will adjust the mode to be as good as the
* password.
*
* <p> This method will fail (returning {@code false}) if the previously
* saved password provided is incorrect, or if the lockscreen verification
* is still being throttled.
*
* @param password The password to save
* @param savedPassword The previously saved lock password, or null if none
* @param requestedQuality {@see DevicePolicyManager#getPasswordQuality(
@@ -953,9 +993,9 @@ public class LockPatternUtils {
* @param userHandle The userId of the user to change the password for
* @param allowUntrustedChange whether we want to allow saving a new password if the existing
* password being provided is incorrect.
*
* @return whether this method saved the new password successfully or not. This flow will fail
* and return false if the given credential is wrong and allowUntrustedChange is false.
* @throws RuntimeException if password change encountered an unrecoverable error.
*/
public boolean saveLockPassword(byte[] password, byte[] savedPassword,
int requestedQuality, int userHandle, boolean allowUntrustedChange) {
@@ -981,10 +1021,9 @@ public class LockPatternUtils {
try {
getLockSettings().setLockCredential(password, CREDENTIAL_TYPE_PASSWORD, savedPassword,
requestedQuality, userHandle, allowUntrustedChange);
} catch (Exception e) {
Log.e(TAG, "Unable to save lock password", e);
} catch (RemoteException | RuntimeException e) {
setKeyguardStoredPasswordQuality(currentQuality, userHandle);
return false;
throw new RuntimeException("Unable to save lock password", e);
}
updateEncryptionPasswordIfNeeded(password, passwordQuality, userHandle);

View File

@@ -1461,7 +1461,7 @@ public class LockSettingsService extends ILockSettings.Stub {
// This method should be called by LockPatternUtil only, all internal methods in this class
// should call setLockCredentialInternal.
@Override
public void setLockCredential(byte[] credential, int type,
public boolean setLockCredential(byte[] credential, int type,
byte[] savedCredential, int requestedQuality, int userId,
boolean allowUntrustedChange) {
@@ -1471,8 +1471,10 @@ public class LockSettingsService extends ILockSettings.Stub {
}
checkWritePermission(userId);
synchronized (mSeparateChallengeLock) {
setLockCredentialInternal(credential, type, savedCredential, requestedQuality, userId,
allowUntrustedChange, /* isLockTiedToParent= */ false);
if (!setLockCredentialInternal(credential, type, savedCredential, requestedQuality,
userId, allowUntrustedChange, /* isLockTiedToParent= */ false)) {
return false;
}
setSeparateProfileChallengeEnabledLocked(userId, true, null);
notifyPasswordChanged(userId);
}
@@ -1481,13 +1483,14 @@ public class LockSettingsService extends ILockSettings.Stub {
setDeviceUnlockedForUser(userId);
}
notifySeparateProfileChallengeChanged(userId);
return true;
}
/**
* @param isLockTiedToParent is {@code true} if {@code userId} is a profile and its new
* credentials are being tied to its parent's credentials.
*/
private void setLockCredentialInternal(byte[] credential, @CredentialType int credentialType,
private boolean setLockCredentialInternal(byte[] credential, @CredentialType int credentialType,
byte[] savedCredential, int requestedQuality, int userId, boolean allowUntrustedChange,
boolean isLockTiedToParent) {
// Normalize savedCredential and credential such that empty string is always represented
@@ -1500,9 +1503,9 @@ public class LockSettingsService extends ILockSettings.Stub {
}
synchronized (mSpManager) {
if (isSyntheticPasswordBasedCredentialLocked(userId)) {
spBasedSetLockCredentialInternalLocked(credential, credentialType, savedCredential,
requestedQuality, userId, allowUntrustedChange, isLockTiedToParent);
return;
return spBasedSetLockCredentialInternalLocked(credential, credentialType,
savedCredential, requestedQuality, userId, allowUntrustedChange,
isLockTiedToParent);
}
}
@@ -1519,7 +1522,7 @@ public class LockSettingsService extends ILockSettings.Stub {
setUserPasswordMetrics(CREDENTIAL_TYPE_NONE, null, userId);
sendCredentialsOnChangeIfRequired(
credentialType, credential, userId, isLockTiedToParent);
return;
return true;
}
if (credential == null) {
throw new IllegalArgumentException("Null credential with mismatched credential type");
@@ -1552,37 +1555,38 @@ public class LockSettingsService extends ILockSettings.Stub {
if (shouldMigrateToSyntheticPasswordLocked(userId)) {
initializeSyntheticPasswordLocked(currentHandle.hash, savedCredential,
currentHandle.type, requestedQuality, userId);
spBasedSetLockCredentialInternalLocked(credential, credentialType, savedCredential,
requestedQuality, userId, allowUntrustedChange, isLockTiedToParent);
return;
return spBasedSetLockCredentialInternalLocked(credential, credentialType,
savedCredential, requestedQuality, userId, allowUntrustedChange,
isLockTiedToParent);
}
}
if (DEBUG) Slog.d(TAG, "setLockCredentialInternal: user=" + userId);
byte[] enrolledHandle = enrollCredential(currentHandle.hash, savedCredential, credential,
userId);
if (enrolledHandle != null) {
CredentialHash willStore = CredentialHash.create(enrolledHandle, credentialType);
mStorage.writeCredentialHash(willStore, userId);
// push new secret and auth token to vold
GateKeeperResponse gkResponse;
try {
gkResponse = getGateKeeperService().verifyChallenge(userId, 0, willStore.hash,
credential);
} catch (RemoteException e) {
throw new IllegalStateException("Failed to verify current credential", e);
}
setUserKeyProtection(userId, credential, convertResponse(gkResponse));
fixateNewestUserKeyAuth(userId);
// Refresh the auth token
doVerifyCredential(credential, credentialType, CHALLENGE_FROM_CALLER, 0, userId,
null /* progressCallback */);
synchronizeUnifiedWorkChallengeForProfiles(userId, null);
sendCredentialsOnChangeIfRequired(
credentialType, credential, userId, isLockTiedToParent);
} else {
throw new IllegalStateException(String.format("Failed to enroll %s",
if (enrolledHandle == null) {
Slog.w(TAG, String.format("Failed to enroll %s: incorrect credential",
credentialType == CREDENTIAL_TYPE_PASSWORD ? "password" : "pattern"));
return false;
}
CredentialHash willStore = CredentialHash.create(enrolledHandle, credentialType);
mStorage.writeCredentialHash(willStore, userId);
// push new secret and auth token to vold
GateKeeperResponse gkResponse;
try {
gkResponse = getGateKeeperService().verifyChallenge(userId, 0, willStore.hash,
credential);
} catch (RemoteException e) {
throw new IllegalStateException("Failed to verify current credential", e);
}
setUserKeyProtection(userId, credential, convertResponse(gkResponse));
fixateNewestUserKeyAuth(userId);
// Refresh the auth token
doVerifyCredential(credential, credentialType, CHALLENGE_FROM_CALLER, 0, userId,
null /* progressCallback */);
synchronizeUnifiedWorkChallengeForProfiles(userId, null);
sendCredentialsOnChangeIfRequired(
credentialType, credential, userId, isLockTiedToParent);
return true;
}
private VerifyCredentialResponse convertResponse(GateKeeperResponse gateKeeperResponse) {
@@ -2711,7 +2715,7 @@ public class LockSettingsService extends ILockSettings.Stub {
}
@GuardedBy("mSpManager")
private void spBasedSetLockCredentialInternalLocked(byte[] credential, int credentialType,
private boolean spBasedSetLockCredentialInternalLocked(byte[] credential, int credentialType,
byte[] savedCredential, int requestedQuality, int userId,
boolean allowUntrustedChange, boolean isLockTiedToParent) {
if (DEBUG) Slog.d(TAG, "spBasedSetLockCredentialInternalLocked: user=" + userId);
@@ -2736,8 +2740,9 @@ public class LockSettingsService extends ILockSettings.Stub {
// If existing credential is provided, the existing credential must match.
if (savedCredential != null && auth == null) {
throw new IllegalStateException(String.format("Failed to enroll %s",
Slog.w(TAG, String.format("Failed to enroll %s: incorrect credential",
credentialType == CREDENTIAL_TYPE_PASSWORD ? "password" : "pattern"));
return false;
}
boolean untrustedReset = false;
if (auth != null) {
@@ -2757,7 +2762,8 @@ public class LockSettingsService extends ILockSettings.Stub {
}
untrustedReset = true;
} else /* responseCode == VerifyCredentialResponse.RESPONSE_RETRY */ {
throw new IllegalStateException("Rate limit exceeded, so password was not changed.");
Slog.w(TAG, "Rate limit exceeded, so password was not changed.");
return false;
}
if (auth != null) {
@@ -2779,6 +2785,7 @@ public class LockSettingsService extends ILockSettings.Stub {
// synthetic password. That would invalidate existing escrow tokens though.
}
sendCredentialsOnChangeIfRequired(credentialType, credential, userId, isLockTiedToParent);
return true;
}
/**

View File

@@ -92,24 +92,18 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
public void testChangePasswordFailPrimaryUser() throws RemoteException {
final long sid = 1234;
final String FAILED_MESSAGE = "Failed to enroll password";
initializeStorageWithCredential(PRIMARY_USER_ID, "password", CREDENTIAL_TYPE_PASSWORD, sid);
try {
mService.setLockCredential("newpwd".getBytes(), CREDENTIAL_TYPE_PASSWORD,
"badpwd".getBytes(), PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID, false);
fail("Did not fail when enrolling using incorrect credential");
} catch (IllegalStateException expected) {
assertTrue(expected.getMessage().equals(FAILED_MESSAGE));
}
assertFalse(mService.setLockCredential("newpwd".getBytes(), CREDENTIAL_TYPE_PASSWORD,
"badpwd".getBytes(), PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID, false));
assertVerifyCredentials(PRIMARY_USER_ID, "password", CREDENTIAL_TYPE_PASSWORD, sid);
}
public void testClearPasswordPrimaryUser() throws RemoteException {
final String PASSWORD = "password";
initializeStorageWithCredential(PRIMARY_USER_ID, PASSWORD, CREDENTIAL_TYPE_PASSWORD, 1234);
mService.setLockCredential(null, CREDENTIAL_TYPE_NONE, PASSWORD.getBytes(),
PASSWORD_QUALITY_UNSPECIFIED, PRIMARY_USER_ID, false);
assertTrue(mService.setLockCredential(null, CREDENTIAL_TYPE_NONE, PASSWORD.getBytes(),
PASSWORD_QUALITY_UNSPECIFIED, PRIMARY_USER_ID, false));
assertFalse(mService.havePassword(PRIMARY_USER_ID));
assertFalse(mService.havePattern(PRIMARY_USER_ID));
assertEquals(0, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
@@ -118,9 +112,9 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
public void testManagedProfileUnifiedChallenge() throws RemoteException {
final String firstUnifiedPassword = "testManagedProfileUnifiedChallenge-pwd-1";
final String secondUnifiedPassword = "testManagedProfileUnifiedChallenge-pwd-2";
mService.setLockCredential(firstUnifiedPassword.getBytes(),
assertTrue(mService.setLockCredential(firstUnifiedPassword.getBytes(),
LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
null, PASSWORD_QUALITY_COMPLEX, PRIMARY_USER_ID, false);
null, PASSWORD_QUALITY_COMPLEX, PRIMARY_USER_ID, false));
mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
final long primarySid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
final long profileSid = mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID);
@@ -154,17 +148,17 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
*/
mStorageManager.setIgnoreBadUnlock(true);
// Change primary password and verify that profile SID remains
mService.setLockCredential(secondUnifiedPassword.getBytes(),
assertTrue(mService.setLockCredential(secondUnifiedPassword.getBytes(),
LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, firstUnifiedPassword.getBytes(),
PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID, false);
PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID, false));
mStorageManager.setIgnoreBadUnlock(false);
assertEquals(profileSid, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
assertNull(mGateKeeperService.getAuthToken(TURNED_OFF_PROFILE_USER_ID));
// Clear unified challenge
mService.setLockCredential(null, LockPatternUtils.CREDENTIAL_TYPE_NONE,
assertTrue(mService.setLockCredential(null, LockPatternUtils.CREDENTIAL_TYPE_NONE,
secondUnifiedPassword.getBytes(), PASSWORD_QUALITY_UNSPECIFIED, PRIMARY_USER_ID,
false);
false));
assertEquals(0, mGateKeeperService.getSecureUserId(PRIMARY_USER_ID));
assertEquals(0, mGateKeeperService.getSecureUserId(MANAGED_PROFILE_USER_ID));
assertEquals(0, mGateKeeperService.getSecureUserId(TURNED_OFF_PROFILE_USER_ID));
@@ -173,17 +167,17 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
public void testManagedProfileSeparateChallenge() throws RemoteException {
final String primaryPassword = "testManagedProfileSeparateChallenge-primary";
final String profilePassword = "testManagedProfileSeparateChallenge-profile";
mService.setLockCredential(primaryPassword.getBytes(),
assertTrue(mService.setLockCredential(primaryPassword.getBytes(),
LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null,
PASSWORD_QUALITY_COMPLEX, PRIMARY_USER_ID, false);
PASSWORD_QUALITY_COMPLEX, PRIMARY_USER_ID, false));
/* Currently in LockSettingsService.setLockCredential, unlockUser() is called with the new
* credential as part of verifyCredential() before the new credential is committed in
* StorageManager. So we relax the check in our mock StorageManager to allow that.
*/
mStorageManager.setIgnoreBadUnlock(true);
mService.setLockCredential(profilePassword.getBytes(),
assertTrue(mService.setLockCredential(profilePassword.getBytes(),
LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, null,
PASSWORD_QUALITY_COMPLEX, MANAGED_PROFILE_USER_ID, false);
PASSWORD_QUALITY_COMPLEX, MANAGED_PROFILE_USER_ID, false));
mStorageManager.setIgnoreBadUnlock(false);
final long primarySid = mGateKeeperService.getSecureUserId(PRIMARY_USER_ID);
@@ -209,8 +203,9 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
// Change primary credential and make sure we don't affect profile
mStorageManager.setIgnoreBadUnlock(true);
mService.setLockCredential("pwd".getBytes(), LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
primaryPassword.getBytes(), PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID, false);
assertTrue(mService.setLockCredential("pwd".getBytes(),
LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
primaryPassword.getBytes(), PASSWORD_QUALITY_ALPHABETIC, PRIMARY_USER_ID, false));
mStorageManager.setIgnoreBadUnlock(false);
assertEquals(VerifyCredentialResponse.RESPONSE_OK, mService.verifyCredential(
profilePassword.getBytes(), LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, 0,
@@ -221,13 +216,13 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
public void testSetLockCredential_forPrimaryUser_sendsCredentials() throws Exception {
final byte[] password = "password".getBytes();
mService.setLockCredential(
assertTrue(mService.setLockCredential(
password,
CREDENTIAL_TYPE_PASSWORD,
null,
PASSWORD_QUALITY_ALPHABETIC,
PRIMARY_USER_ID,
false);
false));
verify(mRecoverableKeyStoreManager)
.lockScreenSecretChanged(CREDENTIAL_TYPE_PASSWORD, password, PRIMARY_USER_ID);
@@ -237,13 +232,13 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
throws Exception {
final byte[] pattern = "12345".getBytes();
mService.setLockCredential(
assertTrue(mService.setLockCredential(
pattern,
CREDENTIAL_TYPE_PATTERN,
null,
PASSWORD_QUALITY_SOMETHING,
MANAGED_PROFILE_USER_ID,
false);
false));
verify(mRecoverableKeyStoreManager)
.lockScreenSecretChanged(CREDENTIAL_TYPE_PATTERN, pattern, MANAGED_PROFILE_USER_ID);
@@ -259,13 +254,13 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
CREDENTIAL_TYPE_PATTERN,
PASSWORD_QUALITY_SOMETHING);
mService.setLockCredential(
assertTrue(mService.setLockCredential(
newCredential,
CREDENTIAL_TYPE_PASSWORD,
oldCredential.getBytes(),
PASSWORD_QUALITY_ALPHABETIC,
MANAGED_PROFILE_USER_ID,
false);
false));
verify(mRecoverableKeyStoreManager)
.lockScreenSecretChanged(
@@ -276,13 +271,13 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
throws Exception {
mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
mService.setLockCredential(
assertTrue(mService.setLockCredential(
"12345".getBytes(),
CREDENTIAL_TYPE_PATTERN,
null,
PASSWORD_QUALITY_SOMETHING,
PRIMARY_USER_ID,
false);
false));
verify(mRecoverableKeyStoreManager, never())
.lockScreenSecretChanged(
@@ -298,13 +293,13 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
PRIMARY_USER_ID, oldCredential, CREDENTIAL_TYPE_PASSWORD, 1234);
mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
mService.setLockCredential(
assertTrue(mService.setLockCredential(
newCredential,
CREDENTIAL_TYPE_PASSWORD,
oldCredential.getBytes(),
PASSWORD_QUALITY_ALPHABETIC,
PRIMARY_USER_ID,
false);
false));
verify(mRecoverableKeyStoreManager)
.lockScreenSecretChanged(CREDENTIAL_TYPE_PASSWORD, newCredential, PRIMARY_USER_ID);
@@ -321,13 +316,13 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
PRIMARY_USER_ID, oldCredential, CREDENTIAL_TYPE_PASSWORD, 1234);
mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
mService.setLockCredential(
assertTrue(mService.setLockCredential(
null,
CREDENTIAL_TYPE_NONE,
oldCredential.getBytes(),
PASSWORD_QUALITY_UNSPECIFIED,
PRIMARY_USER_ID,
false);
false));
verify(mRecoverableKeyStoreManager)
.lockScreenSecretChanged(CREDENTIAL_TYPE_NONE, null, PRIMARY_USER_ID);
@@ -343,13 +338,13 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
PRIMARY_USER_ID, parentPassword, CREDENTIAL_TYPE_PASSWORD, 1234);
mService.setSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID, false, null);
mService.setLockCredential(
assertTrue(mService.setLockCredential(
profilePassword,
CREDENTIAL_TYPE_PASSWORD,
null,
PASSWORD_QUALITY_ALPHABETIC,
MANAGED_PROFILE_USER_ID,
false);
false));
verify(mRecoverableKeyStoreManager)
.lockScreenSecretChanged(
@@ -395,13 +390,13 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
public void testVerifyCredential_forProfileWithSeparateChallenge_sendsCredentials()
throws Exception {
final byte[] pattern = "12345".getBytes();
mService.setLockCredential(
assertTrue(mService.setLockCredential(
pattern,
CREDENTIAL_TYPE_PATTERN,
null,
PASSWORD_QUALITY_SOMETHING,
MANAGED_PROFILE_USER_ID,
false);
false));
reset(mRecoverableKeyStoreManager);
mService.verifyCredential(pattern, CREDENTIAL_TYPE_PATTERN, 1, MANAGED_PROFILE_USER_ID);
@@ -436,8 +431,8 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
private void testCreateCredential(int userId, String credential, int type, int quality)
throws RemoteException {
mService.setLockCredential(credential.getBytes(), type, null, quality,
userId, false);
assertTrue(mService.setLockCredential(credential.getBytes(), type, null, quality,
userId, false));
assertVerifyCredentials(userId, credential, type, -1);
}
@@ -461,8 +456,8 @@ public class LockSettingsServiceTests extends BaseLockSettingsServiceTests {
String oldCredential, int oldType, int quality) throws RemoteException {
final long sid = 1234;
initializeStorageWithCredential(userId, oldCredential, oldType, sid);
mService.setLockCredential(newCredential.getBytes(), newType, oldCredential.getBytes(),
quality, userId, false);
assertTrue(mService.setLockCredential(newCredential.getBytes(), newType,
oldCredential.getBytes(), quality, userId, false));
assertVerifyCredentials(userId, newCredential, newType, sid);
}