Only admins or system user car create other admins.
Change-Id: Ie67d0a9f7ff70594c075af6bb824e69d85feaf02
Fixes: 109698068
Test: atest CarUserManagerHelperTest
diff --git a/car-lib/src/android/car/user/CarUserManagerHelper.java b/car-lib/src/android/car/user/CarUserManagerHelper.java
index 7fd7fd2..cd5bf30 100644
--- a/car-lib/src/android/car/user/CarUserManagerHelper.java
+++ b/car-lib/src/android/car/user/CarUserManagerHelper.java
@@ -458,16 +458,22 @@
/**
* Creates a new user on the system, the created user would be granted admin role.
+ * Only admins can create other admins.
*
* @param userName Name to give to the newly created user.
* @return Newly created admin user, null if failed to create a user.
*/
@Nullable
public UserInfo createNewAdminUser(String userName) {
+ if (!(isCurrentProcessAdminUser() || isCurrentProcessSystemUser())) {
+ // Only Admins or System user can create other privileged users.
+ Log.e(TAG, "Only admin users and system user can create other admins.");
+ return null;
+ }
+
UserInfo user = mUserManager.createUser(userName, UserInfo.FLAG_ADMIN);
if (user == null) {
- // Couldn't create user, most likely because there are too many, but we haven't
- // been able to reload the list yet.
+ // Couldn't create user, most likely because there are too many.
Log.w(TAG, "can't create admin user.");
return null;
}
@@ -485,8 +491,7 @@
public UserInfo createNewNonAdminUser(String userName) {
UserInfo user = mUserManager.createUser(userName, 0);
if (user == null) {
- // Couldn't create user, most likely because there are too many, but we haven't
- // been able to reload the list yet.
+ // Couldn't create user, most likely because there are too many.
Log.w(TAG, "can't create non-admin user.");
return null;
}
diff --git a/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java b/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java
index d91846a..74a3548 100644
--- a/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java
+++ b/tests/carservice_unit_test/src/com/android/car/CarUserManagerHelperTest.java
@@ -243,6 +243,9 @@
@Test
public void testCreateNewAdminUser() {
+ // Make sure current user is admin, since only admins can create other admins.
+ when(mUserManager.isAdminUser()).thenReturn(true);
+
// Verify createUser on UserManager gets called.
mHelper.createNewAdminUser(mTestUserName);
verify(mUserManager).createUser(mTestUserName, UserInfo.FLAG_ADMIN);
@@ -257,6 +260,44 @@
}
@Test
+ public void testAdminsCanCreateAdmins() {
+ String newAdminName = "Test new admin";
+ UserInfo expectedAdmin = new UserInfo();
+ expectedAdmin.name = newAdminName;
+ when(mUserManager.createUser(newAdminName, UserInfo.FLAG_ADMIN)).thenReturn(expectedAdmin);
+
+ // Admins can create other admins.
+ when(mUserManager.isAdminUser()).thenReturn(true);
+ UserInfo actualAdmin = mHelper.createNewAdminUser(newAdminName);
+ assertThat(actualAdmin).isEqualTo(expectedAdmin);
+ }
+
+ @Test
+ public void testNonAdminsCanNotCreateAdmins() {
+ String newAdminName = "Test new admin";
+ UserInfo expectedAdmin = new UserInfo();
+ expectedAdmin.name = newAdminName;
+ when(mUserManager.createUser(newAdminName, UserInfo.FLAG_ADMIN)).thenReturn(expectedAdmin);
+
+ // Test that non-admins cannot create new admins.
+ when(mUserManager.isAdminUser()).thenReturn(false); // Current user non-admin.
+ assertThat(mHelper.createNewAdminUser(newAdminName)).isNull();
+ }
+
+ @Test
+ public void testSystemUserCanCreateAdmins() {
+ String newAdminName = "Test new admin";
+ UserInfo expectedAdmin = new UserInfo();
+ expectedAdmin.name = newAdminName;
+ when(mUserManager.createUser(newAdminName, UserInfo.FLAG_ADMIN)).thenReturn(expectedAdmin);
+
+ // System user can create admins.
+ when(mUserManager.isSystemUser()).thenReturn(true);
+ UserInfo actualAdmin = mHelper.createNewAdminUser(newAdminName);
+ assertThat(actualAdmin).isEqualTo(expectedAdmin);
+ }
+
+ @Test
public void testCreateNewNonAdminUser() {
// Verify createUser on UserManager gets called.
mHelper.createNewNonAdminUser(mTestUserName);