Allow multiple verdicts from the same verifier.

Bug: 241826200
Fixes: 241826200
Test: atest PackageVerificationStateTest PackageInstallerTest
Change-Id: I3dd590305413e14823d8e49befdb08dd64e93f8d
This commit is contained in:
Alex Buynytskyy
2022-08-11 10:49:42 -07:00
parent b633647667
commit d4a3fc30d6
2 changed files with 27 additions and 3 deletions

View File

@@ -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;

View File

@@ -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);