diff options
| author | 2016-06-16 00:24:14 +0000 | |
|---|---|---|
| committer | 2016-06-16 00:24:14 +0000 | |
| commit | c5ffdb9ee48905bacab0d5986d3eff2b399acd5e (patch) | |
| tree | 9b6c1462165857eea893ec30dc75c05447b8b667 | |
| parent | 337c7143644fd6980ef234191e01274804e0e7bb (diff) | |
| parent | 4f2b1b455e0f256ef9cb345d844ac89b6c3fd20c (diff) | |
Merge \"More thorough cleansing of expired users\" into nyc-dev
am: 4f2b1b455e
Change-Id: I5714f73a9b90c0cb8fee653abf799374acfc6232
10 files changed, 108 insertions, 31 deletions
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 8b3eac5e6c07..ca798f63d1b2 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3644,6 +3644,12 @@ public abstract class Context { public static final String SYSTEM_HEALTH_SERVICE = "systemhealth"; /** + * Gatekeeper Service. + * @hide + */ + public static final String GATEKEEPER_SERVICE = "android.service.gatekeeper.IGateKeeperService"; + + /** * Determine whether the given permission is allowed for a particular * process and user ID running in the system. * diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 6af067821808..80927f368e0c 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -240,6 +240,22 @@ public class Environment { return new File(getDataDirectory(), "system"); } + /** + * Returns the base directory for per-user system directory, device encrypted. + * {@hide} + */ + public static File getDataSystemDeDirectory() { + return buildPath(getDataDirectory(), "system_de"); + } + + /** + * Returns the base directory for per-user system directory, credential encrypted. + * {@hide} + */ + public static File getDataSystemCeDirectory() { + return buildPath(getDataDirectory(), "system_ce"); + } + /** {@hide} */ public static File getDataSystemCeDirectory(int userId) { return buildPath(getDataDirectory(), "system_ce", String.valueOf(userId)); diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 9b0ef8e1fde4..d74220676ca2 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -1508,7 +1508,9 @@ public class UserManager { } /** - * Returns information for all users on this device. + * Returns information for all users on this device, including ones marked for deletion. + * To retrieve only users that are alive, use {@link #getUsers(boolean)}. + * <p> * Requires {@link android.Manifest.permission#MANAGE_USERS} permission. * @return the list of users that exist on the device. * @hide diff --git a/keystore/java/android/security/GateKeeper.java b/keystore/java/android/security/GateKeeper.java index c1df28c387e5..7a2cbd06eb92 100644 --- a/keystore/java/android/security/GateKeeper.java +++ b/keystore/java/android/security/GateKeeper.java @@ -16,6 +16,7 @@ package android.security; +import android.content.Context; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; @@ -32,7 +33,7 @@ public abstract class GateKeeper { public static IGateKeeperService getService() { IGateKeeperService service = IGateKeeperService.Stub.asInterface( - ServiceManager.getService("android.service.gatekeeper.IGateKeeperService")); + ServiceManager.getService(Context.GATEKEEPER_SERVICE)); if (service == null) { throw new IllegalStateException("Gatekeeper service not available"); } diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index eeb20bf03d12..1e715f93d041 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -1588,7 +1588,7 @@ public class LockSettingsService extends ILockSettings.Stub { } final IBinder service = - ServiceManager.getService("android.service.gatekeeper.IGateKeeperService"); + ServiceManager.getService(Context.GATEKEEPER_SERVICE); if (service != null) { service.linkToDeath(new GateKeeperDiedRecipient(), 0); mGateKeeperService = IGateKeeperService.Stub.asInterface(service); diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index 408454286aee..0cf517274f30 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -3425,7 +3425,7 @@ public class AccountManagerService /** {@hide} */ @NonNull public AccountAndUser[] getAllAccounts() { - final List<UserInfo> users = getUserManager().getUsers(); + final List<UserInfo> users = getUserManager().getUsers(true); final int[] userIds = new int[users.size()]; for (int i = 0; i < userIds.length; i++) { userIds[i] = users.get(i).id; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 25627079f36e..e3210499b981 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -19359,10 +19359,18 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); if ((flags & StorageManager.FLAG_STORAGE_DE) != 0 && !mOnlyCore) { UserManagerService.enforceSerialNumber( Environment.getDataUserDeDirectory(volumeUuid, userId), userSerial); + if (Objects.equals(volumeUuid, StorageManager.UUID_PRIVATE_INTERNAL)) { + UserManagerService.enforceSerialNumber( + Environment.getDataSystemDeDirectory(userId), userSerial); + } } if ((flags & StorageManager.FLAG_STORAGE_CE) != 0 && !mOnlyCore) { UserManagerService.enforceSerialNumber( Environment.getDataUserCeDirectory(volumeUuid, userId), userSerial); + if (Objects.equals(volumeUuid, StorageManager.UUID_PRIVATE_INTERNAL)) { + UserManagerService.enforceSerialNumber( + Environment.getDataSystemCeDirectory(userId), userSerial); + } } synchronized (mInstallLock) { @@ -19431,6 +19439,10 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); .listFilesOrEmpty(Environment.getDataUserDeDirectory(volumeUuid))); Collections.addAll(files, FileUtils .listFilesOrEmpty(Environment.getDataUserCeDirectory(volumeUuid))); + Collections.addAll(files, FileUtils + .listFilesOrEmpty(Environment.getDataSystemDeDirectory())); + Collections.addAll(files, FileUtils + .listFilesOrEmpty(Environment.getDataSystemCeDirectory())); for (File file : files) { if (!file.isDirectory()) continue; diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index c2c569edc4ee..0bf0cac95975 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -67,6 +67,8 @@ import android.os.UserManager; import android.os.UserManagerInternal; import android.os.UserManagerInternal.UserRestrictionsListener; import android.os.storage.StorageManager; +import android.security.GateKeeper; +import android.service.gatekeeper.IGateKeeperService; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; @@ -90,6 +92,7 @@ import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.internal.widget.LockPatternUtils; import com.android.server.LocalServices; +import com.android.server.SystemService; import com.android.server.am.UserState; import libcore.io.IoUtils; @@ -122,6 +125,7 @@ import java.util.List; * </ul> */ public class UserManagerService extends IUserManager.Stub { + private static final String LOG_TAG = "UserManagerService"; static final boolean DBG = false; // DO NOT SUBMIT WITH TRUE private static final boolean DBG_WITH_STACKTRACE = false; // DO NOT SUBMIT WITH TRUE @@ -370,6 +374,31 @@ public class UserManagerService extends IUserManager.Stub { } } + public static class LifeCycle extends SystemService { + + private UserManagerService mUms; + + /** + * @param context + */ + public LifeCycle(Context context) { + super(context); + } + + @Override + public void onStart() { + mUms = UserManagerService.getInstance(); + publishBinderService(Context.USER_SERVICE, mUms); + } + + @Override + public void onBootPhase(int phase) { + if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) { + mUms.cleanupPartialUsers(); + } + } + } + @VisibleForTesting UserManagerService(File dataDir) { this(null, null, new Object(), dataDir); @@ -411,25 +440,6 @@ public class UserManagerService extends IUserManager.Stub { } void systemReady() { - // Prune out any partially created, partially removed and ephemeral users. - ArrayList<UserInfo> partials = new ArrayList<>(); - synchronized (mUsersLock) { - final int userSize = mUsers.size(); - for (int i = 0; i < userSize; i++) { - UserInfo ui = mUsers.valueAt(i).info; - if ((ui.partial || ui.guestToRemove || ui.isEphemeral()) && i != 0) { - partials.add(ui); - } - } - } - final int partialsSize = partials.size(); - for (int i = 0; i < partialsSize; i++) { - UserInfo ui = partials.get(i); - Slog.w(LOG_TAG, "Removing partially created user " + ui.id - + " (name=" + ui.name + ")"); - removeUserState(ui.id); - } - mAppOpsService = IAppOpsService.Stub.asInterface( ServiceManager.getService(Context.APP_OPS_SERVICE)); @@ -452,6 +462,27 @@ public class UserManagerService extends IUserManager.Stub { null, mHandler); } + void cleanupPartialUsers() { + // Prune out any partially created, partially removed and ephemeral users. + ArrayList<UserInfo> partials = new ArrayList<>(); + synchronized (mUsersLock) { + final int userSize = mUsers.size(); + for (int i = 0; i < userSize; i++) { + UserInfo ui = mUsers.valueAt(i).info; + if ((ui.partial || ui.guestToRemove || ui.isEphemeral()) && i != 0) { + partials.add(ui); + } + } + } + final int partialsSize = partials.size(); + for (int i = 0; i < partialsSize; i++) { + UserInfo ui = partials.get(i); + Slog.w(LOG_TAG, "Removing partially created user " + ui.id + + " (name=" + ui.name + ")"); + removeUserState(ui.id); + } + } + @Override public String getUserAccount(int userId) { checkManageUserAndAcrossUsersFullPermission("get user account"); @@ -2479,8 +2510,23 @@ public class UserManagerService extends IUserManager.Stub { "Destroying key for user " + userHandle + " failed, continuing anyway", e); } + // Cleanup gatekeeper secure user id + try { + final IGateKeeperService gk = GateKeeper.getService(); + if (gk != null) { + gk.clearSecureUserId(userHandle); + } + } catch (Exception ex) { + Slog.w(LOG_TAG, "unable to clear GK secure user id"); + } + // Cleanup package manager settings mPm.cleanUpUser(this, userHandle); + + // Clean up all data before removing metadata + mPm.destroyUserData(userHandle, + StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); + // Remove this user from the list synchronized (mUsersLock) { mUsers.remove(userHandle); @@ -2503,12 +2549,6 @@ public class UserManagerService extends IUserManager.Stub { AtomicFile userFile = new AtomicFile(new File(mUsersDir, userHandle + XML_SUFFIX)); userFile.delete(); updateUserIds(); - - // Now that we've purged all the metadata above, destroy the actual data - // on disk; if we battery pull in here we'll finish cleaning up when - // reconciling after reboot. - mPm.destroyUserData(userHandle, - StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); } private void sendProfileRemovedBroadcast(int parentUserId, int removedUserId) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java index 1ae1a773b23e..b53933e07f2b 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java @@ -120,7 +120,7 @@ class Owners { // First, try to read from the legacy file. final File legacy = getLegacyConfigFileWithTestOverride(); - final List<UserInfo> users = mUserManager.getUsers(); + final List<UserInfo> users = mUserManager.getUsers(true); if (readLegacyOwnerFileLocked(legacy)) { if (DEBUG) { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index b21f5fb4b70f..8f8ba1d19273 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -475,7 +475,7 @@ public final class SystemServer { } traceBeginAndSlog("StartUserManagerService"); - ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance()); + mSystemServiceManager.startService(UserManagerService.LifeCycle.class); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); // Initialize attribute cache used to cache resources from packages. |