diff options
6 files changed, 40 insertions, 16 deletions
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 31c9348c8127..09e79860b45c 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -222,6 +222,14 @@ public abstract class PackageManagerInternal { int callingUid); /** + * Like {@link #getInstalledApplications}, but allows the fetching of apps + * cross user. + */ + public abstract List<ApplicationInfo> getInstalledApplicationsCrossUser( + @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId, + int callingUid); + + /** * Retrieve launcher extras for a suspended package provided to the system in * {@link PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle, * PersistableBundle, String)}. diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java index c36c8caf8b19..bd725ed49f3c 100644 --- a/services/core/java/com/android/server/pm/Computer.java +++ b/services/core/java/com/android/server/pm/Computer.java @@ -477,7 +477,7 @@ public interface Computer extends PackageDataSnapshot { @NonNull List<ApplicationInfo> getInstalledApplications( @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId, - int callingUid); + int callingUid, boolean forceAllowCrossUser); @Nullable ProviderInfo resolveContentProvider(@NonNull String name, diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index 2ae10051182d..2dc3fb7464fd 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -4640,7 +4640,7 @@ public class ComputerEngine implements Computer { @Override public List<ApplicationInfo> getInstalledApplications( @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId, - int callingUid) { + int callingUid, boolean forceAllowCrossUser) { if (getInstantAppPackageName(callingUid) != null) { return Collections.emptyList(); } @@ -4650,12 +4650,14 @@ public class ComputerEngine implements Computer { final boolean listApex = (flags & MATCH_APEX) != 0; final boolean listArchivedOnly = !listUninstalled && (flags & MATCH_ARCHIVED_PACKAGES) != 0; - enforceCrossUserPermission( - callingUid, - userId, - false /* requireFullPermission */, - false /* checkShell */, - "get installed application info"); + if (!forceAllowCrossUser) { + enforceCrossUserPermission( + callingUid, + userId, + false /* requireFullPermission */, + false /* checkShell */, + "get installed application info"); + } ArrayList<ApplicationInfo> list; final ArrayMap<String, ? extends PackageStateInternal> packageStates = diff --git a/services/core/java/com/android/server/pm/IPackageManagerBase.java b/services/core/java/com/android/server/pm/IPackageManagerBase.java index 9a0306b77c41..24a33f1949fa 100644 --- a/services/core/java/com/android/server/pm/IPackageManagerBase.java +++ b/services/core/java/com/android/server/pm/IPackageManagerBase.java @@ -476,7 +476,8 @@ public abstract class IPackageManagerBase extends IPackageManager.Stub { @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { final int callingUid = Binder.getCallingUid(); return new ParceledListSlice<>( - snapshot().getInstalledApplications(flags, userId, callingUid)); + snapshot().getInstalledApplications(flags, userId, callingUid, + /* forceAllowCrossUser= */ false)); } @Override diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index b80c0094ffb9..58c1c0564f95 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -769,6 +769,9 @@ public class LauncherAppsService extends SystemService { @NonNull private List<LauncherActivityInfoInternal> generateLauncherActivitiesForArchivedApp( @Nullable String packageName, UserHandle user) { + if (!canAccessProfile(user.getIdentifier(), "Cannot retrieve activities")) { + return List.of(); + } List<ApplicationInfo> applicationInfoList = (packageName == null) ? getApplicationInfoListForAllArchivedApps(user) @@ -827,7 +830,7 @@ public class LauncherAppsService extends SystemService { private List<ApplicationInfo> getApplicationInfoListForAllArchivedApps(UserHandle user) { final int callingUid = injectBinderCallingUid(); List<ApplicationInfo> installedApplicationInfoList = - mPackageManagerInternal.getInstalledApplications( + mPackageManagerInternal.getInstalledApplicationsCrossUser( PackageManager.MATCH_ARCHIVED_PACKAGES, user.getIdentifier(), callingUid); @@ -845,11 +848,12 @@ public class LauncherAppsService extends SystemService { private List<ApplicationInfo> getApplicationInfoForArchivedApp( @NonNull String packageName, UserHandle user) { final int callingUid = injectBinderCallingUid(); - ApplicationInfo applicationInfo = mPackageManagerInternal.getApplicationInfo( - packageName, - PackageManager.MATCH_ARCHIVED_PACKAGES, - callingUid, - user.getIdentifier()); + ApplicationInfo applicationInfo = Binder.withCleanCallingIdentity(() -> + mPackageManagerInternal.getApplicationInfo( + packageName, + PackageManager.MATCH_ARCHIVED_PACKAGES, + callingUid, + user.getIdentifier())); if (applicationInfo == null || !applicationInfo.isArchived) { return Collections.EMPTY_LIST; } diff --git a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java index b281808e89b6..1e7d0437d99e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java +++ b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java @@ -97,7 +97,16 @@ abstract class PackageManagerInternalBase extends PackageManagerInternal { @Deprecated public final List<ApplicationInfo> getInstalledApplications( @PackageManager.ApplicationInfoFlagsBits long flags, int userId, int callingUid) { - return snapshot().getInstalledApplications(flags, userId, callingUid); + return snapshot().getInstalledApplications(flags, userId, callingUid, + /* forceAllowCrossUser= */ false); + } + + @Override + @Deprecated + public final List<ApplicationInfo> getInstalledApplicationsCrossUser( + @PackageManager.ApplicationInfoFlagsBits long flags, int userId, int callingUid) { + return snapshot().getInstalledApplications(flags, userId, callingUid, + /* forceAllowCrossUser= */ true); } @Override |