Merge "Do not suppress severe exception when password change fails"
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user