Merge "Require that the caller has INTERACT_ACROSS_USERS in order to retrieve home tasks of other users." into qt-qpr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b255146be2
@@ -5227,18 +5227,27 @@ class ActivityStack extends ConfigurationContainer {
|
||||
* then skip running tasks that match those types.
|
||||
*/
|
||||
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 focusedStack = mRootActivityContainer.getTopDisplayFocusedStack() == this;
|
||||
boolean topTask = true;
|
||||
int userId = UserHandle.getUserId(callingUid);
|
||||
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
|
||||
final TaskRecord task = mTaskHistory.get(taskNdx);
|
||||
if (task.getTopActivity() == null) {
|
||||
// Skip if there are no activities in the task
|
||||
continue;
|
||||
}
|
||||
if (!allowed && !task.isActivityTypeHome() && task.effectiveUid != callingUid) {
|
||||
// Skip if the caller can't fetch this task
|
||||
continue;
|
||||
if (task.effectiveUid != callingUid) {
|
||||
if (task.userId != userId && !crossUser) {
|
||||
// Skip if the caller does not have cross user permission
|
||||
continue;
|
||||
}
|
||||
if (!allowed && !task.isActivityTypeHome()) {
|
||||
// Skip if the caller isn't allowed to fetch this task, except for the home
|
||||
// task which we always return.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (ignoreActivityType != ACTIVITY_TYPE_UNDEFINED
|
||||
&& task.getActivityType() == ignoreActivityType) {
|
||||
|
||||
@@ -19,6 +19,8 @@ package com.android.server.wm;
|
||||
import static android.Manifest.permission.BIND_VOICE_INTERACTION;
|
||||
import static android.Manifest.permission.CHANGE_CONFIGURATION;
|
||||
import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
|
||||
import static android.Manifest.permission.INTERACT_ACROSS_USERS;
|
||||
import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
|
||||
import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
|
||||
import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS;
|
||||
import static android.Manifest.permission.READ_FRAME_BUFFER;
|
||||
@@ -2522,15 +2524,16 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
|
||||
@WindowConfiguration.ActivityType int ignoreActivityType,
|
||||
@WindowConfiguration.WindowingMode int ignoreWindowingMode) {
|
||||
final int callingUid = Binder.getCallingUid();
|
||||
final int callingPid = Binder.getCallingPid();
|
||||
final boolean crossUser = isCrossUserAllowed(callingPid, callingUid);
|
||||
ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>();
|
||||
|
||||
synchronized (mGlobalLock) {
|
||||
if (DEBUG_ALL) Slog.v(TAG, "getTasks: max=" + maxNum);
|
||||
|
||||
final boolean allowed = isGetTasksAllowed("getTasks", Binder.getCallingPid(),
|
||||
callingUid);
|
||||
final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid);
|
||||
mRootActivityContainer.getRunningTasks(maxNum, list, ignoreActivityType,
|
||||
ignoreWindowingMode, callingUid, allowed);
|
||||
ignoreWindowingMode, callingUid, allowed, crossUser);
|
||||
}
|
||||
|
||||
return list;
|
||||
@@ -3587,6 +3590,11 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
|
||||
return allowed;
|
||||
}
|
||||
|
||||
boolean isCrossUserAllowed(int pid, int uid) {
|
||||
return checkPermission(INTERACT_ACROSS_USERS, pid, uid) == PERMISSION_GRANTED
|
||||
|| checkPermission(INTERACT_ACROSS_USERS_FULL, pid, uid) == PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint,
|
||||
IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken,
|
||||
boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout,
|
||||
|
||||
@@ -2266,9 +2266,9 @@ class RootActivityContainer extends ConfigurationContainer
|
||||
void getRunningTasks(int maxNum, List<ActivityManager.RunningTaskInfo> list,
|
||||
@WindowConfiguration.ActivityType int ignoreActivityType,
|
||||
@WindowConfiguration.WindowingMode int ignoreWindowingMode, int callingUid,
|
||||
boolean allowed) {
|
||||
boolean allowed, boolean crossUser) {
|
||||
mStackSupervisor.mRunningTasks.getTasks(maxNum, list, ignoreActivityType,
|
||||
ignoreWindowingMode, mActivityDisplays, callingUid, allowed);
|
||||
ignoreWindowingMode, mActivityDisplays, callingUid, allowed, crossUser);
|
||||
}
|
||||
|
||||
void sendPowerHintForLaunchStartIfNeeded(boolean forceSend, ActivityRecord targetActivity) {
|
||||
|
||||
@@ -40,7 +40,7 @@ class RunningTasks {
|
||||
|
||||
void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType,
|
||||
@WindowingMode int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
|
||||
int callingUid, boolean allowed) {
|
||||
int callingUid, boolean allowed, boolean crossUser) {
|
||||
// Return early if there are no tasks to fetch
|
||||
if (maxNum <= 0) {
|
||||
return;
|
||||
@@ -55,7 +55,7 @@ class RunningTasks {
|
||||
final ActivityStack stack = display.getChildAt(stackNdx);
|
||||
mTmpStackTasks.clear();
|
||||
stack.getRunningTasks(mTmpStackTasks, ignoreActivityType, ignoreWindowingMode,
|
||||
callingUid, allowed);
|
||||
callingUid, allowed, crossUser);
|
||||
mTmpSortedSet.addAll(mTmpStackTasks);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1301,10 +1301,10 @@ public class RecentTasksTest extends ActivityTestsBase {
|
||||
@Override
|
||||
void getTasks(int maxNum, List<RunningTaskInfo> list, int ignoreActivityType,
|
||||
int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays,
|
||||
int callingUid, boolean allowed) {
|
||||
int callingUid, boolean allowed, boolean crossUser) {
|
||||
mLastAllowed = allowed;
|
||||
super.getTasks(maxNum, list, ignoreActivityType, ignoreWindowingMode, activityDisplays,
|
||||
callingUid, allowed);
|
||||
callingUid, allowed, crossUser);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ public class RunningTasksTest extends ActivityTestsBase {
|
||||
final int numFetchTasks = 5;
|
||||
ArrayList<RunningTaskInfo> tasks = new ArrayList<>();
|
||||
mRunningTasks.getTasks(5, tasks, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED,
|
||||
displays, -1 /* callingUid */, true /* allowed */);
|
||||
displays, -1 /* callingUid */, true /* allowed */, true /*crossUser */);
|
||||
assertThat(tasks).hasSize(numFetchTasks);
|
||||
for (int i = 0; i < numFetchTasks; i++) {
|
||||
assertEquals(numTasks - i - 1, tasks.get(i).id);
|
||||
@@ -87,7 +87,7 @@ 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 */);
|
||||
displays, -1 /* callingUid */, true /* allowed */, true /* crossUser */);
|
||||
assertThat(tasks).hasSize(numTasks);
|
||||
for (int i = 0; i < numTasks; i++) {
|
||||
assertEquals(numTasks - i - 1, tasks.get(i).id);
|
||||
|
||||
Reference in New Issue
Block a user