From d6b44523fe7250b979a4869401b1fa9bad19ba97 Mon Sep 17 00:00:00 2001 From: Nicholas Sauer Date: Tue, 10 Sep 2019 20:23:41 -0700 Subject: [PATCH] Return tasks that belong to a profile from getRunningTasks. See also ag/9307763 bug: 140813306 Test: cts-tradefed run cts-dev -m CtsPermissionTestCases -t android.permission.cts.NoActivityRelatedPermissionTest#testGetTask Test: cts-tradefed run cts-dev -m CtsWindowManagerDeviceTestCases Test: cts-tradefed run cts-dev -m CtsAppTestCases Change-Id: I6809c459af7442a306ccdd81bc036ad81d02030a Merged-In: I6809c459af7442a306ccdd81bc036ad81d02030a --- .../core/java/com/android/server/wm/ActivityStack.java | 7 ++++--- .../android/server/wm/ActivityTaskManagerService.java | 9 ++++++++- .../com/android/server/wm/RootActivityContainer.java | 4 ++-- .../core/java/com/android/server/wm/RunningTasks.java | 5 +++-- .../src/com/android/server/wm/ActivityTestsBase.java | 9 +++++++++ .../src/com/android/server/wm/RecentTasksTest.java | 6 +++--- .../src/com/android/server/wm/RunningTasksTest.java | 9 +++++++-- 7 files changed, 36 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 97682b7e6d57b..9faef0abcd170 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -5228,7 +5228,7 @@ class ActivityStack extends ConfigurationContainer { */ void getRunningTasks(List tasksOut, @ActivityType int ignoreActivityType, @WindowingMode int ignoreWindowingMode, int callingUid, boolean allowed, - boolean crossUser) { + boolean crossUser, ArraySet profileIds) { boolean focusedStack = mRootActivityContainer.getTopDisplayFocusedStack() == this; boolean topTask = true; int userId = UserHandle.getUserId(callingUid); @@ -5239,8 +5239,9 @@ class ActivityStack extends ConfigurationContainer { continue; } if (task.effectiveUid != callingUid) { - if (task.userId != userId && !crossUser) { - // Skip if the caller does not have cross user permission + if (task.userId != userId && !crossUser && !profileIds.contains(task.userId)) { + // Skip if the caller does not have cross user permission or cannot access + // the task's profile continue; } if (!allowed && !task.isActivityTypeHome()) { diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 59ae9ac963552..69d7b6d7e7bd7 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -215,6 +215,7 @@ import android.telecom.TelecomManager; import android.text.TextUtils; import android.text.format.Time; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.EventLog; import android.util.Log; import android.util.Slog; @@ -2526,6 +2527,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); final boolean crossUser = isCrossUserAllowed(callingPid, callingUid); + final int[] profileIds = getUserManager().getProfileIds( + UserHandle.getUserId(callingUid), true); + ArraySet callingProfileIds = new ArraySet<>(); + for (int i = 0; i < profileIds.length; i++) { + callingProfileIds.add(profileIds[i]); + } ArrayList list = new ArrayList<>(); synchronized (mGlobalLock) { @@ -2533,7 +2540,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid); mRootActivityContainer.getRunningTasks(maxNum, list, ignoreActivityType, - ignoreWindowingMode, callingUid, allowed, crossUser); + ignoreWindowingMode, callingUid, allowed, crossUser, callingProfileIds); } return list; diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java index 2e3094a6b554b..a339ef03c22ca 100644 --- a/services/core/java/com/android/server/wm/RootActivityContainer.java +++ b/services/core/java/com/android/server/wm/RootActivityContainer.java @@ -2266,9 +2266,9 @@ class RootActivityContainer extends ConfigurationContainer void getRunningTasks(int maxNum, List list, @WindowConfiguration.ActivityType int ignoreActivityType, @WindowConfiguration.WindowingMode int ignoreWindowingMode, int callingUid, - boolean allowed, boolean crossUser) { + boolean allowed, boolean crossUser, ArraySet profileIds) { mStackSupervisor.mRunningTasks.getTasks(maxNum, list, ignoreActivityType, - ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser); + ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser, profileIds); } void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) { diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java index 22a9c32a830fd..81a85476c53a4 100644 --- a/services/core/java/com/android/server/wm/RunningTasks.java +++ b/services/core/java/com/android/server/wm/RunningTasks.java @@ -19,6 +19,7 @@ package com.android.server.wm; import android.app.ActivityManager.RunningTaskInfo; import android.app.WindowConfiguration.ActivityType; import android.app.WindowConfiguration.WindowingMode; +import android.util.ArraySet; import java.util.ArrayList; import java.util.Comparator; @@ -40,7 +41,7 @@ class RunningTasks { void getTasks(int maxNum, List list, @ActivityType int ignoreActivityType, @WindowingMode int ignoreWindowingMode, ArrayList activityDisplays, - int callingUid, boolean allowed, boolean crossUser) { + int callingUid, boolean allowed, boolean crossUser, ArraySet profileIds) { // Return early if there are no tasks to fetch if (maxNum <= 0) { return; @@ -55,7 +56,7 @@ class RunningTasks { final ActivityStack stack = display.getChildAt(stackNdx); mTmpStackTasks.clear(); stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode, - callingUid, allowed, crossUser); + callingUid, allowed, crossUser, profileIds); mTmpSortedSet.addAll(mTmpStackTasks); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index ecf3acd32d4f9..3c0da265f97af 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -40,6 +40,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING; import static com.android.server.wm.ActivityStackSupervisor.ON_TOP; +import static org.mockito.ArgumentMatchers.eq; + import android.app.ActivityManagerInternal; import android.app.ActivityOptions; import android.app.AppOpsManager; @@ -72,6 +74,7 @@ import com.android.server.am.ActivityManagerService; import com.android.server.am.PendingIntentController; import com.android.server.appop.AppOpsService; import com.android.server.firewall.IntentFirewall; +import com.android.server.pm.UserManagerService; import com.android.server.policy.PermissionPolicyInternal; import com.android.server.uri.UriGrantsManagerInternal; import com.android.server.wm.TaskRecord.TaskRecordFactory; @@ -92,6 +95,7 @@ import java.util.function.Consumer; */ class ActivityTestsBase { private static int sNextDisplayId = DEFAULT_DISPLAY + 1; + private static final int[] TEST_USER_PROFILE_IDS = {}; @Rule public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule = @@ -471,6 +475,11 @@ class ActivityTestsBase { // allow background activity starts by default doReturn(true).when(this).isBackgroundActivityStartsEnabled(); doNothing().when(this).updateCpuStats(); + + // UserManager + final UserManagerService ums = mock(UserManagerService.class); + doReturn(ums).when(this).getUserManager(); + doReturn(TEST_USER_PROFILE_IDS).when(ums).getProfileIds(anyInt(), eq(true)); } void setup(IntentFirewall intentFirewall, PendingIntentController intentController, diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index bad6c7cc3eecc..e4f614d38c82e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -62,6 +62,7 @@ import android.os.Looper; import android.os.RemoteException; import android.os.SystemClock; import android.platform.test.annotations.Presubmit; +import android.util.ArraySet; import android.util.MutableLong; import android.util.SparseBooleanArray; @@ -952,7 +953,6 @@ public class RecentTasksTest extends ActivityTestsBase { public void testRecentsComponent_allowApiAccessWithoutPermissions() { doReturn(PackageManager.PERMISSION_DENIED).when(mTestService) .checkGetTasksPermission(anyString(), anyInt(), anyInt()); - // Set the recents component and ensure that the following calls do not fail mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.GRANT); doTestRecentTasksApis(true /* expectNoSecurityException */); @@ -1301,10 +1301,10 @@ public class RecentTasksTest extends ActivityTestsBase { @Override void getTasks(int maxNum, List list, int ignoreActivityType, int ignoreWindowingMode, ArrayList activityDisplays, - int callingUid, boolean allowed, boolean crossUser) { + int callingUid, boolean allowed, boolean crossUser, ArraySet profileIds) { mLastAllowed = allowed; super.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, activityDisplays, - callingUid, allowed, crossUser); + callingUid, allowed, crossUser, profileIds); } } } diff --git a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java index cdd4c24244213..3e316f674dbfd 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RunningTasksTest.java @@ -29,6 +29,7 @@ import static org.junit.Assert.assertEquals; import android.app.ActivityManager.RunningTaskInfo; import android.content.ComponentName; import android.platform.test.annotations.Presubmit; +import android.util.ArraySet; import androidx.test.filters.MediumTest; @@ -45,6 +46,8 @@ import java.util.ArrayList; @Presubmit public class RunningTasksTest extends ActivityTestsBase { + private static final ArraySet PROFILE_IDS = new ArraySet<>(); + private RunningTasks mRunningTasks; @Before @@ -77,7 +80,8 @@ public class RunningTasksTest extends ActivityTestsBase { final int numFetchTasks = 5; ArrayList tasks = new ArrayList<>(); mRunningTasks.getTasks(5, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED, - displays, -1 /* callingUid */, true /* allowed */, true /*crossUser */); + displays, -1 /* callingUid */, true /* allowed */, true /*crossUser */, + PROFILE_IDS); assertThat(tasks).hasSize(numFetchTasks); for (int i = 0; i < numFetchTasks; i++) { assertEquals(numTasks - i - 1, tasks.get(i).id); @@ -87,7 +91,8 @@ public class RunningTasksTest extends ActivityTestsBase { // and does not crash tasks.clear(); mRunningTasks.getTasks(100, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED, - displays, -1 /* callingUid */, true /* allowed */, true /* crossUser */); + displays, -1 /* callingUid */, true /* allowed */, true /* crossUser */, + PROFILE_IDS); assertThat(tasks).hasSize(numTasks); for (int i = 0; i < numTasks; i++) { assertEquals(numTasks - i - 1, tasks.get(i).id);