• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
clearSeedAccountData()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 
getInstance()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          */
LifeCycle(Context context)420         public LifeCycle(Context context) {
421             super(context);
422         }
423 
424         @Override
onStart()425         public void onStart() {
426             mUms = UserManagerService.getInstance();
427             publishBinderService(Context.USER_SERVICE, mUms);
428         }
429 
430         @Override
onBootPhase(int phase)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
UserManagerService(Context context)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      */
UserManagerService(Context context, PackageManagerService pm, UserDataPreparer userDataPreparer, Object packagesLock)449     UserManagerService(Context context, PackageManagerService pm, UserDataPreparer userDataPreparer,
450             Object packagesLock) {
451         this(context, pm, userDataPreparer, packagesLock, Environment.getDataDirectory());
452     }
453 
UserManagerService(Context context, PackageManagerService pm, UserDataPreparer userDataPreparer, Object packagesLock, File dataDir)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 
systemReady()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 
cleanupPartialUsers()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
getUserAccount(int userId)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
setUserAccount(int userId, String accountName)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
getPrimaryUser()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
getUsers(boolean excludeDying)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
getProfiles(int userId, boolean enabledOnly)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
getProfileIds(int userId, boolean enabledOnly)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 */
getProfilesLU(int userId, boolean enabledOnly, boolean fullInfo)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      */
getProfileIdsLU(int userId, boolean enabledOnly)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
getCredentialOwnerProfile(int userHandle)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
isSameProfileGroup(int userId, int otherUserId)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 
isSameProfileGroupNoChecks(int userId, int otherUserId)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
getProfileParent(int userHandle)713     public UserInfo getProfileParent(int userHandle) {
714         checkManageUsersPermission("get the profile parent");
715         synchronized (mUsersLock) {
716             return getProfileParentLU(userHandle);
717         }
718     }
719 
getProfileParentLU(int userHandle)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 
isProfileOf(UserInfo user, UserInfo profile)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 
broadcastProfileAvailabilityChanges(UserHandle profileHandle, UserHandle parentHandle, boolean inQuietMode)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
setQuietModeEnabled(int userHandle, boolean enableQuietMode)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
isQuietModeEnabled(int userHandle)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
trySetQuietModeDisabled(int userHandle, IntentSender target)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
setUserEnabled(int userId)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
evictCredentialEncryptionKey(@serIdInt int userId)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
getUserInfo(int userId)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      */
userWithName(UserInfo orig)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
getManagedProfileBadge(@serIdInt int userId)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
isManagedProfile(int userId)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
isUserUnlockingOrUnlocked(int userId)947     public boolean isUserUnlockingOrUnlocked(int userId) {
948         checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserUnlockingOrUnlocked");
949         return mLocalService.isUserUnlockingOrUnlocked(userId);
950     }
951 
952     @Override
isUserUnlocked(int userId)953     public boolean isUserUnlocked(int userId) {
954         checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserUnlocked");
955         return mLocalService.isUserUnlocked(userId);
956     }
957 
958     @Override
isUserRunning(int userId)959     public boolean isUserRunning(int userId) {
960         checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserRunning");
961         return mLocalService.isUserRunning(userId);
962     }
963 
checkManageOrInteractPermIfCallerInOtherProfileGroup(int userId, String name)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
isDemoUser(int userId)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
isRestricted()991     public boolean isRestricted() {
992         synchronized (mUsersLock) {
993             return getUserInfoLU(UserHandle.getCallingUserId()).isRestricted();
994         }
995     }
996 
997     @Override
canHaveRestrictedProfile(int userId)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      */
getUserInfoLU(int userId)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 
getUserDataLU(int userId)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      */
getUserInfoNoChecks(int userId)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      */
getUserDataNoChecks(int userId)1050     private UserData getUserDataNoChecks(int userId) {
1051         synchronized (mUsersLock) {
1052             return mUsers.get(userId);
1053         }
1054     }
1055 
1056     /** Called by PackageManagerService */
exists(int userId)1057     public boolean exists(int userId) {
1058         return getUserInfoNoChecks(userId) != null;
1059     }
1060 
1061     @Override
setUserName(int userId, String name)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
setUserIcon(int userId, Bitmap bitmap)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 
sendUserInfoChangedBroadcast(int userId)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
getUserIcon(int targetUserId)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 
makeInitialized(int userId)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      */
initDefaultGuestRestrictions()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
getDefaultGuestRestrictions()1171     public Bundle getDefaultGuestRestrictions() {
1172         checkManageUsersPermission("getDefaultGuestRestrictions");
1173         synchronized (mGuestRestrictions) {
1174             return new Bundle(mGuestRestrictions);
1175         }
1176     }
1177 
1178     @Override
setDefaultGuestRestrictions(Bundle restrictions)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      */
setDevicePolicyUserRestrictionsInner(int userId, @Nullable Bundle restrictions, boolean isDeviceOwner, int cameraRestrictionScope)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      */
updateRestrictionsIfNeededLR(int userId, @Nullable Bundle restrictions, SparseArray<Bundle> restrictionsArray)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")
computeEffectiveUserRestrictionsLR(int userId)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")
invalidateEffectiveUserRestrictionsLR(int userId)1284     private void invalidateEffectiveUserRestrictionsLR(int userId) {
1285         if (DBG) {
1286             Log.d(LOG_TAG, "invalidateEffectiveUserRestrictions userId=" + userId);
1287         }
1288         mCachedEffectiveUserRestrictions.remove(userId);
1289     }
1290 
getEffectiveUserRestrictions(int userId)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
hasUserRestriction(String restrictionKey, int userId)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
getUserRestrictionSource(String restrictionKey, int userId)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
getUserRestrictionSources( String restrictionKey, @UserIdInt int userId)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 
getEnforcingUserLocked(@serIdInt int userId)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
getUserRestrictions(int userId)1384     public Bundle getUserRestrictions(int userId) {
1385         return UserRestrictionsUtils.clone(getEffectiveUserRestrictions(userId));
1386     }
1387 
1388     @Override
hasBaseUserRestriction(String restrictionKey, int userId)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
setUserRestriction(String key, boolean value, int userId)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")
updateUserRestrictionsInternalLR( @ullable Bundle newBaseRestrictions, int userId)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 
propagateUserRestrictionsLR(final int userId, Bundle newRestrictions, Bundle prevRestrictions)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.
applyUserRestrictionsLR(int userId)1510     void applyUserRestrictionsLR(int userId) {
1511         updateUserRestrictionsInternalLR(null, userId);
1512     }
1513 
1514     @GuardedBy("mRestrictionsLock")
1515     // Package private for the inner class.
applyUserRestrictionsForAllUsersLR()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      */
isUserLimitReached()1553     private boolean isUserLimitReached() {
1554         int count;
1555         synchronized (mUsersLock) {
1556             count = getAliveUsersExcludingGuestsCountLU();
1557         }
1558         return count >= UserManager.getMaxSupportedUsers();
1559     }
1560 
1561     @Override
canAddMoreManagedProfiles(int userId, boolean allowedToRemoveOne)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 
getAliveUsersExcludingGuestsCountLU()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      */
checkManageUserAndAcrossUsersFullPermission(String message)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      */
checkManageUsersPermission(String message)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      */
checkManageOrCreateUsersPermission(String message)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      */
checkManageOrCreateUsersPermission(int creationFlags)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      */
hasManageUsersPermission()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      */
hasManageOrCreateUsersPermission()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      */
checkSystemOrRoot(String message)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 
writeBitmapLP(UserInfo info, Bitmap bitmap)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      */
getUserIds()1754     public int[] getUserIds() {
1755         synchronized (mUsersLock) {
1756             return mUserIds;
1757         }
1758     }
1759 
readUserListLP()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      */
upgradeIfNecessaryLP(Bundle oldGlobalUserRestrictions)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 
fallbackToSingleUserLP()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 
getOwnerName()1976     private String getOwnerName() {
1977         return mContext.getResources().getString(com.android.internal.R.string.owner_name);
1978     }
1979 
scheduleWriteUser(UserData UserData)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 
writeUserLP(UserData userData)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
writeUserLP(UserData userData, OutputStream os)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      */
writeUserListLP()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 
readUserLP(int id)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
readUserLP(int id, InputStream is)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 
readIntAttribute(XmlPullParser parser, String attr, int defaultValue)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 
readLongAttribute(XmlPullParser parser, String attr, long defaultValue)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      */
cleanAppRestrictionsForPackageLAr(String pkg, int userId)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
createProfileForUser(String name, int flags, int userId, String[] disallowedPackages)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
createProfileForUserEvenWhenDisallowed(String name, int flags, int userId, String[] disallowedPackages)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
removeUserEvenWhenDisallowed(@serIdInt int userHandle)2357     public boolean removeUserEvenWhenDisallowed(@UserIdInt int userHandle) {
2358         checkManageOrCreateUsersPermission("Only the system can remove users");
2359         return removeUserUnchecked(userHandle);
2360     }
2361 
2362     @Override
createUser(String name, int flags)2363     public UserInfo createUser(String name, int flags) {
2364         checkManageOrCreateUsersPermission(flags);
2365         return createUserInternal(name, flags, UserHandle.USER_NULL);
2366     }
2367 
createUserInternal(String name, int flags, int parentId)2368     private UserInfo createUserInternal(String name, int flags, int parentId) {
2369         return createUserInternal(name, flags, parentId, null);
2370     }
2371 
createUserInternal(String name, int flags, int parentId, String[] disallowedPackages)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 
createUserInternalUnchecked(String name, int flags, int parentId, String[] disallowedPackages)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
putUserInfo(UserInfo userInfo)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
removeUserInfo(int userId)2547     void removeUserInfo(int userId) {
2548         synchronized (mUsers) {
2549             mUsers.remove(userId);
2550         }
2551     }
2552 
2553     /**
2554      * @hide
2555      */
2556     @Override
createRestrictedProfile(String name, int parentUserId)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      */
findCurrentGuestUser()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
markGuestForDeletion(int userHandle)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
removeUser(int userHandle)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 
removeUserUnchecked(int userHandle)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
addRemovingUserIdLocked(int userId)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 
finishRemoveUser(final int userHandle)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 
removeUserState(final int userHandle)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 
sendProfileRemovedBroadcast(int parentUserId, int removedUserId)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
getApplicationRestrictions(String packageName)2847     public Bundle getApplicationRestrictions(String packageName) {
2848         return getApplicationRestrictionsForUser(packageName, UserHandle.getCallingUserId());
2849     }
2850 
2851     @Override
getApplicationRestrictionsForUser(String packageName, int userId)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
setApplicationRestrictions(String packageName, Bundle restrictions, int userId)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 
getUidForPackage(String packageName)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")
readApplicationRestrictionsLAr(String packageName, int userId)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")
readApplicationRestrictionsLAr(AtomicFile restrictionsFile)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 
readEntry(Bundle restrictions, ArrayList<String> values, XmlPullParser parser)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 
readBundleEntry(XmlPullParser parser, ArrayList<String> values)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")
writeApplicationRestrictionsLAr(String packageName, Bundle restrictions, int userId)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")
writeApplicationRestrictionsLAr(Bundle restrictions, AtomicFile restrictionsFile)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 
writeBundle(Bundle restrictions, XmlSerializer serializer)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
getUserSerialNumber(int userHandle)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
isUserNameSet(int userHandle)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
getUserHandle(int userSerialNumber)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
getUserCreationTime(int userHandle)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      */
updateUserIds()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      */
onBeforeStartUser(int userId)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      */
onBeforeUnlockUser(@serIdInt int userId)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      */
reconcileUsers(String volumeUuid)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      */
onUserLoggedIn(@serIdInt int userId)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
getNextAvailableId()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 
scanNextAvailableIdLocked()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 
packageToRestrictionsFileName(String packageName)3246     private static String packageToRestrictionsFileName(String packageName) {
3247         return RESTRICTIONS_FILE_PREFIX + packageName + XML_SUFFIX;
3248     }
3249 
3250     @Override
setSeedAccountData(int userId, String accountName, String accountType, PersistableBundle accountOptions, boolean persist)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
getSeedAccountName()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
getSeedAccountType()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
getSeedAccountOptions()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
clearSeedAccountData()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
someUserHasSeedAccount(String accountName, String accountType)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
onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, String[] args, ShellCallback callback, ResultReceiver resultReceiver)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 
onShellCommand(Shell shell, String cmd)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 
runList(PrintWriter pw)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
dump(FileDescriptor fd, PrintWriter pw, String[] args)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
handleMessage(Message msg)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      */
isInitialized(int userId)3511     boolean isInitialized(int userId) {
3512         return (getUserInfo(userId).flags & UserInfo.FLAG_INITIALIZED) != 0;
3513     }
3514 
3515     private class LocalService extends UserManagerInternal {
3516         @Override
setDevicePolicyUserRestrictions(int userId, @Nullable Bundle restrictions, boolean isDeviceOwner, int cameraRestrictionScope)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
getBaseUserRestrictions(int userId)3524         public Bundle getBaseUserRestrictions(int userId) {
3525             synchronized (mRestrictionsLock) {
3526                 return mBaseUserRestrictions.get(userId);
3527             }
3528         }
3529 
3530         @Override
setBaseUserRestrictionsByDpmsForMigration( int userId, Bundle baseRestrictions)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
getUserRestriction(int userId, String key)3551         public boolean getUserRestriction(int userId, String key) {
3552             return getUserRestrictions(userId).getBoolean(key);
3553         }
3554 
3555         @Override
addUserRestrictionsListener(UserRestrictionsListener listener)3556         public void addUserRestrictionsListener(UserRestrictionsListener listener) {
3557             synchronized (mUserRestrictionsListeners) {
3558                 mUserRestrictionsListeners.add(listener);
3559             }
3560         }
3561 
3562         @Override
removeUserRestrictionsListener(UserRestrictionsListener listener)3563         public void removeUserRestrictionsListener(UserRestrictionsListener listener) {
3564             synchronized (mUserRestrictionsListeners) {
3565                 mUserRestrictionsListeners.remove(listener);
3566             }
3567         }
3568 
3569         @Override
setDeviceManaged(boolean isManaged)3570         public void setDeviceManaged(boolean isManaged) {
3571             synchronized (mUsersLock) {
3572                 mIsDeviceManaged = isManaged;
3573             }
3574         }
3575 
3576         @Override
setUserManaged(int userId, boolean isManaged)3577         public void setUserManaged(int userId, boolean isManaged) {
3578             synchronized (mUsersLock) {
3579                 mIsUserManaged.put(userId, isManaged);
3580             }
3581         }
3582 
3583         @Override
setUserIcon(int userId, Bitmap bitmap)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
setForceEphemeralUsers(boolean forceEphemeralUsers)3603         public void setForceEphemeralUsers(boolean forceEphemeralUsers) {
3604             synchronized (mUsersLock) {
3605                 mForceEphemeralUsers = forceEphemeralUsers;
3606             }
3607         }
3608 
3609         @Override
removeAllUsers()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
onEphemeralUserStop(int userId)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
createUserEvenWhenDisallowed(String name, int flags)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
removeUserEvenWhenDisallowed(int userId)3668         public boolean removeUserEvenWhenDisallowed(int userId) {
3669             return removeUserUnchecked(userId);
3670         }
3671 
3672         @Override
isUserRunning(int userId)3673         public boolean isUserRunning(int userId) {
3674             synchronized (mUserStates) {
3675                 return mUserStates.get(userId, -1) >= 0;
3676             }
3677         }
3678 
3679         @Override
setUserState(int userId, int userState)3680         public void setUserState(int userId, int userState) {
3681             synchronized (mUserStates) {
3682                 mUserStates.put(userId, userState);
3683             }
3684         }
3685 
3686         @Override
removeUserState(int userId)3687         public void removeUserState(int userId) {
3688             synchronized (mUserStates) {
3689                 mUserStates.delete(userId);
3690             }
3691         }
3692 
3693         @Override
getUserIds()3694         public int[] getUserIds() {
3695             return UserManagerService.this.getUserIds();
3696         }
3697 
3698         @Override
isUserUnlockingOrUnlocked(int userId)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
isUserUnlocked(int userId)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. */
removeNonSystemUsers()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
onCommand(String cmd)3745         public int onCommand(String cmd) {
3746             return onShellCommand(this, cmd);
3747         }
3748 
3749         @Override
onHelp()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 
debug(String message)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
getMaxManagedProfiles()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
getFreeProfileBadgeLU(int parentUserId)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      */
hasManagedProfile(int userId)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