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

Commit 64380516 authored by Song Chun Fan's avatar Song Chun Fan Committed by Android (Google) Code Review
Browse files

Merge changes from topic "revert-30469933-revert_verification_service_main-JGMGPMPKDJ" into main

* changes:
  [ADI][8/N] per-user global verification policy
  [ADI][7/N] only the current verifier can call VerificationSession APIs
  [ADI][6/N] allow adb installs to bypass verifier
  [ADI][5/N] Use synchronous interface for report* methods
  [ADI][4/N] APIs for verification policy and failure reasons
  [ADI][3/N] implement getDeclaredLibraries
  [ADI][2/N] implementation of verifier controller and status tracker
  [ADI][1/N] APIs of verification service, session and status
parents e17349ae d6a2d21f
Loading
Loading
Loading
Loading
+69 −0
Original line number Diff line number Diff line
@@ -100,6 +100,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";
@@ -441,6 +442,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";
@@ -4280,9 +4282,11 @@ package android.content.pm {
  }
  public class PackageInstaller {
    method @FlaggedApi("android.content.pm.verification_service") @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public final int getVerificationPolicy();
    method @NonNull public android.content.pm.PackageInstaller.InstallInfo readInstallInfo(@NonNull java.io.File, int) throws android.content.pm.PackageInstaller.PackageParsingException;
    method @FlaggedApi("android.content.pm.read_install_info") @NonNull public android.content.pm.PackageInstaller.InstallInfo readInstallInfo(@NonNull android.os.ParcelFileDescriptor, @Nullable String, int) throws android.content.pm.PackageInstaller.PackageParsingException;
    method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setPermissionsResult(int, boolean);
    method @FlaggedApi("android.content.pm.verification_service") @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public final boolean setVerificationPolicy(int);
    field public static final String ACTION_CONFIRM_INSTALL = "android.content.pm.action.CONFIRM_INSTALL";
    field public static final String ACTION_CONFIRM_PRE_APPROVAL = "android.content.pm.action.CONFIRM_PRE_APPROVAL";
    field @FlaggedApi("android.content.pm.sdk_dependency_installer") public static final String ACTION_INSTALL_DEPENDENCY = "android.content.pm.action.INSTALL_DEPENDENCY";
@@ -4294,12 +4298,20 @@ package android.content.pm {
    field @FlaggedApi("android.content.pm.archiving") public static final String EXTRA_DELETE_FLAGS = "android.content.pm.extra.DELETE_FLAGS";
    field public static final String EXTRA_LEGACY_STATUS = "android.content.pm.extra.LEGACY_STATUS";
    field @Deprecated public static final String EXTRA_RESOLVED_BASE_PATH = "android.content.pm.extra.RESOLVED_BASE_PATH";
    field @FlaggedApi("android.content.pm.verification_service") public static final String EXTRA_VERIFICATION_FAILURE_REASON = "android.content.pm.extra.VERIFICATION_FAILURE_REASON";
    field public static final int LOCATION_DATA_APP = 0; // 0x0
    field public static final int LOCATION_MEDIA_DATA = 2; // 0x2
    field public static final int LOCATION_MEDIA_OBB = 1; // 0x1
    field public static final int REASON_CONFIRM_PACKAGE_CHANGE = 0; // 0x0
    field public static final int REASON_OWNERSHIP_CHANGED = 1; // 0x1
    field public static final int REASON_REMIND_OWNERSHIP = 2; // 0x2
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_FAILED_REASON_NETWORK_UNAVAILABLE = 1; // 0x1
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_FAILED_REASON_PACKAGE_BLOCKED = 2; // 0x2
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_FAILED_REASON_UNKNOWN = 0; // 0x0
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_POLICY_BLOCK_FAIL_CLOSED = 3; // 0x3
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_POLICY_BLOCK_FAIL_OPEN = 1; // 0x1
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_POLICY_BLOCK_FAIL_WARN = 2; // 0x2
    field @FlaggedApi("android.content.pm.verification_service") public static final int VERIFICATION_POLICY_NONE = 0; // 0x0
  }
  public static class PackageInstaller.InstallInfo {
@@ -4420,6 +4432,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
@@ -4751,6 +4764,62 @@ 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 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 public long getTimeoutTime();
    method public int getVerificationPolicy();
    method public void reportVerificationComplete(@NonNull android.content.pm.verify.pkg.VerificationStatus);
    method public void reportVerificationComplete(@NonNull android.content.pm.verify.pkg.VerificationStatus, @NonNull android.os.PersistableBundle);
    method public void reportVerificationIncomplete(int);
    method public boolean setVerificationPolicy(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_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 {
+6 −0
Original line number Diff line number Diff line
@@ -93,4 +93,10 @@ interface IPackageInstaller {

    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES,android.Manifest.permission.REQUEST_INSTALL_PACKAGES})")
    void reportUnarchivalStatus(int unarchiveId, int status, long requiredStorageBytes, in PendingIntent userActionIntent, in UserHandle userHandle);

    @EnforcePermission("VERIFICATION_AGENT")
    int getVerificationPolicy(int userId);

    @EnforcePermission("VERIFICATION_AGENT")
    boolean setVerificationPolicy(int policy, int userId);
}
+149 −0
Original line number Diff line number Diff line
@@ -62,6 +62,8 @@ import android.content.pm.parsing.PackageLite;
import android.content.pm.parsing.result.ParseResult;
import android.content.pm.parsing.result.ParseTypeImpl;
import android.content.pm.verify.domain.DomainSet;
import android.content.pm.verify.pkg.VerificationSession;
import android.content.pm.verify.pkg.VerificationStatus;
import android.graphics.Bitmap;
import android.icu.util.ULocale;
import android.net.Uri;
@@ -429,6 +431,21 @@ public class PackageInstaller {
     */
    public static final String EXTRA_WARNINGS = "android.content.pm.extra.WARNINGS";

    /**
     * When verification is blocked as part of the installation, additional reason for the block
     * will be provided to the installer with a {@link VerificationFailedReason} as part of the
     * installation result returned via the {@link IntentSender} in
     * {@link Session#commit(IntentSender)}. This extra is provided only when the installation has
     * failed. Installers can use this extra to check if the installation failure was caused by a
     * verification failure.
     *
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final String EXTRA_VERIFICATION_FAILURE_REASON =
            "android.content.pm.extra.VERIFICATION_FAILURE_REASON";

    /**
     * Streaming installation pending.
     * Caller should make sure DataLoader is able to prepare image and reinitiate the operation.
@@ -772,6 +789,90 @@ public class PackageInstaller {
    @Retention(RetentionPolicy.SOURCE)
    public @interface UnarchivalStatus {}

    /**
     * Verification failed because of unknown reasons, such as when the verifier times out or cannot
     * be connected. It can also corresponds to the status of
     * {@link VerificationSession#VERIFICATION_INCOMPLETE_UNKNOWN} reported by the verifier via
     * {@link VerificationSession#reportVerificationIncomplete(int)}.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_FAILED_REASON_UNKNOWN = 0;

    /**
     * Verification failed because the network is unavailable. This corresponds to the status of
     * {@link VerificationSession#VERIFICATION_INCOMPLETE_NETWORK_UNAVAILABLE} reported by the
     * verifier via {@link VerificationSession#reportVerificationIncomplete(int)}.
     *
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_FAILED_REASON_NETWORK_UNAVAILABLE = 1;

    /**
     * Verification failed because the package is blocked, as reported by the verifier via
     * {@link VerificationSession#reportVerificationComplete(VerificationStatus)} or
     * {@link VerificationSession#reportVerificationComplete(VerificationStatus, PersistableBundle)}
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_FAILED_REASON_PACKAGE_BLOCKED = 2;

    /**
     * @hide
     */
    @IntDef(value = {
            VERIFICATION_FAILED_REASON_UNKNOWN,
            VERIFICATION_FAILED_REASON_NETWORK_UNAVAILABLE,
            VERIFICATION_FAILED_REASON_PACKAGE_BLOCKED,
    })
    public @interface VerificationFailedReason {
    }

    /**
     * Do not block installs, regardless of verification status.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_POLICY_NONE = 0; // platform default
    /**
     * Only block installations on {@link #VERIFICATION_FAILED_REASON_PACKAGE_BLOCKED}.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_POLICY_BLOCK_FAIL_OPEN = 1;
    /**
     * Only block installations on {@link #VERIFICATION_FAILED_REASON_PACKAGE_BLOCKED} and ask the
     * user if they'd like to install anyway when the verification is blocked for other reason.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_POLICY_BLOCK_FAIL_WARN = 2;
    /**
     * Block installations whose verification status is blocked for any reason.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    public static final int VERIFICATION_POLICY_BLOCK_FAIL_CLOSED = 3;
    /**
     * @hide
     */
    @IntDef(value = {
            VERIFICATION_POLICY_NONE,
            VERIFICATION_POLICY_BLOCK_FAIL_OPEN,
            VERIFICATION_POLICY_BLOCK_FAIL_WARN,
            VERIFICATION_POLICY_BLOCK_FAIL_CLOSED,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface VerificationPolicy {
    }

    /** Default set of checksums - includes all available checksums.
     * @see Session#requestChecksums  */
@@ -1514,6 +1615,40 @@ public class PackageInstaller {
        }
    }

    /**
     * Return the current verification enforcement policy. This may only be called by the
     * package currently set by the system as the verifier agent.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)
    public final @VerificationPolicy int getVerificationPolicy() {
        try {
            return mInstaller.getVerificationPolicy(mUserId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Set the current verification enforcement policy which will be applied to all the future
     * installation sessions. This may only be called by the package currently set by the system as
     * the verifier agent.
     * @hide
     * @return whether the new policy was successfully set.
     */
    @FlaggedApi(Flags.FLAG_VERIFICATION_SERVICE)
    @SystemApi
    @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)
    public final boolean setVerificationPolicy(@VerificationPolicy int policy) {
        try {
            return mInstaller.setVerificationPolicy(policy, mUserId);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * An installation that is being actively staged. For an install to succeed,
     * all existing and new packages must have identical package names, version
@@ -2812,6 +2947,8 @@ public class PackageInstaller {
        /** {@hide} */
        public @Nullable String dexoptCompilerFilter = null;
        /** {@hide} */
        public boolean forceVerification;
        /** {@hide} */
        public boolean isAutoInstallDependenciesEnabled = true;

        private final ArrayMap<String, Integer> mPermissionStates;
@@ -2872,6 +3009,7 @@ public class PackageInstaller {
            developmentInstallFlags = source.readInt();
            unarchiveId = source.readInt();
            dexoptCompilerFilter = source.readString();
            forceVerification = source.readBoolean();
            isAutoInstallDependenciesEnabled = source.readBoolean();
        }

@@ -2909,6 +3047,7 @@ public class PackageInstaller {
            ret.developmentInstallFlags = developmentInstallFlags;
            ret.unarchiveId = unarchiveId;
            ret.dexoptCompilerFilter = dexoptCompilerFilter;
            ret.forceVerification = forceVerification;
            ret.isAutoInstallDependenciesEnabled = isAutoInstallDependenciesEnabled;
            return ret;
        }
@@ -3650,6 +3789,14 @@ public class PackageInstaller {
            return grantedPermissions.toArray(ArrayUtils.emptyArray(String.class));
        }

        /**
         * Used by adb installations to force enable the verification for this install.
         * {@hide}
         */
        public void setForceVerification() {
            this.forceVerification = true;
        }

        /**
         * Optionally indicate whether missing SDK or static shared library dependencies should be
         * automatically fetched and installed when installing an app that wants to use these
@@ -3704,6 +3851,7 @@ public class PackageInstaller {
            pw.printHexPair("developmentInstallFlags", developmentInstallFlags);
            pw.printPair("unarchiveId", unarchiveId);
            pw.printPair("dexoptCompilerFilter", dexoptCompilerFilter);
            pw.printPair("forceVerification", forceVerification);
            pw.printPair("isAutoInstallDependenciesEnabled", isAutoInstallDependenciesEnabled);
            pw.println();
        }
@@ -3751,6 +3899,7 @@ public class PackageInstaller {
            dest.writeInt(developmentInstallFlags);
            dest.writeInt(unarchiveId);
            dest.writeString(dexoptCompilerFilter);
            dest.writeBoolean(forceVerification);
            dest.writeBoolean(isAutoInstallDependenciesEnabled);
        }

+19 −0
Original line number Diff line number Diff line
@@ -5194,6 +5194,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>
+32 −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;

/**
 * Non-oneway interface that allows the verifier to communicate with the system.
 * @hide
 */
interface IVerificationSessionInterface {
    long getTimeoutTime(int verificationId);
    long extendTimeRemaining(int verificationId, long additionalMs);
    boolean setVerificationPolicy(int verificationId, int policy);
    void reportVerificationIncomplete(int verificationId, int reason);
    void reportVerificationComplete(int verificationId, in VerificationStatus status, in @nullable PersistableBundle extensionResponse);
}
 No newline at end of file
Loading