diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index eb3d37d6e14fa..7f198975db053 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -764,6 +764,7 @@ public abstract class PackageManager { MATCH_DISABLED_UNTIL_USED_COMPONENTS, MATCH_SYSTEM_ONLY, MATCH_FACTORY_ONLY, + MATCH_ANY_USER, MATCH_DEBUG_TRIAGED_MISSING, MATCH_INSTANT, MATCH_APEX, diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index a3b4a0f51c755..a510d1663298a 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -490,7 +490,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mMainHandler, context, new PolicyWarningUIController.NotificationController(context)); mSecurityPolicy = new AccessibilitySecurityPolicy(policyWarningUIController, mContext, - this); + this, LocalServices.getService(PackageManagerInternal.class)); mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler, mWindowManagerService, this, mSecurityPolicy, this, mTraceManager); mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java b/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java index 88656239e59b8..93356263b897a 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilitySecurityPolicy.java @@ -29,6 +29,7 @@ import android.appwidget.AppWidgetManagerInternal; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; @@ -99,6 +100,7 @@ public class AccessibilitySecurityPolicy { private final Context mContext; private final PackageManager mPackageManager; + private final PackageManagerInternal mPackageManagerInternal; private final UserManager mUserManager; private final AppOpsManager mAppOpsManager; private final AccessibilityUserManager mAccessibilityUserManager; @@ -116,10 +118,12 @@ public class AccessibilitySecurityPolicy { */ public AccessibilitySecurityPolicy(PolicyWarningUIController policyWarningUIController, @NonNull Context context, - @NonNull AccessibilityUserManager a11yUserManager) { + @NonNull AccessibilityUserManager a11yUserManager, + @NonNull PackageManagerInternal packageManagerInternal) { mContext = context; mAccessibilityUserManager = a11yUserManager; mPackageManager = mContext.getPackageManager(); + mPackageManagerInternal = packageManagerInternal; mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mPolicyWarningUIController = policyWarningUIController; @@ -515,10 +519,8 @@ public class AccessibilitySecurityPolicy { try { // Since we treat calls from a profile as if made by its parent, using // MATCH_ANY_USER to query the uid of the given package name. - return uid == mPackageManager.getPackageUidAsUser( - packageName, PackageManager.MATCH_ANY_USER, UserHandle.getUserId(uid)); - } catch (PackageManager.NameNotFoundException e) { - return false; + return mPackageManagerInternal.isSameApp(packageName, PackageManager.MATCH_ANY_USER, + uid, UserHandle.getUserId(uid)); } finally { Binder.restoreCallingIdentity(token); } diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 22ac22d0d6990..a305ed36e4d1d 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -153,17 +153,25 @@ public abstract class PackageManagerInternal { public abstract boolean isPermissionsReviewRequired(String packageName, int userId); + /** + * Variant of {@link #isSameApp(String, long, int, int)} with no flags. + * @see #isSameApp(String, long, int, int) + */ + public abstract boolean isSameApp(String packageName, int callingUid, int userId); + /** * Gets whether a given package name belongs to the calling uid. If the calling uid is an * {@link Process#isSdkSandboxUid(int) sdk sandbox uid}, checks whether the package name is * equal to {@link PackageManager#getSdkSandboxPackageName()}. * * @param packageName The package name to check. + * @param flags The PackageInfoFlagsBits flags to use during uid lookup. * @param callingUid The calling uid. * @param userId The user under which to check. * @return True if the package name belongs to the calling uid. */ - public abstract boolean isSameApp(String packageName, int callingUid, int userId); + public abstract boolean isSameApp(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int callingUid, int userId); /** * Retrieve all of the information we know about a particular package/application. diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index b5108af6d2f8f..4564b8072cb7c 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -6837,6 +6837,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) { + return isSameApp(packageName, /*flags=*/0, callingUid, userId); + } + + @Override + public boolean isSameApp(@Nullable String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int callingUid, int userId) { if (packageName == null) { return false; } @@ -6845,7 +6851,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService return packageName.equals(mRequiredSdkSandboxPackage); } Computer snapshot = snapshot(); - int uid = snapshot.getPackageUid(packageName, 0, userId); + int uid = snapshot.getPackageUid(packageName, flags, userId); return UserHandle.isSameApp(uid, callingUid); } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java index eb6670ee964c7..72758c9781ae8 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilitySecurityPolicyTest.java @@ -16,6 +16,8 @@ package com.android.server.accessibility; +import static android.content.pm.PackageManager.MATCH_ANY_USER; + import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static junit.framework.Assert.assertFalse; @@ -146,7 +148,7 @@ public class AccessibilitySecurityPolicyTest { @Mock private PolicyWarningUIController mPolicyWarningUIController; @Mock - private PackageManagerInternal mPackageManagerInternal; + private PackageManagerInternal mMockPackageManagerInternal; @Before public void setUp() { @@ -158,7 +160,8 @@ public class AccessibilitySecurityPolicyTest { R.dimen.accessibility_focus_highlight_stroke_width, 1); mA11ySecurityPolicy = new AccessibilitySecurityPolicy( - mPolicyWarningUIController, mContext, mMockA11yUserManager); + mPolicyWarningUIController, mContext, mMockA11yUserManager, + mMockPackageManagerInternal); mA11ySecurityPolicy.setSendingNonA11yToolNotificationLocked(true); mA11ySecurityPolicy.setAccessibilityWindowManager(mMockA11yWindowManager); mA11ySecurityPolicy.setAppWidgetManager(mMockAppWidgetManager); @@ -237,8 +240,9 @@ public class AccessibilitySecurityPolicyTest { @Test public void resolveValidReportedPackage_uidAndPkgNameMatched_returnPkgName() throws PackageManager.NameNotFoundException { - when(mMockPackageManager.getPackageUidAsUser(PACKAGE_NAME, - PackageManager.MATCH_ANY_USER, TEST_USER_ID)).thenReturn(APP_UID); + when(mMockPackageManagerInternal.isSameApp( + PACKAGE_NAME, MATCH_ANY_USER, APP_UID, TEST_USER_ID)) + .thenReturn(true); assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( PACKAGE_NAME, APP_UID, TEST_USER_ID, APP_PID), @@ -257,8 +261,9 @@ public class AccessibilitySecurityPolicyTest { when(mMockAppWidgetManager.getHostedWidgetPackages(widgetHostUid)) .thenReturn(widgetPackages); - when(mMockPackageManager.getPackageUidAsUser(hostPackageName, TEST_USER_ID)) - .thenReturn(widgetHostUid); + when(mMockPackageManagerInternal.isSameApp( + hostPackageName, MATCH_ANY_USER, widgetHostUid, TEST_USER_ID)) + .thenReturn(true); assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( widgetPackageName, widgetHostUid, TEST_USER_ID, widgetHostPid), @@ -272,8 +277,9 @@ public class AccessibilitySecurityPolicyTest { final String[] uidPackages = {PACKAGE_NAME, PACKAGE_NAME2}; when(mMockPackageManager.getPackagesForUid(APP_UID)) .thenReturn(uidPackages); - when(mMockPackageManager.getPackageUidAsUser(invalidPackageName, TEST_USER_ID)) - .thenThrow(PackageManager.NameNotFoundException.class); + when(mMockPackageManagerInternal.isSameApp( + invalidPackageName, MATCH_ANY_USER, APP_UID, TEST_USER_ID)) + .thenReturn(false); when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) .thenReturn(new ArraySet<>()); mContext.getTestablePermissions().setPermission( @@ -292,8 +298,9 @@ public class AccessibilitySecurityPolicyTest { final String[] uidPackages = {PACKAGE_NAME}; when(mMockPackageManager.getPackagesForUid(APP_UID)) .thenReturn(uidPackages); - when(mMockPackageManager.getPackageUidAsUser(wantedPackageName, TEST_USER_ID)) - .thenReturn(wantedUid); + when(mMockPackageManagerInternal.isSameApp( + wantedPackageName, MATCH_ANY_USER, wantedUid, TEST_USER_ID)) + .thenReturn(true); when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) .thenReturn(new ArraySet<>()); mContext.getTestablePermissions().setPermission( @@ -312,8 +319,9 @@ public class AccessibilitySecurityPolicyTest { final String[] uidPackages = {PACKAGE_NAME}; when(mMockPackageManager.getPackagesForUid(APP_UID)) .thenReturn(uidPackages); - when(mMockPackageManager.getPackageUidAsUser(wantedPackageName, TEST_USER_ID)) - .thenReturn(wantedUid); + when(mMockPackageManagerInternal.isSameApp( + wantedPackageName, MATCH_ANY_USER, wantedUid, TEST_USER_ID)) + .thenReturn(true); when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) .thenReturn(new ArraySet<>()); mContext.getTestablePermissions().setPermission(