summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java7
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java23
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java17
3 files changed, 45 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index da89b9e7a599..7faebb543f76 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -3044,7 +3044,12 @@ class PackageManagerShellCommand extends ShellCommand {
translateUserId(userId, UserHandle.USER_NULL, "runSetUserRestriction");
final IUserManager um = IUserManager.Stub.asInterface(
ServiceManager.getService(Context.USER_SERVICE));
- um.setUserRestriction(restriction, value, translatedUserId);
+ try {
+ um.setUserRestriction(restriction, value, translatedUserId);
+ } catch (IllegalArgumentException e) {
+ getErrPrintWriter().println(e.getMessage());
+ return 1;
+ }
return 0;
}
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index a3bca4c8976e..3864415dabad 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -2630,6 +2630,11 @@ public class UserManagerService extends IUserManager.Stub {
if (!UserRestrictionsUtils.isValidRestriction(key)) {
return;
}
+
+ if (!userExists(userId)) {
+ throw new IllegalArgumentException("Cannot set user restriction. "
+ + "User with this id does not exist");
+ }
synchronized (mRestrictionsLock) {
// Note we can't modify Bundles stored in mBaseUserRestrictions directly, so create
// a copy.
@@ -3214,6 +3219,22 @@ public class UserManagerService extends IUserManager.Stub {
}
/**
+ * Checks whether user with a given ID exists.
+ * @param id User id to be checked.
+ */
+ @VisibleForTesting
+ boolean userExists(int id) {
+ synchronized (mUsersLock) {
+ for (int userId : mUserIds) {
+ if (userId == id) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
* Returns an array of user ids, including pre-created users.
*
* <p>This method should only used for the specific cases that need to handle pre-created users;
@@ -3736,7 +3757,6 @@ public class UserManagerService extends IUserManager.Stub {
}
}
- updateUserIds();
initDefaultGuestRestrictions();
writeUserLP(userData);
@@ -4933,6 +4953,7 @@ public class UserManagerService extends IUserManager.Stub {
synchronized (mUsersLock) {
mUsers.put(userInfo.id, userData);
}
+ updateUserIds();
return userData;
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java
index b1ad8ec1cb66..e04edc6d7db2 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceTest.java
@@ -16,6 +16,7 @@
package com.android.server.pm;
+import static android.os.UserManager.DISALLOW_BLUETOOTH;
import static android.os.UserManager.DISALLOW_USER_SWITCH;
import static com.google.common.truth.Truth.assertThat;
@@ -40,6 +41,7 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.server.LocalServices;
import org.junit.After;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -174,6 +176,21 @@ public class UserManagerServiceTest {
}
@Test
+ public void testSetUserRestrictionWithIncorrectID() throws Exception {
+ int incorrectId = 1;
+ while (mUserManagerService.userExists(incorrectId)) {
+ incorrectId++;
+ }
+ try {
+ mUserManagerService.setUserRestriction(DISALLOW_BLUETOOTH, true, incorrectId);
+ Assert.fail();
+ } catch (IllegalArgumentException e) {
+ //Exception is expected to be thrown if user ID does not exist.
+ // IllegalArgumentException thrown means this test is successful.
+ }
+ }
+
+ @Test
public void assertIsUserSwitcherEnabledOnMultiUserSettings() throws Exception {
int userId = ActivityManager.getCurrentUser();
resetUserSwitcherEnabled();