diff options
6 files changed, 73 insertions, 25 deletions
diff --git a/core/java/android/content/pm/verify/pkg/IVerificationSessionCallback.aidl b/core/java/android/content/pm/verify/pkg/IVerificationSessionCallback.aidl new file mode 100644 index 000000000000..38a7956603ae --- /dev/null +++ b/core/java/android/content/pm/verify/pkg/IVerificationSessionCallback.aidl @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm.verify.pkg; + +import android.content.pm.verify.pkg.VerificationStatus; +import android.os.PersistableBundle; + +/** + * Oneway interface that allows the verifier to send response or verification results back to + * the system. + * @hide + */ +oneway interface IVerificationSessionCallback { + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") + void reportVerificationIncomplete(int verificationId, int reason); + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") + void reportVerificationComplete(int verificationId, in VerificationStatus status); + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") + void reportVerificationCompleteWithExtensionResponse(int verificationId, in VerificationStatus status, in PersistableBundle response); +} diff --git a/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl b/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl index 66caf2d0fec0..036c1e69cb0d 100644 --- a/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl +++ b/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl @@ -16,11 +16,8 @@ package android.content.pm.verify.pkg; -import android.content.pm.verify.pkg.VerificationStatus; -import android.os.PersistableBundle; - /** - * Non-oneway interface that allows the verifier to communicate with the system. + * Non-oneway interface that allows the verifier to retrieve information from the system. * @hide */ interface IVerificationSessionInterface { @@ -30,10 +27,4 @@ interface IVerificationSessionInterface { long extendTimeRemaining(int verificationId, long additionalMs); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") boolean setVerificationPolicy(int verificationId, int policy); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") - void reportVerificationIncomplete(int verificationId, int reason); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") - void reportVerificationComplete(int verificationId, in VerificationStatus status); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") - void reportVerificationCompleteWithExtensionResponse(int verificationId, in VerificationStatus status, in PersistableBundle response); }
\ No newline at end of file diff --git a/core/java/android/content/pm/verify/pkg/VerificationSession.java b/core/java/android/content/pm/verify/pkg/VerificationSession.java index 4ade21198f37..f393be829aed 100644 --- a/core/java/android/content/pm/verify/pkg/VerificationSession.java +++ b/core/java/android/content/pm/verify/pkg/VerificationSession.java @@ -79,6 +79,8 @@ public final class VerificationSession implements Parcelable { private final PersistableBundle mExtensionParams; @NonNull private final IVerificationSessionInterface mSession; + @NonNull + private final IVerificationSessionCallback mCallback; /** * The current policy that is active for the session. It might not be * the same as the original policy that was initially assigned for this verification session, @@ -98,7 +100,8 @@ public final class VerificationSession implements Parcelable { @NonNull List<SharedLibraryInfo> declaredLibraries, @NonNull PersistableBundle extensionParams, @PackageInstaller.VerificationPolicy int defaultPolicy, - @NonNull IVerificationSessionInterface session) { + @NonNull IVerificationSessionInterface session, + @NonNull IVerificationSessionCallback callback) { mId = id; mInstallSessionId = installSessionId; mPackageName = packageName; @@ -108,6 +111,7 @@ public final class VerificationSession implements Parcelable { mExtensionParams = extensionParams; mVerificationPolicy = defaultPolicy; mSession = session; + mCallback = callback; } /** @@ -232,7 +236,7 @@ public final class VerificationSession implements Parcelable { @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationIncomplete(@VerificationIncompleteReason int reason) { try { - mSession.reportVerificationIncomplete(mId, reason); + mCallback.reportVerificationIncomplete(mId, reason); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -246,7 +250,7 @@ public final class VerificationSession implements Parcelable { @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationComplete(@NonNull VerificationStatus status) { try { - mSession.reportVerificationComplete(mId, status); + mCallback.reportVerificationComplete(mId, status); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -261,7 +265,7 @@ public final class VerificationSession implements Parcelable { public void reportVerificationComplete(@NonNull VerificationStatus status, @NonNull PersistableBundle response) { try { - mSession.reportVerificationCompleteWithExtensionResponse(mId, status, response); + mCallback.reportVerificationCompleteWithExtensionResponse(mId, status, response); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -277,6 +281,7 @@ public final class VerificationSession implements Parcelable { mExtensionParams = in.readPersistableBundle(getClass().getClassLoader()); mVerificationPolicy = in.readInt(); mSession = IVerificationSessionInterface.Stub.asInterface(in.readStrongBinder()); + mCallback = IVerificationSessionCallback.Stub.asInterface(in.readStrongBinder()); } @Override @@ -295,6 +300,7 @@ public final class VerificationSession implements Parcelable { dest.writePersistableBundle(mExtensionParams); dest.writeInt(mVerificationPolicy); dest.writeStrongBinder(mSession.asBinder()); + dest.writeStrongBinder(mCallback.asBinder()); } @NonNull diff --git a/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java b/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java index 90ae306952fe..80255c5f6600 100644 --- a/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java +++ b/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java @@ -33,6 +33,7 @@ import static org.mockito.Mockito.when; import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningInfo; import android.content.pm.VersionedPackage; +import android.content.pm.verify.pkg.IVerificationSessionCallback; import android.content.pm.verify.pkg.IVerificationSessionInterface; import android.content.pm.verify.pkg.VerificationSession; import android.content.pm.verify.pkg.VerificationStatus; @@ -83,6 +84,8 @@ public class VerificationSessionTest { private final PersistableBundle mTestExtensionParams = new PersistableBundle(); @Mock private IVerificationSessionInterface mTestSessionInterface; + @Mock + private IVerificationSessionCallback mTestCallback; private VerificationSession mTestSession; @Before @@ -93,7 +96,7 @@ public class VerificationSessionTest { mTestExtensionParams.putString(TEST_KEY, TEST_VALUE); mTestSession = new VerificationSession(TEST_ID, TEST_INSTALL_SESSION_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI, TEST_SIGNING_INFO, mTestDeclaredLibraries, - mTestExtensionParams, TEST_POLICY, mTestSessionInterface); + mTestExtensionParams, TEST_POLICY, mTestSessionInterface, mTestCallback); } @Test @@ -135,22 +138,25 @@ public class VerificationSessionTest { assertThat(mTestSession.extendTimeRemaining(TEST_EXTEND_TIME)).isEqualTo(TEST_EXTEND_TIME); verify(mTestSessionInterface, times(1)).extendTimeRemaining( eq(TEST_ID), eq(TEST_EXTEND_TIME)); + } + @Test + public void testCallback() throws Exception { PersistableBundle response = new PersistableBundle(); response.putString("test key", "test value"); final VerificationStatus status = new VerificationStatus.Builder().setVerified(true).build(); mTestSession.reportVerificationComplete(status); - verify(mTestSessionInterface, times(1)).reportVerificationComplete( + verify(mTestCallback, times(1)).reportVerificationComplete( eq(TEST_ID), eq(status)); mTestSession.reportVerificationComplete(status, response); - verify(mTestSessionInterface, times(1)) + verify(mTestCallback, times(1)) .reportVerificationCompleteWithExtensionResponse( eq(TEST_ID), eq(status), eq(response)); final int reason = VerificationSession.VERIFICATION_INCOMPLETE_UNKNOWN; mTestSession.reportVerificationIncomplete(reason); - verify(mTestSessionInterface, times(1)).reportVerificationIncomplete( + verify(mTestCallback, times(1)).reportVerificationIncomplete( eq(TEST_ID), eq(reason)); } diff --git a/core/tests/coretests/src/android/content/pm/verify/VerifierServiceTest.java b/core/tests/coretests/src/android/content/pm/verify/VerifierServiceTest.java index 56fc66a286c3..7807c8a94530 100644 --- a/core/tests/coretests/src/android/content/pm/verify/VerifierServiceTest.java +++ b/core/tests/coretests/src/android/content/pm/verify/VerifierServiceTest.java @@ -27,7 +27,6 @@ import static org.mockito.Mockito.when; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.SigningInfo; -import android.content.pm.verify.pkg.IVerificationSessionInterface; import android.content.pm.verify.pkg.IVerifierService; import android.content.pm.verify.pkg.VerificationSession; import android.content.pm.verify.pkg.VerifierService; @@ -64,8 +63,7 @@ public class VerifierServiceTest { mService = Mockito.mock(VerifierService.class, Answers.CALLS_REAL_METHODS); mSession = new VerificationSession(TEST_ID, TEST_INSTALL_SESSION_ID, TEST_PACKAGE_NAME, TEST_PACKAGE_URI, TEST_SIGNING_INFO, - new ArrayList<>(), new PersistableBundle(), TEST_POLICY, Mockito.mock( - IVerificationSessionInterface.class)); + new ArrayList<>(), new PersistableBundle(), TEST_POLICY, null, null); } @Test diff --git a/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java b/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java index 0dd1f4c77246..b7cc7ccead89 100644 --- a/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java +++ b/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java @@ -35,6 +35,7 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningInfo; +import android.content.pm.verify.pkg.IVerificationSessionCallback; import android.content.pm.verify.pkg.IVerificationSessionInterface; import android.content.pm.verify.pkg.IVerifierService; import android.content.pm.verify.pkg.VerificationSession; @@ -44,6 +45,7 @@ import android.os.Build; import android.os.Handler; import android.os.PersistableBundle; import android.os.Process; +import android.os.RemoteException; import android.os.UserHandle; import android.provider.DeviceConfig; import android.util.Pair; @@ -305,7 +307,8 @@ public class VerifierController { /* id= */ verificationId, /* installSessionId= */ installationSessionId, packageName, stagedPackageUri, signingInfo, declaredLibraries, extensionParams, - verificationPolicy, new VerificationSessionInterface(callback)); + verificationPolicy, new VerificationSessionInterface(callback), + new VerificationSessionCallback(callback)); AndroidFuture<Void> unusedFuture = mRemoteService.post(service -> { if (!retry) { if (DEBUG) { @@ -465,9 +468,17 @@ public class VerifierController { } return mCallback.setVerificationPolicy(policy); } + } + + private class VerificationSessionCallback extends IVerificationSessionCallback.Stub { + private final PackageInstallerSession.VerifierCallback mCallback; + + VerificationSessionCallback(PackageInstallerSession.VerifierCallback callback) { + mCallback = callback; + } @Override - public void reportVerificationIncomplete(int id, int reason) { + public void reportVerificationIncomplete(int id, int reason) throws RemoteException { checkCallerPermission(); final VerificationStatusTracker tracker; synchronized (mVerificationStatus) { @@ -483,14 +494,16 @@ public class VerifierController { } @Override - public void reportVerificationComplete(int id, VerificationStatus verificationStatus) { + public void reportVerificationComplete(int id, VerificationStatus verificationStatus) + throws RemoteException { reportVerificationCompleteWithExtensionResponse(id, verificationStatus, /* extensionResponse= */ null); } @Override public void reportVerificationCompleteWithExtensionResponse(int id, - VerificationStatus verificationStatus, PersistableBundle extensionResponse) { + VerificationStatus verificationStatus, PersistableBundle extensionResponse) + throws RemoteException { checkCallerPermission(); final VerificationStatusTracker tracker; synchronized (mVerificationStatus) { |