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

Commit 159b4c81 authored by Philip P. Moltmann's avatar Philip P. Moltmann Committed by android-build-merger
Browse files

Merge "Whitelist all permission in apks on /system" into qt-dev

am: bfb18441

Change-Id: I01a6bdb22cb38fc4c03ecc476dcdddb2b0d0e1c5
parents bd288446 bfb18441
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.Manifest;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.permission.PermissionManager;
import android.text.TextUtils;
import android.util.Log;
@@ -54,6 +55,8 @@ class RuntimePermissionsUpgradeController {
                PermissionManager.class);
        final int currentVersion = permissionManager.getRuntimePermissionsVersion();

        whitelistAllSystemAppPermissions(context);

        final int upgradedVersion = onUpgradeLocked(context, currentVersion);

        if (upgradedVersion != LATEST_VERSION) {
@@ -69,6 +72,51 @@ class RuntimePermissionsUpgradeController {
        }
    }

    /**
     * Whitelist permissions of system-apps.
     *
     * <p>Apps that are updated via OTAs are never installed. Hence their permission are never
     * whitelisted. This code replaces that by always whitelisting them.
     *
     * @param context A context to talk to the platform
     */
    private static void whitelistAllSystemAppPermissions(@NonNull Context context) {
        // Only whitelist permissions that are in the OTA. For non-OTA updates the installer should
        // do the white-listing
        final List<PackageInfo> apps = context.getPackageManager()
                .getInstalledPackages(PackageManager.GET_PERMISSIONS
                        | PackageManager.MATCH_UNINSTALLED_PACKAGES
                        | PackageManager.MATCH_FACTORY_ONLY);

        final int appCount = apps.size();
        for (int i = 0; i < appCount; i++) {
            final PackageInfo app = apps.get(i);

            if (app.requestedPermissions == null) {
                continue;
            }

            for (String requestedPermission : app.requestedPermissions) {
                final PermissionInfo permInfo;
                try {
                    permInfo = context.getPackageManager().getPermissionInfo(
                            requestedPermission, 0);
                } catch (PackageManager.NameNotFoundException e) {
                    continue;
                }

                if ((permInfo.flags & (PermissionInfo.FLAG_HARD_RESTRICTED
                        | PermissionInfo.FLAG_SOFT_RESTRICTED)) == 0) {
                    continue;
                }

                context.getPackageManager().addWhitelistedRestrictedPermission(
                        app.packageName, requestedPermission,
                        PackageManager.FLAG_PERMISSION_WHITELIST_UPGRADE);
            }
        }
    }

    /**
     * You must perform all necessary mutations to bring the runtime permissions
     * database from the old to the new version. When you add a new upgrade step