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

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

Merge "[pm] fix PackageInfo.signatures for archived apps" into main

parents 0cc6464e 92761054
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -190,9 +190,11 @@ public final class SigningInfo implements Parcelable {
        mSigningDetails.writeToParcel(dest, parcelableFlags);
    }

    /* @hide */
    /**
     *  @hide
     */
    @NonNull
    SigningDetails getSigningDetails() {
    public SigningDetails getSigningDetails() {
        return mSigningDetails;
    }

+2 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ import static com.android.server.pm.PackageManagerService.TAG;
import static com.android.server.pm.PackageManagerServiceUtils.compareSignatureArrays;
import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures;
import static com.android.server.pm.PackageManagerServiceUtils.isSystemOrRootOrShell;
import static com.android.server.pm.parsing.PackageInfoUtils.getDeprecatedSignatures;
import static com.android.server.pm.resolution.ComponentResolver.RESOLVE_PRIORITY_SORTER;

import android.Manifest;
@@ -1531,6 +1532,7 @@ public class ComputerEngine implements Computer {
            pi.applicationInfo = PackageInfoUtils.generateDelegateApplicationInfo(
                    ai, flags, state, userId);
            pi.signingInfo = ps.getSigningInfo();
            pi.signatures = getDeprecatedSignatures(pi.signingInfo.getSigningDetails(), flags);

            if (DEBUG_PACKAGE_INFO) {
                Log.v(TAG, "ps.pkg is n/a for ["
+25 −15
Original line number Diff line number Diff line
@@ -238,21 +238,7 @@ public class PackageInfoUtils {
        }

        final SigningDetails signingDetails = pkg.getSigningDetails();
        // deprecated method of getting signing certificates
        if ((flags & PackageManager.GET_SIGNATURES) != 0) {
            if (signingDetails.hasPastSigningCertificates()) {
                // Package has included signing certificate rotation information.  Return the oldest
                // cert so that programmatic checks keep working even if unaware of key rotation.
                info.signatures = new Signature[1];
                info.signatures[0] = signingDetails.getPastSigningCertificates()[0];
            } else if (signingDetails.hasSignatures()) {
                // otherwise keep old behavior
                int numberOfSigs = signingDetails.getSignatures().length;
                info.signatures = new Signature[numberOfSigs];
                System.arraycopy(signingDetails.getSignatures(), 0, info.signatures, 0,
                        numberOfSigs);
            }
        }
        info.signatures = getDeprecatedSignatures(signingDetails, flags);

        // replacement for GET_SIGNATURES
        if ((flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0) {
@@ -358,6 +344,30 @@ public class PackageInfoUtils {
        return info;
    }

    /**
     *  Retrieve the deprecated {@link PackageInfo.signatures} field of signing certificates
     */
    public static Signature[] getDeprecatedSignatures(SigningDetails signingDetails, long flags) {
        if ((flags & PackageManager.GET_SIGNATURES) == 0) {
            return null;
        }
        if (signingDetails.hasPastSigningCertificates()) {
            // Package has included signing certificate rotation information.  Return the oldest
            // cert so that programmatic checks keep working even if unaware of key rotation.
            Signature[] signatures = new Signature[1];
            signatures[0] = signingDetails.getPastSigningCertificates()[0];
            return signatures;
        } else if (signingDetails.hasSignatures()) {
            // otherwise keep old behavior
            int numberOfSigs = signingDetails.getSignatures().length;
            Signature[] signatures = new Signature[numberOfSigs];
            System.arraycopy(signingDetails.getSignatures(), 0, signatures, 0,
                    numberOfSigs);
            return signatures;
        }
        return null;
    }

    private static void updateApplicationInfo(ApplicationInfo ai, long flags,
            PackageUserState state) {
        if ((flags & PackageManager.GET_META_DATA) == 0) {