Merge "Store all permissions per-user."

This commit is contained in:
Hai Zhang
2021-01-22 14:55:32 +00:00
committed by Android (Google) Code Review
6 changed files with 79 additions and 120 deletions

View File

@@ -21423,7 +21423,7 @@ public class PackageManagerService extends IPackageManager.Stub
mPermissionManager.onPackageInstalled(pkg,
PermissionManagerServiceInternal.PackageInstalledParams.DEFAULT, userId);
if (applyUserRestrictions) {
mSettings.writeRuntimePermissionsForUserLPr(userId, false);
mSettings.writePermissionStateForUserLPr(userId, false);
}
}
@@ -27429,7 +27429,7 @@ public class PackageManagerService extends IPackageManager.Stub
public void writePermissionSettings(int[] userIds, boolean async) {
synchronized (mLock) {
for (int userId : userIds) {
mSettings.writeRuntimePermissionsForUserLPr(userId, !async);
mSettings.writePermissionStateForUserLPr(userId, !async);
}
}
}
@@ -28069,13 +28069,12 @@ public class PackageManagerService extends IPackageManager.Stub
/**
* Temporary method that wraps mSettings.writeLPr() and calls mPermissionManager's
* writeLegacyPermissionsTEMP() and writeLegacyPermissionStateTEMP() beforehand.
* writeLegacyPermissionsTEMP() beforehand.
*
* TODO(zhanghai): This should be removed once we finish migration of permission storage.
*/
private void writeSettingsLPrTEMP() {
mPermissionManager.writeLegacyPermissionsTEMP(mSettings.mPermissions);
mPermissionManager.writeLegacyPermissionStateTEMP();
mSettings.writeLPr();
}

View File

@@ -356,7 +356,7 @@ public class PackageSetting extends PackageSettingBase {
proto.write(PackageProto.UserPermissionsProto.ID, user.id);
runtimePermissionStates = dataProvider.getLegacyPermissionState(appId)
.getRuntimePermissionStates(user.id);
.getPermissionStates(user.id);
for (LegacyPermissionState.PermissionState permission : runtimePermissionStates) {
if (permission.isGranted()) {
proto.write(PackageProto.UserPermissionsProto.GRANTED_PERMISSIONS,

View File

@@ -2313,7 +2313,8 @@ public final class Settings implements Watchable, Snappable {
}
void readInstallPermissionsLPr(TypedXmlPullParser parser,
LegacyPermissionState permissionsState) throws IOException, XmlPullParserException {
LegacyPermissionState permissionsState, List<UserInfo> users)
throws IOException, XmlPullParserException {
int outerDepth = parser.getDepth();
int type;
while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
@@ -2328,8 +2329,10 @@ public final class Settings implements Watchable, Snappable {
String name = parser.getAttributeValue(null, ATTR_NAME);
final boolean granted = parser.getAttributeBoolean(null, ATTR_GRANTED, true);
final int flags = parser.getAttributeIntHex(null, ATTR_FLAGS, 0);
permissionsState.putInstallPermissionState(new PermissionState(name, granted,
flags));
for (final UserInfo user : users) {
permissionsState.putPermissionState(new PermissionState(name, false, granted,
flags), user.id);
}
} else {
Slog.w(PackageManagerService.TAG, "Unknown element under <permissions>: "
+ parser.getName());
@@ -2338,25 +2341,6 @@ public final class Settings implements Watchable, Snappable {
}
}
void writePermissionsLPr(TypedXmlSerializer serializer, Collection<PermissionState> permissionStates)
throws IOException {
if (permissionStates.isEmpty()) {
return;
}
serializer.startTag(null, TAG_PERMISSIONS);
for (PermissionState permissionState : permissionStates) {
serializer.startTag(null, TAG_ITEM);
serializer.attributeInterned(null, ATTR_NAME, permissionState.getName());
serializer.attributeBoolean(null, ATTR_GRANTED, permissionState.isGranted());
serializer.attributeIntHex(null, ATTR_FLAGS, permissionState.getFlags());
serializer.endTag(null, TAG_ITEM);
}
serializer.endTag(null, TAG_PERMISSIONS);
}
void readUsesStaticLibLPw(TypedXmlPullParser parser, PackageSetting outPs)
throws IOException, XmlPullParserException {
String libName = parser.getAttributeValue(null, ATTR_NAME);
@@ -2572,8 +2556,6 @@ public final class Settings implements Watchable, Snappable {
serializer.attribute(null, ATTR_NAME, usr.name);
serializer.attributeInt(null, "userId", usr.userId);
usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
writePermissionsLPr(serializer, usr.getLegacyPermissionState()
.getInstallPermissionStates());
serializer.endTag(null, "shared-user");
}
@@ -2898,12 +2880,6 @@ public final class Settings implements Watchable, Snappable {
writeUsesStaticLibLPw(serializer, pkg.usesStaticLibraries, pkg.usesStaticLibrariesVersions);
// If this is a shared user, the permissions will be written there.
if (pkg.sharedUser == null) {
writePermissionsLPr(serializer, pkg.getLegacyPermissionState()
.getInstallPermissionStates());
}
serializer.endTag(null, "updated-package");
}
@@ -2991,9 +2967,6 @@ public final class Settings implements Watchable, Snappable {
serializer, "install-initiator-sigs", mPastSignatures);
}
writePermissionsLPr(serializer,
pkg.getLegacyPermissionState().getInstallPermissionStates());
writeSigningKeySetLPr(serializer, pkg.keySetData);
writeUpgradeKeySetsLPr(serializer, pkg.keySetData);
writeKeySetAliasesLPr(serializer, pkg.keySetData);
@@ -3097,13 +3070,13 @@ public final class Settings implements Watchable, Snappable {
String tagName = parser.getName();
if (tagName.equals("package")) {
readPackageLPw(parser);
readPackageLPw(parser, users);
} else if (tagName.equals("permissions")) {
mPermissions.readPermissions(parser);
} else if (tagName.equals("permission-trees")) {
mPermissions.readPermissionTrees(parser);
} else if (tagName.equals("shared-user")) {
readSharedUserLPw(parser);
readSharedUserLPw(parser, users);
} else if (tagName.equals("preferred-packages")) {
// no longer used.
} else if (tagName.equals("preferred-activities")) {
@@ -3121,7 +3094,7 @@ public final class Settings implements Watchable, Snappable {
} else if (tagName.equals(TAG_DEFAULT_BROWSER)) {
readDefaultAppsLPw(parser, 0);
} else if (tagName.equals("updated-package")) {
readDisabledSysPackageLPw(parser);
readDisabledSysPackageLPw(parser, users);
} else if (tagName.equals("renamed-package")) {
String nname = parser.getAttributeValue(null, "new");
String oname = parser.getAttributeValue(null, "old");
@@ -3627,7 +3600,7 @@ public final class Settings implements Watchable, Snappable {
}
}
private void readDisabledSysPackageLPw(TypedXmlPullParser parser)
private void readDisabledSysPackageLPw(TypedXmlPullParser parser, List<UserInfo> users)
throws XmlPullParserException, IOException {
String name = parser.getAttributeValue(null, ATTR_NAME);
String realName = parser.getAttributeValue(null, "realName");
@@ -3676,7 +3649,7 @@ public final class Settings implements Watchable, Snappable {
}
if (parser.getName().equals(TAG_PERMISSIONS)) {
readInstallPermissionsLPr(parser, ps.getLegacyPermissionState());
readInstallPermissionsLPr(parser, ps.getLegacyPermissionState(), users);
} else if (parser.getName().equals(TAG_USES_STATIC_LIB)) {
readUsesStaticLibLPw(parser, ps);
} else {
@@ -3693,7 +3666,7 @@ public final class Settings implements Watchable, Snappable {
private static int PRE_M_APP_INFO_FLAG_CANT_SAVE_STATE = 1<<28;
private static int PRE_M_APP_INFO_FLAG_PRIVILEGED = 1<<30;
private void readPackageLPw(TypedXmlPullParser parser)
private void readPackageLPw(TypedXmlPullParser parser, List<UserInfo> users)
throws XmlPullParserException, IOException {
String name = null;
String realName = null;
@@ -3935,7 +3908,7 @@ public final class Settings implements Watchable, Snappable {
packageSetting.signatures.readXml(parser, mPastSignatures);
} else if (tagName.equals(TAG_PERMISSIONS)) {
readInstallPermissionsLPr(parser,
packageSetting.getLegacyPermissionState());
packageSetting.getLegacyPermissionState(), users);
packageSetting.installPermissionsFixed = true;
} else if (tagName.equals("proper-signing-keyset")) {
long id = parser.getAttributeLong(null, "identifier");
@@ -4112,7 +4085,7 @@ public final class Settings implements Watchable, Snappable {
}
}
private void readSharedUserLPw(TypedXmlPullParser parser)
private void readSharedUserLPw(TypedXmlPullParser parser, List<UserInfo> users)
throws XmlPullParserException, IOException {
String name = null;
int pkgFlags = 0;
@@ -4156,7 +4129,7 @@ public final class Settings implements Watchable, Snappable {
if (tagName.equals("sigs")) {
su.signatures.readXml(parser, mPastSignatures);
} else if (tagName.equals("perms")) {
readInstallPermissionsLPr(parser, su.getLegacyPermissionState());
readInstallPermissionsLPr(parser, su.getLegacyPermissionState(), users);
} else {
PackageManagerService.reportSettingsProblem(Log.WARN,
"Unknown element under <shared-user>: " + parser.getName());
@@ -4979,7 +4952,7 @@ public final class Settings implements Watchable, Snappable {
dumpGidsLPr(pw, prefix + " ", mPermissionDataProvider.getGidsForUid(
UserHandle.getUid(user.id, ps.appId)));
dumpRuntimePermissionsLPr(pw, prefix + " ", permissionNames, permissionsState
.getRuntimePermissionStates(user.id), dumpAll);
.getPermissionStates(user.id), dumpAll);
}
String harmfulAppWarning = ps.getHarmfulAppWarning(user.id);
@@ -5154,7 +5127,7 @@ public final class Settings implements Watchable, Snappable {
final int[] gids = mPermissionDataProvider.getGidsForUid(UserHandle.getUid(
userId, su.userId));
final Collection<PermissionState> permissions =
permissionsState.getRuntimePermissionStates(userId);
permissionsState.getPermissionStates(userId);
if (!ArrayUtils.isEmpty(gids) || !permissions.isEmpty()) {
pw.print(prefix); pw.print("User "); pw.print(userId); pw.println(": ");
dumpGidsLPr(pw, prefix + " ", gids);
@@ -5215,9 +5188,19 @@ public final class Settings implements Watchable, Snappable {
void dumpRuntimePermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
Collection<PermissionState> permissionStates, boolean dumpAll) {
if (!permissionStates.isEmpty() || dumpAll) {
boolean hasRuntimePermissions = false;
for (PermissionState permissionState : permissionStates) {
if (permissionState.isRuntime()) {
hasRuntimePermissions = true;
break;
}
}
if (hasRuntimePermissions || dumpAll) {
pw.print(prefix); pw.println("runtime permissions:");
for (PermissionState permissionState : permissionStates) {
if (!permissionState.isRuntime()) {
continue;
}
if (permissionNames != null
&& !permissionNames.contains(permissionState.getName())) {
continue;
@@ -5256,11 +5239,21 @@ public final class Settings implements Watchable, Snappable {
void dumpInstallPermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
LegacyPermissionState permissionsState) {
Collection<PermissionState> permissionStates =
permissionsState.getInstallPermissionStates();
if (!permissionStates.isEmpty()) {
Collection<PermissionState> permissionStates = permissionsState.getPermissionStates(
UserHandle.USER_SYSTEM);
boolean hasInstallPermissions = false;
for (PermissionState permissionState : permissionStates) {
if (!permissionState.isRuntime()) {
hasInstallPermissions = true;
break;
}
}
if (hasInstallPermissions) {
pw.print(prefix); pw.println("install permissions:");
for (PermissionState permissionState : permissionStates) {
if (permissionState.isRuntime()) {
continue;
}
if (permissionNames != null
&& !permissionNames.contains(permissionState.getName())) {
continue;
@@ -5295,7 +5288,7 @@ public final class Settings implements Watchable, Snappable {
}
}
public void writeRuntimePermissionsForUserLPr(int userId, boolean sync) {
public void writePermissionStateForUserLPr(int userId, boolean sync) {
if (sync) {
mRuntimePermissionsPersistence.writeStateForUserSyncLPr(userId);
} else {
@@ -5530,7 +5523,7 @@ public final class Settings implements Watchable, Snappable {
private List<RuntimePermissionsState.PermissionState> getPermissionsFromPermissionsState(
@NonNull LegacyPermissionState permissionsState, @UserIdInt int userId) {
Collection<PermissionState> permissionStates =
permissionsState.getRuntimePermissionStates(userId);
permissionsState.getPermissionStates(userId);
List<RuntimePermissionsState.PermissionState> permissions = new ArrayList<>();
for (PermissionState permissionState : permissionStates) {
RuntimePermissionsState.PermissionState permission =
@@ -5590,6 +5583,7 @@ public final class Settings implements Watchable, Snappable {
if (permissions != null) {
readPermissionsStateLpr(permissions, packageSetting.getLegacyPermissionState(),
userId);
packageSetting.installPermissionsFixed = true;
} else if (packageSetting.sharedUser == null && !isUpgradeToR) {
Slog.w(TAG, "Missing permission state for package: " + packageName);
packageSetting.getLegacyPermissionState().setMissing(true, userId);
@@ -5624,7 +5618,7 @@ public final class Settings implements Watchable, Snappable {
String name = permission.getName();
boolean granted = permission.isGranted();
int flags = permission.getFlags();
permissionsState.putRuntimePermissionState(new PermissionState(name, granted,
permissionsState.putPermissionState(new PermissionState(name, true, granted,
flags), userId);
}
}
@@ -5646,7 +5640,7 @@ public final class Settings implements Watchable, Snappable {
try {
final TypedXmlPullParser parser = Xml.resolvePullParser(in);
parseRuntimePermissionsLPr(parser, userId);
parseLegacyRuntimePermissionsLPr(parser, userId);
} catch (XmlPullParserException | IOException e) {
throw new IllegalStateException("Failed parsing permissions file: "
@@ -5659,7 +5653,7 @@ public final class Settings implements Watchable, Snappable {
// Private internals
@GuardedBy("Settings.this.mLock")
private void parseRuntimePermissionsLPr(TypedXmlPullParser parser, int userId)
private void parseLegacyRuntimePermissionsLPr(TypedXmlPullParser parser, int userId)
throws IOException, XmlPullParserException {
final int outerDepth = parser.getDepth();
int type;
@@ -5687,7 +5681,7 @@ public final class Settings implements Watchable, Snappable {
XmlUtils.skipCurrentTag(parser);
continue;
}
parsePermissionsLPr(parser, ps.getLegacyPermissionState(), userId);
parseLegacyPermissionsLPr(parser, ps.getLegacyPermissionState(), userId);
} break;
case TAG_SHARED_USER: {
@@ -5698,13 +5692,13 @@ public final class Settings implements Watchable, Snappable {
XmlUtils.skipCurrentTag(parser);
continue;
}
parsePermissionsLPr(parser, sus.getLegacyPermissionState(), userId);
parseLegacyPermissionsLPr(parser, sus.getLegacyPermissionState(), userId);
} break;
}
}
}
private void parsePermissionsLPr(TypedXmlPullParser parser,
private void parseLegacyPermissionsLPr(TypedXmlPullParser parser,
LegacyPermissionState permissionsState, int userId)
throws IOException, XmlPullParserException {
final int outerDepth = parser.getDepth();
@@ -5722,7 +5716,7 @@ public final class Settings implements Watchable, Snappable {
parser.getAttributeBoolean(null, ATTR_GRANTED, true);
final int flags =
parser.getAttributeIntHex(null, ATTR_FLAGS, 0);
permissionsState.putRuntimePermissionState(new PermissionState(name,
permissionsState.putPermissionState(new PermissionState(name, true,
granted, flags), userId);
}
break;

View File

@@ -19,7 +19,6 @@ package com.android.server.pm.permission;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -105,28 +104,14 @@ public final class LegacyPermissionState {
}
/**
* Put a install permission state.
*
* @param permissionState the permission state
*/
public void putInstallPermissionState(@NonNull PermissionState permissionState) {
putPermissionState(permissionState, UserHandle.USER_ALL);
}
/**
* Put a runtime permission state for a user.
* Put a permission state for a user.
*
* @param permissionState the permission state
* @param userId the user ID
*/
public void putRuntimePermissionState(@NonNull PermissionState permissionState,
public void putPermissionState(@NonNull PermissionState permissionState,
@UserIdInt int userId) {
checkUserId(userId);
putPermissionState(permissionState, userId);
}
private void putPermissionState(@NonNull PermissionState permissionState,
@UserIdInt int userId) {
UserState userState = mUserStates.get(userId);
if (userState == null) {
userState = new UserState();
@@ -156,16 +141,6 @@ public final class LegacyPermissionState {
return false;
}
/**
* Get all the install permission states.
*
* @return the install permission states
*/
@NonNull
public Collection<PermissionState> getInstallPermissionStates() {
return getPermissionStates(UserHandle.USER_ALL);
}
/**
* Get all the runtime permission states for a user.
*
@@ -173,13 +148,8 @@ public final class LegacyPermissionState {
* @return the runtime permission states
*/
@NonNull
public Collection<PermissionState> getRuntimePermissionStates(@UserIdInt int userId) {
public Collection<PermissionState> getPermissionStates(@UserIdInt int userId) {
checkUserId(userId);
return getPermissionStates(userId);
}
@NonNull
private Collection<PermissionState> getPermissionStates(@UserIdInt int userId) {
final UserState userState = mUserStates.get(userId);
if (userState == null) {
return Collections.emptyList();
@@ -265,6 +235,8 @@ public final class LegacyPermissionState {
@NonNull
private final String mName;
private final boolean mRuntime;
private final boolean mGranted;
private final int mFlags;
@@ -273,17 +245,20 @@ public final class LegacyPermissionState {
* Create a new instance of this class.
*
* @param name the name of the permission
* @param runtime whether the permission is runtime
* @param granted whether the permission is granted
* @param flags the permission flags
*/
public PermissionState(@NonNull String name, boolean granted, int flags) {
public PermissionState(@NonNull String name, boolean runtime, boolean granted, int flags) {
mName = name;
mRuntime = runtime;
mGranted = granted;
mFlags = flags;
}
private PermissionState(@NonNull PermissionState other) {
mName = other.mName;
mRuntime = other.mRuntime;
mGranted = other.mGranted;
mFlags = other.mFlags;
}
@@ -298,6 +273,15 @@ public final class LegacyPermissionState {
return mName;
}
/**
* Get whether the permission is a runtime permission.
*
* @return whether the permission is a runtime permission.
*/
public boolean isRuntime() {
return mRuntime;
}
/**
* Get whether the permission is granted.
*

View File

@@ -3965,8 +3965,7 @@ public class PermissionManagerService extends IPermissionManager.Stub {
if (!usedPermissions.contains(permissionState.getName())) {
Permission bp = mRegistry.getPermission(permissionState.getName());
if (bp != null) {
if (uidState.removePermissionState(bp.getName())
&& permissionState.isRuntime()) {
if (uidState.removePermissionState(bp.getName()) && bp.isRuntime()) {
runtimePermissionChanged = true;
}
}
@@ -4573,9 +4572,7 @@ public class PermissionManagerService extends IPermissionManager.Stub {
uidState.reset();
uidState.setMissing(legacyState.isMissing(userId));
readLegacyPermissionStatesLocked(uidState,
legacyState.getInstallPermissionStates());
readLegacyPermissionStatesLocked(uidState,
legacyState.getRuntimePermissionStates(userId));
legacyState.getPermissionStates(userId));
}
}
});
@@ -4634,12 +4631,9 @@ public class PermissionManagerService extends IPermissionManager.Stub {
final LegacyPermissionState.PermissionState legacyPermissionState =
new LegacyPermissionState.PermissionState(permissionState.getName(),
permissionState.getPermission().isRuntime(),
permissionState.isGranted(), permissionState.getFlags());
if (permissionState.isRuntime()) {
legacyState.putRuntimePermissionState(legacyPermissionState, userId);
} else {
legacyState.putInstallPermissionState(legacyPermissionState);
}
legacyState.putPermissionState(legacyPermissionState, userId);
}
}
}
@@ -4904,12 +4898,9 @@ public class PermissionManagerService extends IPermissionManager.Stub {
final LegacyPermissionState.PermissionState legacyPermissionState =
new LegacyPermissionState.PermissionState(permissionState.getName(),
permissionState.getPermission().isRuntime(),
permissionState.isGranted(), permissionState.getFlags());
if (permissionState.isRuntime()) {
legacyState.putRuntimePermissionState(legacyPermissionState, userId);
} else if (userId == UserHandle.USER_SYSTEM) {
legacyState.putInstallPermissionState(legacyPermissionState);
}
legacyState.putPermissionState(legacyPermissionState, userId);
}
}
}

View File

@@ -31,9 +31,6 @@ public final class PermissionState {
private final Object mLock = new Object();
@GuardedBy("mLock")
private boolean mRuntime;
@GuardedBy("mLock")
private boolean mGranted;
@@ -66,12 +63,6 @@ public final class PermissionState {
return mPermission.computeGids(userId);
}
public boolean isRuntime() {
synchronized (mLock) {
return mPermission.isRuntime();
}
}
public boolean isGranted() {
synchronized (mLock) {
return mGranted;