Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9e7fdc3 authored by Yasin Kilicdere's avatar Yasin Kilicdere
Browse files

Prevent removing the target user during a user switch.

This CL prevents removing the target user and allows removing the
user that has been switched away. Let's say we're switching from
userA to userB, before this CL during the switch it was possible to
remove userB and it wasn't possible to remove userA. After this CL
this problem is fixed.

This CL also disables REMOVE_GUEST_ON_EXIT while running
UserLifecycleStressTest.switchToExistingGuestAndStartOverStressTest,
and restores it back after the test.

Bug: 264667155
Test: atest FrameworksServicesTests:com.android.server.pm.UserLifecycleStressTest#switchToExistingGuestAndStartOverStressTest
Change-Id: I802191492adc7a60c7c43ea7651a124d2a8425da
parent 719d7559
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -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;
            }
+15 −0
Original line number Diff line number Diff line
@@ -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);
        }