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

Commit 34d1db18 authored by Hai Zhang's avatar Hai Zhang
Browse files

Check permission via PermissionManagerService in PackageManagerService.

As the first step towards moving PermissionsState out of package
Setting. The usages for GIDs and installing a system package after
uninstalling its update will be addressed in another change.

Bug: 158736025
Test: presubmit
Test: System boots
Change-Id: Ic45a97eabb6957836d691ac1d3c9092648b0b523
parent c546ba79
Loading
Loading
Loading
Loading
+14 −13
Original line number Diff line number Diff line
@@ -4206,14 +4206,10 @@ public class PackageManagerService extends IPackageManager.Stub
        Iterator<ResolveInfo> iter = matches.iterator();
        while (iter.hasNext()) {
            final ResolveInfo rInfo = iter.next();
            final PackageSetting ps = mSettings.mPackages.get(rInfo.activityInfo.packageName);
            if (ps != null) {
                final PermissionsState permissionsState = ps.getPermissionsState();
                if (permissionsState.hasPermission(Manifest.permission.INSTALL_PACKAGES, 0)
                        || Build.IS_ENG) {
            if (checkPermission(Manifest.permission.INSTALL_PACKAGES,
                    rInfo.activityInfo.packageName, 0) == PERMISSION_GRANTED || Build.IS_ENG) {
                continue;
            }
            }
            iter.remove();
        }
        if (matches.size() == 0) {
@@ -8592,10 +8588,9 @@ public class PackageManagerService extends IPackageManager.Stub
    private void addPackageHoldingPermissions(ArrayList<PackageInfo> list, PackageSetting ps,
            String[] permissions, boolean[] tmp, int flags, int userId) {
        int numMatch = 0;
        final PermissionsState permissionsState = ps.getPermissionsState();
        for (int i=0; i<permissions.length; i++) {
            final String permission = permissions[i];
            if (permissionsState.hasPermission(permission, userId)) {
            if (checkPermission(permission, ps.name, userId) == PERMISSION_GRANTED) {
                tmp[i] = true;
                numMatch++;
            } else {
@@ -19222,6 +19217,13 @@ public class PackageManagerService extends IPackageManager.Stub
        final int flags = action.flags;
        final boolean systemApp = isSystemApp(ps);
        // We need to get the permission state before package state is (potentially) destroyed.
        final SparseBooleanArray hadSuspendAppsPermission = new SparseBooleanArray();
        for (int userId : allUserHandles) {
            hadSuspendAppsPermission.put(userId, checkPermission(Manifest.permission.SUSPEND_APPS,
                    packageName, userId) == PERMISSION_GRANTED);
        }
        final int userId = user == null ? UserHandle.USER_ALL : user.getIdentifier();
        if ((!systemApp || (flags & PackageManager.DELETE_SYSTEM_APP) != 0)
@@ -19288,8 +19290,7 @@ public class PackageManagerService extends IPackageManager.Stub
            affectedUserIds = resolveUserIds(userId);
        }
        for (final int affectedUserId : affectedUserIds) {
            if (ps.getPermissionsState().hasPermission(Manifest.permission.SUSPEND_APPS,
                    affectedUserId)) {
            if (hadSuspendAppsPermission.get(affectedUserId)) {
                unsuspendForSuspendingPackage(packageName, affectedUserId);
                removeAllDistractingPackageRestrictions(affectedUserId);
            }
@@ -21062,8 +21063,8 @@ public class PackageManagerService extends IPackageManager.Stub
                pkgSetting.setEnabled(newState, userId, callingPackage);
                if ((newState == COMPONENT_ENABLED_STATE_DISABLED_USER
                        || newState == COMPONENT_ENABLED_STATE_DISABLED)
                        && pkgSetting.getPermissionsState().hasPermission(
                                Manifest.permission.SUSPEND_APPS, userId)) {
                        && checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId)
                        == PERMISSION_GRANTED) {
                    // This app should not generally be allowed to get disabled by the UI, but if it
                    // ever does, we don't want to end up with some of the user's apps permanently
                    // suspended.