Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87af05bf authored by Jacob Hobbie's avatar Jacob Hobbie Committed by Eric Biggers
Browse files

Fix timer bug in TrustManagerService.

Previously, anytime a device was unlocked, we would refresh the trustable timers. Now, we should ensure that there actually is a trustable timer running before refreshing (since updating trust will start it anyways). We also make sure to destroy the timers when we move to UNTRUSTED

Fixes:273550297
Fixes:264684930
Change-Id: I75d58e09848d4123bb55ea9a36cab739504ca6e8
Merged-In: I75d58e09848d4123bb55ea9a36cab739504ca6e8
Test: Tested that this fixes 273550297 by justinkchung@
(cherry picked from commit c539a470)
parent eebbb8ba
Loading
Loading
Loading
Loading
+28 −19
Original line number Diff line number Diff line
@@ -393,6 +393,23 @@ public class TrustManagerService extends SystemService {
                true /* overrideHardTimeout */);
    }

    private void cancelBothTrustableAlarms(int userId) {
        TrustableTimeoutAlarmListener idleTimeout =
                mIdleTrustableTimeoutAlarmListenerForUser.get(
                        userId);
        TrustableTimeoutAlarmListener trustableTimeout =
                mTrustableTimeoutAlarmListenerForUser.get(
                        userId);
        if (idleTimeout != null && idleTimeout.isQueued()) {
            idleTimeout.setQueued(false);
            mAlarmManager.cancel(idleTimeout);
        }
        if (trustableTimeout != null && trustableTimeout.isQueued()) {
            trustableTimeout.setQueued(false);
            mAlarmManager.cancel(trustableTimeout);
        }
    }

    private void handleScheduleTrustedTimeout(int userId, boolean shouldOverride) {
        long when = SystemClock.elapsedRealtime() + TRUST_TIMEOUT_IN_MILLIS;
        TrustedTimeoutAlarmListener alarm = mTrustTimeoutAlarmListenerForUser.get(userId);
@@ -657,6 +674,11 @@ public class TrustManagerService extends SystemService {
                resultCallback.complete(new GrantTrustResult(STATUS_UNLOCKED_BY_GRANT));
            }
        }

        if ((wasTrusted || wasTrustable) && pendingTrustState == TrustState.UNTRUSTED) {
            if (DEBUG) Slog.d(TAG, "Trust was revoked, destroy trustable alarms");
            cancelBothTrustableAlarms(userId);
        }
    }

    private void updateTrustUsuallyManaged(int userId, boolean managed) {
@@ -1903,7 +1925,11 @@ public class TrustManagerService extends SystemService {
                    handleScheduleTrustTimeout(shouldOverride, timeoutType);
                    break;
                case MSG_REFRESH_TRUSTABLE_TIMERS_AFTER_AUTH:
                    TrustableTimeoutAlarmListener trustableAlarm =
                            mTrustableTimeoutAlarmListenerForUser.get(msg.arg1);
                    if (trustableAlarm != null && trustableAlarm.isQueued()) {
                        refreshTrustableTimers(msg.arg1);
                    }
                    break;
            }
        }
@@ -2155,7 +2181,7 @@ public class TrustManagerService extends SystemService {
            TrustedTimeoutAlarmListener otherAlarm;
            boolean otherAlarmPresent;
            if (ENABLE_ACTIVE_UNLOCK_FLAG) {
                cancelBothTrustableAlarms();
                cancelBothTrustableAlarms(mUserId);
                otherAlarm = mTrustTimeoutAlarmListenerForUser.get(mUserId);
                otherAlarmPresent = (otherAlarm != null) && otherAlarm.isQueued();
                if (otherAlarmPresent) {
@@ -2167,23 +2193,6 @@ public class TrustManagerService extends SystemService {
            }
        }

        private void cancelBothTrustableAlarms() {
            TrustableTimeoutAlarmListener idleTimeout =
                    mIdleTrustableTimeoutAlarmListenerForUser.get(
                            mUserId);
            TrustableTimeoutAlarmListener trustableTimeout =
                    mTrustableTimeoutAlarmListenerForUser.get(
                            mUserId);
            if (idleTimeout != null && idleTimeout.isQueued()) {
                idleTimeout.setQueued(false);
                mAlarmManager.cancel(idleTimeout);
            }
            if (trustableTimeout != null && trustableTimeout.isQueued()) {
                trustableTimeout.setQueued(false);
                mAlarmManager.cancel(trustableTimeout);
            }
        }

        private void disableRenewableTrustWhileNonrenewableTrustIsPresent() {
            // if non-renewable trust is running, we need to temporarily prevent
            // renewable trust from being used