Merge "New Shell command to list all profile / device owners." into sc-dev

This commit is contained in:
TreeHugger Robot
2021-02-06 02:02:27 +00:00
committed by Android (Google) Code Review
3 changed files with 98 additions and 4 deletions

View File

@@ -313,6 +313,7 @@ import com.android.server.PersistentDataBlockManagerInternal;
import com.android.server.SystemServerInitThreadPool; import com.android.server.SystemServerInitThreadPool;
import com.android.server.SystemService; import com.android.server.SystemService;
import com.android.server.devicepolicy.ActiveAdmin.TrustAgentInfo; import com.android.server.devicepolicy.ActiveAdmin.TrustAgentInfo;
import com.android.server.devicepolicy.Owners.OwnerDto;
import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.net.NetworkPolicyManagerInternal; import com.android.server.net.NetworkPolicyManagerInternal;
import com.android.server.pm.RestrictionsSet; import com.android.server.pm.RestrictionsSet;
@@ -1130,6 +1131,22 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
mSafetyChecker = new OneTimeSafetyChecker(this, operation, reason); mSafetyChecker = new OneTimeSafetyChecker(this, operation, reason);
} }
// Used by DevicePolicyManagerServiceShellCommand
List<OwnerDto> listAllOwners() {
Preconditions.checkCallAuthorization(
hasCallingOrSelfPermission(permission.MANAGE_DEVICE_ADMINS));
List<OwnerDto> owners = mOwners.listAllOwners();
synchronized (getLockObject()) {
for (int i = 0; i < owners.size(); i++) {
OwnerDto owner = owners.get(i);
owner.isAffiliated = isUserAffiliatedWithDeviceLocked(owner.userId);
}
}
return owners;
}
/** /**
* Unit test will subclass it to inject mocks. * Unit test will subclass it to inject mocks.
*/ */
@@ -13466,15 +13483,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
if (!mOwners.hasDeviceOwner()) { if (!mOwners.hasDeviceOwner()) {
return false; return false;
} }
if (userId == mOwners.getDeviceOwnerUserId()) {
// The user that the DO is installed on is always affiliated with the device.
return true;
}
if (userId == UserHandle.USER_SYSTEM) { if (userId == UserHandle.USER_SYSTEM) {
// The system user is always affiliated in a DO device, // The system user is always affiliated in a DO device,
// even if in headless system user mode. // even if in headless system user mode.
return true; return true;
} }
if (userId == mOwners.getDeviceOwnerUserId()) {
// The user that the DO is installed on is always affiliated with the device.
return true;
}
final ComponentName profileOwner = getProfileOwnerAsUser(userId); final ComponentName profileOwner = getProfileOwnerAsUser(userId);
if (profileOwner == null) { if (profileOwner == null) {

View File

@@ -18,13 +18,17 @@ package com.android.server.devicepolicy;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.os.ShellCommand; import android.os.ShellCommand;
import com.android.server.devicepolicy.Owners.OwnerDto;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.List;
import java.util.Objects; import java.util.Objects;
final class DevicePolicyManagerServiceShellCommand extends ShellCommand { final class DevicePolicyManagerServiceShellCommand extends ShellCommand {
private static final String CMD_IS_SAFE_OPERATION = "is-operation-safe"; private static final String CMD_IS_SAFE_OPERATION = "is-operation-safe";
private static final String CMD_SET_SAFE_OPERATION = "set-operation-safe"; private static final String CMD_SET_SAFE_OPERATION = "set-operation-safe";
private static final String CMD_LIST_OWNERS = "list-owners";
private final DevicePolicyManagerService mService; private final DevicePolicyManagerService mService;
@@ -51,6 +55,8 @@ final class DevicePolicyManagerServiceShellCommand extends ShellCommand {
return runIsSafeOperation(pw); return runIsSafeOperation(pw);
case CMD_SET_SAFE_OPERATION: case CMD_SET_SAFE_OPERATION:
return runSetSafeOperation(pw); return runSetSafeOperation(pw);
case CMD_LIST_OWNERS:
return runListOwners(pw);
default: default:
return onInvalidCommand(pw, cmd); return onInvalidCommand(pw, cmd);
} }
@@ -76,6 +82,8 @@ final class DevicePolicyManagerServiceShellCommand extends ShellCommand {
pw.printf(" %s <OPERATION_ID> <REASON_ID>\n", CMD_SET_SAFE_OPERATION); pw.printf(" %s <OPERATION_ID> <REASON_ID>\n", CMD_SET_SAFE_OPERATION);
pw.printf(" Emulates the result of the next call to check if the given operation is safe" pw.printf(" Emulates the result of the next call to check if the given operation is safe"
+ " \n\n"); + " \n\n");
pw.printf(" %s\n", CMD_LIST_OWNERS);
pw.printf(" Lists the device / profile owners per user \n\n");
} }
private int runIsSafeOperation(PrintWriter pw) { private int runIsSafeOperation(PrintWriter pw) {
@@ -97,4 +105,36 @@ final class DevicePolicyManagerServiceShellCommand extends ShellCommand {
DevicePolicyManager.unsafeOperationReasonToString(reason)); DevicePolicyManager.unsafeOperationReasonToString(reason));
return 0; return 0;
} }
private int runListOwners(PrintWriter pw) {
List<OwnerDto> owners = mService.listAllOwners();
if (owners.isEmpty()) {
pw.println("none");
return 0;
}
int size = owners.size();
if (size == 1) {
pw.println("1 owner:");
} else {
pw.printf("%d owners:\n", size);
}
for (int i = 0; i < size; i++) {
OwnerDto owner = owners.get(i);
pw.printf("User %2d: admin=%s", owner.userId, owner.admin.flattenToShortString());
if (owner.isDeviceOwner) {
pw.print(",DeviceOwner");
}
if (owner.isProfileOwner) {
pw.print(",ProfileOwner");
}
if (owner.isAffiliated) {
pw.print(",Affiliated");
}
pw.println();
}
return 0;
}
} }

View File

@@ -17,6 +17,7 @@
package com.android.server.devicepolicy; package com.android.server.devicepolicy;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManagerInternal; import android.app.ActivityManagerInternal;
import android.app.AppOpsManagerInternal; import android.app.AppOpsManagerInternal;
import android.app.admin.SystemUpdateInfo; import android.app.admin.SystemUpdateInfo;
@@ -57,6 +58,7 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -433,6 +435,23 @@ class Owners {
} }
} }
List<OwnerDto> listAllOwners() {
List<OwnerDto> owners = new ArrayList<>();
synchronized (mLock) {
if (mDeviceOwner != null) {
owners.add(new OwnerDto(mDeviceOwnerUserId, mDeviceOwner.admin,
/* isDeviceOwner= */ true));
}
for (int i = 0; i < mProfileOwners.size(); i++) {
int userId = mProfileOwners.keyAt(i);
OwnerInfo info = mProfileOwners.valueAt(i);
owners.add(new OwnerDto(userId, info.admin, /* isDeviceOwner= */ false));
}
}
return owners;
}
SystemUpdatePolicy getSystemUpdatePolicy() { SystemUpdatePolicy getSystemUpdatePolicy() {
synchronized (mLock) { synchronized (mLock) {
return mSystemUpdatePolicy; return mSystemUpdatePolicy;
@@ -1076,6 +1095,24 @@ class Owners {
} }
} }
/**
* Data-transfer object used by {@link DevicePolicyManagerServiceShellCommand}.
*/
static final class OwnerDto {
public final @UserIdInt int userId;
public final ComponentName admin;
public final boolean isDeviceOwner;
public final boolean isProfileOwner;
public boolean isAffiliated;
private OwnerDto(@UserIdInt int userId, ComponentName admin, boolean isDeviceOwner) {
this.userId = userId;
this.admin = Objects.requireNonNull(admin, "admin must not be null");
this.isDeviceOwner = isDeviceOwner;
this.isProfileOwner = !isDeviceOwner;
}
}
public void dump(IndentingPrintWriter pw) { public void dump(IndentingPrintWriter pw) {
boolean needBlank = false; boolean needBlank = false;
if (mDeviceOwner != null) { if (mDeviceOwner != null) {