Merge "Prevent removing the target user during a user switch."

This commit is contained in:
Yasin Kilicdere
2023-01-10 15:22:43 +00:00
committed by Android (Google) Code Review
2 changed files with 33 additions and 2 deletions

View File

@@ -1833,6 +1833,23 @@ public class UserManagerService extends IUserManager.Stub {
return activityManagerInternal.getCurrentUserId();
}
/**
* Gets the current user id, or the target user id in case there is a started user switch.
*
* @return id of current or target foreground user, or {@link UserHandle#USER_NULL} if
* {@link ActivityManagerInternal} is not available yet.
*/
@VisibleForTesting
int getCurrentOrTargetUserId() {
ActivityManagerInternal activityManagerInternal = getActivityManagerInternal();
if (activityManagerInternal == null) {
Slog.w(LOG_TAG, "getCurrentOrTargetUserId() called too early, ActivityManagerInternal"
+ " is not set yet");
return UserHandle.USER_NULL;
}
return activityManagerInternal.getCurrentUser().id;
}
/**
* Gets whether the user is the current foreground user or a started profile of that user.
*
@@ -5407,8 +5424,7 @@ public class UserManagerService extends IUserManager.Stub {
final long ident = Binder.clearCallingIdentity();
try {
final UserData userData;
int currentUser = getCurrentUserId();
if (currentUser == userId) {
if (userId == getCurrentOrTargetUserId()) {
Slog.w(LOG_TAG, "Current user cannot be removed.");
return false;
}

View File

@@ -29,6 +29,7 @@ import android.content.pm.UserInfo;
import android.os.RemoteException;
import android.os.UserManager;
import android.platform.test.annotations.Postsubmit;
import android.provider.Settings;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
@@ -37,6 +38,7 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.FunctionalUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -62,12 +64,22 @@ public class UserLifecycleStressTest {
private Context mContext;
private UserManager mUserManager;
private ActivityManager mActivityManager;
private String mRemoveGuestOnExitOriginalValue;
@Before
public void setup() {
mContext = InstrumentationRegistry.getInstrumentation().getContext();
mUserManager = mContext.getSystemService(UserManager.class);
mActivityManager = mContext.getSystemService(ActivityManager.class);
mRemoveGuestOnExitOriginalValue = Settings.Global.getString(mContext.getContentResolver(),
Settings.Global.REMOVE_GUEST_ON_EXIT);
}
@After
public void tearDown() {
Settings.Global.putString(mContext.getContentResolver(),
Settings.Global.REMOVE_GUEST_ON_EXIT, mRemoveGuestOnExitOriginalValue);
}
/**
@@ -105,6 +117,9 @@ public class UserLifecycleStressTest {
**/
@Test
public void switchToExistingGuestAndStartOverStressTest() throws Exception {
Settings.Global.putString(mContext.getContentResolver(),
Settings.Global.REMOVE_GUEST_ON_EXIT, "0");
if (ActivityManager.getCurrentUser() != USER_SYSTEM) {
switchUser(USER_SYSTEM);
}