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

Commit a9c38b7b authored by Hai Zhang's avatar Hai Zhang Committed by Android (Google) Code Review
Browse files

Merge "Compute PermissionInfo.FLAG_INSTALLED instead of mutating ParsedPermission."

parents 630e4fde c90f85e7
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -1476,14 +1476,18 @@ public class ComputerEngine implements Computer {
            // Compute GIDs only if requested
            final int[] gids = (flags & PackageManager.GET_GIDS) == 0 ? EMPTY_INT_ARRAY
                    : mPermissionManager.getGidsForUid(UserHandle.getUid(userId, ps.getAppId()));
            // Compute installed permissions only if requested
            final Set<String> installedPermissions = ((flags & PackageManager.GET_PERMISSIONS) == 0
                    || ArrayUtils.isEmpty(p.getPermissions())) ? Collections.emptySet()
                    : mPermissionManager.getInstalledPermissions(ps.getPackageName());
            // Compute granted permissions only if package has requested permissions
            final Set<String> permissions = ((flags & PackageManager.GET_PERMISSIONS) == 0
            final Set<String> grantedPermissions = ((flags & PackageManager.GET_PERMISSIONS) == 0
                    || ArrayUtils.isEmpty(p.getRequestedPermissions())) ? Collections.emptySet()
                    : mPermissionManager.getGrantedPermissions(ps.getPackageName(), userId);

            PackageInfo packageInfo = PackageInfoUtils.generate(p, gids, flags,
                    state.getFirstInstallTimeMillis(), ps.getLastUpdateTime(), permissions, state,
                    userId, ps);
                    state.getFirstInstallTimeMillis(), ps.getLastUpdateTime(), installedPermissions,
                    grantedPermissions, state, userId, ps);

            if (packageInfo == null) {
                return null;
+13 −7
Original line number Diff line number Diff line
@@ -104,10 +104,11 @@ public class PackageInfoUtils {
    @Nullable
    public static PackageInfo generate(AndroidPackage pkg, int[] gids,
            @PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime,
            long lastUpdateTime, Set<String> grantedPermissions, PackageUserStateInternal state,
            @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) {
            long lastUpdateTime, Set<String> installedPermissions, Set<String> grantedPermissions,
            PackageUserStateInternal state, @UserIdInt int userId,
            @NonNull PackageStateInternal pkgSetting) {
        return generateWithComponents(pkg, gids, flags, firstInstallTime, lastUpdateTime,
                grantedPermissions, state, userId, pkgSetting);
                installedPermissions, grantedPermissions, state, userId, pkgSetting);
    }

    /**
@@ -115,8 +116,9 @@ public class PackageInfoUtils {
     */
    private static PackageInfo generateWithComponents(AndroidPackage pkg, int[] gids,
            @PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime,
            long lastUpdateTime, Set<String> grantedPermissions, PackageUserStateInternal state,
            @UserIdInt int userId, @NonNull PackageStateInternal pkgSetting) {
            long lastUpdateTime, Set<String> installedPermissions, Set<String> grantedPermissions,
            PackageUserStateInternal state, @UserIdInt int userId,
            @NonNull PackageStateInternal pkgSetting) {
        ApplicationInfo applicationInfo = generateApplicationInfo(pkg, flags, state, userId,
                pkgSetting);
        if (applicationInfo == null) {
@@ -174,8 +176,12 @@ public class PackageInfoUtils {
            if (size > 0) {
                info.permissions = new PermissionInfo[size];
                for (int i = 0; i < size; i++) {
                    info.permissions[i] = generatePermissionInfo(pkg.getPermissions().get(i),
                            flags);
                    final var permission = pkg.getPermissions().get(i);
                    final var permissionInfo = generatePermissionInfo(permission, flags);
                    if (installedPermissions.contains(permission.getName())) {
                        permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED;
                    }
                    info.permissions[i] = permissionInfo;
                }
            }
            final List<ParsedUsesPermission> usesPermissions = pkg.getUsesPermissions();
+2 −7
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.util.Log;
import android.util.Slog;

import com.android.server.pm.PackageManagerService;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.component.ParsedPermission;

@@ -215,10 +214,6 @@ public final class Permission {
                == PermissionInfo.PROTECTION_DANGEROUS;
    }

    public boolean isInstalled() {
        return (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLED) != 0;
    }

    public boolean isRemoved() {
        return (mPermissionInfo.flags & PermissionInfo.FLAG_REMOVED) != 0;
    }
@@ -423,7 +418,6 @@ public final class Permission {
            if (packageState.isSystem()) {
                if (permission.mType == Permission.TYPE_CONFIG && !permission.mReconciled) {
                    // It's a built-in permission and no owner, take ownership now
                    permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED;
                    permission.mPermissionInfo = permissionInfo;
                    permission.mReconciled = true;
                    permission.mUid = packageState.getAppId();
@@ -451,7 +445,6 @@ public final class Permission {
                final Permission tree = findPermissionTree(permissionTrees, permissionInfo.name);
                if (tree == null
                        || tree.mPermissionInfo.packageName.equals(permissionInfo.packageName)) {
                    permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED;
                    permission.mPermissionInfo = permissionInfo;
                    permission.mReconciled = true;
                    permission.mUid = packageState.getAppId();
@@ -562,6 +555,8 @@ public final class Permission {
            permissionInfo.packageName = mPermissionInfo.packageName;
            permissionInfo.nonLocalizedLabel = mPermissionInfo.name;
        }
        // A Permission in PermissionRegistry is always installed.
        permissionInfo.flags |= PermissionInfo.FLAG_INSTALLED;
        if (targetSdkVersion >= Build.VERSION_CODES.O) {
            permissionInfo.protectionLevel = mPermissionInfo.protectionLevel;
        } else {
+5 −0
Original line number Diff line number Diff line
@@ -760,6 +760,11 @@ public class PermissionManagerService extends IPermissionManager.Stub {
        }
        @NonNull
        @Override
        public Set<String> getInstalledPermissions(@NonNull String packageName) {
            return mPermissionManagerServiceImpl.getInstalledPermissions(packageName);
        }
        @NonNull
        @Override
        public Set<String> getGrantedPermissions(@NonNull String packageName,
                @UserIdInt int userId) {
            return mPermissionManagerServiceImpl.getGrantedPermissions(packageName, userId);
+15 −7
Original line number Diff line number Diff line
@@ -2345,9 +2345,6 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
        for (int i=0; i<N; i++) {
            ParsedPermission p = pkg.getPermissions().get(i);

            // Assume by default that we did not install this permission into the system.
            ComponentMutateUtils.setExactFlags(p, p.getFlags() & ~PermissionInfo.FLAG_INSTALLED);

            final PermissionInfo permissionInfo;
            final Permission oldPermission;
            synchronized (mLock) {
@@ -2384,10 +2381,6 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
                } else {
                    mRegistry.addPermission(permission);
                }
                if (permission.isInstalled()) {
                    ComponentMutateUtils.setExactFlags(p,
                            p.getFlags() | PermissionInfo.FLAG_INSTALLED);
                }
                if (permission.isDefinitionChanged()) {
                    definitionChangedPermissions.add(p.getName());
                    permission.setDefinitionChanged(false);
@@ -5141,6 +5134,21 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
        return isPermissionsReviewRequiredInternal(packageName, userId);
    }

    @NonNull
    @Override
    public Set<String> getInstalledPermissions(@NonNull String packageName) {
        Objects.requireNonNull(packageName, "packageName");
        final Set<String> installedPermissions = new ArraySet<>();
        synchronized (mLock) {
            for (final Permission permission : mRegistry.getPermissions()) {
                if (Objects.equals(permission.getPackageName(), packageName)) {
                    installedPermissions.add(permission.getName());
                }
            }
        }
        return installedPermissions;
    }

    @NonNull
    @Override
    public Set<String> getGrantedPermissions(@NonNull String packageName,
Loading