Merge "Read permissions state from pm/Settings"
This commit is contained in:
committed by
Android (Google) Code Review
commit
78c6455368
@@ -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}.
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,44 +5731,16 @@ 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();
|
||||
for (int i = 0; i < packagesSize; i++) {
|
||||
String packageName = packageStates.keyAt(i);
|
||||
PackageStateInternal packageState = packageStates.valueAt(i);
|
||||
if (!packageState.hasSharedUser()) {
|
||||
List<RuntimePermissionsState.PermissionState> permissions =
|
||||
getPermissionsFromPermissionsState(
|
||||
packageState.getLegacyPermissionState(), userId);
|
||||
if (permissions.isEmpty()
|
||||
&& !packageState.isInstallPermissionsFixed()) {
|
||||
// Storing an empty state means the package is known to the
|
||||
// system and its install permissions have been granted and fixed.
|
||||
// If this is not the case, we should not store anything.
|
||||
continue;
|
||||
}
|
||||
packagePermissions.put(packageName, permissions);
|
||||
}
|
||||
}
|
||||
|
||||
final int sharedUsersSize = sharedUsers.size();
|
||||
for (int i = 0; i < sharedUsersSize; i++) {
|
||||
String sharedUserName = sharedUsers.keyAt(i);
|
||||
SharedUserSetting sharedUserSetting = sharedUsers.valueAt(i);
|
||||
List<RuntimePermissionsState.PermissionState> permissions =
|
||||
getPermissionsFromPermissionsState(
|
||||
sharedUserSetting.getLegacyPermissionState(), userId);
|
||||
sharedUserPermissions.put(sharedUserName, permissions);
|
||||
}
|
||||
packagePermissions = getPackagePermissions(userId, packageStates);
|
||||
sharedUserPermissions = getShareUsersPermissions(userId, sharedUsers);
|
||||
}
|
||||
synchronized (mLock) {
|
||||
int version = mVersions.get(userId, INITIAL_VERSION);
|
||||
@@ -5791,6 +5768,68 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
|
||||
}
|
||||
}
|
||||
|
||||
@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);
|
||||
if (!packageState.hasSharedUser()) {
|
||||
List<RuntimePermissionsState.PermissionState> permissions =
|
||||
getPermissionsFromPermissionsState(
|
||||
packageState.getLegacyPermissionState(), userId);
|
||||
if (permissions.isEmpty()
|
||||
&& !packageState.isInstallPermissionsFixed()) {
|
||||
// Storing an empty state means the package is known to the
|
||||
// system and its install permissions have been granted and fixed.
|
||||
// If this is not the case, we should not store anything.
|
||||
continue;
|
||||
}
|
||||
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++) {
|
||||
String sharedUserName = sharedUsers.keyAt(i);
|
||||
SharedUserSetting sharedUserSetting = sharedUsers.valueAt(i);
|
||||
List<RuntimePermissionsState.PermissionState> permissions =
|
||||
getPermissionsFromPermissionsState(
|
||||
sharedUserSetting.getLegacyPermissionState(), userId);
|
||||
sharedUserPermissions.put(sharedUserName, permissions);
|
||||
}
|
||||
return sharedUserPermissions;
|
||||
}
|
||||
|
||||
private void writePendingStates() {
|
||||
while (true) {
|
||||
final RuntimePermissionsState runtimePermissions;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user