Home | History | Annotate | Download | only in pm
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.server.pm;
     18 
     19 import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
     20 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
     21 
     22 import android.Manifest;
     23 import android.annotation.NonNull;
     24 import android.annotation.Nullable;
     25 import android.annotation.UserIdInt;
     26 import android.app.Activity;
     27 import android.app.ActivityManager;
     28 import android.app.ActivityManagerInternal;
     29 import android.app.ActivityManagerNative;
     30 import android.app.AppGlobals;
     31 import android.app.IActivityManager;
     32 import android.app.IStopUserCallback;
     33 import android.app.KeyguardManager;
     34 import android.app.PendingIntent;
     35 import android.content.BroadcastReceiver;
     36 import android.content.Context;
     37 import android.content.Intent;
     38 import android.content.IntentFilter;
     39 import android.content.IntentSender;
     40 import android.content.pm.PackageManager;
     41 import android.content.pm.PackageManager.NameNotFoundException;
     42 import android.content.pm.UserInfo;
     43 import android.content.res.Resources;
     44 import android.graphics.Bitmap;
     45 import android.os.Binder;
     46 import android.os.Build;
     47 import android.os.Bundle;
     48 import android.os.Debug;
     49 import android.os.Environment;
     50 import android.os.FileUtils;
     51 import android.os.Handler;
     52 import android.os.IBinder;
     53 import android.os.IUserManager;
     54 import android.os.Message;
     55 import android.os.ParcelFileDescriptor;
     56 import android.os.Parcelable;
     57 import android.os.PersistableBundle;
     58 import android.os.Process;
     59 import android.os.RemoteException;
     60 import android.os.ResultReceiver;
     61 import android.os.SELinux;
     62 import android.os.ServiceManager;
     63 import android.os.ShellCallback;
     64 import android.os.ShellCommand;
     65 import android.os.SystemProperties;
     66 import android.os.UserHandle;
     67 import android.os.UserManager;
     68 import android.os.UserManager.EnforcingUser;
     69 import android.os.UserManagerInternal;
     70 import android.os.UserManagerInternal.UserRestrictionsListener;
     71 import android.os.storage.StorageManager;
     72 import android.security.GateKeeper;
     73 import android.service.gatekeeper.IGateKeeperService;
     74 import android.system.ErrnoException;
     75 import android.system.Os;
     76 import android.system.OsConstants;
     77 import android.text.TextUtils;
     78 import android.util.AtomicFile;
     79 import android.util.IntArray;
     80 import android.util.Log;
     81 import android.util.Slog;
     82 import android.util.SparseArray;
     83 import android.util.SparseBooleanArray;
     84 import android.util.SparseIntArray;
     85 import android.util.TimeUtils;
     86 import android.util.Xml;
     87 
     88 import com.android.internal.annotations.GuardedBy;
     89 import com.android.internal.annotations.VisibleForTesting;
     90 import com.android.internal.app.IAppOpsService;
     91 import com.android.internal.logging.MetricsLogger;
     92 import com.android.internal.util.DumpUtils;
     93 import com.android.internal.util.FastXmlSerializer;
     94 import com.android.internal.util.Preconditions;
     95 import com.android.internal.util.XmlUtils;
     96 import com.android.internal.widget.LockPatternUtils;
     97 import com.android.server.LocalServices;
     98 import com.android.server.LockGuard;
     99 import com.android.server.SystemService;
    100 import com.android.server.am.UserState;
    101 import com.android.server.storage.DeviceStorageMonitorInternal;
    102 
    103 import libcore.io.IoUtils;
    104 import libcore.util.Objects;
    105 
    106 import org.xmlpull.v1.XmlPullParser;
    107 import org.xmlpull.v1.XmlPullParserException;
    108 import org.xmlpull.v1.XmlSerializer;
    109 
    110 import java.io.BufferedOutputStream;
    111 import java.io.File;
    112 import java.io.FileDescriptor;
    113 import java.io.FileInputStream;
    114 import java.io.FileNotFoundException;
    115 import java.io.FileOutputStream;
    116 import java.io.InputStream;
    117 import java.io.OutputStream;
    118 import java.io.IOException;
    119 import java.io.PrintWriter;
    120 import java.nio.charset.StandardCharsets;
    121 import java.util.ArrayList;
    122 import java.util.Collections;
    123 import java.util.LinkedList;
    124 import java.util.List;
    125 
    126 /**
    127  * Service for {@link UserManager}.
    128  *
    129  * Method naming convention:
    130  * <ul>
    131  * <li> Methods suffixed with "LAr" should be called within the {@link #mAppRestrictionsLock} lock.
    132  * <li> Methods suffixed with "LP" should be called within the {@link #mPackagesLock} lock.
    133  * <li> Methods suffixed with "LR" should be called within the {@link #mRestrictionsLock} lock.
    134  * <li> Methods suffixed with "LU" should be called within the {@link #mUsersLock} lock.
    135  * </ul>
    136  */
    137 public class UserManagerService extends IUserManager.Stub {
    138 
    139     private static final String LOG_TAG = "UserManagerService";
    140     static final boolean DBG = false; // DO NOT SUBMIT WITH TRUE
    141     private static final boolean DBG_WITH_STACKTRACE = false; // DO NOT SUBMIT WITH TRUE
    142     // Can be used for manual testing of id recycling
    143     private static final boolean RELEASE_DELETED_USER_ID = false; // DO NOT SUBMIT WITH TRUE
    144 
    145     private static final String TAG_NAME = "name";
    146     private static final String TAG_ACCOUNT = "account";
    147     private static final String ATTR_FLAGS = "flags";
    148     private static final String ATTR_ICON_PATH = "icon";
    149     private static final String ATTR_ID = "id";
    150     private static final String ATTR_CREATION_TIME = "created";
    151     private static final String ATTR_LAST_LOGGED_IN_TIME = "lastLoggedIn";
    152     private static final String ATTR_LAST_LOGGED_IN_FINGERPRINT = "lastLoggedInFingerprint";
    153     private static final String ATTR_SERIAL_NO = "serialNumber";
    154     private static final String ATTR_NEXT_SERIAL_NO = "nextSerialNumber";
    155     private static final String ATTR_PARTIAL = "partial";
    156     private static final String ATTR_GUEST_TO_REMOVE = "guestToRemove";
    157     private static final String ATTR_USER_VERSION = "version";
    158     private static final String ATTR_PROFILE_GROUP_ID = "profileGroupId";
    159     private static final String ATTR_PROFILE_BADGE = "profileBadge";
    160     private static final String ATTR_RESTRICTED_PROFILE_PARENT_ID = "restrictedProfileParentId";
    161     private static final String ATTR_SEED_ACCOUNT_NAME = "seedAccountName";
    162     private static final String ATTR_SEED_ACCOUNT_TYPE = "seedAccountType";
    163     private static final String TAG_GUEST_RESTRICTIONS = "guestRestrictions";
    164     private static final String TAG_USERS = "users";
    165     private static final String TAG_USER = "user";
    166     private static final String TAG_RESTRICTIONS = "restrictions";
    167     private static final String TAG_DEVICE_POLICY_RESTRICTIONS = "device_policy_restrictions";
    168     private static final String TAG_DEVICE_POLICY_GLOBAL_RESTRICTIONS =
    169             "device_policy_global_restrictions";
    170     /** Legacy name for device owner id tag. */
    171     private static final String TAG_GLOBAL_RESTRICTION_OWNER_ID = "globalRestrictionOwnerUserId";
    172     private static final String TAG_DEVICE_OWNER_USER_ID = "deviceOwnerUserId";
    173     private static final String TAG_ENTRY = "entry";
    174     private static final String TAG_VALUE = "value";
    175     private static final String TAG_SEED_ACCOUNT_OPTIONS = "seedAccountOptions";
    176     private static final String ATTR_KEY = "key";
    177     private static final String ATTR_VALUE_TYPE = "type";
    178     private static final String ATTR_MULTIPLE = "m";
    179 
    180     private static final String ATTR_TYPE_STRING_ARRAY = "sa";
    181     private static final String ATTR_TYPE_STRING = "s";
    182     private static final String ATTR_TYPE_BOOLEAN = "b";
    183     private static final String ATTR_TYPE_INTEGER = "i";
    184     private static final String ATTR_TYPE_BUNDLE = "B";
    185     private static final String ATTR_TYPE_BUNDLE_ARRAY = "BA";
    186 
    187     private static final String USER_INFO_DIR = "system" + File.separator + "users";
    188     private static final String USER_LIST_FILENAME = "userlist.xml";
    189     private static final String USER_PHOTO_FILENAME = "photo.png";
    190     private static final String USER_PHOTO_FILENAME_TMP = USER_PHOTO_FILENAME + ".tmp";
    191 
    192     private static final String RESTRICTIONS_FILE_PREFIX = "res_";
    193     private static final String XML_SUFFIX = ".xml";
    194 
    195     private static final int ALLOWED_FLAGS_FOR_CREATE_USERS_PERMISSION =
    196             UserInfo.FLAG_MANAGED_PROFILE
    197             | UserInfo.FLAG_EPHEMERAL
    198             | UserInfo.FLAG_RESTRICTED
    199             | UserInfo.FLAG_GUEST
    200             | UserInfo.FLAG_DEMO;
    201 
    202     @VisibleForTesting
    203     static final int MIN_USER_ID = 10;
    204     // We need to keep process uid within Integer.MAX_VALUE.
    205     @VisibleForTesting
    206     static final int MAX_USER_ID = Integer.MAX_VALUE / UserHandle.PER_USER_RANGE;
    207 
    208     // Max size of the queue of recently removed users
    209     @VisibleForTesting
    210     static final int MAX_RECENTLY_REMOVED_IDS_SIZE = 100;
    211 
    212     private static final int USER_VERSION = 7;
    213 
    214     private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // ms
    215 
    216     // Maximum number of managed profiles permitted per user is 1. This cannot be increased
    217     // without first making sure that the rest of the framework is prepared for it.
    218     @VisibleForTesting
    219     static final int MAX_MANAGED_PROFILES = 1;
    220 
    221     static final int WRITE_USER_MSG = 1;
    222     static final int WRITE_USER_DELAY = 2*1000;  // 2 seconds
    223 
    224     // Tron counters
    225     private static final String TRON_GUEST_CREATED = "users_guest_created";
    226     private static final String TRON_USER_CREATED = "users_user_created";
    227     private static final String TRON_DEMO_CREATED = "users_demo_created";
    228 
    229     private final Context mContext;
    230     private final PackageManagerService mPm;
    231     private final Object mPackagesLock;
    232     private final UserDataPreparer mUserDataPreparer;
    233     // Short-term lock for internal state, when interaction/sync with PM is not required
    234     private final Object mUsersLock = LockGuard.installNewLock(LockGuard.INDEX_USER);
    235     private final Object mRestrictionsLock = new Object();
    236     // Used for serializing access to app restriction files
    237     private final Object mAppRestrictionsLock = new Object();
    238 
    239     private final Handler mHandler;
    240 
    241     private final File mUsersDir;
    242     private final File mUserListFile;
    243 
    244     private static final IBinder mUserRestriconToken = new Binder();
    245 
    246     /**
    247      * User-related information that is used for persisting to flash. Only UserInfo is
    248      * directly exposed to other system apps.
    249      */
    250     @VisibleForTesting
    251     static class UserData {
    252         // Basic user information and properties
    253         UserInfo info;
    254         // Account name used when there is a strong association between a user and an account
    255         String account;
    256         // Account information for seeding into a newly created user. This could also be
    257         // used for login validation for an existing user, for updating their credentials.
    258         // In the latter case, data may not need to be persisted as it is only valid for the
    259         // current login session.
    260         String seedAccountName;
    261         String seedAccountType;
    262         PersistableBundle seedAccountOptions;
    263         // Whether to perist the seed account information to be available after a boot
    264         boolean persistSeedData;
    265 
    266         void clearSeedAccountData() {
    267             seedAccountName = null;
    268             seedAccountType = null;
    269             seedAccountOptions = null;
    270             persistSeedData = false;
    271         }
    272     }
    273 
    274     @GuardedBy("mUsersLock")
    275     private final SparseArray<UserData> mUsers = new SparseArray<>();
    276 
    277     /**
    278      * User restrictions set via UserManager.  This doesn't include restrictions set by
    279      * device owner / profile owners. Only non-empty restriction bundles are stored.
    280      *
    281      * DO NOT Change existing {@link Bundle} in it.  When changing a restriction for a user,
    282      * a new {@link Bundle} should always be created and set.  This is because a {@link Bundle}
    283      * maybe shared between {@link #mBaseUserRestrictions} and
    284      * {@link #mCachedEffectiveUserRestrictions}, but they should always updated separately.
    285      * (Otherwise we won't be able to detect what restrictions have changed in
    286      * {@link #updateUserRestrictionsInternalLR}.
    287      */
    288     @GuardedBy("mRestrictionsLock")
    289     private final SparseArray<Bundle> mBaseUserRestrictions = new SparseArray<>();
    290 
    291     /**
    292      * Cached user restrictions that are in effect -- i.e. {@link #mBaseUserRestrictions} combined
    293      * with device / profile owner restrictions.  We'll initialize it lazily; use
    294      * {@link #getEffectiveUserRestrictions} to access it.
    295      *
    296      * DO NOT Change existing {@link Bundle} in it.  When changing a restriction for a user,
    297      * a new {@link Bundle} should always be created and set.  This is because a {@link Bundle}
    298      * maybe shared between {@link #mBaseUserRestrictions} and
    299      * {@link #mCachedEffectiveUserRestrictions}, but they should always updated separately.
    300      * (Otherwise we won't be able to detect what restrictions have changed in
    301      * {@link #updateUserRestrictionsInternalLR}.
    302      */
    303     @GuardedBy("mRestrictionsLock")
    304     private final SparseArray<Bundle> mCachedEffectiveUserRestrictions = new SparseArray<>();
    305 
    306     /**
    307      * User restrictions that have already been applied in
    308      * {@link #updateUserRestrictionsInternalLR(Bundle, int)}.  We use it to detect restrictions
    309      * that have changed since the last
    310      * {@link #updateUserRestrictionsInternalLR(Bundle, int)} call.
    311      */
    312     @GuardedBy("mRestrictionsLock")
    313     private final SparseArray<Bundle> mAppliedUserRestrictions = new SparseArray<>();
    314 
    315     /**
    316      * User restrictions set by {@link com.android.server.devicepolicy.DevicePolicyManagerService}
    317      * that should be applied to all users, including guests. Only non-empty restriction bundles are
    318      * stored.
    319      */
    320     @GuardedBy("mRestrictionsLock")
    321     private final SparseArray<Bundle> mDevicePolicyGlobalUserRestrictions = new SparseArray<>();
    322 
    323     /**
    324      * Id of the user that set global restrictions.
    325      */
    326     @GuardedBy("mRestrictionsLock")
    327     private int mDeviceOwnerUserId = UserHandle.USER_NULL;
    328 
    329     /**
    330      * User restrictions set by {@link com.android.server.devicepolicy.DevicePolicyManagerService}
    331      * for each user. Only non-empty restriction bundles are stored.
    332      */
    333     @GuardedBy("mRestrictionsLock")
    334     private final SparseArray<Bundle> mDevicePolicyLocalUserRestrictions = new SparseArray<>();
    335 
    336     @GuardedBy("mGuestRestrictions")
    337     private final Bundle mGuestRestrictions = new Bundle();
    338 
    339     /**
    340      * Set of user IDs being actively removed. Removed IDs linger in this set
    341      * for several seconds to work around a VFS caching issue.
    342      * Use {@link #addRemovingUserIdLocked(int)} to add elements to this array
    343      */
    344     @GuardedBy("mUsersLock")
    345     private final SparseBooleanArray mRemovingUserIds = new SparseBooleanArray();
    346 
    347     /**
    348      * Queue of recently removed userIds. Used for recycling of userIds
    349      */
    350     @GuardedBy("mUsersLock")
    351     private final LinkedList<Integer> mRecentlyRemovedIds = new LinkedList<>();
    352 
    353     @GuardedBy("mUsersLock")
    354     private int[] mUserIds;
    355     @GuardedBy("mPackagesLock")
    356     private int mNextSerialNumber;
    357     private int mUserVersion = 0;
    358 
    359     private IAppOpsService mAppOpsService;
    360 
    361     private final LocalService mLocalService;
    362 
    363     @GuardedBy("mUsersLock")
    364     private boolean mIsDeviceManaged;
    365 
    366     @GuardedBy("mUsersLock")
    367     private final SparseBooleanArray mIsUserManaged = new SparseBooleanArray();
    368 
    369     @GuardedBy("mUserRestrictionsListeners")
    370     private final ArrayList<UserRestrictionsListener> mUserRestrictionsListeners =
    371             new ArrayList<>();
    372 
    373     private final LockPatternUtils mLockPatternUtils;
    374 
    375     private final String ACTION_DISABLE_QUIET_MODE_AFTER_UNLOCK =
    376             "com.android.server.pm.DISABLE_QUIET_MODE_AFTER_UNLOCK";
    377 
    378     private final BroadcastReceiver mDisableQuietModeCallback = new BroadcastReceiver() {
    379         @Override
    380         public void onReceive(Context context, Intent intent) {
    381             if (ACTION_DISABLE_QUIET_MODE_AFTER_UNLOCK.equals(intent.getAction())) {
    382                 final IntentSender target = intent.getParcelableExtra(Intent.EXTRA_INTENT);
    383                 final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_ID, 0);
    384                 setQuietModeEnabled(userHandle, false);
    385                 if (target != null) {
    386                     try {
    387                         mContext.startIntentSender(target, null, 0, 0, 0);
    388                     } catch (IntentSender.SendIntentException e) {
    389                         /* ignore */
    390                     }
    391                 }
    392             }
    393         }
    394     };
    395 
    396     /**
    397      * Whether all users should be created ephemeral.
    398      */
    399     @GuardedBy("mUsersLock")
    400     private boolean mForceEphemeralUsers;
    401 
    402     @GuardedBy("mUserStates")
    403     private final SparseIntArray mUserStates = new SparseIntArray();
    404 
    405     private static UserManagerService sInstance;
    406 
    407     public static UserManagerService getInstance() {
    408         synchronized (UserManagerService.class) {
    409             return sInstance;
    410         }
    411     }
    412 
    413     public static class LifeCycle extends SystemService {
    414 
    415         private UserManagerService mUms;
    416 
    417         /**
    418          * @param context
    419          */
    420         public LifeCycle(Context context) {
    421             super(context);
    422         }
    423 
    424         @Override
    425         public void onStart() {
    426             mUms = UserManagerService.getInstance();
    427             publishBinderService(Context.USER_SERVICE, mUms);
    428         }
    429 
    430         @Override
    431         public void onBootPhase(int phase) {
    432             if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
    433                 mUms.cleanupPartialUsers();
    434             }
    435         }
    436     }
    437 
    438     // TODO b/28848102 Add support for test dependencies injection
    439     @VisibleForTesting
    440     UserManagerService(Context context) {
    441         this(context, null, null, new Object(), context.getCacheDir());
    442     }
    443 
    444     /**
    445      * Called by package manager to create the service.  This is closely
    446      * associated with the package manager, and the given lock is the
    447      * package manager's own lock.
    448      */
    449     UserManagerService(Context context, PackageManagerService pm, UserDataPreparer userDataPreparer,
    450             Object packagesLock) {
    451         this(context, pm, userDataPreparer, packagesLock, Environment.getDataDirectory());
    452     }
    453 
    454     private UserManagerService(Context context, PackageManagerService pm,
    455             UserDataPreparer userDataPreparer, Object packagesLock, File dataDir) {
    456         mContext = context;
    457         mPm = pm;
    458         mPackagesLock = packagesLock;
    459         mHandler = new MainHandler();
    460         mUserDataPreparer = userDataPreparer;
    461         synchronized (mPackagesLock) {
    462             mUsersDir = new File(dataDir, USER_INFO_DIR);
    463             mUsersDir.mkdirs();
    464             // Make zeroth user directory, for services to migrate their files to that location
    465             File userZeroDir = new File(mUsersDir, String.valueOf(UserHandle.USER_SYSTEM));
    466             userZeroDir.mkdirs();
    467             FileUtils.setPermissions(mUsersDir.toString(),
    468                     FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IROTH | FileUtils.S_IXOTH,
    469                     -1, -1);
    470             mUserListFile = new File(mUsersDir, USER_LIST_FILENAME);
    471             initDefaultGuestRestrictions();
    472             readUserListLP();
    473             sInstance = this;
    474         }
    475         mLocalService = new LocalService();
    476         LocalServices.addService(UserManagerInternal.class, mLocalService);
    477         mLockPatternUtils = new LockPatternUtils(mContext);
    478         mUserStates.put(UserHandle.USER_SYSTEM, UserState.STATE_BOOTING);
    479     }
    480 
    481     void systemReady() {
    482         mAppOpsService = IAppOpsService.Stub.asInterface(
    483                 ServiceManager.getService(Context.APP_OPS_SERVICE));
    484 
    485         synchronized (mRestrictionsLock) {
    486             applyUserRestrictionsLR(UserHandle.USER_SYSTEM);
    487         }
    488 
    489         UserInfo currentGuestUser = findCurrentGuestUser();
    490         if (currentGuestUser != null && !hasUserRestriction(
    491                 UserManager.DISALLOW_CONFIG_WIFI, currentGuestUser.id)) {
    492             // If a guest user currently exists, apply the DISALLOW_CONFIG_WIFI option
    493             // to it, in case this guest was created in a previous version where this
    494             // user restriction was not a default guest restriction.
    495             setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, currentGuestUser.id);
    496         }
    497 
    498         mContext.registerReceiver(mDisableQuietModeCallback,
    499                 new IntentFilter(ACTION_DISABLE_QUIET_MODE_AFTER_UNLOCK),
    500                 null, mHandler);
    501     }
    502 
    503     void cleanupPartialUsers() {
    504         // Prune out any partially created, partially removed and ephemeral users.
    505         ArrayList<UserInfo> partials = new ArrayList<>();
    506         synchronized (mUsersLock) {
    507             final int userSize = mUsers.size();
    508             for (int i = 0; i < userSize; i++) {
    509                 UserInfo ui = mUsers.valueAt(i).info;
    510                 if ((ui.partial || ui.guestToRemove || ui.isEphemeral()) && i != 0) {
    511                     partials.add(ui);
    512                     addRemovingUserIdLocked(ui.id);
    513                     ui.partial = true;
    514                 }
    515             }
    516         }
    517         final int partialsSize = partials.size();
    518         for (int i = 0; i < partialsSize; i++) {
    519             UserInfo ui = partials.get(i);
    520             Slog.w(LOG_TAG, "Removing partially created user " + ui.id
    521                     + " (name=" + ui.name + ")");
    522             removeUserState(ui.id);
    523         }
    524     }
    525 
    526     @Override
    527     public String getUserAccount(int userId) {
    528         checkManageUserAndAcrossUsersFullPermission("get user account");
    529         synchronized (mUsersLock) {
    530             return mUsers.get(userId).account;
    531         }
    532     }
    533 
    534     @Override
    535     public void setUserAccount(int userId, String accountName) {
    536         checkManageUserAndAcrossUsersFullPermission("set user account");
    537         UserData userToUpdate = null;
    538         synchronized (mPackagesLock) {
    539             synchronized (mUsersLock) {
    540                 final UserData userData = mUsers.get(userId);
    541                 if (userData == null) {
    542                     Slog.e(LOG_TAG, "User not found for setting user account: u" + userId);
    543                     return;
    544                 }
    545                 String currentAccount = userData.account;
    546                 if (!Objects.equal(currentAccount, accountName)) {
    547                     userData.account = accountName;
    548                     userToUpdate = userData;
    549                 }
    550             }
    551 
    552             if (userToUpdate != null) {
    553                 writeUserLP(userToUpdate);
    554             }
    555         }
    556     }
    557 
    558     @Override
    559     public UserInfo getPrimaryUser() {
    560         checkManageUsersPermission("query users");
    561         synchronized (mUsersLock) {
    562             final int userSize = mUsers.size();
    563             for (int i = 0; i < userSize; i++) {
    564                 UserInfo ui = mUsers.valueAt(i).info;
    565                 if (ui.isPrimary() && !mRemovingUserIds.get(ui.id)) {
    566                     return ui;
    567                 }
    568             }
    569         }
    570         return null;
    571     }
    572 
    573     @Override
    574     public @NonNull List<UserInfo> getUsers(boolean excludeDying) {
    575         checkManageOrCreateUsersPermission("query users");
    576         synchronized (mUsersLock) {
    577             ArrayList<UserInfo> users = new ArrayList<UserInfo>(mUsers.size());
    578             final int userSize = mUsers.size();
    579             for (int i = 0; i < userSize; i++) {
    580                 UserInfo ui = mUsers.valueAt(i).info;
    581                 if (ui.partial) {
    582                     continue;
    583                 }
    584                 if (!excludeDying || !mRemovingUserIds.get(ui.id)) {
    585                     users.add(userWithName(ui));
    586                 }
    587             }
    588             return users;
    589         }
    590     }
    591 
    592     @Override
    593     public List<UserInfo> getProfiles(int userId, boolean enabledOnly) {
    594         boolean returnFullInfo = true;
    595         if (userId != UserHandle.getCallingUserId()) {
    596             checkManageOrCreateUsersPermission("getting profiles related to user " + userId);
    597         } else {
    598             returnFullInfo = hasManageUsersPermission();
    599         }
    600         final long ident = Binder.clearCallingIdentity();
    601         try {
    602             synchronized (mUsersLock) {
    603                 return getProfilesLU(userId, enabledOnly, returnFullInfo);
    604             }
    605         } finally {
    606             Binder.restoreCallingIdentity(ident);
    607         }
    608     }
    609 
    610     @Override
    611     public int[] getProfileIds(int userId, boolean enabledOnly) {
    612         if (userId != UserHandle.getCallingUserId()) {
    613             checkManageOrCreateUsersPermission("getting profiles related to user " + userId);
    614         }
    615         final long ident = Binder.clearCallingIdentity();
    616         try {
    617             synchronized (mUsersLock) {
    618                 return getProfileIdsLU(userId, enabledOnly).toArray();
    619             }
    620         } finally {
    621             Binder.restoreCallingIdentity(ident);
    622         }
    623     }
    624 
    625     /** Assume permissions already checked and caller's identity cleared */
    626     private List<UserInfo> getProfilesLU(int userId, boolean enabledOnly, boolean fullInfo) {
    627         IntArray profileIds = getProfileIdsLU(userId, enabledOnly);
    628         ArrayList<UserInfo> users = new ArrayList<>(profileIds.size());
    629         for (int i = 0; i < profileIds.size(); i++) {
    630             int profileId = profileIds.get(i);
    631             UserInfo userInfo = mUsers.get(profileId).info;
    632             // If full info is not required - clear PII data to prevent 3P apps from reading it
    633             if (!fullInfo) {
    634                 userInfo = new UserInfo(userInfo);
    635                 userInfo.name = null;
    636                 userInfo.iconPath = null;
    637             } else {
    638                 userInfo = userWithName(userInfo);
    639             }
    640             users.add(userInfo);
    641         }
    642         return users;
    643     }
    644 
    645     /**
    646      *  Assume permissions already checked and caller's identity cleared
    647      */
    648     private IntArray getProfileIdsLU(int userId, boolean enabledOnly) {
    649         UserInfo user = getUserInfoLU(userId);
    650         IntArray result = new IntArray(mUsers.size());
    651         if (user == null) {
    652             // Probably a dying user
    653             return result;
    654         }
    655         final int userSize = mUsers.size();
    656         for (int i = 0; i < userSize; i++) {
    657             UserInfo profile = mUsers.valueAt(i).info;
    658             if (!isProfileOf(user, profile)) {
    659                 continue;
    660             }
    661             if (enabledOnly && !profile.isEnabled()) {
    662                 continue;
    663             }
    664             if (mRemovingUserIds.get(profile.id)) {
    665                 continue;
    666             }
    667             if (profile.partial) {
    668                 continue;
    669             }
    670             result.add(profile.id);
    671         }
    672         return result;
    673     }
    674 
    675     @Override
    676     public int getCredentialOwnerProfile(int userHandle) {
    677         checkManageUsersPermission("get the credential owner");
    678         if (!mLockPatternUtils.isSeparateProfileChallengeEnabled(userHandle)) {
    679             synchronized (mUsersLock) {
    680                 UserInfo profileParent = getProfileParentLU(userHandle);
    681                 if (profileParent != null) {
    682                     return profileParent.id;
    683                 }
    684             }
    685         }
    686 
    687         return userHandle;
    688     }
    689 
    690     @Override
    691     public boolean isSameProfileGroup(int userId, int otherUserId) {
    692         if (userId == otherUserId) return true;
    693         checkManageUsersPermission("check if in the same profile group");
    694         return isSameProfileGroupNoChecks(userId, otherUserId);
    695     }
    696 
    697     private boolean isSameProfileGroupNoChecks(int userId, int otherUserId) {
    698         synchronized (mUsersLock) {
    699             UserInfo userInfo = getUserInfoLU(userId);
    700             if (userInfo == null || userInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID) {
    701                 return false;
    702             }
    703             UserInfo otherUserInfo = getUserInfoLU(otherUserId);
    704             if (otherUserInfo == null
    705                     || otherUserInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID) {
    706                 return false;
    707             }
    708             return userInfo.profileGroupId == otherUserInfo.profileGroupId;
    709         }
    710     }
    711 
    712     @Override
    713     public UserInfo getProfileParent(int userHandle) {
    714         checkManageUsersPermission("get the profile parent");
    715         synchronized (mUsersLock) {
    716             return getProfileParentLU(userHandle);
    717         }
    718     }
    719 
    720     private UserInfo getProfileParentLU(int userHandle) {
    721         UserInfo profile = getUserInfoLU(userHandle);
    722         if (profile == null) {
    723             return null;
    724         }
    725         int parentUserId = profile.profileGroupId;
    726         if (parentUserId == userHandle || parentUserId == UserInfo.NO_PROFILE_GROUP_ID) {
    727             return null;
    728         } else {
    729             return getUserInfoLU(parentUserId);
    730         }
    731     }
    732 
    733     private static boolean isProfileOf(UserInfo user, UserInfo profile) {
    734         return user.id == profile.id ||
    735                 (user.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID
    736                 && user.profileGroupId == profile.profileGroupId);
    737     }
    738 
    739     private void broadcastProfileAvailabilityChanges(UserHandle profileHandle,
    740             UserHandle parentHandle, boolean inQuietMode) {
    741         Intent intent = new Intent();
    742         if (inQuietMode) {
    743             intent.setAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
    744         } else {
    745             intent.setAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
    746         }
    747         intent.putExtra(Intent.EXTRA_QUIET_MODE, inQuietMode);
    748         intent.putExtra(Intent.EXTRA_USER, profileHandle);
    749         intent.putExtra(Intent.EXTRA_USER_HANDLE, profileHandle.getIdentifier());
    750         intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    751         mContext.sendBroadcastAsUser(intent, parentHandle);
    752     }
    753 
    754     @Override
    755     public void setQuietModeEnabled(int userHandle, boolean enableQuietMode) {
    756         checkManageUsersPermission("silence profile");
    757         boolean changed = false;
    758         UserInfo profile, parent;
    759         synchronized (mPackagesLock) {
    760             synchronized (mUsersLock) {
    761                 profile = getUserInfoLU(userHandle);
    762                 parent = getProfileParentLU(userHandle);
    763 
    764             }
    765             if (profile == null || !profile.isManagedProfile()) {
    766                 throw new IllegalArgumentException("User " + userHandle + " is not a profile");
    767             }
    768             if (profile.isQuietModeEnabled() != enableQuietMode) {
    769                 profile.flags ^= UserInfo.FLAG_QUIET_MODE;
    770                 writeUserLP(getUserDataLU(profile.id));
    771                 changed = true;
    772             }
    773         }
    774         if (changed) {
    775             long identity = Binder.clearCallingIdentity();
    776             try {
    777                 if (enableQuietMode) {
    778                     ActivityManager.getService().stopUser(userHandle, /* force */true, null);
    779                     LocalServices.getService(ActivityManagerInternal.class)
    780                             .killForegroundAppsForUser(userHandle);
    781                 } else {
    782                     ActivityManager.getService().startUserInBackground(userHandle);
    783                 }
    784             } catch (RemoteException e) {
    785                 Slog.e(LOG_TAG, "fail to start/stop user for quiet mode", e);
    786             } finally {
    787                 Binder.restoreCallingIdentity(identity);
    788             }
    789 
    790             broadcastProfileAvailabilityChanges(profile.getUserHandle(), parent.getUserHandle(),
    791                     enableQuietMode);
    792         }
    793     }
    794 
    795     @Override
    796     public boolean isQuietModeEnabled(int userHandle) {
    797         synchronized (mPackagesLock) {
    798             UserInfo info;
    799             synchronized (mUsersLock) {
    800                 info = getUserInfoLU(userHandle);
    801             }
    802             if (info == null || !info.isManagedProfile()) {
    803                 return false;
    804             }
    805             return info.isQuietModeEnabled();
    806         }
    807     }
    808 
    809     @Override
    810     public boolean trySetQuietModeDisabled(int userHandle, IntentSender target) {
    811         checkManageUsersPermission("silence profile");
    812         if (StorageManager.isUserKeyUnlocked(userHandle)
    813                 || !mLockPatternUtils.isSecure(userHandle)) {
    814             // if the user is already unlocked, no need to show a profile challenge
    815             setQuietModeEnabled(userHandle, false);
    816             return true;
    817         }
    818 
    819         long identity = Binder.clearCallingIdentity();
    820         try {
    821             // otherwise, we show a profile challenge to trigger decryption of the user
    822             final KeyguardManager km = (KeyguardManager) mContext.getSystemService(
    823                     Context.KEYGUARD_SERVICE);
    824             // We should use userHandle not credentialOwnerUserId here, as even if it is unified
    825             // lock, confirm screenlock page will know and show personal challenge, and unlock
    826             // work profile when personal challenge is correct
    827             final Intent unlockIntent = km.createConfirmDeviceCredentialIntent(null, null,
    828                     userHandle);
    829             if (unlockIntent == null) {
    830                 return false;
    831             }
    832             final Intent callBackIntent = new Intent(
    833                     ACTION_DISABLE_QUIET_MODE_AFTER_UNLOCK);
    834             if (target != null) {
    835                 callBackIntent.putExtra(Intent.EXTRA_INTENT, target);
    836             }
    837             callBackIntent.putExtra(Intent.EXTRA_USER_ID, userHandle);
    838             callBackIntent.setPackage(mContext.getPackageName());
    839             callBackIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
    840             final PendingIntent pendingIntent = PendingIntent.getBroadcast(
    841                     mContext,
    842                     0,
    843                     callBackIntent,
    844                     PendingIntent.FLAG_CANCEL_CURRENT |
    845                             PendingIntent.FLAG_ONE_SHOT |
    846                             PendingIntent.FLAG_IMMUTABLE);
    847             // After unlocking the challenge, it will disable quiet mode and run the original
    848             // intentSender
    849             unlockIntent.putExtra(Intent.EXTRA_INTENT, pendingIntent.getIntentSender());
    850             unlockIntent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    851             mContext.startActivity(unlockIntent);
    852         } finally {
    853             Binder.restoreCallingIdentity(identity);
    854         }
    855         return false;
    856     }
    857 
    858     @Override
    859     public void setUserEnabled(int userId) {
    860         checkManageUsersPermission("enable user");
    861         synchronized (mPackagesLock) {
    862             UserInfo info;
    863             synchronized (mUsersLock) {
    864                 info = getUserInfoLU(userId);
    865             }
    866             if (info != null && !info.isEnabled()) {
    867                 info.flags ^= UserInfo.FLAG_DISABLED;
    868                 writeUserLP(getUserDataLU(info.id));
    869             }
    870         }
    871     }
    872 
    873     /**
    874      * Evicts a user's CE key by stopping and restarting the user.
    875      *
    876      * The key is evicted automatically by the user controller when the user has stopped.
    877      */
    878     @Override
    879     public void evictCredentialEncryptionKey(@UserIdInt int userId) {
    880         checkManageUsersPermission("evict CE key");
    881         final IActivityManager am = ActivityManagerNative.getDefault();
    882         final long identity = Binder.clearCallingIdentity();
    883         try {
    884             am.restartUserInBackground(userId);
    885         } catch (RemoteException re) {
    886             throw re.rethrowAsRuntimeException();
    887         } finally {
    888             Binder.restoreCallingIdentity(identity);
    889         }
    890     }
    891 
    892     @Override
    893     public UserInfo getUserInfo(int userId) {
    894         checkManageOrCreateUsersPermission("query user");
    895         synchronized (mUsersLock) {
    896             return userWithName(getUserInfoLU(userId));
    897         }
    898     }
    899 
    900     /**
    901      * Returns a UserInfo object with the name filled in, for Owner, or the original
    902      * if the name is already set.
    903      */
    904     private UserInfo userWithName(UserInfo orig) {
    905         if (orig != null && orig.name == null && orig.id == UserHandle.USER_SYSTEM) {
    906             UserInfo withName = new UserInfo(orig);
    907             withName.name = getOwnerName();
    908             return withName;
    909         } else {
    910             return orig;
    911         }
    912     }
    913 
    914     @Override
    915     public int getManagedProfileBadge(@UserIdInt int userId) {
    916         int callingUserId = UserHandle.getCallingUserId();
    917         if (callingUserId != userId && !hasManageUsersPermission()) {
    918             if (!isSameProfileGroupNoChecks(callingUserId, userId)) {
    919                 throw new SecurityException(
    920                         "You need MANAGE_USERS permission to: check if specified user a " +
    921                         "managed profile outside your profile group");
    922             }
    923         }
    924         synchronized (mUsersLock) {
    925             UserInfo userInfo = getUserInfoLU(userId);
    926             return userInfo != null ? userInfo.profileBadge : 0;
    927         }
    928     }
    929 
    930     @Override
    931     public boolean isManagedProfile(int userId) {
    932         int callingUserId = UserHandle.getCallingUserId();
    933         if (callingUserId != userId && !hasManageUsersPermission()) {
    934             if (!isSameProfileGroupNoChecks(callingUserId, userId)) {
    935                 throw new SecurityException(
    936                         "You need MANAGE_USERS permission to: check if specified user a " +
    937                         "managed profile outside your profile group");
    938             }
    939         }
    940         synchronized (mUsersLock) {
    941             UserInfo userInfo = getUserInfoLU(userId);
    942             return userInfo != null && userInfo.isManagedProfile();
    943         }
    944     }
    945 
    946     @Override
    947     public boolean isUserUnlockingOrUnlocked(int userId) {
    948         checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserUnlockingOrUnlocked");
    949         return mLocalService.isUserUnlockingOrUnlocked(userId);
    950     }
    951 
    952     @Override
    953     public boolean isUserUnlocked(int userId) {
    954         checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserUnlocked");
    955         return mLocalService.isUserUnlocked(userId);
    956     }
    957 
    958     @Override
    959     public boolean isUserRunning(int userId) {
    960         checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserRunning");
    961         return mLocalService.isUserRunning(userId);
    962     }
    963 
    964     private void checkManageOrInteractPermIfCallerInOtherProfileGroup(int userId, String name) {
    965         int callingUserId = UserHandle.getCallingUserId();
    966         if (callingUserId == userId || isSameProfileGroupNoChecks(callingUserId, userId) ||
    967                 hasManageUsersPermission()) {
    968             return;
    969         }
    970         if (ActivityManager.checkComponentPermission(Manifest.permission.INTERACT_ACROSS_USERS,
    971                 Binder.getCallingUid(), -1, true) != PackageManager.PERMISSION_GRANTED) {
    972             throw new SecurityException("You need INTERACT_ACROSS_USERS or MANAGE_USERS permission "
    973                     + "to: check " + name);
    974         }
    975     }
    976 
    977     @Override
    978     public boolean isDemoUser(int userId) {
    979         int callingUserId = UserHandle.getCallingUserId();
    980         if (callingUserId != userId && !hasManageUsersPermission()) {
    981             throw new SecurityException("You need MANAGE_USERS permission to query if u=" + userId
    982                     + " is a demo user");
    983         }
    984         synchronized (mUsersLock) {
    985             UserInfo userInfo = getUserInfoLU(userId);
    986             return userInfo != null && userInfo.isDemo();
    987         }
    988     }
    989 
    990     @Override
    991     public boolean isRestricted() {
    992         synchronized (mUsersLock) {
    993             return getUserInfoLU(UserHandle.getCallingUserId()).isRestricted();
    994         }
    995     }
    996 
    997     @Override
    998     public boolean canHaveRestrictedProfile(int userId) {
    999         checkManageUsersPermission("canHaveRestrictedProfile");
   1000         synchronized (mUsersLock) {
   1001             final UserInfo userInfo = getUserInfoLU(userId);
   1002             if (userInfo == null || !userInfo.canHaveProfile()) {
   1003                 return false;
   1004             }
   1005             if (!userInfo.isAdmin()) {
   1006                 return false;
   1007             }
   1008             // restricted profile can be created if there is no DO set and the admin user has no PO;
   1009             return !mIsDeviceManaged && !mIsUserManaged.get(userId);
   1010         }
   1011     }
   1012 
   1013     /*
   1014      * Should be locked on mUsers before calling this.
   1015      */
   1016     private UserInfo getUserInfoLU(int userId) {
   1017         final UserData userData = mUsers.get(userId);
   1018         // If it is partial and not in the process of being removed, return as unknown user.
   1019         if (userData != null && userData.info.partial && !mRemovingUserIds.get(userId)) {
   1020             Slog.w(LOG_TAG, "getUserInfo: unknown user #" + userId);
   1021             return null;
   1022         }
   1023         return userData != null ? userData.info : null;
   1024     }
   1025 
   1026     private UserData getUserDataLU(int userId) {
   1027         final UserData userData = mUsers.get(userId);
   1028         // If it is partial and not in the process of being removed, return as unknown user.
   1029         if (userData != null && userData.info.partial && !mRemovingUserIds.get(userId)) {
   1030             return null;
   1031         }
   1032         return userData;
   1033     }
   1034 
   1035     /**
   1036      * Obtains {@link #mUsersLock} and return UserInfo from mUsers.
   1037      * <p>No permissions checking or any addition checks are made</p>
   1038      */
   1039     private UserInfo getUserInfoNoChecks(int userId) {
   1040         synchronized (mUsersLock) {
   1041             final UserData userData = mUsers.get(userId);
   1042             return userData != null ? userData.info : null;
   1043         }
   1044     }
   1045 
   1046     /**
   1047      * Obtains {@link #mUsersLock} and return UserData from mUsers.
   1048      * <p>No permissions checking or any addition checks are made</p>
   1049      */
   1050     private UserData getUserDataNoChecks(int userId) {
   1051         synchronized (mUsersLock) {
   1052             return mUsers.get(userId);
   1053         }
   1054     }
   1055 
   1056     /** Called by PackageManagerService */
   1057     public boolean exists(int userId) {
   1058         return getUserInfoNoChecks(userId) != null;
   1059     }
   1060 
   1061     @Override
   1062     public void setUserName(int userId, String name) {
   1063         checkManageUsersPermission("rename users");
   1064         boolean changed = false;
   1065         synchronized (mPackagesLock) {
   1066             UserData userData = getUserDataNoChecks(userId);
   1067             if (userData == null || userData.info.partial) {
   1068                 Slog.w(LOG_TAG, "setUserName: unknown user #" + userId);
   1069                 return;
   1070             }
   1071             if (name != null && !name.equals(userData.info.name)) {
   1072                 userData.info.name = name;
   1073                 writeUserLP(userData);
   1074                 changed = true;
   1075             }
   1076         }
   1077         if (changed) {
   1078             sendUserInfoChangedBroadcast(userId);
   1079         }
   1080     }
   1081 
   1082     @Override
   1083     public void setUserIcon(int userId, Bitmap bitmap) {
   1084         checkManageUsersPermission("update users");
   1085         if (hasUserRestriction(UserManager.DISALLOW_SET_USER_ICON, userId)) {
   1086             Log.w(LOG_TAG, "Cannot set user icon. DISALLOW_SET_USER_ICON is enabled.");
   1087             return;
   1088         }
   1089         mLocalService.setUserIcon(userId, bitmap);
   1090     }
   1091 
   1092 
   1093 
   1094     private void sendUserInfoChangedBroadcast(int userId) {
   1095         Intent changedIntent = new Intent(Intent.ACTION_USER_INFO_CHANGED);
   1096         changedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
   1097         changedIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
   1098         mContext.sendBroadcastAsUser(changedIntent, UserHandle.ALL);
   1099     }
   1100 
   1101     @Override
   1102     public ParcelFileDescriptor getUserIcon(int targetUserId) {
   1103         String iconPath;
   1104         synchronized (mPackagesLock) {
   1105             UserInfo targetUserInfo = getUserInfoNoChecks(targetUserId);
   1106             if (targetUserInfo == null || targetUserInfo.partial) {
   1107                 Slog.w(LOG_TAG, "getUserIcon: unknown user #" + targetUserId);
   1108                 return null;
   1109             }
   1110 
   1111             final int callingUserId = UserHandle.getCallingUserId();
   1112             final int callingGroupId = getUserInfoNoChecks(callingUserId).profileGroupId;
   1113             final int targetGroupId = targetUserInfo.profileGroupId;
   1114             final boolean sameGroup = (callingGroupId != UserInfo.NO_PROFILE_GROUP_ID
   1115                     && callingGroupId == targetGroupId);
   1116             if ((callingUserId != targetUserId) && !sameGroup) {
   1117                 checkManageUsersPermission("get the icon of a user who is not related");
   1118             }
   1119 
   1120             if (targetUserInfo.iconPath == null) {
   1121                 return null;
   1122             }
   1123             iconPath = targetUserInfo.iconPath;
   1124         }
   1125 
   1126         try {
   1127             return ParcelFileDescriptor.open(
   1128                     new File(iconPath), ParcelFileDescriptor.MODE_READ_ONLY);
   1129         } catch (FileNotFoundException e) {
   1130             Log.e(LOG_TAG, "Couldn't find icon file", e);
   1131         }
   1132         return null;
   1133     }
   1134 
   1135     public void makeInitialized(int userId) {
   1136         checkManageUsersPermission("makeInitialized");
   1137         boolean scheduleWriteUser = false;
   1138         UserData userData;
   1139         synchronized (mUsersLock) {
   1140             userData = mUsers.get(userId);
   1141             if (userData == null || userData.info.partial) {
   1142                 Slog.w(LOG_TAG, "makeInitialized: unknown user #" + userId);
   1143                 return;
   1144             }
   1145             if ((userData.info.flags & UserInfo.FLAG_INITIALIZED) == 0) {
   1146                 userData.info.flags |= UserInfo.FLAG_INITIALIZED;
   1147                 scheduleWriteUser = true;
   1148             }
   1149         }
   1150         if (scheduleWriteUser) {
   1151             scheduleWriteUser(userData);
   1152         }
   1153     }
   1154 
   1155     /**
   1156      * If default guest restrictions haven't been initialized yet, add the basic
   1157      * restrictions.
   1158      */
   1159     private void initDefaultGuestRestrictions() {
   1160         synchronized (mGuestRestrictions) {
   1161             if (mGuestRestrictions.isEmpty()) {
   1162                 mGuestRestrictions.putBoolean(UserManager.DISALLOW_CONFIG_WIFI, true);
   1163                 mGuestRestrictions.putBoolean(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true);
   1164                 mGuestRestrictions.putBoolean(UserManager.DISALLOW_OUTGOING_CALLS, true);
   1165                 mGuestRestrictions.putBoolean(UserManager.DISALLOW_SMS, true);
   1166             }
   1167         }
   1168     }
   1169 
   1170     @Override
   1171     public Bundle getDefaultGuestRestrictions() {
   1172         checkManageUsersPermission("getDefaultGuestRestrictions");
   1173         synchronized (mGuestRestrictions) {
   1174             return new Bundle(mGuestRestrictions);
   1175         }
   1176     }
   1177 
   1178     @Override
   1179     public void setDefaultGuestRestrictions(Bundle restrictions) {
   1180         checkManageUsersPermission("setDefaultGuestRestrictions");
   1181         synchronized (mGuestRestrictions) {
   1182             mGuestRestrictions.clear();
   1183             mGuestRestrictions.putAll(restrictions);
   1184         }
   1185         synchronized (mPackagesLock) {
   1186             writeUserListLP();
   1187         }
   1188     }
   1189 
   1190     /**
   1191      * See {@link UserManagerInternal#setDevicePolicyUserRestrictions}
   1192      */
   1193     private void setDevicePolicyUserRestrictionsInner(int userId, @Nullable Bundle restrictions,
   1194             boolean isDeviceOwner, int cameraRestrictionScope) {
   1195         final Bundle global = new Bundle();
   1196         final Bundle local = new Bundle();
   1197 
   1198         // Sort restrictions into local and global ensuring they don't overlap.
   1199         UserRestrictionsUtils.sortToGlobalAndLocal(restrictions, isDeviceOwner,
   1200                 cameraRestrictionScope, global, local);
   1201 
   1202         boolean globalChanged, localChanged;
   1203         synchronized (mRestrictionsLock) {
   1204             // Update global and local restrictions if they were changed.
   1205             globalChanged = updateRestrictionsIfNeededLR(
   1206                     userId, global, mDevicePolicyGlobalUserRestrictions);
   1207             localChanged = updateRestrictionsIfNeededLR(
   1208                     userId, local, mDevicePolicyLocalUserRestrictions);
   1209 
   1210             if (isDeviceOwner) {
   1211                 // Remember the global restriction owner userId to be able to make a distinction
   1212                 // in getUserRestrictionSource on who set local policies.
   1213                 mDeviceOwnerUserId = userId;
   1214             } else {
   1215                 if (mDeviceOwnerUserId == userId) {
   1216                     // When profile owner sets restrictions it passes null global bundle and we
   1217                     // reset global restriction owner userId.
   1218                     // This means this user used to have DO, but now the DO is gone and the user
   1219                     // instead has PO.
   1220                     mDeviceOwnerUserId = UserHandle.USER_NULL;
   1221                 }
   1222             }
   1223         }
   1224         if (DBG) {
   1225             Log.d(LOG_TAG, "setDevicePolicyUserRestrictions: userId=" + userId
   1226                             + " global=" + global + (globalChanged ? " (changed)" : "")
   1227                             + " local=" + local + (localChanged ? " (changed)" : "")
   1228             );
   1229         }
   1230         // Don't call them within the mRestrictionsLock.
   1231         synchronized (mPackagesLock) {
   1232             if (localChanged || globalChanged) {
   1233                 writeUserLP(getUserDataNoChecks(userId));
   1234             }
   1235         }
   1236 
   1237         synchronized (mRestrictionsLock) {
   1238             if (globalChanged) {
   1239                 applyUserRestrictionsForAllUsersLR();
   1240             } else if (localChanged) {
   1241                 applyUserRestrictionsLR(userId);
   1242             }
   1243         }
   1244     }
   1245 
   1246     /**
   1247      * Updates restriction bundle for a given user in a given restriction array. If new bundle is
   1248      * empty, record is removed from the array.
   1249      * @return whether restrictions bundle is different from the old one.
   1250      */
   1251     private boolean updateRestrictionsIfNeededLR(int userId, @Nullable Bundle restrictions,
   1252             SparseArray<Bundle> restrictionsArray) {
   1253         final boolean changed =
   1254                 !UserRestrictionsUtils.areEqual(restrictionsArray.get(userId), restrictions);
   1255         if (changed) {
   1256             if (!UserRestrictionsUtils.isEmpty(restrictions)) {
   1257                 restrictionsArray.put(userId, restrictions);
   1258             } else {
   1259                 restrictionsArray.delete(userId);
   1260             }
   1261         }
   1262         return changed;
   1263     }
   1264 
   1265     @GuardedBy("mRestrictionsLock")
   1266     private Bundle computeEffectiveUserRestrictionsLR(int userId) {
   1267         final Bundle baseRestrictions =
   1268                 UserRestrictionsUtils.nonNull(mBaseUserRestrictions.get(userId));
   1269         final Bundle global = UserRestrictionsUtils.mergeAll(mDevicePolicyGlobalUserRestrictions);
   1270         final Bundle local = mDevicePolicyLocalUserRestrictions.get(userId);
   1271 
   1272         if (UserRestrictionsUtils.isEmpty(global) && UserRestrictionsUtils.isEmpty(local)) {
   1273             // Common case first.
   1274             return baseRestrictions;
   1275         }
   1276         final Bundle effective = UserRestrictionsUtils.clone(baseRestrictions);
   1277         UserRestrictionsUtils.merge(effective, global);
   1278         UserRestrictionsUtils.merge(effective, local);
   1279 
   1280         return effective;
   1281     }
   1282 
   1283     @GuardedBy("mRestrictionsLock")
   1284     private void invalidateEffectiveUserRestrictionsLR(int userId) {
   1285         if (DBG) {
   1286             Log.d(LOG_TAG, "invalidateEffectiveUserRestrictions userId=" + userId);
   1287         }
   1288         mCachedEffectiveUserRestrictions.remove(userId);
   1289     }
   1290 
   1291     private Bundle getEffectiveUserRestrictions(int userId) {
   1292         synchronized (mRestrictionsLock) {
   1293             Bundle restrictions = mCachedEffectiveUserRestrictions.get(userId);
   1294             if (restrictions == null) {
   1295                 restrictions = computeEffectiveUserRestrictionsLR(userId);
   1296                 mCachedEffectiveUserRestrictions.put(userId, restrictions);
   1297             }
   1298             return restrictions;
   1299         }
   1300     }
   1301 
   1302     /** @return a specific user restriction that's in effect currently. */
   1303     @Override
   1304     public boolean hasUserRestriction(String restrictionKey, int userId) {
   1305         if (!UserRestrictionsUtils.isValidRestriction(restrictionKey)) {
   1306             return false;
   1307         }
   1308         Bundle restrictions = getEffectiveUserRestrictions(userId);
   1309         return restrictions != null && restrictions.getBoolean(restrictionKey);
   1310     }
   1311 
   1312     /**
   1313      * @hide
   1314      *
   1315      * Returns who set a user restriction on a user.
   1316      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
   1317      * @param restrictionKey the string key representing the restriction
   1318      * @param userId the id of the user for whom to retrieve the restrictions.
   1319      * @return The source of user restriction. Any combination of
   1320      *         {@link UserManager#RESTRICTION_NOT_SET},
   1321      *         {@link UserManager#RESTRICTION_SOURCE_SYSTEM},
   1322      *         {@link UserManager#RESTRICTION_SOURCE_DEVICE_OWNER}
   1323      *         and {@link UserManager#RESTRICTION_SOURCE_PROFILE_OWNER}
   1324      */
   1325     @Override
   1326     public int getUserRestrictionSource(String restrictionKey, int userId) {
   1327         List<EnforcingUser> enforcingUsers = getUserRestrictionSources(restrictionKey,  userId);
   1328         // Get "bitwise or" of restriction sources for all enforcing users.
   1329         int result = UserManager.RESTRICTION_NOT_SET;
   1330         for (int i = enforcingUsers.size() - 1; i >= 0; i--) {
   1331             result |= enforcingUsers.get(i).getUserRestrictionSource();
   1332         }
   1333         return result;
   1334     }
   1335 
   1336     @Override
   1337     public List<EnforcingUser> getUserRestrictionSources(
   1338             String restrictionKey, @UserIdInt int userId) {
   1339         checkManageUsersPermission("getUserRestrictionSource");
   1340 
   1341         // Shortcut for the most common case
   1342         if (!hasUserRestriction(restrictionKey, userId)) {
   1343             return Collections.emptyList();
   1344         }
   1345 
   1346         final List<EnforcingUser> result = new ArrayList<>();
   1347 
   1348         // Check if it is base restriction.
   1349         if (hasBaseUserRestriction(restrictionKey, userId)) {
   1350             result.add(new EnforcingUser(
   1351                     UserHandle.USER_NULL, UserManager.RESTRICTION_SOURCE_SYSTEM));
   1352         }
   1353 
   1354         synchronized (mRestrictionsLock) {
   1355             // Check if it is set by profile owner.
   1356             Bundle profileOwnerRestrictions = mDevicePolicyLocalUserRestrictions.get(userId);
   1357             if (UserRestrictionsUtils.contains(profileOwnerRestrictions, restrictionKey)) {
   1358                 result.add(getEnforcingUserLocked(userId));
   1359             }
   1360 
   1361             // Iterate over all users who enforce global restrictions.
   1362             for (int i = mDevicePolicyGlobalUserRestrictions.size() - 1; i >= 0; i--) {
   1363                 Bundle globalRestrictions = mDevicePolicyGlobalUserRestrictions.valueAt(i);
   1364                 int profileUserId = mDevicePolicyGlobalUserRestrictions.keyAt(i);
   1365                 if (UserRestrictionsUtils.contains(globalRestrictions, restrictionKey)) {
   1366                     result.add(getEnforcingUserLocked(profileUserId));
   1367                 }
   1368             }
   1369         }
   1370         return result;
   1371     }
   1372 
   1373     private EnforcingUser getEnforcingUserLocked(@UserIdInt int userId) {
   1374         int source = mDeviceOwnerUserId == userId ? UserManager.RESTRICTION_SOURCE_DEVICE_OWNER
   1375                 : UserManager.RESTRICTION_SOURCE_PROFILE_OWNER;
   1376         return new EnforcingUser(userId, source);
   1377     }
   1378 
   1379     /**
   1380      * @return UserRestrictions that are in effect currently.  This always returns a new
   1381      * {@link Bundle}.
   1382      */
   1383     @Override
   1384     public Bundle getUserRestrictions(int userId) {
   1385         return UserRestrictionsUtils.clone(getEffectiveUserRestrictions(userId));
   1386     }
   1387 
   1388     @Override
   1389     public boolean hasBaseUserRestriction(String restrictionKey, int userId) {
   1390         checkManageUsersPermission("hasBaseUserRestriction");
   1391         if (!UserRestrictionsUtils.isValidRestriction(restrictionKey)) {
   1392             return false;
   1393         }
   1394         synchronized (mRestrictionsLock) {
   1395             Bundle bundle = mBaseUserRestrictions.get(userId);
   1396             return (bundle != null && bundle.getBoolean(restrictionKey, false));
   1397         }
   1398     }
   1399 
   1400     @Override
   1401     public void setUserRestriction(String key, boolean value, int userId) {
   1402         checkManageUsersPermission("setUserRestriction");
   1403         if (!UserRestrictionsUtils.isValidRestriction(key)) {
   1404             return;
   1405         }
   1406         synchronized (mRestrictionsLock) {
   1407             // Note we can't modify Bundles stored in mBaseUserRestrictions directly, so create
   1408             // a copy.
   1409             final Bundle newRestrictions = UserRestrictionsUtils.clone(
   1410                     mBaseUserRestrictions.get(userId));
   1411             newRestrictions.putBoolean(key, value);
   1412 
   1413             updateUserRestrictionsInternalLR(newRestrictions, userId);
   1414         }
   1415     }
   1416 
   1417     /**
   1418      * Optionally updating user restrictions, calculate the effective user restrictions and also
   1419      * propagate to other services and system settings.
   1420      *
   1421      * @param newBaseRestrictions User restrictions to set.
   1422      *      If null, will not update user restrictions and only does the propagation.
   1423      * @param userId target user ID.
   1424      */
   1425     @GuardedBy("mRestrictionsLock")
   1426     private void updateUserRestrictionsInternalLR(
   1427             @Nullable Bundle newBaseRestrictions, int userId) {
   1428         final Bundle prevAppliedRestrictions = UserRestrictionsUtils.nonNull(
   1429                 mAppliedUserRestrictions.get(userId));
   1430 
   1431         // Update base restrictions.
   1432         if (newBaseRestrictions != null) {
   1433             // If newBaseRestrictions == the current one, it's probably a bug.
   1434             final Bundle prevBaseRestrictions = mBaseUserRestrictions.get(userId);
   1435 
   1436             Preconditions.checkState(prevBaseRestrictions != newBaseRestrictions);
   1437             Preconditions.checkState(mCachedEffectiveUserRestrictions.get(userId)
   1438                     != newBaseRestrictions);
   1439 
   1440             if (updateRestrictionsIfNeededLR(userId, newBaseRestrictions, mBaseUserRestrictions)) {
   1441                 scheduleWriteUser(getUserDataNoChecks(userId));
   1442             }
   1443         }
   1444 
   1445         final Bundle effective = computeEffectiveUserRestrictionsLR(userId);
   1446 
   1447         mCachedEffectiveUserRestrictions.put(userId, effective);
   1448 
   1449         // Apply the new restrictions.
   1450         if (DBG) {
   1451             debug("Applying user restrictions: userId=" + userId
   1452                     + " new=" + effective + " prev=" + prevAppliedRestrictions);
   1453         }
   1454 
   1455         if (mAppOpsService != null) { // We skip it until system-ready.
   1456             mHandler.post(new Runnable() {
   1457                 @Override
   1458                 public void run() {
   1459                     try {
   1460                         mAppOpsService.setUserRestrictions(effective, mUserRestriconToken, userId);
   1461                     } catch (RemoteException e) {
   1462                         Log.w(LOG_TAG, "Unable to notify AppOpsService of UserRestrictions");
   1463                     }
   1464                 }
   1465             });
   1466         }
   1467 
   1468         propagateUserRestrictionsLR(userId, effective, prevAppliedRestrictions);
   1469 
   1470         mAppliedUserRestrictions.put(userId, new Bundle(effective));
   1471     }
   1472 
   1473     private void propagateUserRestrictionsLR(final int userId,
   1474             Bundle newRestrictions, Bundle prevRestrictions) {
   1475         // Note this method doesn't touch any state, meaning it doesn't require mRestrictionsLock
   1476         // actually, but we still need some kind of synchronization otherwise we might end up
   1477         // calling listeners out-of-order, thus "LR".
   1478 
   1479         if (UserRestrictionsUtils.areEqual(newRestrictions, prevRestrictions)) {
   1480             return;
   1481         }
   1482 
   1483         final Bundle newRestrictionsFinal = new Bundle(newRestrictions);
   1484         final Bundle prevRestrictionsFinal = new Bundle(prevRestrictions);
   1485 
   1486         mHandler.post(new Runnable() {
   1487             @Override
   1488             public void run() {
   1489                 UserRestrictionsUtils.applyUserRestrictions(
   1490                         mContext, userId, newRestrictionsFinal, prevRestrictionsFinal);
   1491 
   1492                 final UserRestrictionsListener[] listeners;
   1493                 synchronized (mUserRestrictionsListeners) {
   1494                     listeners = new UserRestrictionsListener[mUserRestrictionsListeners.size()];
   1495                     mUserRestrictionsListeners.toArray(listeners);
   1496                 }
   1497                 for (int i = 0; i < listeners.length; i++) {
   1498                     listeners[i].onUserRestrictionsChanged(userId,
   1499                             newRestrictionsFinal, prevRestrictionsFinal);
   1500                 }
   1501 
   1502                 final Intent broadcast = new Intent(UserManager.ACTION_USER_RESTRICTIONS_CHANGED)
   1503                         .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
   1504                 mContext.sendBroadcastAsUser(broadcast, UserHandle.of(userId));
   1505             }
   1506         });
   1507     }
   1508 
   1509     // Package private for the inner class.
   1510     void applyUserRestrictionsLR(int userId) {
   1511         updateUserRestrictionsInternalLR(null, userId);
   1512     }
   1513 
   1514     @GuardedBy("mRestrictionsLock")
   1515     // Package private for the inner class.
   1516     void applyUserRestrictionsForAllUsersLR() {
   1517         if (DBG) {
   1518             debug("applyUserRestrictionsForAllUsersLR");
   1519         }
   1520         // First, invalidate all cached values.
   1521         mCachedEffectiveUserRestrictions.clear();
   1522 
   1523         // We don't want to call into ActivityManagerService while taking a lock, so we'll call
   1524         // it on a handler.
   1525         final Runnable r = new Runnable() {
   1526             @Override
   1527             public void run() {
   1528                 // Then get the list of running users.
   1529                 final int[] runningUsers;
   1530                 try {
   1531                     runningUsers = ActivityManager.getService().getRunningUserIds();
   1532                 } catch (RemoteException e) {
   1533                     Log.w(LOG_TAG, "Unable to access ActivityManagerService");
   1534                     return;
   1535                 }
   1536                 // Then re-calculate the effective restrictions and apply, only for running users.
   1537                 // It's okay if a new user has started after the getRunningUserIds() call,
   1538                 // because we'll do the same thing (re-calculate the restrictions and apply)
   1539                 // when we start a user.
   1540                 synchronized (mRestrictionsLock) {
   1541                     for (int i = 0; i < runningUsers.length; i++) {
   1542                         applyUserRestrictionsLR(runningUsers[i]);
   1543                     }
   1544                 }
   1545             }
   1546         };
   1547         mHandler.post(r);
   1548     }
   1549 
   1550     /**
   1551      * Check if we've hit the limit of how many users can be created.
   1552      */
   1553     private boolean isUserLimitReached() {
   1554         int count;
   1555         synchronized (mUsersLock) {
   1556             count = getAliveUsersExcludingGuestsCountLU();
   1557         }
   1558         return count >= UserManager.getMaxSupportedUsers();
   1559     }
   1560 
   1561     @Override
   1562     public boolean canAddMoreManagedProfiles(int userId, boolean allowedToRemoveOne) {
   1563         checkManageUsersPermission("check if more managed profiles can be added.");
   1564         if (ActivityManager.isLowRamDeviceStatic()) {
   1565             return false;
   1566         }
   1567         if (!mContext.getPackageManager().hasSystemFeature(
   1568                 PackageManager.FEATURE_MANAGED_USERS)) {
   1569             return false;
   1570         }
   1571         // Limit number of managed profiles that can be created
   1572         final int managedProfilesCount = getProfiles(userId, false).size() - 1;
   1573         final int profilesRemovedCount = managedProfilesCount > 0 && allowedToRemoveOne ? 1 : 0;
   1574         if (managedProfilesCount - profilesRemovedCount >= getMaxManagedProfiles()) {
   1575             return false;
   1576         }
   1577         synchronized(mUsersLock) {
   1578             UserInfo userInfo = getUserInfoLU(userId);
   1579             if (userInfo == null || !userInfo.canHaveProfile()) {
   1580                 return false;
   1581             }
   1582             int usersCountAfterRemoving = getAliveUsersExcludingGuestsCountLU()
   1583                     - profilesRemovedCount;
   1584             // We allow creating a managed profile in the special case where there is only one user.
   1585             return usersCountAfterRemoving  == 1
   1586                     || usersCountAfterRemoving < UserManager.getMaxSupportedUsers();
   1587         }
   1588     }
   1589 
   1590     private int getAliveUsersExcludingGuestsCountLU() {
   1591         int aliveUserCount = 0;
   1592         final int totalUserCount = mUsers.size();
   1593         // Skip over users being removed
   1594         for (int i = 0; i < totalUserCount; i++) {
   1595             UserInfo user = mUsers.valueAt(i).info;
   1596             if (!mRemovingUserIds.get(user.id) && !user.isGuest()) {
   1597                 aliveUserCount++;
   1598             }
   1599         }
   1600         return aliveUserCount;
   1601     }
   1602 
   1603     /**
   1604      * Enforces that only the system UID or root's UID or apps that have the
   1605      * {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS} and
   1606      * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL INTERACT_ACROSS_USERS_FULL}
   1607      * permissions can make certain calls to the UserManager.
   1608      *
   1609      * @param message used as message if SecurityException is thrown
   1610      * @throws SecurityException if the caller does not have enough privilege.
   1611      */
   1612     private static final void checkManageUserAndAcrossUsersFullPermission(String message) {
   1613         final int uid = Binder.getCallingUid();
   1614         if (uid != Process.SYSTEM_UID && uid != 0
   1615                 && ActivityManager.checkComponentPermission(
   1616                 Manifest.permission.MANAGE_USERS,
   1617                 uid, -1, true) != PackageManager.PERMISSION_GRANTED
   1618                 && ActivityManager.checkComponentPermission(
   1619                 Manifest.permission.INTERACT_ACROSS_USERS_FULL,
   1620                 uid, -1, true) != PackageManager.PERMISSION_GRANTED) {
   1621             throw new SecurityException(
   1622                     "You need MANAGE_USERS and INTERACT_ACROSS_USERS_FULL permission to: "
   1623                             + message);
   1624         }
   1625     }
   1626 
   1627     /**
   1628      * Enforces that only the system UID or root's UID or apps that have the
   1629      * {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS}
   1630      * permission can make certain calls to the UserManager.
   1631      *
   1632      * @param message used as message if SecurityException is thrown
   1633      * @throws SecurityException if the caller is not system or root
   1634      * @see #hasManageUsersPermission()
   1635      */
   1636     private static final void checkManageUsersPermission(String message) {
   1637         if (!hasManageUsersPermission()) {
   1638             throw new SecurityException("You need MANAGE_USERS permission to: " + message);
   1639         }
   1640     }
   1641 
   1642     /**
   1643      * Enforces that only the system UID or root's UID or apps that have the
   1644      * {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS} or
   1645      * {@link android.Manifest.permission#CREATE_USERS CREATE_USERS}
   1646      * can make certain calls to the UserManager.
   1647      *
   1648      * @param message used as message if SecurityException is thrown
   1649      * @throws SecurityException if the caller is not system or root
   1650      * @see #hasManageOrCreateUsersPermission()
   1651      */
   1652     private static final void checkManageOrCreateUsersPermission(String message) {
   1653         if (!hasManageOrCreateUsersPermission()) {
   1654             throw new SecurityException(
   1655                     "You either need MANAGE_USERS or CREATE_USERS permission to: " + message);
   1656         }
   1657     }
   1658 
   1659     /**
   1660      * Similar to {@link #checkManageOrCreateUsersPermission(String)} but when the caller is tries
   1661      * to create user/profiles other than what is allowed for
   1662      * {@link android.Manifest.permission#CREATE_USERS CREATE_USERS} permission, then it will only
   1663      * allow callers with {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS} permission.
   1664      */
   1665     private static final void checkManageOrCreateUsersPermission(int creationFlags) {
   1666         if ((creationFlags & ~ALLOWED_FLAGS_FOR_CREATE_USERS_PERMISSION) == 0) {
   1667             if (!hasManageOrCreateUsersPermission()) {
   1668                 throw new SecurityException("You either need MANAGE_USERS or CREATE_USERS "
   1669                         + "permission to create an user with flags: " + creationFlags);
   1670             }
   1671         } else if (!hasManageUsersPermission()) {
   1672             throw new SecurityException("You need MANAGE_USERS permission to create an user "
   1673                     + " with flags: " + creationFlags);
   1674         }
   1675     }
   1676 
   1677     /**
   1678      * @return whether the calling UID is system UID or root's UID or the calling app has the
   1679      * {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS}.
   1680      */
   1681     private static final boolean hasManageUsersPermission() {
   1682         final int callingUid = Binder.getCallingUid();
   1683         return UserHandle.isSameApp(callingUid, Process.SYSTEM_UID)
   1684                 || callingUid == Process.ROOT_UID
   1685                 || ActivityManager.checkComponentPermission(
   1686                         android.Manifest.permission.MANAGE_USERS,
   1687                         callingUid, -1, true) == PackageManager.PERMISSION_GRANTED;
   1688     }
   1689 
   1690     /**
   1691      * @return whether the calling UID is system UID or root's UID or the calling app has the
   1692      * {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS} or
   1693      * {@link android.Manifest.permission#CREATE_USERS CREATE_USERS}.
   1694      */
   1695     private static final boolean hasManageOrCreateUsersPermission() {
   1696         final int callingUid = Binder.getCallingUid();
   1697         return UserHandle.isSameApp(callingUid, Process.SYSTEM_UID)
   1698                 || callingUid == Process.ROOT_UID
   1699                 || ActivityManager.checkComponentPermission(
   1700                         android.Manifest.permission.MANAGE_USERS,
   1701                         callingUid, -1, true) == PackageManager.PERMISSION_GRANTED
   1702                 || ActivityManager.checkComponentPermission(
   1703                         android.Manifest.permission.CREATE_USERS,
   1704                         callingUid, -1, true) == PackageManager.PERMISSION_GRANTED;
   1705     }
   1706 
   1707     /**
   1708      * Enforces that only the system UID or root's UID (on any user) can make certain calls to the
   1709      * UserManager.
   1710      *
   1711      * @param message used as message if SecurityException is thrown
   1712      * @throws SecurityException if the caller is not system or root
   1713      */
   1714     private static void checkSystemOrRoot(String message) {
   1715         final int uid = Binder.getCallingUid();
   1716         if (!UserHandle.isSameApp(uid, Process.SYSTEM_UID) && uid != Process.ROOT_UID) {
   1717             throw new SecurityException("Only system may: " + message);
   1718         }
   1719     }
   1720 
   1721     private void writeBitmapLP(UserInfo info, Bitmap bitmap) {
   1722         try {
   1723             File dir = new File(mUsersDir, Integer.toString(info.id));
   1724             File file = new File(dir, USER_PHOTO_FILENAME);
   1725             File tmp = new File(dir, USER_PHOTO_FILENAME_TMP);
   1726             if (!dir.exists()) {
   1727                 dir.mkdir();
   1728                 FileUtils.setPermissions(
   1729                         dir.getPath(),
   1730                         FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
   1731                         -1, -1);
   1732             }
   1733             FileOutputStream os;
   1734             if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, os = new FileOutputStream(tmp))
   1735                     && tmp.renameTo(file) && SELinux.restorecon(file)) {
   1736                 info.iconPath = file.getAbsolutePath();
   1737             }
   1738             try {
   1739                 os.close();
   1740             } catch (IOException ioe) {
   1741                 // What the ... !
   1742             }
   1743             tmp.delete();
   1744         } catch (FileNotFoundException e) {
   1745             Slog.w(LOG_TAG, "Error setting photo for user ", e);
   1746         }
   1747     }
   1748 
   1749     /**
   1750      * Returns an array of user ids. This array is cached here for quick access, so do not modify or
   1751      * cache it elsewhere.
   1752      * @return the array of user ids.
   1753      */
   1754     public int[] getUserIds() {
   1755         synchronized (mUsersLock) {
   1756             return mUserIds;
   1757         }
   1758     }
   1759 
   1760     private void readUserListLP() {
   1761         if (!mUserListFile.exists()) {
   1762             fallbackToSingleUserLP();
   1763             return;
   1764         }
   1765         FileInputStream fis = null;
   1766         AtomicFile userListFile = new AtomicFile(mUserListFile);
   1767         try {
   1768             fis = userListFile.openRead();
   1769             XmlPullParser parser = Xml.newPullParser();
   1770             parser.setInput(fis, StandardCharsets.UTF_8.name());
   1771             int type;
   1772             while ((type = parser.next()) != XmlPullParser.START_TAG
   1773                     && type != XmlPullParser.END_DOCUMENT) {
   1774                 // Skip
   1775             }
   1776 
   1777             if (type != XmlPullParser.START_TAG) {
   1778                 Slog.e(LOG_TAG, "Unable to read user list");
   1779                 fallbackToSingleUserLP();
   1780                 return;
   1781             }
   1782 
   1783             mNextSerialNumber = -1;
   1784             if (parser.getName().equals(TAG_USERS)) {
   1785                 String lastSerialNumber = parser.getAttributeValue(null, ATTR_NEXT_SERIAL_NO);
   1786                 if (lastSerialNumber != null) {
   1787                     mNextSerialNumber = Integer.parseInt(lastSerialNumber);
   1788                 }
   1789                 String versionNumber = parser.getAttributeValue(null, ATTR_USER_VERSION);
   1790                 if (versionNumber != null) {
   1791                     mUserVersion = Integer.parseInt(versionNumber);
   1792                 }
   1793             }
   1794 
   1795             // Pre-O global user restriction were stored as a single bundle (as opposed to per-user
   1796             // currently), take care of it in case of upgrade.
   1797             Bundle oldDevicePolicyGlobalUserRestrictions = null;
   1798 
   1799             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) {
   1800                 if (type == XmlPullParser.START_TAG) {
   1801                     final String name = parser.getName();
   1802                     if (name.equals(TAG_USER)) {
   1803                         String id = parser.getAttributeValue(null, ATTR_ID);
   1804 
   1805                         UserData userData = readUserLP(Integer.parseInt(id));
   1806 
   1807                         if (userData != null) {
   1808                             synchronized (mUsersLock) {
   1809                                 mUsers.put(userData.info.id, userData);
   1810                                 if (mNextSerialNumber < 0
   1811                                         || mNextSerialNumber <= userData.info.id) {
   1812                                     mNextSerialNumber = userData.info.id + 1;
   1813                                 }
   1814                             }
   1815                         }
   1816                     } else if (name.equals(TAG_GUEST_RESTRICTIONS)) {
   1817                         while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
   1818                                 && type != XmlPullParser.END_TAG) {
   1819                             if (type == XmlPullParser.START_TAG) {
   1820                                 if (parser.getName().equals(TAG_RESTRICTIONS)) {
   1821                                     synchronized (mGuestRestrictions) {
   1822                                         UserRestrictionsUtils
   1823                                                 .readRestrictions(parser, mGuestRestrictions);
   1824                                     }
   1825                                 }
   1826                                 break;
   1827                             }
   1828                         }
   1829                     } else if (name.equals(TAG_DEVICE_OWNER_USER_ID)
   1830                             // Legacy name, should only be encountered when upgrading from pre-O.
   1831                             || name.equals(TAG_GLOBAL_RESTRICTION_OWNER_ID)) {
   1832                         String ownerUserId = parser.getAttributeValue(null, ATTR_ID);
   1833                         if (ownerUserId != null) {
   1834                             mDeviceOwnerUserId = Integer.parseInt(ownerUserId);
   1835                         }
   1836                     } else if (name.equals(TAG_DEVICE_POLICY_RESTRICTIONS)) {
   1837                         // Should only happen when upgrading from pre-O (version < 7).
   1838                         oldDevicePolicyGlobalUserRestrictions =
   1839                                 UserRestrictionsUtils.readRestrictions(parser);
   1840                     }
   1841                 }
   1842             }
   1843 
   1844             updateUserIds();
   1845             upgradeIfNecessaryLP(oldDevicePolicyGlobalUserRestrictions);
   1846         } catch (IOException | XmlPullParserException e) {
   1847             fallbackToSingleUserLP();
   1848         } finally {
   1849             IoUtils.closeQuietly(fis);
   1850         }
   1851     }
   1852 
   1853     /**
   1854      * Upgrade steps between versions, either for fixing bugs or changing the data format.
   1855      * @param oldGlobalUserRestrictions Pre-O global device policy restrictions.
   1856      */
   1857     private void upgradeIfNecessaryLP(Bundle oldGlobalUserRestrictions) {
   1858         final int originalVersion = mUserVersion;
   1859         int userVersion = mUserVersion;
   1860         if (userVersion < 1) {
   1861             // Assign a proper name for the owner, if not initialized correctly before
   1862             UserData userData = getUserDataNoChecks(UserHandle.USER_SYSTEM);
   1863             if ("Primary".equals(userData.info.name)) {
   1864                 userData.info.name =
   1865                         mContext.getResources().getString(com.android.internal.R.string.owner_name);
   1866                 scheduleWriteUser(userData);
   1867             }
   1868             userVersion = 1;
   1869         }
   1870 
   1871         if (userVersion < 2) {
   1872             // Owner should be marked as initialized
   1873             UserData userData = getUserDataNoChecks(UserHandle.USER_SYSTEM);
   1874             if ((userData.info.flags & UserInfo.FLAG_INITIALIZED) == 0) {
   1875                 userData.info.flags |= UserInfo.FLAG_INITIALIZED;
   1876                 scheduleWriteUser(userData);
   1877             }
   1878             userVersion = 2;
   1879         }
   1880 
   1881 
   1882         if (userVersion < 4) {
   1883             userVersion = 4;
   1884         }
   1885 
   1886         if (userVersion < 5) {
   1887             initDefaultGuestRestrictions();
   1888             userVersion = 5;
   1889         }
   1890 
   1891         if (userVersion < 6) {
   1892             final boolean splitSystemUser = UserManager.isSplitSystemUser();
   1893             synchronized (mUsersLock) {
   1894                 for (int i = 0; i < mUsers.size(); i++) {
   1895                     UserData userData = mUsers.valueAt(i);
   1896                     // In non-split mode, only user 0 can have restricted profiles
   1897                     if (!splitSystemUser && userData.info.isRestricted()
   1898                             && (userData.info.restrictedProfileParentId
   1899                                     == UserInfo.NO_PROFILE_GROUP_ID)) {
   1900                         userData.info.restrictedProfileParentId = UserHandle.USER_SYSTEM;
   1901                         scheduleWriteUser(userData);
   1902                     }
   1903                 }
   1904             }
   1905             userVersion = 6;
   1906         }
   1907 
   1908         if (userVersion < 7) {
   1909             // Previously only one user could enforce global restrictions, now it is per-user.
   1910             synchronized (mRestrictionsLock) {
   1911                 if (!UserRestrictionsUtils.isEmpty(oldGlobalUserRestrictions)
   1912                         && mDeviceOwnerUserId != UserHandle.USER_NULL) {
   1913                     mDevicePolicyGlobalUserRestrictions.put(
   1914                             mDeviceOwnerUserId, oldGlobalUserRestrictions);
   1915                 }
   1916                 // ENSURE_VERIFY_APPS is now enforced globally even if put by profile owner, so move
   1917                 // it from local to global bundle for all users who set it.
   1918                 UserRestrictionsUtils.moveRestriction(UserManager.ENSURE_VERIFY_APPS,
   1919                         mDevicePolicyLocalUserRestrictions, mDevicePolicyGlobalUserRestrictions
   1920                 );
   1921             }
   1922             userVersion = 7;
   1923         }
   1924 
   1925         if (userVersion < USER_VERSION) {
   1926             Slog.w(LOG_TAG, "User version " + mUserVersion + " didn't upgrade as expected to "
   1927                     + USER_VERSION);
   1928         } else {
   1929             mUserVersion = userVersion;
   1930 
   1931             if (originalVersion < mUserVersion) {
   1932                 writeUserListLP();
   1933             }
   1934         }
   1935     }
   1936 
   1937     private void fallbackToSingleUserLP() {
   1938         int flags = UserInfo.FLAG_INITIALIZED;
   1939         // In split system user mode, the admin and primary flags are assigned to the first human
   1940         // user.
   1941         if (!UserManager.isSplitSystemUser()) {
   1942             flags |= UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY;
   1943         }
   1944         // Create the system user
   1945         UserInfo system = new UserInfo(UserHandle.USER_SYSTEM, null, null, flags);
   1946         UserData userData = putUserInfo(system);
   1947         mNextSerialNumber = MIN_USER_ID;
   1948         mUserVersion = USER_VERSION;
   1949 
   1950         Bundle restrictions = new Bundle();
   1951         try {
   1952             final String[] defaultFirstUserRestrictions = mContext.getResources().getStringArray(
   1953                     com.android.internal.R.array.config_defaultFirstUserRestrictions);
   1954             for (String userRestriction : defaultFirstUserRestrictions) {
   1955                 if (UserRestrictionsUtils.isValidRestriction(userRestriction)) {
   1956                     restrictions.putBoolean(userRestriction, true);
   1957                 }
   1958             }
   1959         } catch (Resources.NotFoundException e) {
   1960             Log.e(LOG_TAG, "Couldn't find resource: config_defaultFirstUserRestrictions", e);
   1961         }
   1962 
   1963         if (!restrictions.isEmpty()) {
   1964             synchronized (mRestrictionsLock) {
   1965                 mBaseUserRestrictions.append(UserHandle.USER_SYSTEM, restrictions);
   1966             }
   1967         }
   1968 
   1969         updateUserIds();
   1970         initDefaultGuestRestrictions();
   1971 
   1972         writeUserLP(userData);
   1973         writeUserListLP();
   1974     }
   1975 
   1976     private String getOwnerName() {
   1977         return mContext.getResources().getString(com.android.internal.R.string.owner_name);
   1978     }
   1979 
   1980     private void scheduleWriteUser(UserData UserData) {
   1981         if (DBG) {
   1982             debug("scheduleWriteUser");
   1983         }
   1984         // No need to wrap it within a lock -- worst case, we'll just post the same message
   1985         // twice.
   1986         if (!mHandler.hasMessages(WRITE_USER_MSG, UserData)) {
   1987             Message msg = mHandler.obtainMessage(WRITE_USER_MSG, UserData);
   1988             mHandler.sendMessageDelayed(msg, WRITE_USER_DELAY);
   1989         }
   1990     }
   1991 
   1992     private void writeUserLP(UserData userData) {
   1993         if (DBG) {
   1994             debug("writeUserLP " + userData);
   1995         }
   1996         FileOutputStream fos = null;
   1997         AtomicFile userFile = new AtomicFile(new File(mUsersDir, userData.info.id + XML_SUFFIX));
   1998         try {
   1999             fos = userFile.startWrite();
   2000             final BufferedOutputStream bos = new BufferedOutputStream(fos);
   2001             writeUserLP(userData, bos);
   2002             userFile.finishWrite(fos);
   2003         } catch (Exception ioe) {
   2004             Slog.e(LOG_TAG, "Error writing user info " + userData.info.id, ioe);
   2005             userFile.failWrite(fos);
   2006         }
   2007     }
   2008 
   2009     /*
   2010      * Writes the user file in this format:
   2011      *
   2012      * <user flags="20039023" id="0">
   2013      *   <name>Primary</name>
   2014      * </user>
   2015      */
   2016     @VisibleForTesting
   2017     void writeUserLP(UserData userData, OutputStream os)
   2018             throws IOException, XmlPullParserException {
   2019         // XmlSerializer serializer = XmlUtils.serializerInstance();
   2020         final XmlSerializer serializer = new FastXmlSerializer();
   2021         serializer.setOutput(os, StandardCharsets.UTF_8.name());
   2022         serializer.startDocument(null, true);
   2023         serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
   2024 
   2025         final UserInfo userInfo = userData.info;
   2026         serializer.startTag(null, TAG_USER);
   2027         serializer.attribute(null, ATTR_ID, Integer.toString(userInfo.id));
   2028         serializer.attribute(null, ATTR_SERIAL_NO, Integer.toString(userInfo.serialNumber));
   2029         serializer.attribute(null, ATTR_FLAGS, Integer.toString(userInfo.flags));
   2030         serializer.attribute(null, ATTR_CREATION_TIME, Long.toString(userInfo.creationTime));
   2031         serializer.attribute(null, ATTR_LAST_LOGGED_IN_TIME,
   2032                 Long.toString(userInfo.lastLoggedInTime));
   2033         if (userInfo.lastLoggedInFingerprint != null) {
   2034             serializer.attribute(null, ATTR_LAST_LOGGED_IN_FINGERPRINT,
   2035                     userInfo.lastLoggedInFingerprint);
   2036         }
   2037         if (userInfo.iconPath != null) {
   2038             serializer.attribute(null,  ATTR_ICON_PATH, userInfo.iconPath);
   2039         }
   2040         if (userInfo.partial) {
   2041             serializer.attribute(null, ATTR_PARTIAL, "true");
   2042         }
   2043         if (userInfo.guestToRemove) {
   2044             serializer.attribute(null, ATTR_GUEST_TO_REMOVE, "true");
   2045         }
   2046         if (userInfo.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID) {
   2047             serializer.attribute(null, ATTR_PROFILE_GROUP_ID,
   2048                     Integer.toString(userInfo.profileGroupId));
   2049         }
   2050         serializer.attribute(null, ATTR_PROFILE_BADGE,
   2051                 Integer.toString(userInfo.profileBadge));
   2052         if (userInfo.restrictedProfileParentId != UserInfo.NO_PROFILE_GROUP_ID) {
   2053             serializer.attribute(null, ATTR_RESTRICTED_PROFILE_PARENT_ID,
   2054                     Integer.toString(userInfo.restrictedProfileParentId));
   2055         }
   2056         // Write seed data
   2057         if (userData.persistSeedData) {
   2058             if (userData.seedAccountName != null) {
   2059                 serializer.attribute(null, ATTR_SEED_ACCOUNT_NAME, userData.seedAccountName);
   2060             }
   2061             if (userData.seedAccountType != null) {
   2062                 serializer.attribute(null, ATTR_SEED_ACCOUNT_TYPE, userData.seedAccountType);
   2063             }
   2064         }
   2065         if (userInfo.name != null) {
   2066             serializer.startTag(null, TAG_NAME);
   2067             serializer.text(userInfo.name);
   2068             serializer.endTag(null, TAG_NAME);
   2069         }
   2070         synchronized (mRestrictionsLock) {
   2071             UserRestrictionsUtils.writeRestrictions(serializer,
   2072                     mBaseUserRestrictions.get(userInfo.id), TAG_RESTRICTIONS);
   2073             UserRestrictionsUtils.writeRestrictions(serializer,
   2074                     mDevicePolicyLocalUserRestrictions.get(userInfo.id),
   2075                     TAG_DEVICE_POLICY_RESTRICTIONS);
   2076             UserRestrictionsUtils.writeRestrictions(serializer,
   2077                     mDevicePolicyGlobalUserRestrictions.get(userInfo.id),
   2078                     TAG_DEVICE_POLICY_GLOBAL_RESTRICTIONS);
   2079         }
   2080 
   2081         if (userData.account != null) {
   2082             serializer.startTag(null, TAG_ACCOUNT);
   2083             serializer.text(userData.account);
   2084             serializer.endTag(null, TAG_ACCOUNT);
   2085         }
   2086 
   2087         if (userData.persistSeedData && userData.seedAccountOptions != null) {
   2088             serializer.startTag(null, TAG_SEED_ACCOUNT_OPTIONS);
   2089             userData.seedAccountOptions.saveToXml(serializer);
   2090             serializer.endTag(null, TAG_SEED_ACCOUNT_OPTIONS);
   2091         }
   2092 
   2093         serializer.endTag(null, TAG_USER);
   2094 
   2095         serializer.endDocument();
   2096     }
   2097 
   2098     /*
   2099      * Writes the user list file in this format:
   2100      *
   2101      * <users nextSerialNumber="3">
   2102      *   <user id="0"></user>
   2103      *   <user id="2"></user>
   2104      * </users>
   2105      */
   2106     private void writeUserListLP() {
   2107         if (DBG) {
   2108             debug("writeUserList");
   2109         }
   2110         FileOutputStream fos = null;
   2111         AtomicFile userListFile = new AtomicFile(mUserListFile);
   2112         try {
   2113             fos = userListFile.startWrite();
   2114             final BufferedOutputStream bos = new BufferedOutputStream(fos);
   2115 
   2116             // XmlSerializer serializer = XmlUtils.serializerInstance();
   2117             final XmlSerializer serializer = new FastXmlSerializer();
   2118             serializer.setOutput(bos, StandardCharsets.UTF_8.name());
   2119             serializer.startDocument(null, true);
   2120             serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
   2121 
   2122             serializer.startTag(null, TAG_USERS);
   2123             serializer.attribute(null, ATTR_NEXT_SERIAL_NO, Integer.toString(mNextSerialNumber));
   2124             serializer.attribute(null, ATTR_USER_VERSION, Integer.toString(mUserVersion));
   2125 
   2126             serializer.startTag(null, TAG_GUEST_RESTRICTIONS);
   2127             synchronized (mGuestRestrictions) {
   2128                 UserRestrictionsUtils
   2129                         .writeRestrictions(serializer, mGuestRestrictions, TAG_RESTRICTIONS);
   2130             }
   2131             serializer.endTag(null, TAG_GUEST_RESTRICTIONS);
   2132             serializer.startTag(null, TAG_DEVICE_OWNER_USER_ID);
   2133             serializer.attribute(null, ATTR_ID, Integer.toString(mDeviceOwnerUserId));
   2134             serializer.endTag(null, TAG_DEVICE_OWNER_USER_ID);
   2135             int[] userIdsToWrite;
   2136             synchronized (mUsersLock) {
   2137                 userIdsToWrite = new int[mUsers.size()];
   2138                 for (int i = 0; i < userIdsToWrite.length; i++) {
   2139                     UserInfo user = mUsers.valueAt(i).info;
   2140                     userIdsToWrite[i] = user.id;
   2141                 }
   2142             }
   2143             for (int id : userIdsToWrite) {
   2144                 serializer.startTag(null, TAG_USER);
   2145                 serializer.attribute(null, ATTR_ID, Integer.toString(id));
   2146                 serializer.endTag(null, TAG_USER);
   2147             }
   2148 
   2149             serializer.endTag(null, TAG_USERS);
   2150 
   2151             serializer.endDocument();
   2152             userListFile.finishWrite(fos);
   2153         } catch (Exception e) {
   2154             userListFile.failWrite(fos);
   2155             Slog.e(LOG_TAG, "Error writing user list");
   2156         }
   2157     }
   2158 
   2159     private UserData readUserLP(int id) {
   2160         FileInputStream fis = null;
   2161         try {
   2162             AtomicFile userFile =
   2163                     new AtomicFile(new File(mUsersDir, Integer.toString(id) + XML_SUFFIX));
   2164             fis = userFile.openRead();
   2165             return readUserLP(id, fis);
   2166         } catch (IOException ioe) {
   2167             Slog.e(LOG_TAG, "Error reading user list");
   2168         } catch (XmlPullParserException pe) {
   2169             Slog.e(LOG_TAG, "Error reading user list");
   2170         } finally {
   2171             IoUtils.closeQuietly(fis);
   2172         }
   2173         return null;
   2174     }
   2175 
   2176     @VisibleForTesting
   2177     UserData readUserLP(int id, InputStream is) throws IOException,
   2178             XmlPullParserException {
   2179         int flags = 0;
   2180         int serialNumber = id;
   2181         String name = null;
   2182         String account = null;
   2183         String iconPath = null;
   2184         long creationTime = 0L;
   2185         long lastLoggedInTime = 0L;
   2186         String lastLoggedInFingerprint = null;
   2187         int profileGroupId = UserInfo.NO_PROFILE_GROUP_ID;
   2188         int profileBadge = 0;
   2189         int restrictedProfileParentId = UserInfo.NO_PROFILE_GROUP_ID;
   2190         boolean partial = false;
   2191         boolean guestToRemove = false;
   2192         boolean persistSeedData = false;
   2193         String seedAccountName = null;
   2194         String seedAccountType = null;
   2195         PersistableBundle seedAccountOptions = null;
   2196         Bundle baseRestrictions = null;
   2197         Bundle localRestrictions = null;
   2198         Bundle globalRestrictions = null;
   2199 
   2200         XmlPullParser parser = Xml.newPullParser();
   2201         parser.setInput(is, StandardCharsets.UTF_8.name());
   2202         int type;
   2203         while ((type = parser.next()) != XmlPullParser.START_TAG
   2204                 && type != XmlPullParser.END_DOCUMENT) {
   2205             // Skip
   2206         }
   2207 
   2208         if (type != XmlPullParser.START_TAG) {
   2209             Slog.e(LOG_TAG, "Unable to read user " + id);
   2210             return null;
   2211         }
   2212 
   2213         if (type == XmlPullParser.START_TAG && parser.getName().equals(TAG_USER)) {
   2214             int storedId = readIntAttribute(parser, ATTR_ID, -1);
   2215             if (storedId != id) {
   2216                 Slog.e(LOG_TAG, "User id does not match the file name");
   2217                 return null;
   2218             }
   2219             serialNumber = readIntAttribute(parser, ATTR_SERIAL_NO, id);
   2220             flags = readIntAttribute(parser, ATTR_FLAGS, 0);
   2221             iconPath = parser.getAttributeValue(null, ATTR_ICON_PATH);
   2222             creationTime = readLongAttribute(parser, ATTR_CREATION_TIME, 0);
   2223             lastLoggedInTime = readLongAttribute(parser, ATTR_LAST_LOGGED_IN_TIME, 0);
   2224             lastLoggedInFingerprint = parser.getAttributeValue(null,
   2225                     ATTR_LAST_LOGGED_IN_FINGERPRINT);
   2226             profileGroupId = readIntAttribute(parser, ATTR_PROFILE_GROUP_ID,
   2227                     UserInfo.NO_PROFILE_GROUP_ID);
   2228             profileBadge = readIntAttribute(parser, ATTR_PROFILE_BADGE, 0);
   2229             restrictedProfileParentId = readIntAttribute(parser,
   2230                     ATTR_RESTRICTED_PROFILE_PARENT_ID, UserInfo.NO_PROFILE_GROUP_ID);
   2231             String valueString = parser.getAttributeValue(null, ATTR_PARTIAL);
   2232             if ("true".equals(valueString)) {
   2233                 partial = true;
   2234             }
   2235             valueString = parser.getAttributeValue(null, ATTR_GUEST_TO_REMOVE);
   2236             if ("true".equals(valueString)) {
   2237                 guestToRemove = true;
   2238             }
   2239 
   2240             seedAccountName = parser.getAttributeValue(null, ATTR_SEED_ACCOUNT_NAME);
   2241             seedAccountType = parser.getAttributeValue(null, ATTR_SEED_ACCOUNT_TYPE);
   2242             if (seedAccountName != null || seedAccountType != null) {
   2243                 persistSeedData = true;
   2244             }
   2245 
   2246             int outerDepth = parser.getDepth();
   2247             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
   2248                     && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
   2249                 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
   2250                     continue;
   2251                 }
   2252                 String tag = parser.getName();
   2253                 if (TAG_NAME.equals(tag)) {
   2254                     type = parser.next();
   2255                     if (type == XmlPullParser.TEXT) {
   2256                         name = parser.getText();
   2257                     }
   2258                 } else if (TAG_RESTRICTIONS.equals(tag)) {
   2259                     baseRestrictions = UserRestrictionsUtils.readRestrictions(parser);
   2260                 } else if (TAG_DEVICE_POLICY_RESTRICTIONS.equals(tag)) {
   2261                     localRestrictions = UserRestrictionsUtils.readRestrictions(parser);
   2262                 } else if (TAG_DEVICE_POLICY_GLOBAL_RESTRICTIONS.equals(tag)) {
   2263                     globalRestrictions = UserRestrictionsUtils.readRestrictions(parser);
   2264                 } else if (TAG_ACCOUNT.equals(tag)) {
   2265                     type = parser.next();
   2266                     if (type == XmlPullParser.TEXT) {
   2267                         account = parser.getText();
   2268                     }
   2269                 } else if (TAG_SEED_ACCOUNT_OPTIONS.equals(tag)) {
   2270                     seedAccountOptions = PersistableBundle.restoreFromXml(parser);
   2271                     persistSeedData = true;
   2272                 }
   2273             }
   2274         }
   2275 
   2276         // Create the UserInfo object that gets passed around
   2277         UserInfo userInfo = new UserInfo(id, name, iconPath, flags);
   2278         userInfo.serialNumber = serialNumber;
   2279         userInfo.creationTime = creationTime;
   2280         userInfo.lastLoggedInTime = lastLoggedInTime;
   2281         userInfo.lastLoggedInFingerprint = lastLoggedInFingerprint;
   2282         userInfo.partial = partial;
   2283         userInfo.guestToRemove = guestToRemove;
   2284         userInfo.profileGroupId = profileGroupId;
   2285         userInfo.profileBadge = profileBadge;
   2286         userInfo.restrictedProfileParentId = restrictedProfileParentId;
   2287 
   2288         // Create the UserData object that's internal to this class
   2289         UserData userData = new UserData();
   2290         userData.info = userInfo;
   2291         userData.account = account;
   2292         userData.seedAccountName = seedAccountName;
   2293         userData.seedAccountType = seedAccountType;
   2294         userData.persistSeedData = persistSeedData;
   2295         userData.seedAccountOptions = seedAccountOptions;
   2296 
   2297         synchronized (mRestrictionsLock) {
   2298             if (baseRestrictions != null) {
   2299                 mBaseUserRestrictions.put(id, baseRestrictions);
   2300             }
   2301             if (localRestrictions != null) {
   2302                 mDevicePolicyLocalUserRestrictions.put(id, localRestrictions);
   2303             }
   2304             if (globalRestrictions != null) {
   2305                 mDevicePolicyGlobalUserRestrictions.put(id, globalRestrictions);
   2306             }
   2307         }
   2308         return userData;
   2309     }
   2310 
   2311     private int readIntAttribute(XmlPullParser parser, String attr, int defaultValue) {
   2312         String valueString = parser.getAttributeValue(null, attr);
   2313         if (valueString == null) return defaultValue;
   2314         try {
   2315             return Integer.parseInt(valueString);
   2316         } catch (NumberFormatException nfe) {
   2317             return defaultValue;
   2318         }
   2319     }
   2320 
   2321     private long readLongAttribute(XmlPullParser parser, String attr, long defaultValue) {
   2322         String valueString = parser.getAttributeValue(null, attr);
   2323         if (valueString == null) return defaultValue;
   2324         try {
   2325             return Long.parseLong(valueString);
   2326         } catch (NumberFormatException nfe) {
   2327             return defaultValue;
   2328         }
   2329     }
   2330 
   2331     /**
   2332      * Removes the app restrictions file for a specific package and user id, if it exists.
   2333      */
   2334     private static void cleanAppRestrictionsForPackageLAr(String pkg, int userId) {
   2335         File dir = Environment.getUserSystemDirectory(userId);
   2336         File resFile = new File(dir, packageToRestrictionsFileName(pkg));
   2337         if (resFile.exists()) {
   2338             resFile.delete();
   2339         }
   2340     }
   2341 
   2342     @Override
   2343     public UserInfo createProfileForUser(String name, int flags, int userId,
   2344             String[] disallowedPackages) {
   2345         checkManageOrCreateUsersPermission(flags);
   2346         return createUserInternal(name, flags, userId, disallowedPackages);
   2347     }
   2348 
   2349     @Override
   2350     public UserInfo createProfileForUserEvenWhenDisallowed(String name, int flags, int userId,
   2351             String[] disallowedPackages) {
   2352         checkManageOrCreateUsersPermission(flags);
   2353         return createUserInternalUnchecked(name, flags, userId, disallowedPackages);
   2354     }
   2355 
   2356     @Override
   2357     public boolean removeUserEvenWhenDisallowed(@UserIdInt int userHandle) {
   2358         checkManageOrCreateUsersPermission("Only the system can remove users");
   2359         return removeUserUnchecked(userHandle);
   2360     }
   2361 
   2362     @Override
   2363     public UserInfo createUser(String name, int flags) {
   2364         checkManageOrCreateUsersPermission(flags);
   2365         return createUserInternal(name, flags, UserHandle.USER_NULL);
   2366     }
   2367 
   2368     private UserInfo createUserInternal(String name, int flags, int parentId) {
   2369         return createUserInternal(name, flags, parentId, null);
   2370     }
   2371 
   2372     private UserInfo createUserInternal(String name, int flags, int parentId,
   2373             String[] disallowedPackages) {
   2374         String restriction = ((flags & UserInfo.FLAG_MANAGED_PROFILE) != 0)
   2375                 ? UserManager.DISALLOW_ADD_MANAGED_PROFILE
   2376                 : UserManager.DISALLOW_ADD_USER;
   2377         if (hasUserRestriction(restriction, UserHandle.getCallingUserId())) {
   2378             Log.w(LOG_TAG, "Cannot add user. " + restriction + " is enabled.");
   2379             return null;
   2380         }
   2381         return createUserInternalUnchecked(name, flags, parentId, disallowedPackages);
   2382     }
   2383 
   2384     private UserInfo createUserInternalUnchecked(String name, int flags, int parentId,
   2385             String[] disallowedPackages) {
   2386         DeviceStorageMonitorInternal dsm = LocalServices
   2387                 .getService(DeviceStorageMonitorInternal.class);
   2388         if (dsm.isMemoryLow()) {
   2389             Log.w(LOG_TAG, "Cannot add user. Not enough space on disk.");
   2390             return null;
   2391         }
   2392         if (ActivityManager.isLowRamDeviceStatic()) {
   2393             return null;
   2394         }
   2395         final boolean isGuest = (flags & UserInfo.FLAG_GUEST) != 0;
   2396         final boolean isManagedProfile = (flags & UserInfo.FLAG_MANAGED_PROFILE) != 0;
   2397         final boolean isRestricted = (flags & UserInfo.FLAG_RESTRICTED) != 0;
   2398         final boolean isDemo = (flags & UserInfo.FLAG_DEMO) != 0;
   2399         final long ident = Binder.clearCallingIdentity();
   2400         UserInfo userInfo;
   2401         UserData userData;
   2402         final int userId;
   2403         try {
   2404             synchronized (mPackagesLock) {
   2405                 UserData parent = null;
   2406                 if (parentId != UserHandle.USER_NULL) {
   2407                     synchronized (mUsersLock) {
   2408                         parent = getUserDataLU(parentId);
   2409                     }
   2410                     if (parent == null) return null;
   2411                 }
   2412                 if (isManagedProfile && !canAddMoreManagedProfiles(parentId, false)) {
   2413                     Log.e(LOG_TAG, "Cannot add more managed profiles for user " + parentId);
   2414                     return null;
   2415                 }
   2416                 if (!isGuest && !isManagedProfile && !isDemo && isUserLimitReached()) {
   2417                     // If we're not adding a guest/demo user or a managed profile and the limit has
   2418                     // been reached, cannot add a user.
   2419                     return null;
   2420                 }
   2421                 // If we're adding a guest and there already exists one, bail.
   2422                 if (isGuest && findCurrentGuestUser() != null) {
   2423                     return null;
   2424                 }
   2425                 // In legacy mode, restricted profile's parent can only be the owner user
   2426                 if (isRestricted && !UserManager.isSplitSystemUser()
   2427                         && (parentId != UserHandle.USER_SYSTEM)) {
   2428                     Log.w(LOG_TAG, "Cannot add restricted profile - parent user must be owner");
   2429                     return null;
   2430                 }
   2431                 if (isRestricted && UserManager.isSplitSystemUser()) {
   2432                     if (parent == null) {
   2433                         Log.w(LOG_TAG, "Cannot add restricted profile - parent user must be "
   2434                                 + "specified");
   2435                         return null;
   2436                     }
   2437                     if (!parent.info.canHaveProfile()) {
   2438                         Log.w(LOG_TAG, "Cannot add restricted profile - profiles cannot be "
   2439                                 + "created for the specified parent user id " + parentId);
   2440                         return null;
   2441                     }
   2442                 }
   2443                 if (!UserManager.isSplitSystemUser() && (flags & UserInfo.FLAG_EPHEMERAL) != 0
   2444                         && (flags & UserInfo.FLAG_DEMO) == 0) {
   2445                     Log.e(LOG_TAG,
   2446                             "Ephemeral users are supported on split-system-user systems only.");
   2447                     return null;
   2448                 }
   2449                 // In split system user mode, we assign the first human user the primary flag.
   2450                 // And if there is no device owner, we also assign the admin flag to primary user.
   2451                 if (UserManager.isSplitSystemUser()
   2452                         && !isGuest && !isManagedProfile && getPrimaryUser() == null) {
   2453                     flags |= UserInfo.FLAG_PRIMARY;
   2454                     synchronized (mUsersLock) {
   2455                         if (!mIsDeviceManaged) {
   2456                             flags |= UserInfo.FLAG_ADMIN;
   2457                         }
   2458                     }
   2459                 }
   2460 
   2461                 userId = getNextAvailableId();
   2462                 Environment.getUserSystemDirectory(userId).mkdirs();
   2463                 boolean ephemeralGuests = Resources.getSystem()
   2464                         .getBoolean(com.android.internal.R.bool.config_guestUserEphemeral);
   2465 
   2466                 synchronized (mUsersLock) {
   2467                     // Add ephemeral flag to guests/users if required. Also inherit it from parent.
   2468                     if ((isGuest && ephemeralGuests) || mForceEphemeralUsers
   2469                             || (parent != null && parent.info.isEphemeral())) {
   2470                         flags |= UserInfo.FLAG_EPHEMERAL;
   2471                     }
   2472 
   2473                     userInfo = new UserInfo(userId, name, null, flags);
   2474                     userInfo.serialNumber = mNextSerialNumber++;
   2475                     long now = System.currentTimeMillis();
   2476                     userInfo.creationTime = (now > EPOCH_PLUS_30_YEARS) ? now : 0;
   2477                     userInfo.partial = true;
   2478                     userInfo.lastLoggedInFingerprint = Build.FINGERPRINT;
   2479                     if (isManagedProfile && parentId != UserHandle.USER_NULL) {
   2480                         userInfo.profileBadge = getFreeProfileBadgeLU(parentId);
   2481                     }
   2482                     userData = new UserData();
   2483                     userData.info = userInfo;
   2484                     mUsers.put(userId, userData);
   2485                 }
   2486                 writeUserLP(userData);
   2487                 writeUserListLP();
   2488                 if (parent != null) {
   2489                     if (isManagedProfile) {
   2490                         if (parent.info.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID) {
   2491                             parent.info.profileGroupId = parent.info.id;
   2492                             writeUserLP(parent);
   2493                         }
   2494                         userInfo.profileGroupId = parent.info.profileGroupId;
   2495                     } else if (isRestricted) {
   2496                         if (parent.info.restrictedProfileParentId == UserInfo.NO_PROFILE_GROUP_ID) {
   2497                             parent.info.restrictedProfileParentId = parent.info.id;
   2498                             writeUserLP(parent);
   2499                         }
   2500                         userInfo.restrictedProfileParentId = parent.info.restrictedProfileParentId;
   2501                     }
   2502                 }
   2503             }
   2504             final StorageManager storage = mContext.getSystemService(StorageManager.class);
   2505             storage.createUserKey(userId, userInfo.serialNumber, userInfo.isEphemeral());
   2506             mUserDataPreparer.prepareUserData(userId, userInfo.serialNumber,
   2507                     StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE);
   2508             mPm.createNewUser(userId, disallowedPackages);
   2509             userInfo.partial = false;
   2510             synchronized (mPackagesLock) {
   2511                 writeUserLP(userData);
   2512             }
   2513             updateUserIds();
   2514             Bundle restrictions = new Bundle();
   2515             if (isGuest) {
   2516                 synchronized (mGuestRestrictions) {
   2517                     restrictions.putAll(mGuestRestrictions);
   2518                 }
   2519             }
   2520             synchronized (mRestrictionsLock) {
   2521                 mBaseUserRestrictions.append(userId, restrictions);
   2522             }
   2523             mPm.onNewUserCreated(userId);
   2524             Intent addedIntent = new Intent(Intent.ACTION_USER_ADDED);
   2525             addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
   2526             mContext.sendBroadcastAsUser(addedIntent, UserHandle.ALL,
   2527                     android.Manifest.permission.MANAGE_USERS);
   2528             MetricsLogger.count(mContext, isGuest ? TRON_GUEST_CREATED
   2529                     : (isDemo ? TRON_DEMO_CREATED : TRON_USER_CREATED), 1);
   2530         } finally {
   2531             Binder.restoreCallingIdentity(ident);
   2532         }
   2533         return userInfo;
   2534     }
   2535 
   2536     @VisibleForTesting
   2537     UserData putUserInfo(UserInfo userInfo) {
   2538         final UserData userData = new UserData();
   2539         userData.info = userInfo;
   2540         synchronized (mUsers) {
   2541             mUsers.put(userInfo.id, userData);
   2542         }
   2543         return userData;
   2544     }
   2545 
   2546     @VisibleForTesting
   2547     void removeUserInfo(int userId) {
   2548         synchronized (mUsers) {
   2549             mUsers.remove(userId);
   2550         }
   2551     }
   2552 
   2553     /**
   2554      * @hide
   2555      */
   2556     @Override
   2557     public UserInfo createRestrictedProfile(String name, int parentUserId) {
   2558         checkManageOrCreateUsersPermission("setupRestrictedProfile");
   2559         final UserInfo user = createProfileForUser(
   2560                 name, UserInfo.FLAG_RESTRICTED, parentUserId, null);
   2561         if (user == null) {
   2562             return null;
   2563         }
   2564         long identity = Binder.clearCallingIdentity();
   2565         try {
   2566             setUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS, true, user.id);
   2567             // Change the setting before applying the DISALLOW_SHARE_LOCATION restriction, otherwise
   2568             // the putIntForUser() will fail.
   2569             android.provider.Settings.Secure.putIntForUser(mContext.getContentResolver(),
   2570                     android.provider.Settings.Secure.LOCATION_MODE,
   2571                     android.provider.Settings.Secure.LOCATION_MODE_OFF, user.id);
   2572             setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, true, user.id);
   2573         } finally {
   2574             Binder.restoreCallingIdentity(identity);
   2575         }
   2576         return user;
   2577     }
   2578 
   2579     /**
   2580      * Find the current guest user. If the Guest user is partial,
   2581      * then do not include it in the results as it is about to die.
   2582      */
   2583     private UserInfo findCurrentGuestUser() {
   2584         synchronized (mUsersLock) {
   2585             final int size = mUsers.size();
   2586             for (int i = 0; i < size; i++) {
   2587                 final UserInfo user = mUsers.valueAt(i).info;
   2588                 if (user.isGuest() && !user.guestToRemove && !mRemovingUserIds.get(user.id)) {
   2589                     return user;
   2590                 }
   2591             }
   2592         }
   2593         return null;
   2594     }
   2595 
   2596     /**
   2597      * Mark this guest user for deletion to allow us to create another guest
   2598      * and switch to that user before actually removing this guest.
   2599      * @param userHandle the userid of the current guest
   2600      * @return whether the user could be marked for deletion
   2601      */
   2602     @Override
   2603     public boolean markGuestForDeletion(int userHandle) {
   2604         checkManageUsersPermission("Only the system can remove users");
   2605         if (getUserRestrictions(UserHandle.getCallingUserId()).getBoolean(
   2606                 UserManager.DISALLOW_REMOVE_USER, false)) {
   2607             Log.w(LOG_TAG, "Cannot remove user. DISALLOW_REMOVE_USER is enabled.");
   2608             return false;
   2609         }
   2610 
   2611         long ident = Binder.clearCallingIdentity();
   2612         try {
   2613             final UserData userData;
   2614             synchronized (mPackagesLock) {
   2615                 synchronized (mUsersLock) {
   2616                     userData = mUsers.get(userHandle);
   2617                     if (userHandle == 0 || userData == null || mRemovingUserIds.get(userHandle)) {
   2618                         return false;
   2619                     }
   2620                 }
   2621                 if (!userData.info.isGuest()) {
   2622                     return false;
   2623                 }
   2624                 // We set this to a guest user that is to be removed. This is a temporary state
   2625                 // where we are allowed to add new Guest users, even if this one is still not
   2626                 // removed. This user will still show up in getUserInfo() calls.
   2627                 // If we don't get around to removing this Guest user, it will be purged on next
   2628                 // startup.
   2629                 userData.info.guestToRemove = true;
   2630                 // Mark it as disabled, so that it isn't returned any more when
   2631                 // profiles are queried.
   2632                 userData.info.flags |= UserInfo.FLAG_DISABLED;
   2633                 writeUserLP(userData);
   2634             }
   2635         } finally {
   2636             Binder.restoreCallingIdentity(ident);
   2637         }
   2638         return true;
   2639     }
   2640 
   2641     /**
   2642      * Removes a user and all data directories created for that user. This method should be called
   2643      * after the user's processes have been terminated.
   2644      * @param userHandle the user's id
   2645      */
   2646     @Override
   2647     public boolean removeUser(int userHandle) {
   2648         Slog.i(LOG_TAG, "removeUser u" + userHandle);
   2649         checkManageOrCreateUsersPermission("Only the system can remove users");
   2650 
   2651         final boolean isManagedProfile;
   2652         synchronized (mUsersLock) {
   2653             UserInfo userInfo = getUserInfoLU(userHandle);
   2654             isManagedProfile = userInfo != null && userInfo.isManagedProfile();
   2655         }
   2656         String restriction = isManagedProfile
   2657                 ? UserManager.DISALLOW_REMOVE_MANAGED_PROFILE : UserManager.DISALLOW_REMOVE_USER;
   2658         if (getUserRestrictions(UserHandle.getCallingUserId()).getBoolean(restriction, false)) {
   2659             Log.w(LOG_TAG, "Cannot remove user. " + restriction + " is enabled.");
   2660             return false;
   2661         }
   2662         return removeUserUnchecked(userHandle);
   2663     }
   2664 
   2665     private boolean removeUserUnchecked(int userHandle) {
   2666         long ident = Binder.clearCallingIdentity();
   2667         try {
   2668             final UserData userData;
   2669             int currentUser = ActivityManager.getCurrentUser();
   2670             if (currentUser == userHandle) {
   2671                 Log.w(LOG_TAG, "Current user cannot be removed");
   2672                 return false;
   2673             }
   2674             synchronized (mPackagesLock) {
   2675                 synchronized (mUsersLock) {
   2676                     userData = mUsers.get(userHandle);
   2677                     if (userHandle == 0 || userData == null || mRemovingUserIds.get(userHandle)) {
   2678                         return false;
   2679                     }
   2680 
   2681                     addRemovingUserIdLocked(userHandle);
   2682                 }
   2683 
   2684                 // Set this to a partially created user, so that the user will be purged
   2685                 // on next startup, in case the runtime stops now before stopping and
   2686                 // removing the user completely.
   2687                 userData.info.partial = true;
   2688                 // Mark it as disabled, so that it isn't returned any more when
   2689                 // profiles are queried.
   2690                 userData.info.flags |= UserInfo.FLAG_DISABLED;
   2691                 writeUserLP(userData);
   2692             }
   2693             try {
   2694                 mAppOpsService.removeUser(userHandle);
   2695             } catch (RemoteException e) {
   2696                 Log.w(LOG_TAG, "Unable to notify AppOpsService of removing user", e);
   2697             }
   2698 
   2699             if (userData.info.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID
   2700                     && userData.info.isManagedProfile()) {
   2701                 // Send broadcast to notify system that the user removed was a
   2702                 // managed user.
   2703                 sendProfileRemovedBroadcast(userData.info.profileGroupId, userData.info.id);
   2704             }
   2705 
   2706             if (DBG) Slog.i(LOG_TAG, "Stopping user " + userHandle);
   2707             int res;
   2708             try {
   2709                 res = ActivityManager.getService().stopUser(userHandle, /* force= */ true,
   2710                 new IStopUserCallback.Stub() {
   2711                             @Override
   2712                             public void userStopped(int userId) {
   2713                                 finishRemoveUser(userId);
   2714                             }
   2715                             @Override
   2716                             public void userStopAborted(int userId) {
   2717                             }
   2718                         });
   2719             } catch (RemoteException e) {
   2720                 return false;
   2721             }
   2722             return res == ActivityManager.USER_OP_SUCCESS;
   2723         } finally {
   2724             Binder.restoreCallingIdentity(ident);
   2725         }
   2726     }
   2727 
   2728     @VisibleForTesting
   2729     void addRemovingUserIdLocked(int userId) {
   2730         // We remember deleted user IDs to prevent them from being
   2731         // reused during the current boot; they can still be reused
   2732         // after a reboot or recycling of userIds.
   2733         mRemovingUserIds.put(userId, true);
   2734         mRecentlyRemovedIds.add(userId);
   2735         // Keep LRU queue of recently removed IDs for recycling
   2736         if (mRecentlyRemovedIds.size() > MAX_RECENTLY_REMOVED_IDS_SIZE) {
   2737             mRecentlyRemovedIds.removeFirst();
   2738         }
   2739     }
   2740 
   2741     void finishRemoveUser(final int userHandle) {
   2742         if (DBG) Slog.i(LOG_TAG, "finishRemoveUser " + userHandle);
   2743         // Let other services shutdown any activity and clean up their state before completely
   2744         // wiping the user's system directory and removing from the user list
   2745         long ident = Binder.clearCallingIdentity();
   2746         try {
   2747             Intent addedIntent = new Intent(Intent.ACTION_USER_REMOVED);
   2748             addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userHandle);
   2749             mContext.sendOrderedBroadcastAsUser(addedIntent, UserHandle.ALL,
   2750                     android.Manifest.permission.MANAGE_USERS,
   2751 
   2752                     new BroadcastReceiver() {
   2753                         @Override
   2754                         public void onReceive(Context context, Intent intent) {
   2755                             if (DBG) {
   2756                                 Slog.i(LOG_TAG,
   2757                                         "USER_REMOVED broadcast sent, cleaning up user data "
   2758                                         + userHandle);
   2759                             }
   2760                             new Thread() {
   2761                                 @Override
   2762                                 public void run() {
   2763                                     // Clean up any ActivityManager state
   2764                                     LocalServices.getService(ActivityManagerInternal.class)
   2765                                             .onUserRemoved(userHandle);
   2766                                     removeUserState(userHandle);
   2767                                 }
   2768                             }.start();
   2769                         }
   2770                     },
   2771 
   2772                     null, Activity.RESULT_OK, null, null);
   2773         } finally {
   2774             Binder.restoreCallingIdentity(ident);
   2775         }
   2776     }
   2777 
   2778     private void removeUserState(final int userHandle) {
   2779         try {
   2780             mContext.getSystemService(StorageManager.class).destroyUserKey(userHandle);
   2781         } catch (IllegalStateException e) {
   2782             // This may be simply because the user was partially created.
   2783             Slog.i(LOG_TAG,
   2784                 "Destroying key for user " + userHandle + " failed, continuing anyway", e);
   2785         }
   2786 
   2787         // Cleanup gatekeeper secure user id
   2788         try {
   2789             final IGateKeeperService gk = GateKeeper.getService();
   2790             if (gk != null) {
   2791                 gk.clearSecureUserId(userHandle);
   2792             }
   2793         } catch (Exception ex) {
   2794             Slog.w(LOG_TAG, "unable to clear GK secure user id");
   2795         }
   2796 
   2797         // Cleanup package manager settings
   2798         mPm.cleanUpUser(this, userHandle);
   2799 
   2800         // Clean up all data before removing metadata
   2801         mUserDataPreparer.destroyUserData(userHandle,
   2802                 StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE);
   2803 
   2804         // Remove this user from the list
   2805         synchronized (mUsersLock) {
   2806             mUsers.remove(userHandle);
   2807             mIsUserManaged.delete(userHandle);
   2808         }
   2809         synchronized (mUserStates) {
   2810             mUserStates.delete(userHandle);
   2811         }
   2812         synchronized (mRestrictionsLock) {
   2813             mBaseUserRestrictions.remove(userHandle);
   2814             mAppliedUserRestrictions.remove(userHandle);
   2815             mCachedEffectiveUserRestrictions.remove(userHandle);
   2816             mDevicePolicyLocalUserRestrictions.remove(userHandle);
   2817             if (mDevicePolicyGlobalUserRestrictions.get(userHandle) != null) {
   2818                 mDevicePolicyGlobalUserRestrictions.remove(userHandle);
   2819                 applyUserRestrictionsForAllUsersLR();
   2820             }
   2821         }
   2822         // Update the user list
   2823         synchronized (mPackagesLock) {
   2824             writeUserListLP();
   2825         }
   2826         // Remove user file
   2827         AtomicFile userFile = new AtomicFile(new File(mUsersDir, userHandle + XML_SUFFIX));
   2828         userFile.delete();
   2829         updateUserIds();
   2830         if (RELEASE_DELETED_USER_ID) {
   2831             synchronized (mUsers) {
   2832                 mRemovingUserIds.delete(userHandle);
   2833             }
   2834         }
   2835     }
   2836 
   2837     private void sendProfileRemovedBroadcast(int parentUserId, int removedUserId) {
   2838         Intent managedProfileIntent = new Intent(Intent.ACTION_MANAGED_PROFILE_REMOVED);
   2839         managedProfileIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY |
   2840                 Intent.FLAG_RECEIVER_FOREGROUND);
   2841         managedProfileIntent.putExtra(Intent.EXTRA_USER, new UserHandle(removedUserId));
   2842         managedProfileIntent.putExtra(Intent.EXTRA_USER_HANDLE, removedUserId);
   2843         mContext.sendBroadcastAsUser(managedProfileIntent, new UserHandle(parentUserId), null);
   2844     }
   2845 
   2846     @Override
   2847     public Bundle getApplicationRestrictions(String packageName) {
   2848         return getApplicationRestrictionsForUser(packageName, UserHandle.getCallingUserId());
   2849     }
   2850 
   2851     @Override
   2852     public Bundle getApplicationRestrictionsForUser(String packageName, int userId) {
   2853         if (UserHandle.getCallingUserId() != userId
   2854                 || !UserHandle.isSameApp(Binder.getCallingUid(), getUidForPackage(packageName))) {
   2855             checkSystemOrRoot("get application restrictions for other user/app " + packageName);
   2856         }
   2857         synchronized (mAppRestrictionsLock) {
   2858             // Read the restrictions from XML
   2859             return readApplicationRestrictionsLAr(packageName, userId);
   2860         }
   2861     }
   2862 
   2863     @Override
   2864     public void setApplicationRestrictions(String packageName, Bundle restrictions,
   2865             int userId) {
   2866         checkSystemOrRoot("set application restrictions");
   2867         if (restrictions != null) {
   2868             restrictions.setDefusable(true);
   2869         }
   2870         synchronized (mAppRestrictionsLock) {
   2871             if (restrictions == null || restrictions.isEmpty()) {
   2872                 cleanAppRestrictionsForPackageLAr(packageName, userId);
   2873             } else {
   2874                 // Write the restrictions to XML
   2875                 writeApplicationRestrictionsLAr(packageName, restrictions, userId);
   2876             }
   2877         }
   2878 
   2879         // Notify package of changes via an intent - only sent to explicitly registered receivers.
   2880         Intent changeIntent = new Intent(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED);
   2881         changeIntent.setPackage(packageName);
   2882         changeIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
   2883         mContext.sendBroadcastAsUser(changeIntent, UserHandle.of(userId));
   2884     }
   2885 
   2886     private int getUidForPackage(String packageName) {
   2887         long ident = Binder.clearCallingIdentity();
   2888         try {
   2889             return mContext.getPackageManager().getApplicationInfo(packageName,
   2890                     PackageManager.MATCH_ANY_USER).uid;
   2891         } catch (NameNotFoundException nnfe) {
   2892             return -1;
   2893         } finally {
   2894             Binder.restoreCallingIdentity(ident);
   2895         }
   2896     }
   2897 
   2898     @GuardedBy("mAppRestrictionsLock")
   2899     private static Bundle readApplicationRestrictionsLAr(String packageName, int userId) {
   2900         AtomicFile restrictionsFile =
   2901                 new AtomicFile(new File(Environment.getUserSystemDirectory(userId),
   2902                         packageToRestrictionsFileName(packageName)));
   2903         return readApplicationRestrictionsLAr(restrictionsFile);
   2904     }
   2905 
   2906     @VisibleForTesting
   2907     @GuardedBy("mAppRestrictionsLock")
   2908     static Bundle readApplicationRestrictionsLAr(AtomicFile restrictionsFile) {
   2909         final Bundle restrictions = new Bundle();
   2910         final ArrayList<String> values = new ArrayList<>();
   2911         if (!restrictionsFile.getBaseFile().exists()) {
   2912             return restrictions;
   2913         }
   2914 
   2915         FileInputStream fis = null;
   2916         try {
   2917             fis = restrictionsFile.openRead();
   2918             XmlPullParser parser = Xml.newPullParser();
   2919             parser.setInput(fis, StandardCharsets.UTF_8.name());
   2920             XmlUtils.nextElement(parser);
   2921             if (parser.getEventType() != XmlPullParser.START_TAG) {
   2922                 Slog.e(LOG_TAG, "Unable to read restrictions file "
   2923                         + restrictionsFile.getBaseFile());
   2924                 return restrictions;
   2925             }
   2926             while (parser.next() != XmlPullParser.END_DOCUMENT) {
   2927                 readEntry(restrictions, values, parser);
   2928             }
   2929         } catch (IOException|XmlPullParserException e) {
   2930             Log.w(LOG_TAG, "Error parsing " + restrictionsFile.getBaseFile(), e);
   2931         } finally {
   2932             IoUtils.closeQuietly(fis);
   2933         }
   2934         return restrictions;
   2935     }
   2936 
   2937     private static void readEntry(Bundle restrictions, ArrayList<String> values,
   2938             XmlPullParser parser) throws XmlPullParserException, IOException {
   2939         int type = parser.getEventType();
   2940         if (type == XmlPullParser.START_TAG && parser.getName().equals(TAG_ENTRY)) {
   2941             String key = parser.getAttributeValue(null, ATTR_KEY);
   2942             String valType = parser.getAttributeValue(null, ATTR_VALUE_TYPE);
   2943             String multiple = parser.getAttributeValue(null, ATTR_MULTIPLE);
   2944             if (multiple != null) {
   2945                 values.clear();
   2946                 int count = Integer.parseInt(multiple);
   2947                 while (count > 0 && (type = parser.next()) != XmlPullParser.END_DOCUMENT) {
   2948                     if (type == XmlPullParser.START_TAG
   2949                             && parser.getName().equals(TAG_VALUE)) {
   2950                         values.add(parser.nextText().trim());
   2951                         count--;
   2952                     }
   2953                 }
   2954                 String [] valueStrings = new String[values.size()];
   2955                 values.toArray(valueStrings);
   2956                 restrictions.putStringArray(key, valueStrings);
   2957             } else if (ATTR_TYPE_BUNDLE.equals(valType)) {
   2958                 restrictions.putBundle(key, readBundleEntry(parser, values));
   2959             } else if (ATTR_TYPE_BUNDLE_ARRAY.equals(valType)) {
   2960                 final int outerDepth = parser.getDepth();
   2961                 ArrayList<Bundle> bundleList = new ArrayList<>();
   2962                 while (XmlUtils.nextElementWithin(parser, outerDepth)) {
   2963                     Bundle childBundle = readBundleEntry(parser, values);
   2964                     bundleList.add(childBundle);
   2965                 }
   2966                 restrictions.putParcelableArray(key,
   2967                         bundleList.toArray(new Bundle[bundleList.size()]));
   2968             } else {
   2969                 String value = parser.nextText().trim();
   2970                 if (ATTR_TYPE_BOOLEAN.equals(valType)) {
   2971                     restrictions.putBoolean(key, Boolean.parseBoolean(value));
   2972                 } else if (ATTR_TYPE_INTEGER.equals(valType)) {
   2973                     restrictions.putInt(key, Integer.parseInt(value));
   2974                 } else {
   2975                     restrictions.putString(key, value);
   2976                 }
   2977             }
   2978         }
   2979     }
   2980 
   2981     private static Bundle readBundleEntry(XmlPullParser parser, ArrayList<String> values)
   2982             throws IOException, XmlPullParserException {
   2983         Bundle childBundle = new Bundle();
   2984         final int outerDepth = parser.getDepth();
   2985         while (XmlUtils.nextElementWithin(parser, outerDepth)) {
   2986             readEntry(childBundle, values, parser);
   2987         }
   2988         return childBundle;
   2989     }
   2990 
   2991     @GuardedBy("mAppRestrictionsLock")
   2992     private static void writeApplicationRestrictionsLAr(String packageName,
   2993             Bundle restrictions, int userId) {
   2994         AtomicFile restrictionsFile = new AtomicFile(
   2995                 new File(Environment.getUserSystemDirectory(userId),
   2996                         packageToRestrictionsFileName(packageName)));
   2997         writeApplicationRestrictionsLAr(restrictions, restrictionsFile);
   2998     }
   2999 
   3000     @VisibleForTesting
   3001     @GuardedBy("mAppRestrictionsLock")
   3002     static void writeApplicationRestrictionsLAr(Bundle restrictions, AtomicFile restrictionsFile) {
   3003         FileOutputStream fos = null;
   3004         try {
   3005             fos = restrictionsFile.startWrite();
   3006             final BufferedOutputStream bos = new BufferedOutputStream(fos);
   3007 
   3008             final XmlSerializer serializer = new FastXmlSerializer();
   3009             serializer.setOutput(bos, StandardCharsets.UTF_8.name());
   3010             serializer.startDocument(null, true);
   3011             serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
   3012 
   3013             serializer.startTag(null, TAG_RESTRICTIONS);
   3014             writeBundle(restrictions, serializer);
   3015             serializer.endTag(null, TAG_RESTRICTIONS);
   3016 
   3017             serializer.endDocument();
   3018             restrictionsFile.finishWrite(fos);
   3019         } catch (Exception e) {
   3020             restrictionsFile.failWrite(fos);
   3021             Slog.e(LOG_TAG, "Error writing application restrictions list", e);
   3022         }
   3023     }
   3024 
   3025     private static void writeBundle(Bundle restrictions, XmlSerializer serializer)
   3026             throws IOException {
   3027         for (String key : restrictions.keySet()) {
   3028             Object value = restrictions.get(key);
   3029             serializer.startTag(null, TAG_ENTRY);
   3030             serializer.attribute(null, ATTR_KEY, key);
   3031 
   3032             if (value instanceof Boolean) {
   3033                 serializer.attribute(null, ATTR_VALUE_TYPE, ATTR_TYPE_BOOLEAN);
   3034                 serializer.text(value.toString());
   3035             } else if (value instanceof Integer) {
   3036                 serializer.attribute(null, ATTR_VALUE_TYPE, ATTR_TYPE_INTEGER);
   3037                 serializer.text(value.toString());
   3038             } else if (value == null || value instanceof String) {
   3039                 serializer.attribute(null, ATTR_VALUE_TYPE, ATTR_TYPE_STRING);
   3040                 serializer.text(value != null ? (String) value : "");
   3041             } else if (value instanceof Bundle) {
   3042                 serializer.attribute(null, ATTR_VALUE_TYPE, ATTR_TYPE_BUNDLE);
   3043                 writeBundle((Bundle) value, serializer);
   3044             } else if (value instanceof Parcelable[]) {
   3045                 serializer.attribute(null, ATTR_VALUE_TYPE, ATTR_TYPE_BUNDLE_ARRAY);
   3046                 Parcelable[] array = (Parcelable[]) value;
   3047                 for (Parcelable parcelable : array) {
   3048                     if (!(parcelable instanceof Bundle)) {
   3049                         throw new IllegalArgumentException("bundle-array can only hold Bundles");
   3050                     }
   3051                     serializer.startTag(null, TAG_ENTRY);
   3052                     serializer.attribute(null, ATTR_VALUE_TYPE, ATTR_TYPE_BUNDLE);
   3053                     writeBundle((Bundle) parcelable, serializer);
   3054                     serializer.endTag(null, TAG_ENTRY);
   3055                 }
   3056             } else {
   3057                 serializer.attribute(null, ATTR_VALUE_TYPE, ATTR_TYPE_STRING_ARRAY);
   3058                 String[] values = (String[]) value;
   3059                 serializer.attribute(null, ATTR_MULTIPLE, Integer.toString(values.length));
   3060                 for (String choice : values) {
   3061                     serializer.startTag(null, TAG_VALUE);
   3062                     serializer.text(choice != null ? choice : "");
   3063                     serializer.endTag(null, TAG_VALUE);
   3064                 }
   3065             }
   3066             serializer.endTag(null, TAG_ENTRY);
   3067         }
   3068     }
   3069 
   3070     @Override
   3071     public int getUserSerialNumber(int userHandle) {
   3072         synchronized (mUsersLock) {
   3073             if (!exists(userHandle)) return -1;
   3074             return getUserInfoLU(userHandle).serialNumber;
   3075         }
   3076     }
   3077 
   3078     @Override
   3079     public boolean isUserNameSet(int userHandle) {
   3080         synchronized (mUsersLock) {
   3081             UserInfo userInfo = getUserInfoLU(userHandle);
   3082             return userInfo != null && userInfo.name != null;
   3083         }
   3084     }
   3085 
   3086     @Override
   3087     public int getUserHandle(int userSerialNumber) {
   3088         synchronized (mUsersLock) {
   3089             for (int userId : mUserIds) {
   3090                 UserInfo info = getUserInfoLU(userId);
   3091                 if (info != null && info.serialNumber == userSerialNumber) return userId;
   3092             }
   3093             // Not found
   3094             return -1;
   3095         }
   3096     }
   3097 
   3098     @Override
   3099     public long getUserCreationTime(int userHandle) {
   3100         int callingUserId = UserHandle.getCallingUserId();
   3101         UserInfo userInfo = null;
   3102         synchronized (mUsersLock) {
   3103             if (callingUserId == userHandle) {
   3104                 userInfo = getUserInfoLU(userHandle);
   3105             } else {
   3106                 UserInfo parent = getProfileParentLU(userHandle);
   3107                 if (parent != null && parent.id == callingUserId) {
   3108                     userInfo = getUserInfoLU(userHandle);
   3109                 }
   3110             }
   3111         }
   3112         if (userInfo == null) {
   3113             throw new SecurityException("userHandle can only be the calling user or a managed "
   3114                     + "profile associated with this user");
   3115         }
   3116         return userInfo.creationTime;
   3117     }
   3118 
   3119     /**
   3120      * Caches the list of user ids in an array, adjusting the array size when necessary.
   3121      */
   3122     private void updateUserIds() {
   3123         int num = 0;
   3124         synchronized (mUsersLock) {
   3125             final int userSize = mUsers.size();
   3126             for (int i = 0; i < userSize; i++) {
   3127                 if (!mUsers.valueAt(i).info.partial) {
   3128                     num++;
   3129                 }
   3130             }
   3131             final int[] newUsers = new int[num];
   3132             int n = 0;
   3133             for (int i = 0; i < userSize; i++) {
   3134                 if (!mUsers.valueAt(i).info.partial) {
   3135                     newUsers[n++] = mUsers.keyAt(i);
   3136                 }
   3137             }
   3138             mUserIds = newUsers;
   3139         }
   3140     }
   3141 
   3142     /**
   3143      * Called right before a user is started. This gives us a chance to prepare
   3144      * app storage and apply any user restrictions.
   3145      */
   3146     public void onBeforeStartUser(int userId) {
   3147         UserInfo userInfo = getUserInfo(userId);
   3148         if (userInfo == null) {
   3149             return;
   3150         }
   3151         final int userSerial = userInfo.serialNumber;
   3152         // Migrate only if build fingerprints mismatch
   3153         boolean migrateAppsData = !Build.FINGERPRINT.equals(userInfo.lastLoggedInFingerprint);
   3154         mUserDataPreparer.prepareUserData(userId, userSerial, StorageManager.FLAG_STORAGE_DE);
   3155         mPm.reconcileAppsData(userId, StorageManager.FLAG_STORAGE_DE, migrateAppsData);
   3156 
   3157         if (userId != UserHandle.USER_SYSTEM) {
   3158             synchronized (mRestrictionsLock) {
   3159                 applyUserRestrictionsLR(userId);
   3160             }
   3161         }
   3162     }
   3163 
   3164     /**
   3165      * Called right before a user is unlocked. This gives us a chance to prepare
   3166      * app storage.
   3167      */
   3168     public void onBeforeUnlockUser(@UserIdInt int userId) {
   3169         UserInfo userInfo = getUserInfo(userId);
   3170         if (userInfo == null) {
   3171             return;
   3172         }
   3173         final int userSerial = userInfo.serialNumber;
   3174         // Migrate only if build fingerprints mismatch
   3175         boolean migrateAppsData = !Build.FINGERPRINT.equals(userInfo.lastLoggedInFingerprint);
   3176         mUserDataPreparer.prepareUserData(userId, userSerial, StorageManager.FLAG_STORAGE_CE);
   3177         mPm.reconcileAppsData(userId, StorageManager.FLAG_STORAGE_CE, migrateAppsData);
   3178     }
   3179 
   3180     /**
   3181      * Examine all users present on given mounted volume, and destroy data
   3182      * belonging to users that are no longer valid, or whose user ID has been
   3183      * recycled.
   3184      */
   3185     void reconcileUsers(String volumeUuid) {
   3186         mUserDataPreparer.reconcileUsers(volumeUuid, getUsers(true /* excludeDying */));
   3187     }
   3188 
   3189     /**
   3190      * Make a note of the last started time of a user and do some cleanup.
   3191      * This is called with ActivityManagerService lock held.
   3192      * @param userId the user that was just foregrounded
   3193      */
   3194     public void onUserLoggedIn(@UserIdInt int userId) {
   3195         UserData userData = getUserDataNoChecks(userId);
   3196         if (userData == null || userData.info.partial) {
   3197             Slog.w(LOG_TAG, "userForeground: unknown user #" + userId);
   3198             return;
   3199         }
   3200 
   3201         final long now = System.currentTimeMillis();
   3202         if (now > EPOCH_PLUS_30_YEARS) {
   3203             userData.info.lastLoggedInTime = now;
   3204         }
   3205         userData.info.lastLoggedInFingerprint = Build.FINGERPRINT;
   3206         scheduleWriteUser(userData);
   3207     }
   3208 
   3209     /**
   3210      * Returns the next available user id, filling in any holes in the ids.
   3211      */
   3212     @VisibleForTesting
   3213     int getNextAvailableId() {
   3214         int nextId;
   3215         synchronized (mUsersLock) {
   3216             nextId = scanNextAvailableIdLocked();
   3217             if (nextId >= 0) {
   3218                 return nextId;
   3219             }
   3220             // All ids up to MAX_USER_ID were used. Remove all mRemovingUserIds,
   3221             // except most recently removed
   3222             if (mRemovingUserIds.size() > 0) {
   3223                 Slog.i(LOG_TAG, "All available IDs are used. Recycling LRU ids.");
   3224                 mRemovingUserIds.clear();
   3225                 for (Integer recentlyRemovedId : mRecentlyRemovedIds) {
   3226                     mRemovingUserIds.put(recentlyRemovedId, true);
   3227                 }
   3228                 nextId = scanNextAvailableIdLocked();
   3229             }
   3230         }
   3231         if (nextId < 0) {
   3232             throw new IllegalStateException("No user id available!");
   3233         }
   3234         return nextId;
   3235     }
   3236 
   3237     private int scanNextAvailableIdLocked() {
   3238         for (int i = MIN_USER_ID; i < MAX_USER_ID; i++) {
   3239             if (mUsers.indexOfKey(i) < 0 && !mRemovingUserIds.get(i)) {
   3240                 return i;
   3241             }
   3242         }
   3243         return -1;
   3244     }
   3245 
   3246     private static String packageToRestrictionsFileName(String packageName) {
   3247         return RESTRICTIONS_FILE_PREFIX + packageName + XML_SUFFIX;
   3248     }
   3249 
   3250     @Override
   3251     public void setSeedAccountData(int userId, String accountName, String accountType,
   3252             PersistableBundle accountOptions, boolean persist) {
   3253         checkManageUsersPermission("Require MANAGE_USERS permission to set user seed data");
   3254         synchronized (mPackagesLock) {
   3255             final UserData userData;
   3256             synchronized (mUsersLock) {
   3257                 userData = getUserDataLU(userId);
   3258                 if (userData == null) {
   3259                     Slog.e(LOG_TAG, "No such user for settings seed data u=" + userId);
   3260                     return;
   3261                 }
   3262                 userData.seedAccountName = accountName;
   3263                 userData.seedAccountType = accountType;
   3264                 userData.seedAccountOptions = accountOptions;
   3265                 userData.persistSeedData = persist;
   3266             }
   3267             if (persist) {
   3268                 writeUserLP(userData);
   3269             }
   3270         }
   3271     }
   3272 
   3273     @Override
   3274     public String getSeedAccountName() throws RemoteException {
   3275         checkManageUsersPermission("Cannot get seed account information");
   3276         synchronized (mUsersLock) {
   3277             UserData userData = getUserDataLU(UserHandle.getCallingUserId());
   3278             return userData.seedAccountName;
   3279         }
   3280     }
   3281 
   3282     @Override
   3283     public String getSeedAccountType() throws RemoteException {
   3284         checkManageUsersPermission("Cannot get seed account information");
   3285         synchronized (mUsersLock) {
   3286             UserData userData = getUserDataLU(UserHandle.getCallingUserId());
   3287             return userData.seedAccountType;
   3288         }
   3289     }
   3290 
   3291     @Override
   3292     public PersistableBundle getSeedAccountOptions() throws RemoteException {
   3293         checkManageUsersPermission("Cannot get seed account information");
   3294         synchronized (mUsersLock) {
   3295             UserData userData = getUserDataLU(UserHandle.getCallingUserId());
   3296             return userData.seedAccountOptions;
   3297         }
   3298     }
   3299 
   3300     @Override
   3301     public void clearSeedAccountData() throws RemoteException {
   3302         checkManageUsersPermission("Cannot clear seed account information");
   3303         synchronized (mPackagesLock) {
   3304             UserData userData;
   3305             synchronized (mUsersLock) {
   3306                 userData = getUserDataLU(UserHandle.getCallingUserId());
   3307                 if (userData == null) return;
   3308                 userData.clearSeedAccountData();
   3309             }
   3310             writeUserLP(userData);
   3311         }
   3312     }
   3313 
   3314     @Override
   3315     public boolean someUserHasSeedAccount(String accountName, String accountType)
   3316             throws RemoteException {
   3317         checkManageUsersPermission("Cannot check seed account information");
   3318         synchronized (mUsersLock) {
   3319             final int userSize = mUsers.size();
   3320             for (int i = 0; i < userSize; i++) {
   3321                 final UserData data = mUsers.valueAt(i);
   3322                 if (data.info.isInitialized()) continue;
   3323                 if (data.seedAccountName == null || !data.seedAccountName.equals(accountName)) {
   3324                     continue;
   3325                 }
   3326                 if (data.seedAccountType == null || !data.seedAccountType.equals(accountType)) {
   3327                     continue;
   3328                 }
   3329                 return true;
   3330             }
   3331         }
   3332         return false;
   3333     }
   3334 
   3335     @Override
   3336     public void onShellCommand(FileDescriptor in, FileDescriptor out,
   3337             FileDescriptor err, String[] args, ShellCallback callback,
   3338             ResultReceiver resultReceiver) {
   3339         (new Shell()).exec(this, in, out, err, args, callback, resultReceiver);
   3340     }
   3341 
   3342     int onShellCommand(Shell shell, String cmd) {
   3343         if (cmd == null) {
   3344             return shell.handleDefaultCommands(cmd);
   3345         }
   3346 
   3347         final PrintWriter pw = shell.getOutPrintWriter();
   3348         try {
   3349             switch(cmd) {
   3350                 case "list":
   3351                     return runList(pw);
   3352             }
   3353         } catch (RemoteException e) {
   3354             pw.println("Remote exception: " + e);
   3355         }
   3356         return -1;
   3357     }
   3358 
   3359     private int runList(PrintWriter pw) throws RemoteException {
   3360         final IActivityManager am = ActivityManager.getService();
   3361         final List<UserInfo> users = getUsers(false);
   3362         if (users == null) {
   3363             pw.println("Error: couldn't get users");
   3364             return 1;
   3365         } else {
   3366             pw.println("Users:");
   3367             for (int i = 0; i < users.size(); i++) {
   3368                 String running = am.isUserRunning(users.get(i).id, 0) ? " running" : "";
   3369                 pw.println("\t" + users.get(i).toString() + running);
   3370             }
   3371             return 0;
   3372         }
   3373     }
   3374 
   3375     @Override
   3376     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
   3377         if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return;
   3378 
   3379         long now = System.currentTimeMillis();
   3380         StringBuilder sb = new StringBuilder();
   3381         synchronized (mPackagesLock) {
   3382             synchronized (mUsersLock) {
   3383                 pw.println("Users:");
   3384                 for (int i = 0; i < mUsers.size(); i++) {
   3385                     UserData userData = mUsers.valueAt(i);
   3386                     if (userData == null) {
   3387                         continue;
   3388                     }
   3389                     UserInfo userInfo = userData.info;
   3390                     final int userId = userInfo.id;
   3391                     pw.print("  "); pw.print(userInfo);
   3392                     pw.print(" serialNo="); pw.print(userInfo.serialNumber);
   3393                     if (mRemovingUserIds.get(userId)) {
   3394                         pw.print(" <removing> ");
   3395                     }
   3396                     if (userInfo.partial) {
   3397                         pw.print(" <partial>");
   3398                     }
   3399                     pw.println();
   3400                     pw.print("    State: ");
   3401                     final int state;
   3402                     synchronized (mUserStates) {
   3403                         state = mUserStates.get(userId, -1);
   3404                     }
   3405                     pw.println(UserState.stateToString(state));
   3406                     pw.print("    Created: ");
   3407                     if (userInfo.creationTime == 0) {
   3408                         pw.println("<unknown>");
   3409                     } else {
   3410                         sb.setLength(0);
   3411                         TimeUtils.formatDuration(now - userInfo.creationTime, sb);
   3412                         sb.append(" ago");
   3413                         pw.println(sb);
   3414                     }
   3415                     pw.print("    Last logged in: ");
   3416                     if (userInfo.lastLoggedInTime == 0) {
   3417                         pw.println("<unknown>");
   3418                     } else {
   3419                         sb.setLength(0);
   3420                         TimeUtils.formatDuration(now - userInfo.lastLoggedInTime, sb);
   3421                         sb.append(" ago");
   3422                         pw.println(sb);
   3423                     }
   3424                     pw.print("    Last logged in fingerprint: ");
   3425                     pw.println(userInfo.lastLoggedInFingerprint);
   3426                     pw.print("    Has profile owner: ");
   3427                     pw.println(mIsUserManaged.get(userId));
   3428                     pw.println("    Restrictions:");
   3429                     synchronized (mRestrictionsLock) {
   3430                         UserRestrictionsUtils.dumpRestrictions(
   3431                                 pw, "      ", mBaseUserRestrictions.get(userInfo.id));
   3432                         pw.println("    Device policy global restrictions:");
   3433                         UserRestrictionsUtils.dumpRestrictions(
   3434                                 pw, "      ", mDevicePolicyGlobalUserRestrictions.get(userInfo.id));
   3435                         pw.println("    Device policy local restrictions:");
   3436                         UserRestrictionsUtils.dumpRestrictions(
   3437                                 pw, "      ", mDevicePolicyLocalUserRestrictions.get(userInfo.id));
   3438                         pw.println("    Effective restrictions:");
   3439                         UserRestrictionsUtils.dumpRestrictions(
   3440                                 pw, "      ", mCachedEffectiveUserRestrictions.get(userInfo.id));
   3441                     }
   3442 
   3443                     if (userData.account != null) {
   3444                         pw.print("    Account name: " + userData.account);
   3445                         pw.println();
   3446                     }
   3447 
   3448                     if (userData.seedAccountName != null) {
   3449                         pw.print("    Seed account name: " + userData.seedAccountName);
   3450                         pw.println();
   3451                         if (userData.seedAccountType != null) {
   3452                             pw.print("         account type: " + userData.seedAccountType);
   3453                             pw.println();
   3454                         }
   3455                         if (userData.seedAccountOptions != null) {
   3456                             pw.print("         account options exist");
   3457                             pw.println();
   3458                         }
   3459                     }
   3460                 }
   3461             }
   3462             pw.println();
   3463             pw.println("  Device owner id:" + mDeviceOwnerUserId);
   3464             pw.println();
   3465             pw.println("  Guest restrictions:");
   3466             synchronized (mGuestRestrictions) {
   3467                 UserRestrictionsUtils.dumpRestrictions(pw, "    ", mGuestRestrictions);
   3468             }
   3469             synchronized (mUsersLock) {
   3470                 pw.println();
   3471                 pw.println("  Device managed: " + mIsDeviceManaged);
   3472                 if (mRemovingUserIds.size() > 0) {
   3473                     pw.println();
   3474                     pw.println("  Recently removed userIds: " + mRecentlyRemovedIds);
   3475                 }
   3476             }
   3477             synchronized (mUserStates) {
   3478                 pw.println("  Started users state: " + mUserStates);
   3479             }
   3480             // Dump some capabilities
   3481             pw.println();
   3482             pw.println("  Max users: " + UserManager.getMaxSupportedUsers());
   3483             pw.println("  Supports switchable users: " + UserManager.supportsMultipleUsers());
   3484             pw.println("  All guests ephemeral: " + Resources.getSystem().getBoolean(
   3485                     com.android.internal.R.bool.config_guestUserEphemeral));
   3486         }
   3487     }
   3488 
   3489     final class MainHandler extends Handler {
   3490 
   3491         @Override
   3492         public void handleMessage(Message msg) {
   3493             switch (msg.what) {
   3494                 case WRITE_USER_MSG:
   3495                     removeMessages(WRITE_USER_MSG, msg.obj);
   3496                     synchronized (mPackagesLock) {
   3497                         int userId = ((UserData) msg.obj).info.id;
   3498                         UserData userData = getUserDataNoChecks(userId);
   3499                         if (userData != null) {
   3500                             writeUserLP(userData);
   3501                         }
   3502                     }
   3503             }
   3504         }
   3505     }
   3506 
   3507     /**
   3508      * @param userId
   3509      * @return whether the user has been initialized yet
   3510      */
   3511     boolean isInitialized(int userId) {
   3512         return (getUserInfo(userId).flags & UserInfo.FLAG_INITIALIZED) != 0;
   3513     }
   3514 
   3515     private class LocalService extends UserManagerInternal {
   3516         @Override
   3517         public void setDevicePolicyUserRestrictions(int userId, @Nullable Bundle restrictions,
   3518                 boolean isDeviceOwner, int cameraRestrictionScope) {
   3519             UserManagerService.this.setDevicePolicyUserRestrictionsInner(userId, restrictions,
   3520                 isDeviceOwner, cameraRestrictionScope);
   3521         }
   3522 
   3523         @Override
   3524         public Bundle getBaseUserRestrictions(int userId) {
   3525             synchronized (mRestrictionsLock) {
   3526                 return mBaseUserRestrictions.get(userId);
   3527             }
   3528         }
   3529 
   3530         @Override
   3531         public void setBaseUserRestrictionsByDpmsForMigration(
   3532                 int userId, Bundle baseRestrictions) {
   3533             synchronized (mRestrictionsLock) {
   3534                 if (updateRestrictionsIfNeededLR(
   3535                         userId, new Bundle(baseRestrictions), mBaseUserRestrictions)) {
   3536                     invalidateEffectiveUserRestrictionsLR(userId);
   3537                 }
   3538             }
   3539 
   3540             final UserData userData = getUserDataNoChecks(userId);
   3541             synchronized (mPackagesLock) {
   3542                 if (userData != null) {
   3543                     writeUserLP(userData);
   3544                 } else {
   3545                     Slog.w(LOG_TAG, "UserInfo not found for " + userId);
   3546                 }
   3547             }
   3548         }
   3549 
   3550         @Override
   3551         public boolean getUserRestriction(int userId, String key) {
   3552             return getUserRestrictions(userId).getBoolean(key);
   3553         }
   3554 
   3555         @Override
   3556         public void addUserRestrictionsListener(UserRestrictionsListener listener) {
   3557             synchronized (mUserRestrictionsListeners) {
   3558                 mUserRestrictionsListeners.add(listener);
   3559             }
   3560         }
   3561 
   3562         @Override
   3563         public void removeUserRestrictionsListener(UserRestrictionsListener listener) {
   3564             synchronized (mUserRestrictionsListeners) {
   3565                 mUserRestrictionsListeners.remove(listener);
   3566             }
   3567         }
   3568 
   3569         @Override
   3570         public void setDeviceManaged(boolean isManaged) {
   3571             synchronized (mUsersLock) {
   3572                 mIsDeviceManaged = isManaged;
   3573             }
   3574         }
   3575 
   3576         @Override
   3577         public void setUserManaged(int userId, boolean isManaged) {
   3578             synchronized (mUsersLock) {
   3579                 mIsUserManaged.put(userId, isManaged);
   3580             }
   3581         }
   3582 
   3583         @Override
   3584         public void setUserIcon(int userId, Bitmap bitmap) {
   3585             long ident = Binder.clearCallingIdentity();
   3586             try {
   3587                 synchronized (mPackagesLock) {
   3588                     UserData userData = getUserDataNoChecks(userId);
   3589                     if (userData == null || userData.info.partial) {
   3590                         Slog.w(LOG_TAG, "setUserIcon: unknown user #" + userId);
   3591                         return;
   3592                     }
   3593                     writeBitmapLP(userData.info, bitmap);
   3594                     writeUserLP(userData);
   3595                 }
   3596                 sendUserInfoChangedBroadcast(userId);
   3597             } finally {
   3598                 Binder.restoreCallingIdentity(ident);
   3599             }
   3600         }
   3601 
   3602         @Override
   3603         public void setForceEphemeralUsers(boolean forceEphemeralUsers) {
   3604             synchronized (mUsersLock) {
   3605                 mForceEphemeralUsers = forceEphemeralUsers;
   3606             }
   3607         }
   3608 
   3609         @Override
   3610         public void removeAllUsers() {
   3611             if (UserHandle.USER_SYSTEM == ActivityManager.getCurrentUser()) {
   3612                 // Remove the non-system users straight away.
   3613                 removeNonSystemUsers();
   3614             } else {
   3615                 // Switch to the system user first and then remove the other users.
   3616                 BroadcastReceiver userSwitchedReceiver = new BroadcastReceiver() {
   3617                     @Override
   3618                     public void onReceive(Context context, Intent intent) {
   3619                         int userId =
   3620                                 intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
   3621                         if (userId != UserHandle.USER_SYSTEM) {
   3622                             return;
   3623                         }
   3624                         mContext.unregisterReceiver(this);
   3625                         removeNonSystemUsers();
   3626                     }
   3627                 };
   3628                 IntentFilter userSwitchedFilter = new IntentFilter();
   3629                 userSwitchedFilter.addAction(Intent.ACTION_USER_SWITCHED);
   3630                 mContext.registerReceiver(
   3631                         userSwitchedReceiver, userSwitchedFilter, null, mHandler);
   3632 
   3633                 // Switch to the system user.
   3634                 ActivityManager am =
   3635                         (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
   3636                 am.switchUser(UserHandle.USER_SYSTEM);
   3637             }
   3638         }
   3639 
   3640         @Override
   3641         public void onEphemeralUserStop(int userId) {
   3642             synchronized (mUsersLock) {
   3643                UserInfo userInfo = getUserInfoLU(userId);
   3644                if (userInfo != null && userInfo.isEphemeral()) {
   3645                     // Do not allow switching back to the ephemeral user again as the user is going
   3646                     // to be deleted.
   3647                     userInfo.flags |= UserInfo.FLAG_DISABLED;
   3648                     if (userInfo.isGuest()) {
   3649                         // Indicate that the guest will be deleted after it stops.
   3650                         userInfo.guestToRemove = true;
   3651                     }
   3652                }
   3653             }
   3654         }
   3655 
   3656         @Override
   3657         public UserInfo createUserEvenWhenDisallowed(String name, int flags) {
   3658             UserInfo user = createUserInternalUnchecked(name, flags, UserHandle.USER_NULL, null);
   3659             // Keep this in sync with UserManager.createUser
   3660             if (user != null && !user.isAdmin() && !user.isDemo()) {
   3661                 setUserRestriction(UserManager.DISALLOW_SMS, true, user.id);
   3662                 setUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS, true, user.id);
   3663             }
   3664             return user;
   3665         }
   3666 
   3667         @Override
   3668         public boolean removeUserEvenWhenDisallowed(int userId) {
   3669             return removeUserUnchecked(userId);
   3670         }
   3671 
   3672         @Override
   3673         public boolean isUserRunning(int userId) {
   3674             synchronized (mUserStates) {
   3675                 return mUserStates.get(userId, -1) >= 0;
   3676             }
   3677         }
   3678 
   3679         @Override
   3680         public void setUserState(int userId, int userState) {
   3681             synchronized (mUserStates) {
   3682                 mUserStates.put(userId, userState);
   3683             }
   3684         }
   3685 
   3686         @Override
   3687         public void removeUserState(int userId) {
   3688             synchronized (mUserStates) {
   3689                 mUserStates.delete(userId);
   3690             }
   3691         }
   3692 
   3693         @Override
   3694         public int[] getUserIds() {
   3695             return UserManagerService.this.getUserIds();
   3696         }
   3697 
   3698         @Override
   3699         public boolean isUserUnlockingOrUnlocked(int userId) {
   3700             int state;
   3701             synchronized (mUserStates) {
   3702                 state = mUserStates.get(userId, -1);
   3703             }
   3704             // Special case, in the stopping/shutdown state user key can still be unlocked
   3705             if (state == UserState.STATE_STOPPING || state == UserState.STATE_SHUTDOWN) {
   3706                 return StorageManager.isUserKeyUnlocked(userId);
   3707             }
   3708             return (state == UserState.STATE_RUNNING_UNLOCKING)
   3709                     || (state == UserState.STATE_RUNNING_UNLOCKED);
   3710         }
   3711 
   3712         @Override
   3713         public boolean isUserUnlocked(int userId) {
   3714             int state;
   3715             synchronized (mUserStates) {
   3716                 state = mUserStates.get(userId, -1);
   3717             }
   3718             // Special case, in the stopping/shutdown state user key can still be unlocked
   3719             if (state == UserState.STATE_STOPPING || state == UserState.STATE_SHUTDOWN) {
   3720                 return StorageManager.isUserKeyUnlocked(userId);
   3721             }
   3722             return state == UserState.STATE_RUNNING_UNLOCKED;
   3723         }
   3724     }
   3725 
   3726     /* Remove all the users except of the system one. */
   3727     private void removeNonSystemUsers() {
   3728         ArrayList<UserInfo> usersToRemove = new ArrayList<>();
   3729         synchronized (mUsersLock) {
   3730             final int userSize = mUsers.size();
   3731             for (int i = 0; i < userSize; i++) {
   3732                 UserInfo ui = mUsers.valueAt(i).info;
   3733                 if (ui.id != UserHandle.USER_SYSTEM) {
   3734                     usersToRemove.add(ui);
   3735                 }
   3736             }
   3737         }
   3738         for (UserInfo ui: usersToRemove) {
   3739             removeUser(ui.id);
   3740         }
   3741     }
   3742 
   3743     private class Shell extends ShellCommand {
   3744         @Override
   3745         public int onCommand(String cmd) {
   3746             return onShellCommand(this, cmd);
   3747         }
   3748 
   3749         @Override
   3750         public void onHelp() {
   3751             final PrintWriter pw = getOutPrintWriter();
   3752             pw.println("User manager (user) commands:");
   3753             pw.println("  help");
   3754             pw.println("    Print this help text.");
   3755             pw.println("");
   3756             pw.println("  list");
   3757             pw.println("    Prints all users on the system.");
   3758         }
   3759     }
   3760 
   3761     private static void debug(String message) {
   3762         Log.d(LOG_TAG, message +
   3763                 (DBG_WITH_STACKTRACE ? " called at\n" + Debug.getCallers(10, "  ") : ""));
   3764     }
   3765 
   3766     @VisibleForTesting
   3767     static int getMaxManagedProfiles() {
   3768         // Allow overriding max managed profiles on debuggable builds for testing
   3769         // of multiple profiles.
   3770         if (!Build.IS_DEBUGGABLE) {
   3771             return MAX_MANAGED_PROFILES;
   3772         } else {
   3773             return SystemProperties.getInt("persist.sys.max_profiles",
   3774                     MAX_MANAGED_PROFILES);
   3775         }
   3776     }
   3777 
   3778     @VisibleForTesting
   3779     int getFreeProfileBadgeLU(int parentUserId) {
   3780         int maxManagedProfiles = getMaxManagedProfiles();
   3781         boolean[] usedBadges = new boolean[maxManagedProfiles];
   3782         final int userSize = mUsers.size();
   3783         for (int i = 0; i < userSize; i++) {
   3784             UserInfo ui = mUsers.valueAt(i).info;
   3785             // Check which badge indexes are already used by this profile group.
   3786             if (ui.isManagedProfile()
   3787                     && ui.profileGroupId == parentUserId
   3788                     && !mRemovingUserIds.get(ui.id)
   3789                     && ui.profileBadge < maxManagedProfiles) {
   3790                 usedBadges[ui.profileBadge] = true;
   3791             }
   3792         }
   3793         for (int i = 0; i < maxManagedProfiles; i++) {
   3794             if (!usedBadges[i]) {
   3795                 return i;
   3796             }
   3797         }
   3798         return 0;
   3799     }
   3800 
   3801     /**
   3802      * Checks if the given user has a managed profile associated with it.
   3803      * @param userId The parent user
   3804      * @return
   3805      */
   3806     boolean hasManagedProfile(int userId) {
   3807         synchronized (mUsersLock) {
   3808             UserInfo userInfo = getUserInfoLU(userId);
   3809             final int userSize = mUsers.size();
   3810             for (int i = 0; i < userSize; i++) {
   3811                 UserInfo profile = mUsers.valueAt(i).info;
   3812                 if (userId != profile.id && isProfileOf(userInfo, profile)) {
   3813                     return true;
   3814                 }
   3815             }
   3816             return false;
   3817         }
   3818     }
   3819 }
   3820