diff options
author | Jeff Sharkey <jsharkey@android.com> | 2014-08-07 14:01:43 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@google.com> | 2014-08-07 22:40:38 +0000 |
commit | 7328a1b39b3dae1c0cd390c0a3695c6a46b8e9d8 (patch) | |
tree | 7aae8c8c52ed75fcd9fdfbe7c0a3743e6afd3a66 /core/java/android/content | |
parent | e8e91925074479fc06310418b58b54f49d051801 (diff) | |
download | frameworks_base-7328a1b39b3dae1c0cd390c0a3695c6a46b8e9d8.zip frameworks_base-7328a1b39b3dae1c0cd390c0a3695c6a46b8e9d8.tar.gz frameworks_base-7328a1b39b3dae1c0cd390c0a3695c6a46b8e9d8.tar.bz2 |
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
Diffstat (limited to 'core/java/android/content')
4 files changed, 41 insertions, 6 deletions
diff --git a/core/java/android/content/pm/IPackageInstaller.aidl b/core/java/android/content/pm/IPackageInstaller.aidl index cc0d569..5223476 100644 --- a/core/java/android/content/pm/IPackageInstaller.aidl +++ b/core/java/android/content/pm/IPackageInstaller.aidl @@ -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); } diff --git a/core/java/android/content/pm/InstallSessionInfo.java b/core/java/android/content/pm/InstallSessionInfo.java index f263885..161bcde 100644 --- a/core/java/android/content/pm/InstallSessionInfo.java +++ b/core/java/android/content/pm/InstallSessionInfo.java @@ -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); diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 01c080d..525142b 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -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"; /** diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 1e4ed31..d5604cb 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -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; } } |