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

Commit 78c64553 authored by Manjeet Rulhania's avatar Manjeet Rulhania Committed by Android (Google) Code Review
Browse files

Merge "Read permissions state from pm/Settings"

parents 9386d504 27c631b5
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import android.util.ArraySet;
import android.util.SparseArray;

import com.android.internal.util.function.pooled.PooledLambda;
import com.android.permission.persistence.RuntimePermissionsState;
import com.android.server.pm.Installer.LegacyDexoptDisabledException;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.PackageList;
@@ -1077,9 +1078,16 @@ public abstract class PackageManagerInternal {

    /**
     * Read legacy permission definitions for permissions migration to new permission subsystem.
     * Note that this api is supposed to be used for permissions migration only.
     */
    public abstract LegacyPermissionSettings getLegacyPermissions();

    /**
     * Read legacy permission states for permissions migration to new permission subsystem.
     * Note that this api is supposed to be used for permissions state migration only.
     */
    public abstract RuntimePermissionsState getLegacyPermissionsState(@UserIdInt int userId);

    /**
     * Returns {@code true} if the caller is the installer of record for the given package.
     * Otherwise, {@code false}.
+11 −0
Original line number Diff line number Diff line
@@ -188,6 +188,7 @@ import com.android.internal.util.Preconditions;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.permission.persistence.RuntimePermissionsPersistence;
import com.android.permission.persistence.RuntimePermissionsState;
import com.android.server.EventLogTags;
import com.android.server.FgThread;
import com.android.server.LocalManagerRegistry;
@@ -6747,6 +6748,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService
            }
        }

        /**
         * Read legacy permission states for permissions migration to new permission subsystem.
         */
        @Override
        public RuntimePermissionsState getLegacyPermissionsState(int userId) {
            synchronized (mLock) {
                return mSettings.getLegacyPermissionsState(userId);
            }
        }

        @Override
        @SuppressWarnings("GuardedBy")
        public boolean isPermissionUpgradeNeeded(int userId) {
+71 −32
Original line number Diff line number Diff line
@@ -3292,6 +3292,11 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
                mPackages, mSharedUsers, getUserRuntimePermissionsFile(userId));
    }

    RuntimePermissionsState getLegacyPermissionsState(@UserIdInt int userId) {
        return mRuntimePermissionsPersistence.getLegacyPermissionsState(
                userId, mPackages, mSharedUsers);
    }

    void applyDefaultPreferredAppsLPw(int userId) {
        // First pull data from any pre-installed apps.
        final PackageManagerInternal pmInternal =
@@ -5726,17 +5731,67 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
            Runnable writer = () -> {
                boolean isLegacyPermissionStateStale = mIsLegacyPermissionStateStale.getAndSet(
                        false);
                Map<String, List<RuntimePermissionsState.PermissionState>> packagePermissions;
                Map<String, List<RuntimePermissionsState.PermissionState>> sharedUserPermissions;

                final Map<String, List<RuntimePermissionsState.PermissionState>>
                        packagePermissions = new ArrayMap<>();
                final Map<String, List<RuntimePermissionsState.PermissionState>>
                        sharedUserPermissions = new ArrayMap<>();
                synchronized (pmLock) {
                    if (sync || isLegacyPermissionStateStale) {
                        legacyPermissionDataProvider.writeLegacyPermissionStateTEMP();
                    }

                    int packagesSize = packageStates.size();
                    packagePermissions = getPackagePermissions(userId, packageStates);
                    sharedUserPermissions = getShareUsersPermissions(userId, sharedUsers);
                }
                synchronized (mLock) {
                    int version = mVersions.get(userId, INITIAL_VERSION);
                    String fingerprint = mFingerprints.get(userId);

                    RuntimePermissionsState runtimePermissions = new RuntimePermissionsState(
                            version, fingerprint, packagePermissions, sharedUserPermissions);
                    mPendingStatesToWrite.put(userId, runtimePermissions);
                }
                if (pmHandler != null) {
                    // Async version.
                    mPersistenceHandler.obtainMessage(userId).sendToTarget();
                } else {
                    // Sync version.
                    writePendingStates();
                }
            };

            if (pmHandler != null) {
                // Async version, use pmHandler.
                pmHandler.post(writer);
            } else {
                // Sync version, use caller's thread.
                writer.run();
            }
        }

        @NonNull
        RuntimePermissionsState getLegacyPermissionsState(int userId,
                @NonNull WatchedArrayMap<String, ? extends PackageStateInternal> packageStates,
                @NonNull WatchedArrayMap<String, SharedUserSetting> sharedUsers) {
            int version;
            String fingerprint;
            synchronized (mLock) {
                version = mVersions.get(userId, INITIAL_VERSION);
                fingerprint = mFingerprints.get(userId);
            }

            return new RuntimePermissionsState(
                    version, fingerprint, getPackagePermissions(userId, packageStates),
                    getShareUsersPermissions(userId, sharedUsers));
        }

        @NonNull
        private Map<String, List<RuntimePermissionsState.PermissionState>> getPackagePermissions(
                int userId,
                @NonNull WatchedArrayMap<String, ? extends PackageStateInternal> packageStates) {
            final Map<String, List<RuntimePermissionsState.PermissionState>>
                    packagePermissions = new ArrayMap<>();

            final int packagesSize = packageStates.size();
            for (int i = 0; i < packagesSize; i++) {
                String packageName = packageStates.keyAt(i);
                PackageStateInternal packageState = packageStates.valueAt(i);
@@ -5754,6 +5809,14 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
                    packagePermissions.put(packageName, permissions);
                }
            }
            return packagePermissions;
        }

        @NonNull
        private Map<String, List<RuntimePermissionsState.PermissionState>> getShareUsersPermissions(
                int userId, @NonNull WatchedArrayMap<String, SharedUserSetting> sharedUsers) {
            final Map<String, List<RuntimePermissionsState.PermissionState>>
                    sharedUserPermissions = new ArrayMap<>();

            final int sharedUsersSize = sharedUsers.size();
            for (int i = 0; i < sharedUsersSize; i++) {
@@ -5764,31 +5827,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
                                sharedUserSetting.getLegacyPermissionState(), userId);
                sharedUserPermissions.put(sharedUserName, permissions);
            }
                }
                synchronized (mLock) {
                    int version = mVersions.get(userId, INITIAL_VERSION);
                    String fingerprint = mFingerprints.get(userId);

                    RuntimePermissionsState runtimePermissions = new RuntimePermissionsState(
                            version, fingerprint, packagePermissions, sharedUserPermissions);
                    mPendingStatesToWrite.put(userId, runtimePermissions);
                }
                if (pmHandler != null) {
                    // Async version.
                    mPersistenceHandler.obtainMessage(userId).sendToTarget();
                } else {
                    // Sync version.
                    writePendingStates();
                }
            };

            if (pmHandler != null) {
                // Async version, use pmHandler.
                pmHandler.post(writer);
            } else {
                // Sync version, use caller's thread.
                writer.run();
            }
            return sharedUserPermissions;
        }

        private void writePendingStates() {
+4 −9
Original line number Diff line number Diff line
@@ -18,11 +18,9 @@ package com.android.server.pm.permission;

import android.annotation.NonNull;
import android.content.pm.PackageManagerInternal;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Log;

import com.android.permission.persistence.RuntimePermissionsPersistence;
import com.android.permission.persistence.RuntimePermissionsState;
import com.android.server.LocalManagerRegistry;
import com.android.server.LocalServices;
@@ -81,15 +79,12 @@ public class PermissionMigrationHelperImpl implements PermissionMigrationHelper
     */
    @NonNull
    public Map<Integer, Map<String, LegacyPermissionState>> getLegacyPermissionStates(int userId) {
        RuntimePermissionsPersistence legacyPersistence =
                RuntimePermissionsPersistence.createInstance();
        PackageManagerInternal mPackageManagerInternal =
                LocalServices.getService(PackageManagerInternal.class);
        Map<Integer, Map<String, LegacyPermissionState>> appIdPermissionStates = new ArrayMap<>();

        RuntimePermissionsState legacyState = legacyPersistence.readForUser(UserHandle.of(userId));
        if (legacyState == null) {
            return appIdPermissionStates;
        }

        RuntimePermissionsState legacyState =
                mPackageManagerInternal.getLegacyPermissionsState(userId);
        PackageManagerLocal packageManagerLocal =
                LocalManagerRegistry.getManager(PackageManagerLocal.class);