Merge "Allow DO to remove user even if DISALLOW_REMOVE_USER is set."

This commit is contained in:
Nicolas Prévot
2016-10-31 11:23:23 +00:00
committed by Android (Google) Code Review
3 changed files with 31 additions and 6 deletions

View File

@@ -127,6 +127,13 @@ public abstract class UserManagerInternal {
*/
public abstract UserInfo createUserEvenWhenDisallowed(String name, int flags);
/**
* Same as {@link UserManager#removeUser(int userHandle)}, but bypasses the check for
* {@link UserManager#DISALLOW_REMOVE_USER} and does not require the
* {@link android.Manifest.permission#MANAGE_USERS} permission.
*/
public abstract boolean removeUserEvenWhenDisallowed(int userId);
/**
* Return whether the given user is running in an
* {@code UserState.STATE_RUNNING_UNLOCKING} or

View File

@@ -2490,7 +2490,10 @@ public class UserManagerService extends IUserManager.Stub {
Log.w(LOG_TAG, "Cannot remove user. DISALLOW_REMOVE_USER is enabled.");
return false;
}
return removeUserUnchecked(userHandle);
}
private boolean removeUserUnchecked(int userHandle) {
long ident = Binder.clearCallingIdentity();
try {
final UserData userData;
@@ -3567,6 +3570,11 @@ public class UserManagerService extends IUserManager.Stub {
return user;
}
@Override
public boolean removeUserEvenWhenDisallowed(int userId) {
return removeUserUnchecked(userId);
}
@Override
public boolean isUserRunning(int userId) {
synchronized (mUserStates) {

View File

@@ -7340,15 +7340,25 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
@Override
public boolean removeUser(ComponentName who, UserHandle userHandle) {
Preconditions.checkNotNull(who, "ComponentName is null");
UserHandle callingUserHandle = mInjector.binderGetCallingUserHandle();
synchronized (this) {
getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
long id = mInjector.binderClearCallingIdentity();
try {
return mUserManager.removeUser(userHandle.getIdentifier());
} finally {
mInjector.binderRestoreCallingIdentity(id);
}
final long id = mInjector.binderClearCallingIdentity();
try {
int restrictionSource = mUserManager.getUserRestrictionSource(
UserManager.DISALLOW_REMOVE_USER, callingUserHandle);
if (restrictionSource != UserManager.RESTRICTION_NOT_SET
&& restrictionSource != UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) {
Log.w(LOG_TAG, "The device owner cannot remove a user because "
+ "DISALLOW_REMOVE_USER is enabled, and was not set by the device "
+ "owner");
return false;
}
return mUserManagerInternal.removeUserEvenWhenDisallowed(
userHandle.getIdentifier());
} finally {
mInjector.binderRestoreCallingIdentity(id);
}
}