Loading services/core/java/com/android/server/pm/UserManagerService.java +20 −8 Original line number Diff line number Diff line Loading @@ -284,6 +284,8 @@ public class UserManagerService extends IUserManager.Stub { private static final int USER_VERSION = 11; private static final int MAX_USER_STRING_LENGTH = 500; private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // ms static final int WRITE_USER_MSG = 1; Loading Loading @@ -4256,15 +4258,17 @@ public class UserManagerService extends IUserManager.Stub { // Write seed data if (userData.persistSeedData) { if (userData.seedAccountName != null) { serializer.attribute(null, ATTR_SEED_ACCOUNT_NAME, userData.seedAccountName); serializer.attribute(null, ATTR_SEED_ACCOUNT_NAME, truncateString(userData.seedAccountName)); } if (userData.seedAccountType != null) { serializer.attribute(null, ATTR_SEED_ACCOUNT_TYPE, userData.seedAccountType); serializer.attribute(null, ATTR_SEED_ACCOUNT_TYPE, truncateString(userData.seedAccountType)); } } if (userInfo.name != null) { serializer.startTag(null, TAG_NAME); serializer.text(userInfo.name); serializer.text(truncateString(userInfo.name)); serializer.endTag(null, TAG_NAME); } synchronized (mRestrictionsLock) { Loading Loading @@ -4313,6 +4317,13 @@ public class UserManagerService extends IUserManager.Stub { serializer.endDocument(); } private String truncateString(String original) { if (original == null || original.length() <= MAX_USER_STRING_LENGTH) { return original; } return original.substring(0, MAX_USER_STRING_LENGTH); } /* * Writes the user list file in this format: * Loading Loading @@ -4749,6 +4760,7 @@ public class UserManagerService extends IUserManager.Stub { @NonNull TimingsTraceAndSlog t, @Nullable Object token) throws UserManager.CheckedUserOperationException { String truncatedName = truncateString(name); final UserTypeDetails userTypeDetails = mUserTypes.get(userType); if (userTypeDetails == null) { throwCheckedUserOperationException( Loading Loading @@ -4783,8 +4795,8 @@ public class UserManagerService extends IUserManager.Stub { // Try to use a pre-created user (if available). if (!preCreate && parentId < 0 && isUserTypeEligibleForPreCreation(userTypeDetails)) { final UserInfo preCreatedUser = convertPreCreatedUserIfPossible(userType, flags, name, token); final UserInfo preCreatedUser = convertPreCreatedUserIfPossible(userType, flags, truncatedName, token); if (preCreatedUser != null) { return preCreatedUser; } Loading Loading @@ -4871,7 +4883,7 @@ public class UserManagerService extends IUserManager.Stub { flags |= UserInfo.FLAG_EPHEMERAL_ON_CREATE; } userInfo = new UserInfo(userId, name, null, flags, userType); userInfo = new UserInfo(userId, truncatedName, null, flags, userType); userInfo.serialNumber = mNextSerialNumber++; userInfo.creationTime = getCreationTime(); userInfo.partial = true; Loading Loading @@ -6349,8 +6361,8 @@ public class UserManagerService extends IUserManager.Stub { Slog.e(LOG_TAG, "No such user for settings seed data u=" + userId); return; } userData.seedAccountName = accountName; userData.seedAccountType = accountType; userData.seedAccountName = truncateString(accountName); userData.seedAccountType = truncateString(accountType); userData.seedAccountOptions = accountOptions; userData.persistSeedData = persist; } Loading services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java +21 −0 Original line number Diff line number Diff line Loading @@ -15,9 +15,12 @@ */ package com.android.server.pm; import static android.os.UserManager.USER_TYPE_FULL_SECONDARY; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertThrows; Loading Loading @@ -325,6 +328,24 @@ public final class UserManagerServiceTest { () -> mUmi.getBootUser(/* waitUntilSet= */ false)); } @Test public void testCreateUserWithLongName_TruncatesName() { UserInfo user = mUms.createUserWithThrow(generateLongString(), USER_TYPE_FULL_SECONDARY, 0); assertThat(user.name.length()).isEqualTo(500); UserInfo user1 = mUms.createUserWithThrow("Test", USER_TYPE_FULL_SECONDARY, 0); assertThat(user1.name.length()).isEqualTo(4); } private String generateLongString() { String partialString = "Test Name Test Name Test Name Test Name Test Name Test Name Test " + "Name Test Name Test Name Test Name "; //String of length 100 StringBuilder resultString = new StringBuilder(); for (int i = 0; i < 660; i++) { resultString.append(partialString); } return resultString.toString(); } private void mockCurrentUser(@UserIdInt int userId) { mockGetLocalService(ActivityManagerInternal.class, mActivityManagerInternal); Loading Loading
services/core/java/com/android/server/pm/UserManagerService.java +20 −8 Original line number Diff line number Diff line Loading @@ -284,6 +284,8 @@ public class UserManagerService extends IUserManager.Stub { private static final int USER_VERSION = 11; private static final int MAX_USER_STRING_LENGTH = 500; private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // ms static final int WRITE_USER_MSG = 1; Loading Loading @@ -4256,15 +4258,17 @@ public class UserManagerService extends IUserManager.Stub { // Write seed data if (userData.persistSeedData) { if (userData.seedAccountName != null) { serializer.attribute(null, ATTR_SEED_ACCOUNT_NAME, userData.seedAccountName); serializer.attribute(null, ATTR_SEED_ACCOUNT_NAME, truncateString(userData.seedAccountName)); } if (userData.seedAccountType != null) { serializer.attribute(null, ATTR_SEED_ACCOUNT_TYPE, userData.seedAccountType); serializer.attribute(null, ATTR_SEED_ACCOUNT_TYPE, truncateString(userData.seedAccountType)); } } if (userInfo.name != null) { serializer.startTag(null, TAG_NAME); serializer.text(userInfo.name); serializer.text(truncateString(userInfo.name)); serializer.endTag(null, TAG_NAME); } synchronized (mRestrictionsLock) { Loading Loading @@ -4313,6 +4317,13 @@ public class UserManagerService extends IUserManager.Stub { serializer.endDocument(); } private String truncateString(String original) { if (original == null || original.length() <= MAX_USER_STRING_LENGTH) { return original; } return original.substring(0, MAX_USER_STRING_LENGTH); } /* * Writes the user list file in this format: * Loading Loading @@ -4749,6 +4760,7 @@ public class UserManagerService extends IUserManager.Stub { @NonNull TimingsTraceAndSlog t, @Nullable Object token) throws UserManager.CheckedUserOperationException { String truncatedName = truncateString(name); final UserTypeDetails userTypeDetails = mUserTypes.get(userType); if (userTypeDetails == null) { throwCheckedUserOperationException( Loading Loading @@ -4783,8 +4795,8 @@ public class UserManagerService extends IUserManager.Stub { // Try to use a pre-created user (if available). if (!preCreate && parentId < 0 && isUserTypeEligibleForPreCreation(userTypeDetails)) { final UserInfo preCreatedUser = convertPreCreatedUserIfPossible(userType, flags, name, token); final UserInfo preCreatedUser = convertPreCreatedUserIfPossible(userType, flags, truncatedName, token); if (preCreatedUser != null) { return preCreatedUser; } Loading Loading @@ -4871,7 +4883,7 @@ public class UserManagerService extends IUserManager.Stub { flags |= UserInfo.FLAG_EPHEMERAL_ON_CREATE; } userInfo = new UserInfo(userId, name, null, flags, userType); userInfo = new UserInfo(userId, truncatedName, null, flags, userType); userInfo.serialNumber = mNextSerialNumber++; userInfo.creationTime = getCreationTime(); userInfo.partial = true; Loading Loading @@ -6349,8 +6361,8 @@ public class UserManagerService extends IUserManager.Stub { Slog.e(LOG_TAG, "No such user for settings seed data u=" + userId); return; } userData.seedAccountName = accountName; userData.seedAccountType = accountType; userData.seedAccountName = truncateString(accountName); userData.seedAccountType = truncateString(accountType); userData.seedAccountOptions = accountOptions; userData.persistSeedData = persist; } Loading
services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java +21 −0 Original line number Diff line number Diff line Loading @@ -15,9 +15,12 @@ */ package com.android.server.pm; import static android.os.UserManager.USER_TYPE_FULL_SECONDARY; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertThrows; Loading Loading @@ -325,6 +328,24 @@ public final class UserManagerServiceTest { () -> mUmi.getBootUser(/* waitUntilSet= */ false)); } @Test public void testCreateUserWithLongName_TruncatesName() { UserInfo user = mUms.createUserWithThrow(generateLongString(), USER_TYPE_FULL_SECONDARY, 0); assertThat(user.name.length()).isEqualTo(500); UserInfo user1 = mUms.createUserWithThrow("Test", USER_TYPE_FULL_SECONDARY, 0); assertThat(user1.name.length()).isEqualTo(4); } private String generateLongString() { String partialString = "Test Name Test Name Test Name Test Name Test Name Test Name Test " + "Name Test Name Test Name Test Name "; //String of length 100 StringBuilder resultString = new StringBuilder(); for (int i = 0; i < 660; i++) { resultString.append(partialString); } return resultString.toString(); } private void mockCurrentUser(@UserIdInt int userId) { mockGetLocalService(ActivityManagerInternal.class, mActivityManagerInternal); Loading