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

Commit d4a3fc30 authored by Alex Buynytskyy's avatar Alex Buynytskyy
Browse files

Allow multiple verdicts from the same verifier.

Bug: 241826200
Fixes: 241826200
Test: atest PackageVerificationStateTest PackageInstallerTest
Change-Id: I3dd590305413e14823d8e49befdb08dd64e93f8d
parent b6336476
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ class PackageVerificationState {
    private final SparseBooleanArray mSufficientVerifierUids;

    private final SparseBooleanArray mRequiredVerifierUids;
    private final SparseBooleanArray mUnrespondedRequiredVerifierUids;

    private boolean mSufficientVerificationComplete;

@@ -52,6 +53,7 @@ class PackageVerificationState {
        mVerifyingSession = verifyingSession;
        mSufficientVerifierUids = new SparseBooleanArray();
        mRequiredVerifierUids = new SparseBooleanArray();
        mUnrespondedRequiredVerifierUids = new SparseBooleanArray();
        mRequiredVerificationComplete = false;
        mRequiredVerificationPassed = true;
        mExtendedTimeout = false;
@@ -64,6 +66,7 @@ class PackageVerificationState {
    /** Add the user ID of the required package verifier. */
    void addRequiredVerifierUid(int uid) {
        mRequiredVerifierUids.put(uid, true);
        mUnrespondedRequiredVerifierUids.put(uid, true);
    }

    /** Returns true if the uid a required verifier. */
@@ -103,8 +106,8 @@ class PackageVerificationState {
                    mRequiredVerificationPassed = false;
            }

            mRequiredVerifierUids.delete(uid);
            if (mRequiredVerifierUids.size() == 0) {
            mUnrespondedRequiredVerifierUids.delete(uid);
            if (mUnrespondedRequiredVerifierUids.size() == 0) {
                mRequiredVerificationComplete = true;
            }
            return true;
@@ -129,7 +132,7 @@ class PackageVerificationState {
     * Mark the session as passed required verification.
     */
    void passRequiredVerification() {
        if (mRequiredVerifierUids.size() > 0) {
        if (mUnrespondedRequiredVerifierUids.size() > 0) {
            throw new RuntimeException("Required verifiers still present.");
        }
        mRequiredVerificationPassed = true;
+21 −0
Original line number Diff line number Diff line
@@ -329,6 +329,27 @@ public class PackageVerificationStateTest extends AndroidTestCase {
                state.isInstallAllowed());
    }

    public void testAreAllVerificationsComplete_timeoutSuccessWithSufficient() {
        PackageVerificationState state = new PackageVerificationState(null);

        state.addRequiredVerifierUid(REQUIRED_UID_1);
        state.addSufficientVerifier(SUFFICIENT_UID_1);

        assertFalse(state.areAllVerificationsComplete());
        assertFalse(state.isVerificationComplete());
        assertFalse(state.isInstallAllowed());

        // Required verifier responded, but still waiting for sufficient.
        state.setVerifierResponse(REQUIRED_UID_1, PackageManager.VERIFICATION_ALLOW);
        assertFalse(state.isVerificationComplete());

        // Timeout, verification complete and installation allowed.
        state.setVerifierResponse(REQUIRED_UID_1,
                PackageManager.VERIFICATION_ALLOW_WITHOUT_SUFFICIENT);
        assertTrue(state.isVerificationComplete());
        assertTrue(state.isInstallAllowed());
    }

    public void testAreAllVerificationsComplete_onlyVerificationPasses() {
        PackageVerificationState state = new PackageVerificationState(null);
        state.addRequiredVerifierUid(REQUIRED_UID_1);