Allow profiles of an admin user to remove system app updates.
This modifies a change made earlier that prevented non-admin users from removing updates to system apps. This was intended to prevent users such as guests from reverting updates, but an unintentional effect was that profiles of the admin user (such as a work profile) also became unable to do this. This change allows a profile to revert updates if the parent is an admin user. Bug: 229719733 Test: atest DeletePackageHelperTest Change-Id: Ie9065dfa6a0117f8cf1f49382a8e44655b17cec1
This commit is contained in:
@@ -166,9 +166,10 @@ final class DeletePackageHelper {
|
||||
|
||||
if (PackageManagerServiceUtils.isSystemApp(uninstalledPs)) {
|
||||
UserInfo userInfo = mUserManagerInternal.getUserInfo(userId);
|
||||
if (userInfo == null || !userInfo.isAdmin()) {
|
||||
if (userInfo == null || (!userInfo.isAdmin() && !mUserManagerInternal.getUserInfo(
|
||||
mUserManagerInternal.getProfileParentId(userId)).isAdmin())) {
|
||||
Slog.w(TAG, "Not removing package " + packageName
|
||||
+ " as only admin user may downgrade system apps");
|
||||
+ " as only admin user (or their profile) may downgrade system apps");
|
||||
EventLog.writeEvent(0x534e4554, "170646036", -1, packageName);
|
||||
return PackageManager.DELETE_FAILED_USER_RESTRICTED;
|
||||
}
|
||||
|
||||
@@ -69,13 +69,34 @@ class DeletePackageHelperTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun deleteSystemPackageFailsIfNotAdmin() {
|
||||
fun deleteSystemPackageFailsIfNotAdminAndNotProfile() {
|
||||
val ps = mPms.mSettings.getPackageLPr("a.data.package")
|
||||
whenever(PackageManagerServiceUtils.isSystemApp(ps)).thenReturn(true)
|
||||
whenever(mUserManagerInternal.getUserInfo(1)).thenReturn(UserInfo(1, "test", 0))
|
||||
whenever(mUserManagerInternal.getProfileParentId(1)).thenReturn(1)
|
||||
|
||||
val dph = DeletePackageHelper(mPms)
|
||||
val result = dph.deletePackageX("a.data.package", 1L, 1, 0, false)
|
||||
val result = dph.deletePackageX("a.data.package", 1L, 1,
|
||||
PackageManager.DELETE_SYSTEM_APP, false)
|
||||
|
||||
assertThat(result).isEqualTo(PackageManager.DELETE_FAILED_USER_RESTRICTED)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun deleteSystemPackageFailsIfProfileOfNonAdmin() {
|
||||
val userId = 1
|
||||
val parentId = 5
|
||||
val ps = mPms.mSettings.getPackageLPr("a.data.package")
|
||||
whenever(PackageManagerServiceUtils.isSystemApp(ps)).thenReturn(true)
|
||||
whenever(mUserManagerInternal.getUserInfo(userId)).thenReturn(
|
||||
UserInfo(userId, "test", UserInfo.FLAG_PROFILE))
|
||||
whenever(mUserManagerInternal.getProfileParentId(userId)).thenReturn(parentId)
|
||||
whenever(mUserManagerInternal.getUserInfo(parentId)).thenReturn(
|
||||
UserInfo(userId, "testparent", 0))
|
||||
|
||||
val dph = DeletePackageHelper(mPms)
|
||||
val result = dph.deletePackageX("a.data.package", 1L, userId,
|
||||
PackageManager.DELETE_SYSTEM_APP, false)
|
||||
|
||||
assertThat(result).isEqualTo(PackageManager.DELETE_FAILED_USER_RESTRICTED)
|
||||
}
|
||||
@@ -93,4 +114,23 @@ class DeletePackageHelperTest {
|
||||
|
||||
assertThat(result).isEqualTo(PackageManager.DELETE_SUCCEEDED)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun deleteSystemPackageSucceedsIfProfileOfAdmin() {
|
||||
val userId = 1
|
||||
val parentId = 5
|
||||
val ps = mPms.mSettings.getPackageLPr("a.data.package")
|
||||
whenever(PackageManagerServiceUtils.isSystemApp(ps)).thenReturn(true)
|
||||
whenever(mUserManagerInternal.getUserInfo(userId)).thenReturn(
|
||||
UserInfo(userId, "test", UserInfo.FLAG_PROFILE))
|
||||
whenever(mUserManagerInternal.getProfileParentId(userId)).thenReturn(parentId)
|
||||
whenever(mUserManagerInternal.getUserInfo(parentId)).thenReturn(
|
||||
UserInfo(userId, "testparent", UserInfo.FLAG_ADMIN))
|
||||
|
||||
val dph = DeletePackageHelper(mPms)
|
||||
val result = dph.deletePackageX("a.data.package", 1L, userId,
|
||||
PackageManager.DELETE_SYSTEM_APP, false)
|
||||
|
||||
assertThat(result).isEqualTo(PackageManager.DELETE_SUCCEEDED)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user