From a90c8def2c6762bc6e5396b78c43e65e4b05079d Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 7 Jul 2015 17:25:25 -0700 Subject: [PATCH] Add new "preinstalled" permission flag. This allows you to specify that a permission can be granted to any pre-installed system app (not just privileged ones). And as long as I am doing this, clean up the old "system" permission flag, renaming it to "privileged" which is what it really is today, deprecating the old names. And switch the platform's permission declarations to use the new name. Change-Id: Iabf484746af232144786851ec7fe90e3de9dddb2 --- api/current.txt | 6 +- api/system-current.txt | 6 +- .../android/content/pm/PermissionInfo.java | 29 ++- core/res/AndroidManifest.xml | 240 +++++++++--------- core/res/res/values/attrs_manifest.xml | 8 +- .../server/pm/PackageManagerService.java | 60 +++-- 6 files changed, 191 insertions(+), 158 deletions(-) diff --git a/api/current.txt b/api/current.txt index 2e2cae692c9f6..399c1df7e8ece 100644 --- a/api/current.txt +++ b/api/current.txt @@ -9443,13 +9443,15 @@ package android.content.pm { field public static final int PROTECTION_FLAG_DEVELOPMENT = 32; // 0x20 field public static final int PROTECTION_FLAG_INSTALLER = 256; // 0x100 field public static final int PROTECTION_FLAG_PRE23 = 128; // 0x80 - field public static final int PROTECTION_FLAG_SYSTEM = 16; // 0x10 + field public static final int PROTECTION_FLAG_PREINSTALLED = 1024; // 0x400 + field public static final int PROTECTION_FLAG_PRIVILEGED = 16; // 0x10 + field public static final deprecated int PROTECTION_FLAG_SYSTEM = 16; // 0x10 field public static final int PROTECTION_FLAG_VERIFIER = 512; // 0x200 field public static final int PROTECTION_MASK_BASE = 15; // 0xf field public static final int PROTECTION_MASK_FLAGS = 4080; // 0xff0 field public static final int PROTECTION_NORMAL = 0; // 0x0 field public static final int PROTECTION_SIGNATURE = 2; // 0x2 - field public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3; // 0x3 + field public static final deprecated int PROTECTION_SIGNATURE_OR_SYSTEM = 3; // 0x3 field public int descriptionRes; field public int flags; field public java.lang.String group; diff --git a/api/system-current.txt b/api/system-current.txt index e84ad3d21eb89..e64567cd18cf1 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -9778,13 +9778,15 @@ package android.content.pm { field public static final int PROTECTION_FLAG_DEVELOPMENT = 32; // 0x20 field public static final int PROTECTION_FLAG_INSTALLER = 256; // 0x100 field public static final int PROTECTION_FLAG_PRE23 = 128; // 0x80 - field public static final int PROTECTION_FLAG_SYSTEM = 16; // 0x10 + field public static final int PROTECTION_FLAG_PREINSTALLED = 1024; // 0x400 + field public static final int PROTECTION_FLAG_PRIVILEGED = 16; // 0x10 + field public static final deprecated int PROTECTION_FLAG_SYSTEM = 16; // 0x10 field public static final int PROTECTION_FLAG_VERIFIER = 512; // 0x200 field public static final int PROTECTION_MASK_BASE = 15; // 0xf field public static final int PROTECTION_MASK_FLAGS = 4080; // 0xff0 field public static final int PROTECTION_NORMAL = 0; // 0x0 field public static final int PROTECTION_SIGNATURE = 2; // 0x2 - field public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3; // 0x3 + field public static final deprecated int PROTECTION_SIGNATURE_OR_SYSTEM = 3; // 0x3 field public int descriptionRes; field public int flags; field public java.lang.String group; diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java index 1857ecfa53bb7..2828d83bcdae0 100644 --- a/core/java/android/content/pm/PermissionInfo.java +++ b/core/java/android/content/pm/PermissionInfo.java @@ -48,17 +48,25 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { public static final int PROTECTION_SIGNATURE = 2; /** - * System-level value for {@link #protectionLevel}, corresponding - * to the signatureOrSystem value of - * {@link android.R.attr#protectionLevel}. + * @deprecated Use {@link #PROTECTION_SIGNATURE}|{@link #PROTECTION_FLAG_PRIVILEGED} + * instead. */ + @Deprecated public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3; /** * Additional flag for {@link #protectionLevel}, corresponding - * to the system value of + * to the privileged value of * {@link android.R.attr#protectionLevel}. */ + public static final int PROTECTION_FLAG_PRIVILEGED = 0x10; + + /** + * @deprecated Old name for {@link #PROTECTION_FLAG_PRIVILEGED}, which + * is now very confusing because it only applies to privileged apps, not all + * apps on the system image. + */ + @Deprecated public static final int PROTECTION_FLAG_SYSTEM = 0x10; /** @@ -96,6 +104,13 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { */ public static final int PROTECTION_FLAG_VERIFIER = 0x200; + /** + * Additional flag for {@link #protectionLevel}, corresponding + * to the preinstalled value of + * {@link android.R.attr#protectionLevel}. + */ + public static final int PROTECTION_FLAG_PREINSTALLED = 0x400; + /** * Mask for {@link #protectionLevel}: the basic protection type. */ @@ -161,7 +176,7 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { /** @hide */ public static int fixProtectionLevel(int level) { if (level == PROTECTION_SIGNATURE_OR_SYSTEM) { - level = PROTECTION_SIGNATURE | PROTECTION_FLAG_SYSTEM; + level = PROTECTION_SIGNATURE | PROTECTION_FLAG_PRIVILEGED; } return level; } @@ -183,8 +198,8 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { protLevel = "signatureOrSystem"; break; } - if ((level&PermissionInfo.PROTECTION_FLAG_SYSTEM) != 0) { - protLevel += "|system"; + if ((level&PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0) { + protLevel += "|privileged"; } if ((level&PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) { protLevel += "|development"; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index e18e44cf316c4..074d1bd0394e9 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -785,31 +785,31 @@ to handle the respond-via-message action during incoming calls.

Not for use by third-party applications. --> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -857,19 +857,19 @@ + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -1002,22 +1002,22 @@ + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -1105,13 +1105,13 @@ + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -1139,19 +1139,19 @@ @hide This should only be used by OEM's TvInputService's. --> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -1166,7 +1166,7 @@ + android:protectionLevel="signature|privileged" /> @@ -1177,12 +1177,12 @@ a camera is in use by an application. @hide --> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -1193,17 +1193,17 @@ Does not include placing calls.

Not for use by third-party applications. --> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged|development" /> + android:protectionLevel="signature|privileged" /> @@ -1362,7 +1362,7 @@ + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -1404,7 +1404,7 @@ + android:protectionLevel="signature|preinstalled|appop|pre23" /> @@ -1435,7 +1435,7 @@ + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged|development" /> Not for use by third-party applications. --> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged|development" /> @@ -1637,7 +1637,7 @@ + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -1683,7 +1683,7 @@ it off to the various individual installer components @hide --> + android:protectionLevel="signature|privileged" /> @@ -1693,40 +1693,40 @@ + android:protectionLevel="signature|privileged|development" /> + android:protectionLevel="signature|privileged|development" /> + android:protectionLevel="signature|privileged|development" /> + android:protectionLevel="signature|privileged|development" /> + android:protectionLevel="signature|privileged|development" /> + android:protectionLevel="signature|privileged|development" /> + android:protectionLevel="signature|privileged|development" /> @@ -1742,7 +1742,7 @@ and its icons.

Not for use by third-party applications. --> + android:protectionLevel="signature|privileged" /> @@ -1760,16 +1760,16 @@ + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged|development" /> + android:protectionLevel="signature|privileged|installer" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -2081,40 +2081,40 @@

Not for use by third-party applications.

@hide --> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> Not for use by third-party applications. @hide --> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged|development|appop" /> + android:protectionLevel="signature|privileged|development" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -2348,7 +2348,7 @@ by system services like download manager and media server. Not for use by third party apps. @hide --> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> @@ -2514,11 +2514,11 @@ + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> + android:protectionLevel="signature|privileged" /> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index c501329b6ab3c..1515703ec08b7 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -200,7 +200,7 @@ together. --> + + @@ -226,6 +228,10 @@ + + diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9c0d408c7aff4..124214c84b5f2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8430,7 +8430,7 @@ public class PackageManagerService extends IPackageManager.Stub { || (compareSignatures(mPlatformPackage.mSignatures, pkg.mSignatures) == PackageManager.SIGNATURE_MATCH); if (!allowed && (bp.protectionLevel - & PermissionInfo.PROTECTION_FLAG_SYSTEM) != 0) { + & PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0) { if (isSystemApp(pkg)) { // For updated system applications, a system permission // is granted only if it had been defined by the original application. @@ -8467,31 +8467,39 @@ public class PackageManagerService extends IPackageManager.Stub { } } } - if (!allowed && (bp.protectionLevel - & PermissionInfo.PROTECTION_FLAG_PRE23) != 0 - && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.MNC) { - // If this was a previously normal/dangerous permission that got moved - // to a system permission as part of the runtime permission redesign, then - // we still want to blindly grant it to old apps. - allowed = true; - } - if (!allowed && (bp.protectionLevel & PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0 - && pkg.packageName.equals(mRequiredInstallerPackage)) { - // If this permission is to be granted to the system installer and - // this app is an installer, then it gets the permission. - allowed = true; - } - if (!allowed && (bp.protectionLevel & PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0 - && pkg.packageName.equals(mRequiredVerifierPackage)) { - // If this permission is to be granted to the system verifier and - // this app is a verifier, then it gets the permission. - allowed = true; - } - if (!allowed && (bp.protectionLevel - & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) { - // For development permissions, a development permission - // is granted only if it was already granted. - allowed = origPermissions.hasInstallPermission(perm); + if (!allowed) { + if (!allowed && (bp.protectionLevel + & PermissionInfo.PROTECTION_FLAG_PRE23) != 0 + && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.MNC) { + // If this was a previously normal/dangerous permission that got moved + // to a system permission as part of the runtime permission redesign, then + // we still want to blindly grant it to old apps. + allowed = true; + } + if (!allowed && (bp.protectionLevel & PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0 + && pkg.packageName.equals(mRequiredInstallerPackage)) { + // If this permission is to be granted to the system installer and + // this app is an installer, then it gets the permission. + allowed = true; + } + if (!allowed && (bp.protectionLevel & PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0 + && pkg.packageName.equals(mRequiredVerifierPackage)) { + // If this permission is to be granted to the system verifier and + // this app is a verifier, then it gets the permission. + allowed = true; + } + if (!allowed && (bp.protectionLevel + & PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0 + && isSystemApp(pkg)) { + // Any pre-installed system app is allowed to get this permission. + allowed = true; + } + if (!allowed && (bp.protectionLevel + & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) { + // For development permissions, a development permission + // is granted only if it was already granted. + allowed = origPermissions.hasInstallPermission(perm); + } } return allowed; }