diff options
| author | 2023-08-31 14:14:45 +0000 | |
|---|---|---|
| committer | 2023-08-31 14:14:45 +0000 | |
| commit | 328ffcac3b74537f3b3915fbfcd53fd2fdd67c2c (patch) | |
| tree | 577ef9183007fc6b60107d55484b412eb649e28d | |
| parent | 4522ff0d6048d290b810521742b047585c7168b8 (diff) | |
| parent | 5ebe8acdaac5d2076245a4a38ee18b592ab3bac7 (diff) | |
Merge "Add a DISALLOW_ADD_PRIVATE_PROFILE user restriction" into main
8 files changed, 90 insertions, 1 deletions
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index bcde31acda2e..c6cb604d4039 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -1002,6 +1002,24 @@ public class UserManager { public static final String DISALLOW_ADD_CLONE_PROFILE = "no_add_clone_profile"; /** + * Specifies if a user is disallowed from creating a private profile. + * <p>The default value for an unmanaged user is <code>false</code>. + * For users with a device owner set, the default is <code>true</code>. + * + * <p>Holders of the permission + * {@link android.Manifest.permission#MANAGE_DEVICE_POLICY_PROFILES} + * can set this restriction using the DevicePolicyManager APIs mentioned below. + * + * <p>Key for user restrictions. + * <p>Type: Boolean + * @see DevicePolicyManager#addUserRestriction(ComponentName, String) + * @see DevicePolicyManager#clearUserRestriction(ComponentName, String) + * @see #getUserRestrictions() + * @hide + */ + public static final String DISALLOW_ADD_PRIVATE_PROFILE = "no_add_private_profile"; + + /** * Specifies if a user is disallowed from disabling application verification. The default * value is <code>false</code>. * @@ -1895,6 +1913,7 @@ public class UserManager { DISALLOW_ADD_USER, DISALLOW_ADD_MANAGED_PROFILE, DISALLOW_ADD_CLONE_PROFILE, + DISALLOW_ADD_PRIVATE_PROFILE, ENSURE_VERIFY_APPS, DISALLOW_CONFIG_CELL_BROADCASTS, DISALLOW_CONFIG_MOBILE_NETWORKS, diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index f2797eb48305..259b207baec3 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -4787,11 +4787,14 @@ public class UserManagerService extends IUserManager.Stub { // default check is for DISALLOW_ADD_USER // If new user is of type CLONE, check if creation of clone profile is allowed // If new user is of type MANAGED, check if creation of managed profile is allowed + // If new user is of type PRIVATE, check if creation of private profile is allowed String restriction = UserManager.DISALLOW_ADD_USER; if (UserManager.isUserTypeCloneProfile(userType)) { restriction = UserManager.DISALLOW_ADD_CLONE_PROFILE; } else if (UserManager.isUserTypeManagedProfile(userType)) { restriction = UserManager.DISALLOW_ADD_MANAGED_PROFILE; + } else if (UserManager.isUserTypePrivateProfile(userType)) { + restriction = UserManager.DISALLOW_ADD_PRIVATE_PROFILE; } enforceUserRestriction(restriction, UserHandle.getCallingUserId(), diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java index 4e2ceab290d4..35861d79875d 100644 --- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java +++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java @@ -103,6 +103,7 @@ public class UserRestrictionsUtils { UserManager.DISALLOW_ADD_USER, UserManager.DISALLOW_ADD_MANAGED_PROFILE, UserManager.DISALLOW_ADD_CLONE_PROFILE, + UserManager.DISALLOW_ADD_PRIVATE_PROFILE, UserManager.ENSURE_VERIFY_APPS, UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, @@ -212,7 +213,8 @@ public class UserRestrictionsUtils { private static final Set<String> IMMUTABLE_BY_OWNERS = Sets.newArraySet( UserManager.DISALLOW_RECORD_AUDIO, UserManager.DISALLOW_WALLPAPER, - UserManager.DISALLOW_OEM_UNLOCK + UserManager.DISALLOW_OEM_UNLOCK, + UserManager.DISALLOW_ADD_PRIVATE_PROFILE ); /** diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index af1bac890ff1..2be2bb968fb6 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -2594,6 +2594,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_CLONE_PROFILE, true, userHandle); } + // Enforcing the restriction of private profile creation in case device owner is set. + if (!mUserManager.hasUserRestriction( + UserManager.DISALLOW_ADD_PRIVATE_PROFILE, userHandle)) { + mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_PRIVATE_PROFILE, true, + userHandle); + } // Creation of managed profile is restricted in case device owner is set, enforcing this // restriction by setting user level restriction at time of device owner setup. if (!mUserManager.hasUserRestriction( @@ -4036,6 +4042,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_CLONE_PROFILE, false, user); } + + // When a device owner is set, the system automatically restricts adding a + // private profile. + // Remove this restriction when the device owner is cleared. + if (mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_PRIVATE_PROFILE, + user)) { + mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_PRIVATE_PROFILE, + false, user); + } } } else { // ManagedProvisioning/DPC sets DISALLOW_ADD_USER. Clear to recover to the original state @@ -4061,6 +4076,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { false, userHandle); } + + // When a device owner is set, the system automatically restricts adding a + // private profile. + // Remove this restriction when the device owner is cleared. + if (mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_PRIVATE_PROFILE, + userHandle)) { + mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_PRIVATE_PROFILE, + false, userHandle); + } } } @@ -9423,6 +9447,11 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_CLONE_PROFILE, true, UserHandle.of(u)); + + // Restrict adding a private profile when a device owner is set. + mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_PRIVATE_PROFILE, + true, + UserHandle.of(u)); } } else { mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_MANAGED_PROFILE, @@ -9435,6 +9464,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_CLONE_PROFILE, true, UserHandle.of(userId)); + mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_PRIVATE_PROFILE, + true, + UserHandle.of(userId)); } // TODO Send to system too? sendOwnerChangedBroadcast(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED, userId); @@ -13200,6 +13232,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { USER_RESTRICTION_PERMISSIONS.put( UserManager.DISALLOW_ADD_CLONE_PROFILE, new String[]{MANAGE_DEVICE_POLICY_PROFILES}); USER_RESTRICTION_PERMISSIONS.put( + UserManager.DISALLOW_ADD_PRIVATE_PROFILE, new String[]{MANAGE_DEVICE_POLICY_PROFILES}); + USER_RESTRICTION_PERMISSIONS.put( UserManager.DISALLOW_ADD_USER, new String[]{MANAGE_DEVICE_POLICY_MODIFY_USERS}); USER_RESTRICTION_PERMISSIONS.put( UserManager.DISALLOW_ADD_WIFI_CONFIG, new String[]{MANAGE_DEVICE_POLICY_WIFI}); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java index 7a877b9afdad..0fc8c5e7a46a 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java @@ -426,6 +426,7 @@ final class PolicyDefinition<V> { USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_ADD_USER, /* flags= */ 0); USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_ADD_MANAGED_PROFILE, /* flags= */ 0); USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_ADD_CLONE_PROFILE, /* flags= */ 0); + USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_ADD_PRIVATE_PROFILE, /* flags= */ 0); USER_RESTRICTION_FLAGS.put(UserManager.ENSURE_VERIFY_APPS, POLICY_FLAG_GLOBAL_ONLY_POLICY); USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, /* flags= */ 0); USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, /* flags= */ 0); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index f408ef0394e2..f4dac2c10d0f 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -1144,6 +1144,10 @@ public class DevicePolicyManagerTest extends DpmTestBase { eq(UserManager.DISALLOW_ADD_CLONE_PROFILE), eq(true), eq(UserHandle.SYSTEM)); + verify(getServices().userManager, times(1)).setUserRestriction( + eq(UserManager.DISALLOW_ADD_PRIVATE_PROFILE), + eq(true), eq(UserHandle.SYSTEM)); + verify(mContext.spiedContext, times(1)).sendBroadcastAsUser( MockUtils.checkIntentAction(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED), MockUtils.checkUserHandle(UserHandle.USER_SYSTEM)); @@ -1422,6 +1426,10 @@ public class DevicePolicyManagerTest extends DpmTestBase { .setUserRestriction(eq(UserManager.DISALLOW_ADD_CLONE_PROFILE), eq(false), MockUtils.checkUserHandle(UserHandle.USER_SYSTEM)); + verify(getServices().userManager) + .setUserRestriction(eq(UserManager.DISALLOW_ADD_PRIVATE_PROFILE), eq(false), + MockUtils.checkUserHandle(UserHandle.USER_SYSTEM)); + verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions( eq(UserHandle.USER_SYSTEM), MockUtils.checkUserRestrictions(), MockUtils.checkUserRestrictions(UserHandle.USER_SYSTEM), eq(true)); diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java index ecd35a55e291..b22798e6eaed 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java @@ -1174,6 +1174,24 @@ public final class UserManagerTest { } } + // Make sure the creation of a private profile fails if DISALLOW_ADD_PRIVATE_PROFILE is true. + @MediumTest + @Test + public void testCreateProfileForUser_disallowAddPrivateProfile() { + final int mainUserId = ActivityManager.getCurrentUser(); + final UserHandle mainUserHandle = asHandle(mainUserId); + mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_PRIVATE_PROFILE, + true, mainUserHandle); + try { + UserInfo privateProfileInfo = createProfileForUser("Private", + UserManager.USER_TYPE_PROFILE_PRIVATE, mainUserId); + assertThat(privateProfileInfo).isNull(); + } finally { + mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_PRIVATE_PROFILE, false, + mainUserHandle); + } + } + @MediumTest @Test public void testAddRestrictedProfile() throws Exception { diff --git a/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java index a387d4a8b2bc..9907bd6f38b6 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java @@ -72,6 +72,8 @@ public class UserRestrictionsUtilsTest extends AndroidTestCase { public void testCanDeviceOwnerChange() { assertFalse(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_RECORD_AUDIO)); assertFalse(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_WALLPAPER)); + assertFalse(UserRestrictionsUtils.canDeviceOwnerChange( + UserManager.DISALLOW_ADD_PRIVATE_PROFILE)); assertTrue(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_ADD_USER)); assertTrue(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_USER_SWITCH)); } @@ -83,6 +85,8 @@ public class UserRestrictionsUtilsTest extends AndroidTestCase { UserManager.DISALLOW_WALLPAPER, true)); assertFalse(UserRestrictionsUtils.canProfileOwnerChange( UserManager.DISALLOW_USER_SWITCH, true)); + assertFalse(UserRestrictionsUtils.canProfileOwnerChange( + UserManager.DISALLOW_ADD_PRIVATE_PROFILE, true)); assertTrue(UserRestrictionsUtils.canProfileOwnerChange( UserManager.DISALLOW_ADD_USER, true)); assertTrue(UserRestrictionsUtils.canProfileOwnerChange( |