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

Commit 5e6643c1 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android (Google) Code Review
Browse files

Merge "Clean up IPackageManager install surface area."

parents 6dc7e4e4 513a074d
Loading
Loading
Loading
Loading
+6 −95
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import android.app.ActivityManagerNative;
import android.app.IActivityManager;
import android.content.ComponentName;
import android.content.pm.ApplicationInfo;
import android.content.pm.ContainerEncryptionParams;
import android.content.pm.FeatureInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageDeleteObserver;
@@ -48,24 +47,19 @@ import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;

import com.android.internal.content.PackageHelper;
import com.android.internal.util.ArrayUtils;

import java.io.File;
import java.io.FileDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.security.InvalidAlgorithmParameterException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.WeakHashMap;

import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import com.android.internal.content.PackageHelper;
import com.android.internal.util.ArrayUtils;

public final class Pm {
    IPackageManager mPm;
    IUserManager mUm;
@@ -816,13 +810,6 @@ public final class Pm {

        String opt;

        String algo = null;
        byte[] iv = null;
        byte[] key = null;

        String macAlgo = null;
        byte[] macKey = null;
        byte[] tag = null;
        String originatingUriString = null;
        String referrer = null;
        String abi = null;
@@ -848,42 +835,6 @@ public final class Pm {
                installFlags |= PackageManager.INSTALL_INTERNAL;
            } else if (opt.equals("-d")) {
                installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
            } else if (opt.equals("--algo")) {
                algo = nextOptionData();
                if (algo == null) {
                    System.err.println("Error: must supply argument for --algo");
                    return;
                }
            } else if (opt.equals("--iv")) {
                iv = hexToBytes(nextOptionData());
                if (iv == null) {
                    System.err.println("Error: must supply argument for --iv");
                    return;
                }
            } else if (opt.equals("--key")) {
                key = hexToBytes(nextOptionData());
                if (key == null) {
                    System.err.println("Error: must supply argument for --key");
                    return;
                }
            } else if (opt.equals("--macalgo")) {
                macAlgo = nextOptionData();
                if (macAlgo == null) {
                    System.err.println("Error: must supply argument for --macalgo");
                    return;
                }
            } else if (opt.equals("--mackey")) {
                macKey = hexToBytes(nextOptionData());
                if (macKey == null) {
                    System.err.println("Error: must supply argument for --mackey");
                    return;
                }
            } else if (opt.equals("--tag")) {
                tag = hexToBytes(nextOptionData());
                if (tag == null) {
                    System.err.println("Error: must supply argument for --tag");
                    return;
                }
            } else if (opt.equals("--originating-uri")) {
                originatingUriString = nextOptionData();
                if (originatingUriString == null) {
@@ -924,43 +875,6 @@ public final class Pm {
            }
        }

        final ContainerEncryptionParams encryptionParams;
        if (algo != null || iv != null || key != null || macAlgo != null || macKey != null
                || tag != null) {
            if (algo == null || iv == null || key == null) {
                System.err.println("Error: all of --algo, --iv, and --key must be specified");
                return;
            }

            if (macAlgo != null || macKey != null || tag != null) {
                if (macAlgo == null || macKey == null || tag == null) {
                    System.err.println("Error: all of --macalgo, --mackey, and --tag must "
                            + "be specified");
                    return;
                }
            }

            try {
                final SecretKey encKey = new SecretKeySpec(key, "RAW");

                final SecretKey macSecretKey;
                if (macKey == null || macKey.length == 0) {
                    macSecretKey = null;
                } else {
                    macSecretKey = new SecretKeySpec(macKey, "RAW");
                }

                encryptionParams = new ContainerEncryptionParams(algo, new IvParameterSpec(iv),
                        encKey, macAlgo, null, macSecretKey, tag, -1, -1, -1);
            } catch (InvalidAlgorithmParameterException e) {
                e.printStackTrace();
                return;
            }
        } else {
            encryptionParams = null;
        }

        final Uri apkURI;
        final Uri verificationURI;
        final Uri originatingURI;
        final Uri referrerURI;
@@ -980,9 +894,7 @@ public final class Pm {
        // Populate apkURI, must be present
        final String apkFilePath = nextArg();
        System.err.println("\tpkg: " + apkFilePath);
        if (apkFilePath != null) {
            apkURI = Uri.fromFile(new File(apkFilePath));
        } else {
        if (apkFilePath == null) {
            System.err.println("Error: no package specified");
            return;
        }
@@ -1001,9 +913,8 @@ public final class Pm {
            VerificationParams verificationParams = new VerificationParams(verificationURI,
                    originatingURI, referrerURI, VerificationParams.NO_UID, null);

            mPm.installPackageWithVerificationEncryptionAndAbiOverrideEtc(apkURI, null,
                    obs, installFlags, installerPackageName, verificationParams,
                    encryptionParams, abi);
            mPm.installPackage(apkFilePath, obs, installFlags, installerPackageName,
                    verificationParams, abi);

            synchronized (obs) {
                while (!obs.finished) {
+53 −38
Original line number Diff line number Diff line
@@ -29,11 +29,11 @@ import android.content.pm.FeatureInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageDeleteObserver;
import android.content.pm.IPackageInstallObserver;
import android.content.pm.IPackageInstallObserver2;
import android.content.pm.IPackageManager;
import android.content.pm.IPackageMoveObserver;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.InstrumentationInfo;
import android.content.pm.ManifestDigest;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageItemInfo;
@@ -44,15 +44,14 @@ import android.content.pm.PermissionInfo;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.ManifestDigest;
import android.content.pm.VerificationParams;
import android.content.pm.VerifierDeviceIdentity;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -1112,47 +1111,36 @@ final class ApplicationPackageManager extends PackageManager {
    @Override
    public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags,
                               String installerPackageName) {
        try {
            mPM.installPackageEtc(packageURI, observer, null, flags, installerPackageName);
        } catch (RemoteException e) {
            // Should never happen!
        }
        final VerificationParams verificationParams = new VerificationParams(null, null,
                null, VerificationParams.NO_UID, null);
        installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags,
                installerPackageName, verificationParams, null);
    }

    @Override
    public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer,
            int flags, String installerPackageName, Uri verificationURI,
            ManifestDigest manifestDigest, ContainerEncryptionParams encryptionParams) {
        try {
            mPM.installPackageWithVerificationEtc(packageURI, observer, null, flags,
                    installerPackageName, verificationURI, manifestDigest, encryptionParams);
        } catch (RemoteException e) {
            // Should never happen!
        }
        final VerificationParams verificationParams = new VerificationParams(verificationURI, null,
                null, VerificationParams.NO_UID, manifestDigest);
        installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags,
                installerPackageName, verificationParams, encryptionParams);
    }

    @Override
    public void installPackageWithVerificationAndEncryption(Uri packageURI,
            IPackageInstallObserver observer, int flags, String installerPackageName,
            VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
        try {
            mPM.installPackageWithVerificationAndEncryptionEtc(packageURI, observer, null,
                    flags, installerPackageName, verificationParams, encryptionParams);
        } catch (RemoteException e) {
            // Should never happen!
        }
        installCommon(packageURI, new LegacyPackageInstallObserver(observer), flags,
                installerPackageName, verificationParams, encryptionParams);
    }

    // Expanded observer-API versions
    @Override
    public void installPackage(Uri packageURI, PackageInstallObserver observer,
            int flags, String installerPackageName) {
        try {
            mPM.installPackageEtc(packageURI, null, observer.getBinder(),
                    flags, installerPackageName);
        } catch (RemoteException e) {
            // Should never happen!
        }
        final VerificationParams verificationParams = new VerificationParams(null, null,
                null, VerificationParams.NO_UID, null);
        installCommon(packageURI, observer, flags, installerPackageName, verificationParams, null);
    }

    @Override
@@ -1160,24 +1148,35 @@ final class ApplicationPackageManager extends PackageManager {
            PackageInstallObserver observer, int flags, String installerPackageName,
            Uri verificationURI, ManifestDigest manifestDigest,
            ContainerEncryptionParams encryptionParams) {
        try {
            mPM.installPackageWithVerificationEtc(packageURI, null, observer.getBinder(), flags,
                    installerPackageName, verificationURI, manifestDigest, encryptionParams);
        } catch (RemoteException e) {
            // Should never happen!
        }
        final VerificationParams verificationParams = new VerificationParams(verificationURI, null,
                null, VerificationParams.NO_UID, manifestDigest);
        installCommon(packageURI, observer, flags, installerPackageName, verificationParams,
                encryptionParams);
    }

    @Override
    public void installPackageWithVerificationAndEncryption(Uri packageURI,
            PackageInstallObserver observer, int flags, String installerPackageName,
            VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
        try {
            mPM.installPackageWithVerificationAndEncryptionEtc(packageURI, null,
                    observer.getBinder(), flags, installerPackageName, verificationParams,
        installCommon(packageURI, observer, flags, installerPackageName, verificationParams,
                encryptionParams);
        } catch (RemoteException e) {
            // Should never happen!
    }

    private void installCommon(Uri packageURI,
            PackageInstallObserver observer, int flags, String installerPackageName,
            VerificationParams verificationParams, ContainerEncryptionParams encryptionParams) {
        if (!"file".equals(packageURI.getScheme())) {
            throw new UnsupportedOperationException("Only file:// URIs are supported");
        }
        if (encryptionParams != null) {
            throw new UnsupportedOperationException("ContainerEncryptionParams not supported");
        }

        final String originPath = packageURI.getPath();
        try {
            mPM.installPackage(originPath, observer.getBinder(), flags, installerPackageName,
                    verificationParams, null);
        } catch (RemoteException ignored) {
        }
    }

@@ -1523,6 +1522,22 @@ final class ApplicationPackageManager extends PackageManager {
        return dr;
    }

    private static class LegacyPackageInstallObserver extends PackageInstallObserver {
        private final IPackageInstallObserver mLegacy;

        public LegacyPackageInstallObserver(IPackageInstallObserver legacy) {
            mLegacy = legacy;
        }

        @Override
        public void packageInstalled(String basePackageName, Bundle extras, int returnCode) {
            try {
                mLegacy.packageInstalled(basePackageName, returnCode);
            } catch (RemoteException ignored) {
            }
        }
    }

    private final ContextImpl mContext;
    private final IPackageManager mPM;

+6 −43
Original line number Diff line number Diff line
@@ -189,18 +189,12 @@ interface IPackageManager {
    List<InstrumentationInfo> queryInstrumentation(
            String targetPackage, int flags);

    /**
     * Install a package.
     *
     * @param packageURI The location of the package file to install.
     * @param observer a callback to use to notify when the package installation in finished.
     * @param flags - possible values: {@link #FORWARD_LOCK_PACKAGE},
     * {@link #REPLACE_EXISITING_PACKAGE}
     * @param installerPackageName Optional package name of the application that is performing the
     * installation. This identifies which market the package came from.
     */
    void installPackage(in Uri packageURI, IPackageInstallObserver observer, int flags,
            in String installerPackageName);
    void installPackage(in String originPath,
            in IPackageInstallObserver2 observer,
            int flags,
            in String installerPackageName,
            in VerificationParams verificationParams,
            in String packageAbiOverride);

    void finishPackageInstall(int token);

@@ -412,37 +406,6 @@ interface IPackageManager {
    boolean setInstallLocation(int loc);
    int getInstallLocation();

    void installPackageWithVerification(in Uri packageURI, in IPackageInstallObserver observer,
            int flags, in String installerPackageName, in Uri verificationURI,
            in ManifestDigest manifestDigest, in ContainerEncryptionParams encryptionParams);

    void installPackageWithVerificationAndEncryption(in Uri packageURI,
            in IPackageInstallObserver observer, int flags, in String installerPackageName,
            in VerificationParams verificationParams,
            in ContainerEncryptionParams encryptionParams);

    /** Expanded observer versions */
    void installPackageEtc(in Uri packageURI, IPackageInstallObserver observer,
            IPackageInstallObserver2 observer2, int flags, in String installerPackageName);

    void installPackageWithVerificationEtc(in Uri packageURI,
            in IPackageInstallObserver observer, IPackageInstallObserver2 observer2,
            int flags, in String installerPackageName, in Uri verificationURI,
            in ManifestDigest manifestDigest, in ContainerEncryptionParams encryptionParams);

    void installPackageWithVerificationAndEncryptionEtc(in Uri packageURI,
            in IPackageInstallObserver observer, in IPackageInstallObserver2 observer2,
            int flags, in String installerPackageName,
            in VerificationParams verificationParams,
            in ContainerEncryptionParams encryptionParams);

    void installPackageWithVerificationEncryptionAndAbiOverrideEtc(in Uri packageURI,
            in IPackageInstallObserver observer, in IPackageInstallObserver2 observer2,
            int flags, in String installerPackageName,
            in VerificationParams verificationParams,
            in ContainerEncryptionParams encryptionParams,
        in String packageAbiOverride);

    int installExistingPackageAsUser(String packageName, int userId);

    void verifyPendingInstall(int id, int verificationCode);
+27 −136

File changed.

Preview size limit exceeded, changes collapsed.