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

Commit 7328a1b3 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Jeff Sharkey
Browse files

Logic to confirm permissions on install sessions.

When an app without INSTALL permission attempts to commit a session,
we involve user to confirm permissions.  We currently point at the
base APK, which defines all permissions for an app, handling the case
where a session may only be adding splits.

Add failure codes to represent rejection.  Fix bug by ignoring stages
during initial boot scan.

Bug: 16515814
Change-Id: I702bb72445216817bcc62b79c83980c1c2bb0120
parent e8e91925
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -8680,6 +8680,7 @@ package android.content.pm {
    field public static final int FAILURE_CONFLICT = 2; // 0x2
    field public static final int FAILURE_INCOMPATIBLE = 4; // 0x4
    field public static final int FAILURE_INVALID = 1; // 0x1
    field public static final int FAILURE_REJECTED = 5; // 0x5
    field public static final int FAILURE_STORAGE = 3; // 0x3
    field public static final int FAILURE_UNKNOWN = 0; // 0x0
  }
+2 −0
Original line number Diff line number Diff line
@@ -36,4 +36,6 @@ interface IPackageInstaller {

    void uninstall(String packageName, int flags, in IPackageDeleteObserver2 observer, int userId);
    void uninstallSplit(String packageName, String splitName, int flags, in IPackageDeleteObserver2 observer, int userId);

    void setPermissionsResult(int sessionId, boolean accepted);
}
+8 −1
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package android.content.pm;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Intent;
import android.graphics.Bitmap;
@@ -33,8 +32,12 @@ public class InstallSessionInfo implements Parcelable {
    /** {@hide} */
    public String installerPackageName;
    /** {@hide} */
    public String resolvedBaseCodePath;
    /** {@hide} */
    public float progress;
    /** {@hide} */
    public boolean sealed;
    /** {@hide} */
    public boolean open;

    /** {@hide} */
@@ -56,7 +59,9 @@ public class InstallSessionInfo implements Parcelable {
    public InstallSessionInfo(Parcel source) {
        sessionId = source.readInt();
        installerPackageName = source.readString();
        resolvedBaseCodePath = source.readString();
        progress = source.readFloat();
        sealed = source.readInt() != 0;
        open = source.readInt() != 0;

        mode = source.readInt();
@@ -149,7 +154,9 @@ public class InstallSessionInfo implements Parcelable {
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(sessionId);
        dest.writeString(installerPackageName);
        dest.writeString(resolvedBaseCodePath);
        dest.writeFloat(progress);
        dest.writeInt(sealed ? 1 : 0);
        dest.writeInt(open ? 1 : 0);

        dest.writeInt(mode);
+24 −3
Original line number Diff line number Diff line
@@ -81,6 +81,10 @@ public class PackageInstaller {
    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    public static final String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS";

    /** {@hide} */
    public static final String
            ACTION_CONFIRM_PERMISSIONS = "android.content.pm.action.CONFIRM_PERMISSIONS";

    /**
     * An integer session ID.
     *
@@ -206,6 +210,15 @@ public class PackageInstaller {
        }
    }

    /** {@hide} */
    public void setPermissionsResult(int sessionId, boolean accepted) {
        try {
            mInstaller.setPermissionsResult(sessionId, accepted);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
        }
    }

    /**
     * Events for observing session lifecycle.
     * <p>
@@ -603,9 +616,8 @@ public class PackageInstaller {
         * permission, incompatible certificates, etc. The user may be able to
         * uninstall another app to fix the issue.
         * <p>
         * The extras bundle may contain {@link #EXTRA_PACKAGE_NAME} if one
         * specific package was identified as the cause of the conflict. If
         * unknown, or multiple packages, the extra may be {@code null}.
         * The extras bundle may contain {@link #EXTRA_PACKAGE_NAME} with the
         * specific packages identified as the cause of the conflict.
         */
        public static final int FAILURE_CONFLICT = 2;

@@ -626,6 +638,15 @@ public class PackageInstaller {
         */
        public static final int FAILURE_INCOMPATIBLE = 4;

        /**
         * This install session failed because it was rejected. For example, the
         * user declined requested permissions, or a package verifier rejected
         * the session.
         *
         * @see PackageManager#VERIFICATION_REJECT
         */
        public static final int FAILURE_REJECTED = 5;

        public static final String EXTRA_PACKAGE_NAME = "android.content.pm.extra.PACKAGE_NAME";

        /**
+7 −2
Original line number Diff line number Diff line
@@ -770,6 +770,9 @@ public abstract class PackageManager {
     */
    public static final int NO_NATIVE_LIBRARIES = -114;

    /** {@hide} */
    public static final int INSTALL_FAILED_REJECTED = -115;

    /**
     * Flag parameter for {@link #deletePackage} to indicate that you don't want to delete the
     * package's data directory.
@@ -3830,6 +3833,7 @@ public abstract class PackageManager {
            case INSTALL_FAILED_USER_RESTRICTED: return "INSTALL_FAILED_USER_RESTRICTED";
            case INSTALL_FAILED_DUPLICATE_PERMISSION: return "INSTALL_FAILED_DUPLICATE_PERMISSION";
            case INSTALL_FAILED_NO_MATCHING_ABIS: return "INSTALL_FAILED_NO_MATCHING_ABIS";
            case INSTALL_FAILED_REJECTED: return "INSTALL_FAILED_REJECTED";
            default: return Integer.toString(status);
        }
    }
@@ -3857,8 +3861,8 @@ public abstract class PackageManager {
            case INSTALL_FAILED_CONTAINER_ERROR: return CommitCallback.FAILURE_STORAGE;
            case INSTALL_FAILED_INVALID_INSTALL_LOCATION: return CommitCallback.FAILURE_STORAGE;
            case INSTALL_FAILED_MEDIA_UNAVAILABLE: return CommitCallback.FAILURE_STORAGE;
            case INSTALL_FAILED_VERIFICATION_TIMEOUT: return CommitCallback.FAILURE_UNKNOWN;
            case INSTALL_FAILED_VERIFICATION_FAILURE: return CommitCallback.FAILURE_UNKNOWN;
            case INSTALL_FAILED_VERIFICATION_TIMEOUT: return CommitCallback.FAILURE_REJECTED;
            case INSTALL_FAILED_VERIFICATION_FAILURE: return CommitCallback.FAILURE_REJECTED;
            case INSTALL_FAILED_PACKAGE_CHANGED: return CommitCallback.FAILURE_INVALID;
            case INSTALL_FAILED_UID_CHANGED: return CommitCallback.FAILURE_INVALID;
            case INSTALL_FAILED_VERSION_DOWNGRADE: return CommitCallback.FAILURE_INVALID;
@@ -3876,6 +3880,7 @@ public abstract class PackageManager {
            case INSTALL_FAILED_USER_RESTRICTED: return CommitCallback.FAILURE_INCOMPATIBLE;
            case INSTALL_FAILED_DUPLICATE_PERMISSION: return CommitCallback.FAILURE_CONFLICT;
            case INSTALL_FAILED_NO_MATCHING_ABIS: return CommitCallback.FAILURE_INCOMPATIBLE;
            case INSTALL_FAILED_REJECTED: return CommitCallback.FAILURE_REJECTED;
            default: return CommitCallback.FAILURE_UNKNOWN;
        }
    }
Loading