diff options
| -rw-r--r-- | api/current.txt | 1 | ||||
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | api/test-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/content/pm/PermissionInfo.java | 10 | ||||
| -rw-r--r-- | core/res/res/values/attrs_manifest.xml | 3 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java | 6 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 23 |
7 files changed, 41 insertions, 4 deletions
diff --git a/api/current.txt b/api/current.txt index c81284b1af46..81ebe5de70fa 100644 --- a/api/current.txt +++ b/api/current.txt @@ -9916,6 +9916,7 @@ package android.content.pm { field public static final int PROTECTION_FLAG_PRE23 = 128; // 0x80 field public static final int PROTECTION_FLAG_PREINSTALLED = 1024; // 0x400 field public static final int PROTECTION_FLAG_PRIVILEGED = 16; // 0x10 + field public static final int PROTECTION_FLAG_SETUP = 2048; // 0x800 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 diff --git a/api/system-current.txt b/api/system-current.txt index 071d1f123ebe..da0e6d2ee2f1 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -10314,6 +10314,7 @@ package android.content.pm { field public static final int PROTECTION_FLAG_PRE23 = 128; // 0x80 field public static final int PROTECTION_FLAG_PREINSTALLED = 1024; // 0x400 field public static final int PROTECTION_FLAG_PRIVILEGED = 16; // 0x10 + field public static final int PROTECTION_FLAG_SETUP = 2048; // 0x800 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 diff --git a/api/test-current.txt b/api/test-current.txt index 821614631d65..db66a7fc2706 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -9926,6 +9926,7 @@ package android.content.pm { field public static final int PROTECTION_FLAG_PRE23 = 128; // 0x80 field public static final int PROTECTION_FLAG_PREINSTALLED = 1024; // 0x400 field public static final int PROTECTION_FLAG_PRIVILEGED = 16; // 0x10 + field public static final int PROTECTION_FLAG_SETUP = 2048; // 0x800 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 diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java index 984a960b5308..65e0b9204726 100644 --- a/core/java/android/content/pm/PermissionInfo.java +++ b/core/java/android/content/pm/PermissionInfo.java @@ -113,6 +113,13 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { public static final int PROTECTION_FLAG_PREINSTALLED = 0x400; /** + * Additional flag for {@link #protectionLevel}, corresponding + * to the <code>setup</code> value of + * {@link android.R.attr#protectionLevel}. + */ + public static final int PROTECTION_FLAG_SETUP = 0x800; + + /** * Mask for {@link #protectionLevel}: the basic protection type. */ public static final int PROTECTION_MASK_BASE = 0xf; @@ -226,6 +233,9 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { if ((level&PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0) { protLevel += "|preinstalled"; } + if ((level&PermissionInfo.PROTECTION_FLAG_SETUP) != 0) { + protLevel += "|setup"; + } return protLevel; } diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index d1c08958f934..5b4364d45c73 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -225,6 +225,9 @@ granted any application pre-installed on the system image (not just privileged apps). --> <flag name="preinstalled" value="0x400" /> + <!-- Additional flag from base permission type: this permission can be automatically + granted to the setup wizard app --> + <flag name="setup" value="0x800" /> </attr> <!-- Flags indicating more context for a permission group. --> diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java index 13a96ae50cbf..e496132a7451 100644 --- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java @@ -247,10 +247,8 @@ final class DefaultPermissionGrantPolicy { } // SetupWizard - Intent setupIntent = new Intent(Intent.ACTION_MAIN); - setupIntent.addCategory(Intent.CATEGORY_SETUP_WIZARD); - PackageParser.Package setupPackage = getDefaultSystemHandlerActivityPackageLPr( - setupIntent, userId); + PackageParser.Package setupPackage = getSystemPackageLPr( + mService.mSetupWizardPackage); if (setupPackage != null && doesPackageSupportRuntimePermissions(setupPackage)) { grantRuntimePermissionsLPw(setupPackage, PHONE_PERMISSIONS, userId); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index fdbbd853a6ec..a2a7c0d0f6ae 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1034,6 +1034,7 @@ public class PackageManagerService extends IPackageManager.Stub { final @Nullable String mRequiredVerifierPackage; final @Nullable String mRequiredInstallerPackage; + final @Nullable String mSetupWizardPackage; private final PackageUsage mPackageUsage = new PackageUsage(); @@ -2529,6 +2530,7 @@ public class PackageManagerService extends IPackageManager.Stub { } mInstallerService = new PackageInstallerService(context, this); + mSetupWizardPackage = getSetupWizardPackageName(); final ComponentName ephemeralResolverComponent = getEphemeralResolverLPr(); final ComponentName ephemeralInstallerComponent = getEphemeralInstallerLPr(); @@ -9701,6 +9703,12 @@ public class PackageManagerService extends IPackageManager.Stub { // is granted only if it was already granted. allowed = origPermissions.hasInstallPermission(perm); } + if (!allowed && (bp.protectionLevel & PermissionInfo.PROTECTION_FLAG_SETUP) != 0 + && pkg.packageName.equals(mSetupWizardPackage)) { + // If this permission is to be granted to the system setup wizard and + // this app is a setup wizard, then it gets the permission. + allowed = true; + } } return allowed; } @@ -16620,6 +16628,21 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); set, comp, userId); } + private @Nullable String getSetupWizardPackageName() { + final Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_SETUP_WIZARD); + + final List<ResolveInfo> matches = queryIntentActivitiesInternal(intent, null, + MATCH_SYSTEM_ONLY | MATCH_DISABLED_COMPONENTS, UserHandle.myUserId()); + if (matches.size() == 1) { + return matches.get(0).getComponentInfo().packageName; + } else { + Slog.e(TAG, "There should probably be exactly one setup wizard; found " + matches.size() + + ": matches=" + matches); + return null; + } + } + @Override public void setApplicationEnabledSetting(String appPackageName, int newState, int flags, int userId, String callingPackage) { |