StrongAuthTracker: Don't rely on USER_PRESENT

USER_PRESENT is sent via the background queue. A delay
there can cause us not to recognize that the user has
unlocked and prompt for the credential again, when trust
or fingerprint would be sufficient.

Also removes an obsolete reference to USER_PRESENT from
TrustManagerService.

Change-Id: Ie8d1a180170df5f0c8f9e71660504fd71eeacd99
Fixes: 27830458
This commit is contained in:
Adrian Roos
2016-04-13 15:38:13 -07:00
parent 250c617d13
commit 4ab7e595a5
5 changed files with 18 additions and 5 deletions

View File

@@ -43,4 +43,5 @@ interface ILockSettings {
void unregisterStrongAuthTracker(in IStrongAuthTracker tracker);
void requireStrongAuth(int strongAuthReason, int userId);
void systemReady();
void userPresent(int userId);
}

View File

@@ -172,6 +172,14 @@ public class LockPatternUtils {
}
}
public void userPresent(int userId) {
try {
getLockSettings().userPresent(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
public static final class RequestThrottledException extends Exception {
private int mTimeoutMs;
public RequestThrottledException(int timeoutMs) {

View File

@@ -1477,12 +1477,14 @@ public class KeyguardViewMediator extends SystemUI {
private void sendUserPresentBroadcast() {
synchronized (this) {
if (mBootCompleted) {
final UserHandle currentUser = new UserHandle(KeyguardUpdateMonitor.getCurrentUser());
int currentUserId = KeyguardUpdateMonitor.getCurrentUser();
final UserHandle currentUser = new UserHandle(currentUserId);
final UserManager um = (UserManager) mContext.getSystemService(
Context.USER_SERVICE);
for (int profileId : um.getProfileIdsWithDisabled(currentUser.getIdentifier())) {
mContext.sendBroadcastAsUser(USER_PRESENT_INTENT, UserHandle.of(profileId));
}
getLockPatternUtils().userPresent(currentUserId);
} else {
mBootSendUserPresent = true;
}

View File

@@ -229,7 +229,6 @@ public class LockSettingsService extends ILockSettings.Stub {
filter.addAction(Intent.ACTION_USER_ADDED);
filter.addAction(Intent.ACTION_USER_STARTING);
filter.addAction(Intent.ACTION_USER_REMOVED);
filter.addAction(Intent.ACTION_USER_PRESENT);
mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);
mStorage = new LockSettingsStorage(context, new LockSettingsStorage.Callback() {
@@ -369,8 +368,6 @@ public class LockSettingsService extends ILockSettings.Stub {
} else if (Intent.ACTION_USER_STARTING.equals(intent.getAction())) {
final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
mStorage.prefetchUser(userHandle);
} else if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) {
mStrongAuth.reportUnlock(getSendingUserId());
} else if (Intent.ACTION_USER_REMOVED.equals(intent.getAction())) {
final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
if (userHandle > 0) {
@@ -1347,6 +1344,12 @@ public class LockSettingsService extends ILockSettings.Stub {
mStrongAuth.requireStrongAuth(strongAuthReason, userId);
}
@Override
public void userPresent(int userId) {
checkWritePermission(userId);
mStrongAuth.reportUnlock(userId);
}
private static final String[] VALID_SETTINGS = new String[] {
LockPatternUtils.LOCKOUT_PERMANENT_KEY,
LockPatternUtils.LOCKOUT_ATTEMPT_DEADLINE,

View File

@@ -974,7 +974,6 @@ public class TrustManagerService extends SystemService {
public void register(Context context) {
IntentFilter filter = new IntentFilter();
filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
filter.addAction(Intent.ACTION_USER_PRESENT);
filter.addAction(Intent.ACTION_USER_ADDED);
filter.addAction(Intent.ACTION_USER_REMOVED);
context.registerReceiverAsUser(this,