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
This commit is contained in:
Nicholas Sauer
2019-09-10 20:23:41 -07:00
parent 703ce15fef
commit 3f9249f792
7 changed files with 34 additions and 13 deletions

View File

@@ -4516,7 +4516,7 @@ class ActivityStack extends ConfigurationContainer {
*/ */
void getRunningTasks(List<TaskRecord> tasksOut, @ActivityType int ignoreActivityType, void getRunningTasks(List<TaskRecord> tasksOut, @ActivityType int ignoreActivityType,
@WindowingMode int ignoreWindowingMode, int callingUid, boolean allowed, @WindowingMode int ignoreWindowingMode, int callingUid, boolean allowed,
boolean crossUser) { boolean crossUser, ArraySet<Integer> profileIds) {
boolean focusedStack = mRootActivityContainer.getTopDisplayFocusedStack() == this; boolean focusedStack = mRootActivityContainer.getTopDisplayFocusedStack() == this;
boolean topTask = true; boolean topTask = true;
int userId = UserHandle.getUserId(callingUid); int userId = UserHandle.getUserId(callingUid);
@@ -4527,8 +4527,9 @@ class ActivityStack extends ConfigurationContainer {
continue; continue;
} }
if (task.effectiveUid != callingUid) { if (task.effectiveUid != callingUid) {
if (task.userId != userId && !crossUser) { if (task.userId != userId && !crossUser && !profileIds.contains(task.userId)) {
// Skip if the caller does not have cross user permission // Skip if the caller does not have cross user permission or cannot access
// the task's profile
continue; continue;
} }
if (!allowed && !task.isActivityTypeHome()) { if (!allowed && !task.isActivityTypeHome()) {

View File

@@ -215,6 +215,7 @@ import android.telecom.TelecomManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.format.TimeMigrationUtils; import android.text.format.TimeMigrationUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.EventLog; import android.util.EventLog;
import android.util.Log; import android.util.Log;
import android.util.Slog; import android.util.Slog;
@@ -2512,6 +2513,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
final int callingUid = Binder.getCallingUid(); final int callingUid = Binder.getCallingUid();
final int callingPid = Binder.getCallingPid(); final int callingPid = Binder.getCallingPid();
final boolean crossUser = isCrossUserAllowed(callingPid, callingUid); final boolean crossUser = isCrossUserAllowed(callingPid, callingUid);
final int[] profileIds = getUserManager().getProfileIds(
UserHandle.getUserId(callingUid), true);
ArraySet<Integer> callingProfileIds = new ArraySet<>();
for (int i = 0; i < profileIds.length; i++) {
callingProfileIds.add(profileIds[i]);
}
ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>(); ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>();
synchronized (mGlobalLock) { synchronized (mGlobalLock) {
@@ -2519,7 +2526,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid); final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid);
mRootActivityContainer.getRunningTasks(maxNum, list, ignoreActivityType, mRootActivityContainer.getRunningTasks(maxNum, list, ignoreActivityType,
ignoreWindowingMode, callingUid, allowed, crossUser); ignoreWindowingMode, callingUid, allowed, crossUser, callingProfileIds);
} }
return list; return list;

View File

@@ -2214,9 +2214,9 @@ class RootActivityContainer extends ConfigurationContainer
void getRunningTasks(int maxNum, List<ActivityManager.RunningTaskInfo> list, void getRunningTasks(int maxNum, List<ActivityManager.RunningTaskInfo> list,
@WindowConfiguration.ActivityType int ignoreActivityType, @WindowConfiguration.ActivityType int ignoreActivityType,
@WindowConfiguration.WindowingMode int ignoreWindowingMode, int callingUid, @WindowConfiguration.WindowingMode int ignoreWindowingMode, int callingUid,
boolean allowed, boolean crossUser) { boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) {
mStackSupervisor.getRunningTasks().getTasks(maxNum, list, ignoreActivityType, mStackSupervisor.getRunningTasks().getTasks(maxNum, list, ignoreActivityType,
ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser); ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser, profileIds);
} }
void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) { void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) {

View File

@@ -19,6 +19,7 @@ package com.android.server.wm;
import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityManager.RunningTaskInfo;
import android.app.WindowConfiguration.ActivityType; import android.app.WindowConfiguration.ActivityType;
import android.app.WindowConfiguration.WindowingMode; import android.app.WindowConfiguration.WindowingMode;
import android.util.ArraySet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
@@ -40,7 +41,7 @@ class RunningTasks {
void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType, void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType,
@WindowingMode int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays, @WindowingMode int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
int callingUid, boolean allowed, boolean crossUser) { int callingUid, boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) {
// Return early if there are no tasks to fetch // Return early if there are no tasks to fetch
if (maxNum <= 0) { if (maxNum <= 0) {
return; return;
@@ -55,7 +56,7 @@ class RunningTasks {
final ActivityStack stack = display.getChildAt(stackNdx); final ActivityStack stack = display.getChildAt(stackNdx);
mTmpStackTasks.clear(); mTmpStackTasks.clear();
stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode, stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode,
callingUid, allowed, crossUser); callingUid, allowed, crossUser, profileIds);
mTmpSortedSet.addAll(mTmpStackTasks); mTmpSortedSet.addAll(mTmpStackTasks);
} }
} }

View File

@@ -62,6 +62,7 @@ import android.os.Bundle;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.SystemClock; import android.os.SystemClock;
import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.Presubmit;
import android.util.ArraySet;
import android.util.MutableLong; import android.util.MutableLong;
import android.util.SparseBooleanArray; import android.util.SparseBooleanArray;
@@ -1003,7 +1004,6 @@ public class RecentTasksTest extends ActivityTestsBase {
public void testRecentsComponent_allowApiAccessWithoutPermissions() { public void testRecentsComponent_allowApiAccessWithoutPermissions() {
doReturn(PackageManager.PERMISSION_DENIED).when(mService) doReturn(PackageManager.PERMISSION_DENIED).when(mService)
.checkGetTasksPermission(anyString(), anyInt(), anyInt()); .checkGetTasksPermission(anyString(), anyInt(), anyInt());
// Set the recents component and ensure that the following calls do not fail // Set the recents component and ensure that the following calls do not fail
mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.GRANT); mRecentTasks.setIsCallerRecentsOverride(TestRecentTasks.GRANT);
doTestRecentTasksApis(true /* expectNoSecurityException */); doTestRecentTasksApis(true /* expectNoSecurityException */);
@@ -1289,10 +1289,10 @@ public class RecentTasksTest extends ActivityTestsBase {
@Override @Override
void getTasks(int maxNum, List<RunningTaskInfo> list, int ignoreActivityType, void getTasks(int maxNum, List<RunningTaskInfo> list, int ignoreActivityType,
int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays, int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
int callingUid, boolean allowed, boolean crossUser) { int callingUid, boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) {
mLastAllowed = allowed; mLastAllowed = allowed;
super.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, activityDisplays, super.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, activityDisplays,
callingUid, allowed, crossUser); callingUid, allowed, crossUser, profileIds);
} }
} }
} }

View File

@@ -29,6 +29,7 @@ import static org.junit.Assert.assertEquals;
import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName; import android.content.ComponentName;
import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.Presubmit;
import android.util.ArraySet;
import androidx.test.filters.MediumTest; import androidx.test.filters.MediumTest;
@@ -45,6 +46,8 @@ import java.util.ArrayList;
@Presubmit @Presubmit
public class RunningTasksTest extends ActivityTestsBase { public class RunningTasksTest extends ActivityTestsBase {
private static final ArraySet<Integer> PROFILE_IDS = new ArraySet<>();
private RunningTasks mRunningTasks; private RunningTasks mRunningTasks;
@Before @Before
@@ -77,7 +80,8 @@ public class RunningTasksTest extends ActivityTestsBase {
final int numFetchTasks = 5; final int numFetchTasks = 5;
ArrayList<RunningTaskInfo> tasks = new ArrayList<>(); ArrayList<RunningTaskInfo> tasks = new ArrayList<>();
mRunningTasks.getTasks(5, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED, 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); assertThat(tasks).hasSize(numFetchTasks);
for (int i = 0; i < numFetchTasks; i++) { for (int i = 0; i < numFetchTasks; i++) {
assertEquals(numTasks - i - 1, tasks.get(i).id); assertEquals(numTasks - i - 1, tasks.get(i).id);
@@ -87,7 +91,8 @@ public class RunningTasksTest extends ActivityTestsBase {
// and does not crash // and does not crash
tasks.clear(); tasks.clear();
mRunningTasks.getTasks(100, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED, 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); assertThat(tasks).hasSize(numTasks);
for (int i = 0; i < numTasks; i++) { for (int i = 0; i < numTasks; i++) {
assertEquals(numTasks - i - 1, tasks.get(i).id); assertEquals(numTasks - i - 1, tasks.get(i).id);

View File

@@ -74,6 +74,7 @@ import com.android.server.am.ActivityManagerService;
import com.android.server.appop.AppOpsService; import com.android.server.appop.AppOpsService;
import com.android.server.display.color.ColorDisplayService; import com.android.server.display.color.ColorDisplayService;
import com.android.server.input.InputManagerService; import com.android.server.input.InputManagerService;
import com.android.server.pm.UserManagerService;
import com.android.server.policy.PermissionPolicyInternal; import com.android.server.policy.PermissionPolicyInternal;
import com.android.server.policy.WindowManagerPolicy; import com.android.server.policy.WindowManagerPolicy;
import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.statusbar.StatusBarManagerInternal;
@@ -100,6 +101,7 @@ public class SystemServicesTestRule implements TestRule {
static int sNextTaskId = 100; static int sNextTaskId = 100;
private final AtomicBoolean mCurrentMessagesProcessed = new AtomicBoolean(false); private final AtomicBoolean mCurrentMessagesProcessed = new AtomicBoolean(false);
private static final int[] TEST_USER_PROFILE_IDS = {};
private Context mContext; private Context mContext;
private StaticMockitoSession mMockitoSession; private StaticMockitoSession mMockitoSession;
@@ -424,6 +426,11 @@ public class SystemServicesTestRule implements TestRule {
doReturn(AppOpsManager.MODE_DEFAULT) doReturn(AppOpsManager.MODE_DEFAULT)
.when(aos).noteOperation(anyInt(), anyInt(), anyString()); .when(aos).noteOperation(anyInt(), anyInt(), anyString());
// UserManagerService
final UserManagerService ums = mock(UserManagerService.class);
doReturn(ums).when(this).getUserManager();
doReturn(TEST_USER_PROFILE_IDS).when(ums).getProfileIds(anyInt(), eq(true));
setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class)); setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));
ams.mActivityTaskManager = this; ams.mActivityTaskManager = this;
ams.mAtmInternal = mInternal; ams.mAtmInternal = mInternal;