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

Commit 83bd143d authored by Essence Cain's avatar Essence Cain
Browse files

Check for emergency installer attribute and permission to trigger an emergency uninstall

Change-Id: Ia61bdf9045bc6b07feb01726aceb395b7a974bc2
Test: m
Bug: 321080601
Flag: EXEMPT bugfix
parent 3a287975
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1445,6 +1445,15 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
                    .createEvent(DevicePolicyEnums.UNINSTALL_PACKAGE)
                    .setAdmin(callerPackageName)
                    .write();
        } else if (PackageInstallerSession.isEmergencyInstallerEnabled(callerPackageName, snapshot,
                userId, callingUid)) {
            // Need to clear the calling identity to get DELETE_PACKAGES permission
            final long ident = Binder.clearCallingIdentity();
            try {
                mPm.deletePackageVersioned(versionedPackage, adapter.getBinder(), userId, flags);
            } finally {
                Binder.restoreCallingIdentity(ident);
            }
        } else {
            ApplicationInfo appInfo = snapshot.getApplicationInfo(callerPackageName, 0, userId);
            if (appInfo.targetSdkVersion >= Build.VERSION_CODES.P) {
+5 −4
Original line number Diff line number Diff line
@@ -966,7 +966,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
                getInstallSource().mInstallerPackageName, mInstallerUid);
    }

    private boolean isEmergencyInstallerEnabled(String packageName, Computer snapshot) {
    static boolean isEmergencyInstallerEnabled(String packageName, Computer snapshot, int userId,
            int installerUid) {
        final PackageStateInternal ps = snapshot.getPackageStateInternal(packageName);
        if (ps == null || ps.getPkg() == null || !ps.isSystem()) {
            return false;
@@ -974,7 +975,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        int uid = UserHandle.getUid(userId, ps.getAppId());
        String emergencyInstaller = ps.getPkg().getEmergencyInstaller();
        if (emergencyInstaller == null || !ArrayUtils.contains(
                snapshot.getPackagesForUid(mInstallerUid), emergencyInstaller)) {
                snapshot.getPackagesForUid(installerUid), emergencyInstaller)) {
            return false;
        }
        // Only system installers can have an emergency installer
@@ -987,7 +988,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            return false;
        }
        return (snapshot.checkUidPermission(Manifest.permission.EMERGENCY_INSTALL_PACKAGES,
                mInstallerUid) == PackageManager.PERMISSION_GRANTED);
                installerUid) == PackageManager.PERMISSION_GRANTED);
    }

    private static final int USER_ACTION_NOT_NEEDED = 0;
@@ -1075,7 +1076,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
                getInstallerPackageName());
        final boolean isSelfUpdate = targetPackageUid == mInstallerUid;
        final boolean isEmergencyInstall =
                isEmergencyInstallerEnabled(packageName, snapshot);
                isEmergencyInstallerEnabled(packageName, snapshot, userId, mInstallerUid);
        final boolean isPermissionGranted = isInstallPermissionGranted
                || (isUpdatePermissionGranted && isUpdate)
                || (isSelfUpdatePermissionGranted && isSelfUpdate)