diff options
| author | 2022-03-03 13:49:14 +0000 | |
|---|---|---|
| committer | 2022-03-03 13:49:14 +0000 | |
| commit | 4682aac6327eb73fc80b6285c529b98bcbf16f80 (patch) | |
| tree | 27c35eb5bdb8f5ce1852029b1318fa53feff69d8 | |
| parent | 33a2b4bacddd2759e591bd459a356cbead8c5d46 (diff) | |
| parent | 70447223918adc4e858666169e7d88bcfbf3bf6c (diff) | |
Merge "Add isSameApp to PackageManagerInternal" into tm-dev
6 files changed, 40 insertions, 33 deletions
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index e6953f0032c7..c9d704084c19 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -194,6 +194,19 @@ public abstract class PackageManagerInternal { */ public abstract boolean isPermissionsReviewRequired(String packageName, 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 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); + /** * Retrieve all of the information we know about a particular package/application. * @param filterCallingUid The results will be filtered in the context of this UID instead diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 050cfeae80b9..c4731aa7b522 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -9650,27 +9650,8 @@ public class NotificationManagerService extends SystemService { if (uid == Process.ROOT_UID && ROOT_PKG.equals(pkg)) { return; } - try { - ApplicationInfo ai = mPackageManager.getApplicationInfo( - pkg, 0, userId); - if (ai == null) { - throw new SecurityException("Unknown package " + pkg); - } - if (!UserHandle.isSameApp(ai.uid, uid)) { - throw new SecurityException("Calling uid " + uid + " gave package " - + pkg + " which is owned by uid " + ai.uid); - } - } catch (RemoteException re) { - throw new SecurityException("Unknown package " + pkg + "\n" + re); - } - } - - private boolean isCallerSameApp(String pkg) { - try { - checkCallerIsSameApp(pkg); - return true; - } catch (SecurityException e) { - return false; + if (!mPackageManagerInternal.isSameApp(pkg, uid, userId)) { + throw new SecurityException("Package " + pkg + " is not owned by uid " + uid); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6fbad24d58c0..ee49a5184e7f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -6965,6 +6965,19 @@ public class PackageManagerService extends IPackageManager.Stub } @Override + public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) { + if (packageName == null) { + return false; + } + + if (Process.isSdkSandboxUid(callingUid)) { + return packageName.equals(getSdkSandboxPackageName()); + } + int uid = getPackageUid(packageName, 0, userId); + return UserHandle.isSameApp(uid, callingUid); + } + + @Override public boolean isResolveActivityComponent(ComponentInfo component) { return mResolveActivity.packageName.equals(component.packageName) && mResolveActivity.name.equals(component.name); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 062e73d72d1d..bfccdf97c680 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -2232,18 +2232,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { * Return true if callingUid is system, or packageName belongs to that callingUid. */ private boolean isSameApp(int callingUid, @Nullable String packageName) { - try { - if (callingUid != 0 && callingUid != SYSTEM_UID) { - if (packageName == null) { - return false; - } - final int uid = AppGlobals.getPackageManager().getPackageUid(packageName, - PackageManager.MATCH_DEBUG_TRIAGED_MISSING, - UserHandle.getUserId(callingUid)); - return UserHandle.isSameApp(callingUid, uid); - } - } catch (RemoteException e) { - // Should not happen + if (callingUid != 0 && callingUid != SYSTEM_UID) { + return mPmInternal.isSameApp(packageName, callingUid, UserHandle.getUserId(callingUid)); } return true; } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 018a91618564..71f8b8de032b 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -420,6 +420,11 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { return getApplicationInfo((String) args[0], mUid); }); when(mPackageManagerClient.getPackageUidAsUser(any(), anyInt())).thenReturn(mUid); + when(mPackageManagerInternal.isSameApp(anyString(), anyInt(), anyInt())).thenAnswer( + (Answer<Boolean>) invocation -> { + Object[] args = invocation.getArguments(); + return (int) args[1] == mUid; + }); final LightsManager mockLightsManager = mock(LightsManager.class); when(mockLightsManager.getLight(anyInt())).thenReturn(mock(LogicalLight.class)); when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java index 5a6ca6dc2d14..a83887202a7d 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java @@ -316,6 +316,11 @@ public class NotificationPermissionMigrationTest extends UiServiceTestCase { return getApplicationInfo((String) args[0], mUid); }); when(mPackageManagerClient.getPackageUidAsUser(any(), anyInt())).thenReturn(mUid); + when(mPackageManagerInternal.isSameApp(anyString(), anyInt(), anyInt())).thenAnswer( + (Answer<Boolean>) invocation -> { + Object[] args = invocation.getArguments(); + return (int) args[1] == mUid; + }); final LightsManager mockLightsManager = mock(LightsManager.class); when(mockLightsManager.getLight(anyInt())).thenReturn(mock(LogicalLight.class)); when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL); |