summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/pm/verify/pkg/IVerificationSessionCallback.aidl34
-rw-r--r--core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl11
-rw-r--r--core/java/android/content/pm/verify/pkg/VerificationSession.java14
-rw-r--r--core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java14
-rw-r--r--core/tests/coretests/src/android/content/pm/verify/VerifierServiceTest.java4
-rw-r--r--services/core/java/com/android/server/pm/verify/pkg/VerifierController.java21
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) {