Loading services/core/java/com/android/server/pm/PackageVerificationState.java +6 −3 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ class PackageVerificationState { private final SparseBooleanArray mSufficientVerifierUids; private final SparseBooleanArray mRequiredVerifierUids; private final SparseBooleanArray mUnrespondedRequiredVerifierUids; private boolean mSufficientVerificationComplete; Loading @@ -52,6 +53,7 @@ class PackageVerificationState { mVerifyingSession = verifyingSession; mSufficientVerifierUids = new SparseBooleanArray(); mRequiredVerifierUids = new SparseBooleanArray(); mUnrespondedRequiredVerifierUids = new SparseBooleanArray(); mRequiredVerificationComplete = false; mRequiredVerificationPassed = true; mExtendedTimeout = false; Loading @@ -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. */ Loading Loading @@ -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; Loading @@ -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; Loading services/tests/servicestests/src/com/android/server/pm/PackageVerificationStateTest.java +21 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
services/core/java/com/android/server/pm/PackageVerificationState.java +6 −3 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ class PackageVerificationState { private final SparseBooleanArray mSufficientVerifierUids; private final SparseBooleanArray mRequiredVerifierUids; private final SparseBooleanArray mUnrespondedRequiredVerifierUids; private boolean mSufficientVerificationComplete; Loading @@ -52,6 +53,7 @@ class PackageVerificationState { mVerifyingSession = verifyingSession; mSufficientVerifierUids = new SparseBooleanArray(); mRequiredVerifierUids = new SparseBooleanArray(); mUnrespondedRequiredVerifierUids = new SparseBooleanArray(); mRequiredVerificationComplete = false; mRequiredVerificationPassed = true; mExtendedTimeout = false; Loading @@ -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. */ Loading Loading @@ -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; Loading @@ -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; Loading
services/tests/servicestests/src/com/android/server/pm/PackageVerificationStateTest.java +21 −0 Original line number Diff line number Diff line Loading @@ -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); Loading