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

Commit c95e3bb1 authored by Song Chun Fan's avatar Song Chun Fan
Browse files

[1/N] APIs of verification service, session and status

+ Feature flag
+ APIs for VerifierService, VerificationSession, VerificationStatus
+ AIDL interfaces for binder communication
+ Unit testing

BUG: 360129103
FLAG: android.content.pm.verification_service
Test: atest FrameworksCoreTests:android.content.pm.verify.VerificationSessionTest
Test: atest FrameworksCoreTests:android.content.pm.verify.VerificationStatusTest
Test: atest FrameworksCoreTests:android.content.pm.verify.VerifierServiceTest
Test: cts tests to be added
API-Coverage-Bug: 367776952

Change-Id: Ide0b060d1ba61f3a9f53a6b87240df5045cd46eb
parent c3217eaa
Loading
Loading
Loading
Loading
+58 −0
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ package android {
    field public static final String BIND_TRANSLATION_SERVICE = "android.permission.BIND_TRANSLATION_SERVICE";
    field public static final String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT";
    field public static final String BIND_TV_REMOTE_SERVICE = "android.permission.BIND_TV_REMOTE_SERVICE";
    field @FlaggedApi("android.content.pm.verification_service") public static final String BIND_VERIFICATION_AGENT = "android.permission.BIND_VERIFICATION_AGENT";
    field public static final String BIND_VISUAL_QUERY_DETECTION_SERVICE = "android.permission.BIND_VISUAL_QUERY_DETECTION_SERVICE";
    field public static final String BIND_WALLPAPER_EFFECTS_GENERATION_SERVICE = "android.permission.BIND_WALLPAPER_EFFECTS_GENERATION_SERVICE";
    field public static final String BIND_WEARABLE_SENSING_SERVICE = "android.permission.BIND_WEARABLE_SENSING_SERVICE";
@@ -412,6 +413,7 @@ package android {
    field @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence") public static final String USE_ON_DEVICE_INTELLIGENCE = "android.permission.USE_ON_DEVICE_INTELLIGENCE";
    field public static final String USE_RESERVED_DISK = "android.permission.USE_RESERVED_DISK";
    field public static final String UWB_PRIVILEGED = "android.permission.UWB_PRIVILEGED";
    field @FlaggedApi("android.content.pm.verification_service") public static final String VERIFICATION_AGENT = "android.permission.VERIFICATION_AGENT";
    field @FlaggedApi("android.os.vibrator.vendor_vibration_effects") public static final String VIBRATE_VENDOR_EFFECTS = "android.permission.VIBRATE_VENDOR_EFFECTS";
    field public static final String WHITELIST_AUTO_REVOKE_PERMISSIONS = "android.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS";
    field public static final String WHITELIST_RESTRICTED_PERMISSIONS = "android.permission.WHITELIST_RESTRICTED_PERMISSIONS";
@@ -4302,6 +4304,7 @@ package android.content.pm {
    method @Deprecated @RequiresPermission(android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT) public abstract void verifyIntentFilter(int, int, @NonNull java.util.List<java.lang.String>);
    field public static final String ACTION_REQUEST_PERMISSIONS = "android.content.pm.action.REQUEST_PERMISSIONS";
    field public static final String ACTION_REQUEST_PERMISSIONS_FOR_OTHER = "android.content.pm.action.REQUEST_PERMISSIONS_FOR_OTHER";
    field @FlaggedApi("android.content.pm.verification_service") public static final String ACTION_VERIFY_PACKAGE = "android.content.pm.action.VERIFY_PACKAGE";
    field @FlaggedApi("android.content.pm.asl_in_apk_app_metadata_source") public static final int APP_METADATA_SOURCE_APK = 1; // 0x1
    field @FlaggedApi("android.content.pm.asl_in_apk_app_metadata_source") public static final int APP_METADATA_SOURCE_INSTALLER = 2; // 0x2
    field @FlaggedApi("android.content.pm.asl_in_apk_app_metadata_source") public static final int APP_METADATA_SOURCE_SYSTEM_IMAGE = 3; // 0x3
@@ -4615,6 +4618,61 @@ package android.content.pm.verify.domain {
}
package android.content.pm.verify.pkg {
  @FlaggedApi("android.content.pm.verification_service") public final class VerificationSession implements android.os.Parcelable {
    method public int describeContents();
    method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public long extendTimeRemaining(long);
    method @NonNull public java.util.List<android.content.pm.SharedLibraryInfo> getDeclaredLibraries();
    method @NonNull public android.os.PersistableBundle getExtensionParams();
    method public int getId();
    method public int getInstallSessionId();
    method @NonNull public String getPackageName();
    method @NonNull public android.content.pm.SigningInfo getSigningInfo();
    method @NonNull public android.net.Uri getStagedPackageUri();
    method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public long getTimeoutTime();
    method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationComplete(@NonNull android.content.pm.verify.pkg.VerificationStatus);
    method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationComplete(@NonNull android.content.pm.verify.pkg.VerificationStatus, @NonNull android.os.PersistableBundle);
    method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationIncomplete(int);
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.verify.pkg.VerificationSession> CREATOR;
    field public static final int VERIFICATION_INCOMPLETE_NETWORK_LIMITED = 2; // 0x2
    field public static final int VERIFICATION_INCOMPLETE_NETWORK_UNAVAILABLE = 1; // 0x1
    field public static final int VERIFICATION_INCOMPLETE_UNKNOWN = 0; // 0x0
  }
  @FlaggedApi("android.content.pm.verification_service") public final class VerificationStatus implements android.os.Parcelable {
    method public int describeContents();
    method public int getAslStatus();
    method @NonNull public String getFailureMessage();
    method public boolean isVerified();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.content.pm.verify.pkg.VerificationStatus> CREATOR;
    field public static final int VERIFIER_STATUS_ASL_BAD = 2; // 0x2
    field public static final int VERIFIER_STATUS_ASL_GOOD = 1; // 0x1
    field public static final int VERIFIER_STATUS_ASL_UNDEFINED = 0; // 0x0
  }
  public static final class VerificationStatus.Builder {
    ctor public VerificationStatus.Builder();
    method @NonNull public android.content.pm.verify.pkg.VerificationStatus build();
    method @NonNull public android.content.pm.verify.pkg.VerificationStatus.Builder setAslStatus(int);
    method @NonNull public android.content.pm.verify.pkg.VerificationStatus.Builder setFailureMessage(@NonNull String);
    method @NonNull public android.content.pm.verify.pkg.VerificationStatus.Builder setVerified(boolean);
  }
  @FlaggedApi("android.content.pm.verification_service") public abstract class VerifierService extends android.app.Service {
    ctor public VerifierService();
    method @Nullable public android.os.IBinder onBind(@Nullable android.content.Intent);
    method public abstract void onPackageNameAvailable(@NonNull String);
    method public abstract void onVerificationCancelled(@NonNull String);
    method public abstract void onVerificationRequired(@NonNull android.content.pm.verify.pkg.VerificationSession);
    method public abstract void onVerificationRetry(@NonNull android.content.pm.verify.pkg.VerificationSession);
    method public abstract void onVerificationTimeout(int);
  }
}
package android.content.rollback {
  public final class PackageRollbackInfo implements android.os.Parcelable {
+19 −0
Original line number Diff line number Diff line
@@ -5038,6 +5038,25 @@ public abstract class PackageManager {
    public static final String ACTION_REQUEST_PERMISSIONS_FOR_OTHER =
            "android.content.pm.action.REQUEST_PERMISSIONS_FOR_OTHER";

    /**
     * Used by the system to query a {@link android.content.pm.verify.pkg.VerifierService} provider,
     * which registers itself via an intent-filter handling this action.
     *
     * <p class="note">Only the system can bind to such a verifier service. This is protected by the
     * {@link android.Manifest.permission#BIND_VERIFICATION_AGENT} permission. The verifier service
     * app should protect the service by adding this permission in the service declaration in its
     * manifest.
     * <p>
     * A verifier service must be a privileged app and hold the
     * {@link android.Manifest.permission#VERIFICATION_AGENT} permission.
     *
     * @hide
     */
    @SystemApi
    @FlaggedApi(android.content.pm.Flags.FLAG_VERIFICATION_SERVICE)
    @SdkConstant(SdkConstantType.SERVICE_ACTION)
    public static final String ACTION_VERIFY_PACKAGE = "android.content.pm.action.VERIFY_PACKAGE";

    /**
     * The names of the requested permissions.
     * <p>
+8 −0
Original line number Diff line number Diff line
@@ -309,3 +309,11 @@ flag {
    description: "Feature flag to enable the holder of SYSTEM_APP_PROTECTION_SERVICE role to silently delete packages. To be deprecated by delete_packages_silently."
    bug: "361776825"
}

flag {
    name: "verification_service"
    namespace: "package_manager_service"
    description: "Feature flag to enable the new verification service."
    bug: "360129103"
    is_fixed_read_only: true
}
+34 −0
Original line number Diff line number Diff line
/*
 * 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);
}
+28 −0
Original line number Diff line number Diff line
/*
 * 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;

/**
 * Non-oneway interface that allows the verifier to retrieve information from the system.
 * @hide
 */
interface IVerificationSessionInterface {
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)")
    long getTimeoutTime(int verificationId);
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)")
    long extendTimeRemaining(int verificationId, long additionalMs);
}
 No newline at end of file
Loading