Merge "Revert "Revert "Use PM#isSameApp instead of getPackageUidAsUser.""" into udc-dev

This commit is contained in:
Daniel Norman
2023-05-04 15:57:25 +00:00
committed by Android (Google) Code Review
6 changed files with 45 additions and 20 deletions

View File

@@ -764,6 +764,7 @@ public abstract class PackageManager {
MATCH_DISABLED_UNTIL_USED_COMPONENTS, MATCH_DISABLED_UNTIL_USED_COMPONENTS,
MATCH_SYSTEM_ONLY, MATCH_SYSTEM_ONLY,
MATCH_FACTORY_ONLY, MATCH_FACTORY_ONLY,
MATCH_ANY_USER,
MATCH_DEBUG_TRIAGED_MISSING, MATCH_DEBUG_TRIAGED_MISSING,
MATCH_INSTANT, MATCH_INSTANT,
MATCH_APEX, MATCH_APEX,

View File

@@ -490,7 +490,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
mMainHandler, context, mMainHandler, context,
new PolicyWarningUIController.NotificationController(context)); new PolicyWarningUIController.NotificationController(context));
mSecurityPolicy = new AccessibilitySecurityPolicy(policyWarningUIController, mContext, mSecurityPolicy = new AccessibilitySecurityPolicy(policyWarningUIController, mContext,
this); this, LocalServices.getService(PackageManagerInternal.class));
mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler, mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler,
mWindowManagerService, this, mSecurityPolicy, this, mTraceManager); mWindowManagerService, this, mSecurityPolicy, this, mTraceManager);
mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler); mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler);

View File

@@ -29,6 +29,7 @@ import android.appwidget.AppWidgetManagerInternal;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
@@ -99,6 +100,7 @@ public class AccessibilitySecurityPolicy {
private final Context mContext; private final Context mContext;
private final PackageManager mPackageManager; private final PackageManager mPackageManager;
private final PackageManagerInternal mPackageManagerInternal;
private final UserManager mUserManager; private final UserManager mUserManager;
private final AppOpsManager mAppOpsManager; private final AppOpsManager mAppOpsManager;
private final AccessibilityUserManager mAccessibilityUserManager; private final AccessibilityUserManager mAccessibilityUserManager;
@@ -116,10 +118,12 @@ public class AccessibilitySecurityPolicy {
*/ */
public AccessibilitySecurityPolicy(PolicyWarningUIController policyWarningUIController, public AccessibilitySecurityPolicy(PolicyWarningUIController policyWarningUIController,
@NonNull Context context, @NonNull Context context,
@NonNull AccessibilityUserManager a11yUserManager) { @NonNull AccessibilityUserManager a11yUserManager,
@NonNull PackageManagerInternal packageManagerInternal) {
mContext = context; mContext = context;
mAccessibilityUserManager = a11yUserManager; mAccessibilityUserManager = a11yUserManager;
mPackageManager = mContext.getPackageManager(); mPackageManager = mContext.getPackageManager();
mPackageManagerInternal = packageManagerInternal;
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
mPolicyWarningUIController = policyWarningUIController; mPolicyWarningUIController = policyWarningUIController;
@@ -515,10 +519,8 @@ public class AccessibilitySecurityPolicy {
try { try {
// Since we treat calls from a profile as if made by its parent, using // 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. // MATCH_ANY_USER to query the uid of the given package name.
return uid == mPackageManager.getPackageUidAsUser( return mPackageManagerInternal.isSameApp(packageName, PackageManager.MATCH_ANY_USER,
packageName, PackageManager.MATCH_ANY_USER, UserHandle.getUserId(uid)); uid, UserHandle.getUserId(uid));
} catch (PackageManager.NameNotFoundException e) {
return false;
} finally { } finally {
Binder.restoreCallingIdentity(token); Binder.restoreCallingIdentity(token);
} }

View File

@@ -153,17 +153,25 @@ public abstract class PackageManagerInternal {
public abstract boolean isPermissionsReviewRequired(String packageName, int userId); 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 * 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 * {@link Process#isSdkSandboxUid(int) sdk sandbox uid}, checks whether the package name is
* equal to {@link PackageManager#getSdkSandboxPackageName()}. * equal to {@link PackageManager#getSdkSandboxPackageName()}.
* *
* @param packageName The package name to check. * @param packageName The package name to check.
* @param flags The PackageInfoFlagsBits flags to use during uid lookup.
* @param callingUid The calling uid. * @param callingUid The calling uid.
* @param userId The user under which to check. * @param userId The user under which to check.
* @return True if the package name belongs to the calling uid. * @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. * Retrieve all of the information we know about a particular package/application.

View File

@@ -6843,6 +6843,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Override @Override
public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) { 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) { if (packageName == null) {
return false; return false;
} }
@@ -6851,7 +6857,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return packageName.equals(mRequiredSdkSandboxPackage); return packageName.equals(mRequiredSdkSandboxPackage);
} }
Computer snapshot = snapshot(); Computer snapshot = snapshot();
int uid = snapshot.getPackageUid(packageName, 0, userId); int uid = snapshot.getPackageUid(packageName, flags, userId);
return UserHandle.isSameApp(uid, callingUid); return UserHandle.isSameApp(uid, callingUid);
} }

View File

@@ -16,6 +16,8 @@
package com.android.server.accessibility; package com.android.server.accessibility;
import static android.content.pm.PackageManager.MATCH_ANY_USER;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertFalse;
@@ -146,7 +148,7 @@ public class AccessibilitySecurityPolicyTest {
@Mock @Mock
private PolicyWarningUIController mPolicyWarningUIController; private PolicyWarningUIController mPolicyWarningUIController;
@Mock @Mock
private PackageManagerInternal mPackageManagerInternal; private PackageManagerInternal mMockPackageManagerInternal;
@Before @Before
public void setUp() { public void setUp() {
@@ -158,7 +160,8 @@ public class AccessibilitySecurityPolicyTest {
R.dimen.accessibility_focus_highlight_stroke_width, 1); R.dimen.accessibility_focus_highlight_stroke_width, 1);
mA11ySecurityPolicy = new AccessibilitySecurityPolicy( mA11ySecurityPolicy = new AccessibilitySecurityPolicy(
mPolicyWarningUIController, mContext, mMockA11yUserManager); mPolicyWarningUIController, mContext, mMockA11yUserManager,
mMockPackageManagerInternal);
mA11ySecurityPolicy.setSendingNonA11yToolNotificationLocked(true); mA11ySecurityPolicy.setSendingNonA11yToolNotificationLocked(true);
mA11ySecurityPolicy.setAccessibilityWindowManager(mMockA11yWindowManager); mA11ySecurityPolicy.setAccessibilityWindowManager(mMockA11yWindowManager);
mA11ySecurityPolicy.setAppWidgetManager(mMockAppWidgetManager); mA11ySecurityPolicy.setAppWidgetManager(mMockAppWidgetManager);
@@ -237,8 +240,9 @@ public class AccessibilitySecurityPolicyTest {
@Test @Test
public void resolveValidReportedPackage_uidAndPkgNameMatched_returnPkgName() public void resolveValidReportedPackage_uidAndPkgNameMatched_returnPkgName()
throws PackageManager.NameNotFoundException { throws PackageManager.NameNotFoundException {
when(mMockPackageManager.getPackageUidAsUser(PACKAGE_NAME, when(mMockPackageManagerInternal.isSameApp(
PackageManager.MATCH_ANY_USER, TEST_USER_ID)).thenReturn(APP_UID); PACKAGE_NAME, MATCH_ANY_USER, APP_UID, TEST_USER_ID))
.thenReturn(true);
assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked(
PACKAGE_NAME, APP_UID, TEST_USER_ID, APP_PID), PACKAGE_NAME, APP_UID, TEST_USER_ID, APP_PID),
@@ -257,8 +261,9 @@ public class AccessibilitySecurityPolicyTest {
when(mMockAppWidgetManager.getHostedWidgetPackages(widgetHostUid)) when(mMockAppWidgetManager.getHostedWidgetPackages(widgetHostUid))
.thenReturn(widgetPackages); .thenReturn(widgetPackages);
when(mMockPackageManager.getPackageUidAsUser(hostPackageName, TEST_USER_ID)) when(mMockPackageManagerInternal.isSameApp(
.thenReturn(widgetHostUid); hostPackageName, MATCH_ANY_USER, widgetHostUid, TEST_USER_ID))
.thenReturn(true);
assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked( assertEquals(mA11ySecurityPolicy.resolveValidReportedPackageLocked(
widgetPackageName, widgetHostUid, TEST_USER_ID, widgetHostPid), widgetPackageName, widgetHostUid, TEST_USER_ID, widgetHostPid),
@@ -272,8 +277,9 @@ public class AccessibilitySecurityPolicyTest {
final String[] uidPackages = {PACKAGE_NAME, PACKAGE_NAME2}; final String[] uidPackages = {PACKAGE_NAME, PACKAGE_NAME2};
when(mMockPackageManager.getPackagesForUid(APP_UID)) when(mMockPackageManager.getPackagesForUid(APP_UID))
.thenReturn(uidPackages); .thenReturn(uidPackages);
when(mMockPackageManager.getPackageUidAsUser(invalidPackageName, TEST_USER_ID)) when(mMockPackageManagerInternal.isSameApp(
.thenThrow(PackageManager.NameNotFoundException.class); invalidPackageName, MATCH_ANY_USER, APP_UID, TEST_USER_ID))
.thenReturn(false);
when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID))
.thenReturn(new ArraySet<>()); .thenReturn(new ArraySet<>());
mContext.getTestablePermissions().setPermission( mContext.getTestablePermissions().setPermission(
@@ -292,8 +298,9 @@ public class AccessibilitySecurityPolicyTest {
final String[] uidPackages = {PACKAGE_NAME}; final String[] uidPackages = {PACKAGE_NAME};
when(mMockPackageManager.getPackagesForUid(APP_UID)) when(mMockPackageManager.getPackagesForUid(APP_UID))
.thenReturn(uidPackages); .thenReturn(uidPackages);
when(mMockPackageManager.getPackageUidAsUser(wantedPackageName, TEST_USER_ID)) when(mMockPackageManagerInternal.isSameApp(
.thenReturn(wantedUid); wantedPackageName, MATCH_ANY_USER, wantedUid, TEST_USER_ID))
.thenReturn(true);
when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID))
.thenReturn(new ArraySet<>()); .thenReturn(new ArraySet<>());
mContext.getTestablePermissions().setPermission( mContext.getTestablePermissions().setPermission(
@@ -312,8 +319,9 @@ public class AccessibilitySecurityPolicyTest {
final String[] uidPackages = {PACKAGE_NAME}; final String[] uidPackages = {PACKAGE_NAME};
when(mMockPackageManager.getPackagesForUid(APP_UID)) when(mMockPackageManager.getPackagesForUid(APP_UID))
.thenReturn(uidPackages); .thenReturn(uidPackages);
when(mMockPackageManager.getPackageUidAsUser(wantedPackageName, TEST_USER_ID)) when(mMockPackageManagerInternal.isSameApp(
.thenReturn(wantedUid); wantedPackageName, MATCH_ANY_USER, wantedUid, TEST_USER_ID))
.thenReturn(true);
when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID)) when(mMockAppWidgetManager.getHostedWidgetPackages(APP_UID))
.thenReturn(new ArraySet<>()); .thenReturn(new ArraySet<>());
mContext.getTestablePermissions().setPermission( mContext.getTestablePermissions().setPermission(