summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Svetoslav <svetoslavganov@google.com> 2015-05-19 23:30:47 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2015-05-19 23:30:48 +0000
commit6d9a53abbc94788dc02f7ebde30744753e0a5a3d (patch)
tree3ae8494d99c0ee3299f2cd521d8cc0a7079d9282
parente56cce575bc75674a1929700a8975afc280b1ae8 (diff)
parenta1d0f3031f3aff9c17c0bd6e1bdfd788a2b79ab9 (diff)
Merge "Handle downgrading a runtime permission to an install one" into mnc-dev
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java31
1 files changed, 28 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index a37172412b8a..28a786a2e9fc 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -369,11 +369,14 @@ public class PackageManagerService extends IPackageManager.Stub {
/** Permission grant: grant the permission as an install permission. */
private static final int GRANT_INSTALL = 2;
+ /** Permission grant: grant the permission as an install permission for a legacy app. */
+ private static final int GRANT_INSTALL_LEGACY = 3;
+
/** Permission grant: grant the permission as a runtime one. */
- private static final int GRANT_RUNTIME = 3;
+ private static final int GRANT_RUNTIME = 4;
/** Permission grant: grant as runtime a permission that was granted as an install time one. */
- private static final int GRANT_UPGRADE = 4;
+ private static final int GRANT_UPGRADE = 5;
final ServiceThread mHandlerThread;
@@ -7741,7 +7744,7 @@ public class PackageManagerService extends IPackageManager.Stub {
case PermissionInfo.PROTECTION_DANGEROUS: {
if (pkg.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1) {
// For legacy apps dangerous permissions are install time ones.
- grant = GRANT_INSTALL;
+ grant = GRANT_INSTALL_LEGACY;
} else if (ps.isSystem()) {
final int[] updatedUserIds = ps.getPermissionsUpdatedForUserIds();
if (origPermissions.hasInstallPermission(bp.name)) {
@@ -7801,6 +7804,28 @@ public class PackageManagerService extends IPackageManager.Stub {
switch (grant) {
case GRANT_INSTALL: {
+ // Revoke this as runtime permission to handle the case of
+ // a runtime permssion being downgraded to an install one.
+ for (int userId : UserManagerService.getInstance().getUserIds()) {
+ if (origPermissions.getRuntimePermissionState(
+ bp.name, userId) != null) {
+ // Revoke the runtime permission and clear the flags.
+ origPermissions.revokeRuntimePermission(bp, userId);
+ origPermissions.updatePermissionFlags(bp, userId,
+ PackageManager.MASK_PERMISSION_FLAGS, 0);
+ // If we revoked a permission permission, we have to write.
+ changedRuntimePermissionUserIds = ArrayUtils.appendInt(
+ changedRuntimePermissionUserIds, userId);
+ }
+ }
+ // Grant an install permission.
+ if (permissionsState.grantInstallPermission(bp) !=
+ PermissionsState.PERMISSION_OPERATION_FAILURE) {
+ changedInstallPermission = true;
+ }
+ } break;
+
+ case GRANT_INSTALL_LEGACY: {
// Grant an install permission.
if (permissionsState.grantInstallPermission(bp) !=
PermissionsState.PERMISSION_OPERATION_FAILURE) {