summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Gavin Corkery <gavincorkery@google.com> 2022-03-03 13:49:14 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-03-03 13:49:14 +0000
commit4682aac6327eb73fc80b6285c529b98bcbf16f80 (patch)
tree27c35eb5bdb8f5ce1852029b1318fa53feff69d8
parent33a2b4bacddd2759e591bd459a356cbead8c5d46 (diff)
parent70447223918adc4e858666169e7d88bcfbf3bf6c (diff)
Merge "Add isSameApp to PackageManagerInternal" into tm-dev
-rw-r--r--services/core/java/android/content/pm/PackageManagerInternal.java13
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java23
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java13
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java14
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java5
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationPermissionMigrationTest.java5
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);