Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5bd7689d authored by Oli Lan's avatar Oli Lan
Browse files

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
parent 3c2330d3
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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;
                }
+42 −2
Original line number Diff line number Diff line
@@ -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)
    }
}
 No newline at end of file