From 08a04878b0d6ed4c661330751ac253c0b18ef537 Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Tue, 22 Nov 2016 14:07:45 -0800 Subject: [PATCH] Require INSTALL_PACKAGES permission Although it's not technically necessary for the ephemeral installer to hold the INSTALL_PACKAGES permission, it leads to a pretty poor experience -- the user has to confirm ephemeral installation -- which is a primary reason for ephemeral apps. Change-Id: Ic3f947d677964521cd4742f66c1c3fe808c4c55a Fixes: 33073519 Test: manual; installed packages w/ and w/o INSTALL_PACKAGES and only the apps with INSTALL_PACKAGES were made the installer --- .../com/android/server/pm/PackageManagerService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ee3f42b7808ee..c1f755be9ee30 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2925,6 +2925,18 @@ public class PackageManagerService extends IPackageManager.Stub { | (!Build.IS_DEBUGGABLE ? MATCH_SYSTEM_ONLY : 0); final List matches = queryIntentActivitiesInternal(intent, PACKAGE_MIME_TYPE, resolveFlags, UserHandle.USER_SYSTEM); + Iterator iter = matches.iterator(); + while (iter.hasNext()) { + final ResolveInfo rInfo = iter.next(); + final PackageSetting ps = mSettings.mPackages.get(rInfo.activityInfo.packageName); + if (ps != null) { + final PermissionsState permissionsState = ps.getPermissionsState(); + if (permissionsState.hasPermission(Manifest.permission.INSTALL_PACKAGES, 0)) { + continue; + } + } + iter.remove(); + } if (matches.size() == 0) { return null; } else if (matches.size() == 1) {