From 7b6dc8af9009961ef2defab70c67767ca4601e56 Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Fri, 16 Oct 2020 17:03:35 -0700 Subject: [PATCH] Third refactor for BasePermission. Make mPermissionInfo non-null and remove duplicate fields, to make sure we have a single source of truth. The previous nullness of mPermissionInfo is now equivalently represented by the boolean field mReconciled. mPendingPermissionInfo is also removed, which results in a slight change of behavior but I believe it's okay looking at the logic. Bug: 158736025 Test: presubmit Change-Id: Ic346a7c3e2811326da3748368af32153b921476d --- .../server/pm/permission/BasePermission.java | 346 +++++++++--------- .../permission/PermissionManagerService.java | 4 +- 2 files changed, 174 insertions(+), 176 deletions(-) diff --git a/services/core/java/com/android/server/pm/permission/BasePermission.java b/services/core/java/com/android/server/pm/permission/BasePermission.java index 667414e9cc726..6ffc5983417a5 100644 --- a/services/core/java/com/android/server/pm/permission/BasePermission.java +++ b/services/core/java/com/android/server/pm/permission/BasePermission.java @@ -16,16 +16,6 @@ package com.android.server.pm.permission; -import static android.Manifest.permission.READ_EXTERNAL_STORAGE; -import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; -import static android.content.pm.PermissionInfo.PROTECTION_NORMAL; -import static android.content.pm.PermissionInfo.PROTECTION_SIGNATURE; -import static android.content.pm.PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM; - -import static com.android.server.pm.Settings.ATTR_NAME; -import static com.android.server.pm.Settings.ATTR_PACKAGE; -import static com.android.server.pm.Settings.TAG_ITEM; - import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -58,42 +48,38 @@ import java.util.Objects; import java.util.Set; public final class BasePermission { - static final String TAG = "PackageManager"; + private static final String TAG = "PackageManager"; - public static final int TYPE_NORMAL = 0; - public static final int TYPE_BUILTIN = 1; + public static final int TYPE_MANIFEST = 0; + public static final int TYPE_CONFIG = 1; public static final int TYPE_DYNAMIC = 2; - @IntDef(value = { - TYPE_NORMAL, - TYPE_BUILTIN, - TYPE_DYNAMIC, + @IntDef({ + TYPE_MANIFEST, + TYPE_CONFIG, + TYPE_DYNAMIC, }) @Retention(RetentionPolicy.SOURCE) public @interface PermissionType {} - @IntDef(value = { - PROTECTION_DANGEROUS, - PROTECTION_NORMAL, - PROTECTION_SIGNATURE, - PROTECTION_SIGNATURE_OR_SYSTEM, + @IntDef({ + PermissionInfo.PROTECTION_DANGEROUS, + PermissionInfo.PROTECTION_NORMAL, + PermissionInfo.PROTECTION_SIGNATURE, + PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM, }) @Retention(RetentionPolicy.SOURCE) public @interface ProtectionLevel {} + private static final String ATTR_NAME = "name"; + private static final String ATTR_PACKAGE = "package"; + private static final String TAG_ITEM = "item"; + @NonNull - private final String mName; - - private final @PermissionType int mType; - - private String mPackageName; - - private int mProtectionLevel; - - @Nullable private PermissionInfo mPermissionInfo; - @Nullable - private PermissionInfo mPendingPermissionInfo; + private boolean mReconciled; + + private final @PermissionType int mType; /** UID that owns the definition of this permission */ private int mUid; @@ -109,30 +95,31 @@ public final class BasePermission { private boolean mGidsPerUser; public BasePermission(@NonNull String name, String packageName, @PermissionType int type) { - mName = name; - mPackageName = packageName; - mType = type; + mPermissionInfo = new PermissionInfo(); + mPermissionInfo.name = name; + mPermissionInfo.packageName = packageName; // Default to most conservative protection level. - mProtectionLevel = PermissionInfo.PROTECTION_SIGNATURE; + mPermissionInfo.protectionLevel = PermissionInfo.PROTECTION_SIGNATURE; + mType = type; } @Override public String toString() { - return "BasePermission{" + Integer.toHexString(System.identityHashCode(this)) + " " + mName - + "}"; + return "BasePermission{" + Integer.toHexString(System.identityHashCode(this)) + " " + + mPermissionInfo.name + "}"; } @NonNull public String getName() { - return mName; + return mPermissionInfo.name; } public int getProtectionLevel() { - return mProtectionLevel; + return mPermissionInfo.protectionLevel; } public String getPackageName() { - return mPackageName; + return mPermissionInfo.packageName; } public int getType() { @@ -149,7 +136,16 @@ public final class BasePermission { } public void setPermissionInfo(@Nullable PermissionInfo permissionInfo) { - mPermissionInfo = permissionInfo; + if (permissionInfo != null) { + mPermissionInfo = permissionInfo; + } else { + final PermissionInfo newPermissionInfo = new PermissionInfo(); + newPermissionInfo.name = mPermissionInfo.name; + newPermissionInfo.packageName = mPermissionInfo.packageName; + newPermissionInfo.protectionLevel = mPermissionInfo.protectionLevel; + mPermissionInfo = newPermissionInfo; + } + mReconciled = permissionInfo != null; } public boolean hasGids() { @@ -172,7 +168,7 @@ public final class BasePermission { public int calculateFootprint(BasePermission perm) { if (mUid == perm.mUid) { - return perm.mName.length() + perm.mPermissionInfo.calculateFootprint(); + return perm.mPermissionInfo.name.length() + perm.mPermissionInfo.calculateFootprint(); } return 0; } @@ -190,128 +186,143 @@ public final class BasePermission { } public boolean isNormal() { - return (mProtectionLevel & PermissionInfo.PROTECTION_MASK_BASE) + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) == PermissionInfo.PROTECTION_NORMAL; } public boolean isRuntime() { - return (mProtectionLevel & PermissionInfo.PROTECTION_MASK_BASE) + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) == PermissionInfo.PROTECTION_DANGEROUS; } public boolean isInstalled() { - return mPermissionInfo != null - && (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLED) != 0; + return (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLED) != 0; } public boolean isRemoved() { - return mPermissionInfo != null - && (mPermissionInfo.flags & PermissionInfo.FLAG_REMOVED) != 0; + return (mPermissionInfo.flags & PermissionInfo.FLAG_REMOVED) != 0; } public boolean isSoftRestricted() { - return mPermissionInfo != null - && (mPermissionInfo.flags & PermissionInfo.FLAG_SOFT_RESTRICTED) != 0; + return (mPermissionInfo.flags & PermissionInfo.FLAG_SOFT_RESTRICTED) != 0; } public boolean isHardRestricted() { - return mPermissionInfo != null - && (mPermissionInfo.flags & PermissionInfo.FLAG_HARD_RESTRICTED) != 0; + return (mPermissionInfo.flags & PermissionInfo.FLAG_HARD_RESTRICTED) != 0; } public boolean isHardOrSoftRestricted() { - return mPermissionInfo != null && (mPermissionInfo.flags - & (PermissionInfo.FLAG_HARD_RESTRICTED | PermissionInfo.FLAG_SOFT_RESTRICTED)) != 0; + return (mPermissionInfo.flags & (PermissionInfo.FLAG_HARD_RESTRICTED + | PermissionInfo.FLAG_SOFT_RESTRICTED)) != 0; } public boolean isImmutablyRestricted() { - return mPermissionInfo != null - && (mPermissionInfo.flags & PermissionInfo.FLAG_IMMUTABLY_RESTRICTED) != 0; + return (mPermissionInfo.flags & PermissionInfo.FLAG_IMMUTABLY_RESTRICTED) != 0; } public boolean isInstallerExemptIgnored() { - return mPermissionInfo != null - && (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLER_EXEMPT_IGNORED) != 0; + return (mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLER_EXEMPT_IGNORED) != 0; } public boolean isSignature() { - return (mProtectionLevel & PermissionInfo.PROTECTION_MASK_BASE) + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) == PermissionInfo.PROTECTION_SIGNATURE; } public boolean isAppOp() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_APPOP) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_APPOP) != 0; } + public boolean isDevelopment() { - return isSignature() - && (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0; + return isSignature() && (mPermissionInfo.protectionLevel + & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0; } + public boolean isInstaller() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0; } + public boolean isInstant() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_INSTANT) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_INSTANT) != 0; } - public boolean isOEM() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_OEM) != 0; + + public boolean isOem() { + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_OEM) != 0; } + public boolean isPre23() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_PRE23) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_PRE23) != 0; } + public boolean isPreInstalled() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0; } + public boolean isPrivileged() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0; } + public boolean isRuntimeOnly() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) != 0; } + public boolean isSetup() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_SETUP) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_SETUP) != 0; } + public boolean isVerifier() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0; } + public boolean isVendorPrivileged() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_VENDOR_PRIVILEGED) != 0; - } - public boolean isSystemTextClassifier() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER) + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_VENDOR_PRIVILEGED) != 0; } + + public boolean isSystemTextClassifier() { + return (mPermissionInfo.protectionLevel + & PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER) != 0; + } + public boolean isWellbeing() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_WELLBEING) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_WELLBEING) != 0; } + public boolean isDocumenter() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_DOCUMENTER) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_DOCUMENTER) != 0; } + public boolean isConfigurator() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_CONFIGURATOR) - != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_CONFIGURATOR) != 0; } + public boolean isIncidentReportApprover() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_INCIDENT_REPORT_APPROVER) != 0; + return (mPermissionInfo.protectionLevel + & PermissionInfo.PROTECTION_FLAG_INCIDENT_REPORT_APPROVER) != 0; } + public boolean isAppPredictor() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_APP_PREDICTOR) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_APP_PREDICTOR) + != 0; } + public boolean isCompanion() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_COMPANION) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_COMPANION) != 0; } public boolean isRetailDemo() { - return (mProtectionLevel & PermissionInfo.PROTECTION_FLAG_RETAIL_DEMO) != 0; + return (mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_FLAG_RETAIL_DEMO) != 0; } public void transfer(@NonNull String origPackageName, @NonNull String newPackageName) { - if (!origPackageName.equals(mPackageName)) { + if (!origPackageName.equals(mPermissionInfo.packageName)) { return; } - mPackageName = newPackageName; - mPermissionInfo = null; - if (mPendingPermissionInfo != null) { - mPendingPermissionInfo.packageName = newPackageName; - } + final PermissionInfo newPermissionInfo = new PermissionInfo(); + newPermissionInfo.name = mPermissionInfo.name; + newPermissionInfo.packageName = newPackageName; + newPermissionInfo.protectionLevel = mPermissionInfo.protectionLevel; + mPermissionInfo = newPermissionInfo; + mReconciled = false; mUid = 0; mGids = EmptyArray.INT; mGidsPerUser = false; @@ -320,16 +331,16 @@ public final class BasePermission { public boolean addToTree(@ProtectionLevel int protectionLevel, @NonNull PermissionInfo permissionInfo, @NonNull BasePermission tree) { final boolean changed = - (mProtectionLevel != protectionLevel - || mPermissionInfo == null + (mPermissionInfo.protectionLevel != protectionLevel + || !mReconciled || mUid != tree.mUid || !Objects.equals(mPermissionInfo.packageName, tree.mPermissionInfo.packageName) || !comparePermissionInfos(mPermissionInfo, permissionInfo)); - mProtectionLevel = protectionLevel; mPermissionInfo = new PermissionInfo(permissionInfo); - mPermissionInfo.protectionLevel = protectionLevel; mPermissionInfo.packageName = tree.mPermissionInfo.packageName; + mPermissionInfo.protectionLevel = protectionLevel; + mReconciled = true; mUid = tree.mUid; return changed; } @@ -337,13 +348,12 @@ public final class BasePermission { public void updateDynamicPermission(Collection permissionTrees) { if (PackageManagerService.DEBUG_SETTINGS) Log.v(TAG, "Dynamic permission: name=" + getName() + " pkg=" + getPackageName() - + " info=" + mPendingPermissionInfo); - if (mPendingPermissionInfo != null) { - final BasePermission tree = findPermissionTree(permissionTrees, mName); - if (tree != null && tree.mPermissionInfo != null) { - mPermissionInfo = new PermissionInfo(mPendingPermissionInfo); + + " info=" + mPermissionInfo); + if (mType == TYPE_DYNAMIC) { + final BasePermission tree = findPermissionTree(permissionTrees, mPermissionInfo.name); + if (tree != null) { mPermissionInfo.packageName = tree.mPermissionInfo.packageName; - mPermissionInfo.name = mName; + mReconciled = true; mUid = tree.mUid; } } @@ -354,9 +364,9 @@ public final class BasePermission { @NonNull AndroidPackage pkg, Collection permissionTrees, boolean chatty) { // Allow system apps to redefine non-system permissions - if (bp != null && !Objects.equals(bp.mPackageName, p.packageName)) { + if (bp != null && !Objects.equals(bp.mPermissionInfo.packageName, p.packageName)) { final boolean currentOwnerIsSystem; - if (bp.mPermissionInfo == null) { + if (!bp.mReconciled) { currentOwnerIsSystem = false; } else { AndroidPackage currentPackage = packageManagerInternal.getPackage( @@ -369,34 +379,34 @@ public final class BasePermission { } if (pkg.isSystem()) { - if (bp.mType == BasePermission.TYPE_BUILTIN && bp.mPermissionInfo == null) { + if (bp.mType == BasePermission.TYPE_CONFIG && !bp.mReconciled) { // It's a built-in permission and no owner, take ownership now p.flags |= PermissionInfo.FLAG_INSTALLED; bp.mPermissionInfo = p; + bp.mReconciled = true; bp.mUid = pkg.getUid(); - bp.mPackageName = p.packageName; } else if (!currentOwnerIsSystem) { String msg = "New decl " + pkg + " of permission " - + p.name + " is system; overriding " + bp.mPackageName; + + p.name + " is system; overriding " + bp.mPermissionInfo.packageName; PackageManagerService.reportSettingsProblem(Log.WARN, msg); bp = null; } } } if (bp == null) { - bp = new BasePermission(p.name, p.packageName, TYPE_NORMAL); + bp = new BasePermission(p.name, p.packageName, TYPE_MANIFEST); } StringBuilder r = null; - if (bp.mPermissionInfo == null) { - if (bp.mPackageName == null - || bp.mPackageName.equals(p.packageName)) { + if (!bp.mReconciled) { + if (bp.mPermissionInfo.packageName == null + || bp.mPermissionInfo.packageName.equals(p.packageName)) { final BasePermission tree = findPermissionTree(permissionTrees, p.name); if (tree == null - || tree.mPackageName.equals(p.packageName)) { + || tree.mPermissionInfo.packageName.equals(p.packageName)) { p.flags |= PermissionInfo.FLAG_INSTALLED; bp.mPermissionInfo = p; + bp.mReconciled = true; bp.mUid = pkg.getUid(); - bp.mPackageName = p.packageName; if (chatty) { if (r == null) { r = new StringBuilder(256); @@ -408,13 +418,13 @@ public final class BasePermission { } else { Slog.w(TAG, "Permission " + p.name + " from package " + p.packageName + " ignored: base tree " - + tree.mName + " is from package " - + tree.mPackageName); + + tree.mPermissionInfo.name + " is from package " + + tree.mPermissionInfo.packageName); } } else { Slog.w(TAG, "Permission " + p.name + " from package " + p.packageName + " ignored: original from " - + bp.mPackageName); + + bp.mPermissionInfo.packageName); } } else if (chatty) { if (r == null) { @@ -425,9 +435,6 @@ public final class BasePermission { r.append("DUP:"); r.append(p.name); } - if (bp.mPermissionInfo == p) { - bp.mProtectionLevel = p.protectionLevel; - } if (PackageManagerService.DEBUG_PACKAGE_SCANNING && r != null) { Log.d(TAG, " Permissions: " + r); } @@ -444,7 +451,7 @@ public final class BasePermission { } throw new SecurityException("Calling uid " + callingUid + " is not allowed to add to permission tree " - + bp.mName + " owned by uid " + bp.mUid); + + bp.mPermissionInfo.name + " owned by uid " + bp.mUid); } } throw new SecurityException("No permission tree found for " + permName); @@ -453,9 +460,9 @@ public final class BasePermission { private static BasePermission findPermissionTree( Collection permissionTrees, String permName) { for (BasePermission bp : permissionTrees) { - if (permName.startsWith(bp.mName) - && permName.length() > bp.mName.length() - && permName.charAt(bp.mName.length()) == '.') { + if (permName.startsWith(bp.mPermissionInfo.name) + && permName.length() > bp.mPermissionInfo.name.length() + && permName.charAt(bp.mPermissionInfo.name.length()) == '.') { return bp; } } @@ -464,20 +471,20 @@ public final class BasePermission { @Nullable public String getBackgroundPermission() { - return mPermissionInfo != null ? mPermissionInfo.backgroundPermission : null; + return mPermissionInfo.backgroundPermission; } @Nullable public String getGroup() { - return mPermissionInfo != null ? mPermissionInfo.group : null; + return mPermissionInfo.group; } public int getProtection() { - return mProtectionLevel & PermissionInfo.PROTECTION_MASK_BASE; + return mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE; } public int getProtectionFlags() { - return mProtectionLevel & PermissionInfo.PROTECTION_MASK_FLAGS; + return mPermissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_FLAGS; } @NonNull @@ -495,17 +502,18 @@ public final class BasePermission { } } else { permissionInfo = new PermissionInfo(); - permissionInfo.name = mName; - permissionInfo.packageName = mPackageName; - permissionInfo.nonLocalizedLabel = mName; + permissionInfo.name = mPermissionInfo.name; + permissionInfo.packageName = mPermissionInfo.packageName; + permissionInfo.nonLocalizedLabel = mPermissionInfo.name; } if (targetSdkVersion >= Build.VERSION_CODES.O) { - permissionInfo.protectionLevel = mProtectionLevel; + permissionInfo.protectionLevel = mPermissionInfo.protectionLevel; } else { - final int protection = mProtectionLevel & PermissionInfo.PROTECTION_MASK_BASE; + final int protection = mPermissionInfo.protectionLevel + & PermissionInfo.PROTECTION_MASK_BASE; if (protection == PermissionInfo.PROTECTION_SIGNATURE) { // Signature permission's protection flags are always reported. - permissionInfo.protectionLevel = mProtectionLevel; + permissionInfo.protectionLevel = mPermissionInfo.protectionLevel; } else { permissionInfo.protectionLevel = protection; } @@ -520,9 +528,9 @@ public final class BasePermission { return false; } final String name = parser.getAttributeValue(null, ATTR_NAME); - final String sourcePackage = parser.getAttributeValue(null, ATTR_PACKAGE); + final String packageName = parser.getAttributeValue(null, ATTR_PACKAGE); final String ptype = parser.getAttributeValue(null, "type"); - if (name == null || sourcePackage == null) { + if (name == null || packageName == null) { PackageManagerService.reportSettingsProblem(Log.WARN, "Error in package manager settings: permissions has" + " no name at " + parser.getPositionDescription()); @@ -531,23 +539,19 @@ public final class BasePermission { final boolean dynamic = "dynamic".equals(ptype); BasePermission bp = out.get(name); // If the permission is builtin, do not clobber it. - if (bp == null || bp.mType != TYPE_BUILTIN) { - bp = new BasePermission(name.intern(), sourcePackage, - dynamic ? TYPE_DYNAMIC : TYPE_NORMAL); + if (bp == null || bp.mType != TYPE_CONFIG) { + bp = new BasePermission(name.intern(), packageName, + dynamic ? TYPE_DYNAMIC : TYPE_MANIFEST); } - bp.mProtectionLevel = readInt(parser, null, "protection", + bp.mPermissionInfo.protectionLevel = readInt(parser, null, "protection", PermissionInfo.PROTECTION_NORMAL); - bp.mProtectionLevel = PermissionInfo.fixProtectionLevel(bp.mProtectionLevel); + bp.mPermissionInfo.protectionLevel = PermissionInfo.fixProtectionLevel( + bp.mPermissionInfo.protectionLevel); if (dynamic) { - final PermissionInfo pi = new PermissionInfo(); - pi.packageName = sourcePackage.intern(); - pi.name = name.intern(); - pi.icon = readInt(parser, null, "icon", 0); - pi.nonLocalizedLabel = parser.getAttributeValue(null, "label"); - pi.protectionLevel = bp.mProtectionLevel; - bp.mPendingPermissionInfo = pi; + bp.mPermissionInfo.icon = readInt(parser, null, "icon", 0); + bp.mPermissionInfo.nonLocalizedLabel = parser.getAttributeValue(null, "label"); } - out.put(bp.mName, bp); + out.put(bp.mPermissionInfo.name, bp); return true; } @@ -568,30 +572,23 @@ public final class BasePermission { } public void writeLPr(@NonNull XmlSerializer serializer) throws IOException { - if (mPackageName == null) { + if (mPermissionInfo.packageName == null) { return; } serializer.startTag(null, TAG_ITEM); - serializer.attribute(null, ATTR_NAME, mName); - serializer.attribute(null, ATTR_PACKAGE, mPackageName); - if (mProtectionLevel != PermissionInfo.PROTECTION_NORMAL) { - serializer.attribute(null, "protection", Integer.toString(mProtectionLevel)); + serializer.attribute(null, ATTR_NAME, mPermissionInfo.name); + serializer.attribute(null, ATTR_PACKAGE, mPermissionInfo.packageName); + if (mPermissionInfo.protectionLevel != PermissionInfo.PROTECTION_NORMAL) { + serializer.attribute(null, "protection", + Integer.toString(mPermissionInfo.protectionLevel)); } - if (mType == BasePermission.TYPE_DYNAMIC) { - if (mPermissionInfo != null || mPendingPermissionInfo != null) { - serializer.attribute(null, "type", "dynamic"); - int icon = mPermissionInfo != null ? mPermissionInfo.icon - : mPendingPermissionInfo.icon; - CharSequence nonLocalizedLabel = mPermissionInfo != null - ? mPermissionInfo.nonLocalizedLabel - : mPendingPermissionInfo.nonLocalizedLabel; - - if (icon != 0) { - serializer.attribute(null, "icon", Integer.toString(icon)); - } - if (nonLocalizedLabel != null) { - serializer.attribute(null, "label", nonLocalizedLabel.toString()); - } + if (mType == TYPE_DYNAMIC) { + serializer.attribute(null, "type", "dynamic"); + if (mPermissionInfo.icon != 0) { + serializer.attribute(null, "icon", Integer.toString(mPermissionInfo.icon)); + } + if (mPermissionInfo.nonLocalizedLabel != null) { + serializer.attribute(null, "label", mPermissionInfo.nonLocalizedLabel.toString()); } } serializer.endTag(null, TAG_ITEM); @@ -616,10 +613,10 @@ public final class BasePermission { public boolean dumpPermissionsLPr(@NonNull PrintWriter pw, @NonNull String packageName, @NonNull Set permissionNames, boolean readEnforced, boolean printedSomething, @NonNull DumpState dumpState) { - if (packageName != null && !packageName.equals(mPackageName)) { + if (packageName != null && !packageName.equals(mPermissionInfo.packageName)) { return false; } - if (permissionNames != null && !permissionNames.contains(mName)) { + if (permissionNames != null && !permissionNames.contains(mPermissionInfo.name)) { return false; } if (!printedSomething) { @@ -627,15 +624,15 @@ public final class BasePermission { pw.println(); pw.println("Permissions:"); } - pw.print(" Permission ["); pw.print(mName); pw.print("] ("); + pw.print(" Permission ["); pw.print(mPermissionInfo.name); pw.print("] ("); pw.print(Integer.toHexString(System.identityHashCode(this))); pw.println("):"); - pw.print(" sourcePackage="); pw.println(mPackageName); + pw.print(" sourcePackage="); pw.println(mPermissionInfo.packageName); pw.print(" uid="); pw.print(mUid); pw.print(" gids="); pw.print(Arrays.toString(computeGids(UserHandle.USER_SYSTEM))); pw.print(" type="); pw.print(mType); pw.print(" prot="); - pw.println(PermissionInfo.protectionToString(mProtectionLevel)); + pw.println(PermissionInfo.protectionToString(mPermissionInfo.protectionLevel)); if (mPermissionInfo != null) { pw.print(" perm="); pw.println(mPermissionInfo); if ((mPermissionInfo.flags & PermissionInfo.FLAG_INSTALLED) == 0 @@ -643,7 +640,8 @@ public final class BasePermission { pw.print(" flags=0x"); pw.println(Integer.toHexString(mPermissionInfo.flags)); } } - if (READ_EXTERNAL_STORAGE.equals(mName)) { + if (Objects.equals(mPermissionInfo.name, + android.Manifest.permission.READ_EXTERNAL_STORAGE)) { pw.print(" enforced="); pw.println(readEnforced); } diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index d871325fe8297..c8fddbd5d7719 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -411,7 +411,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { final SystemConfig.PermissionEntry perm = permConfig.valueAt(i); BasePermission bp = mSettings.getPermissionLocked(perm.name); if (bp == null) { - bp = new BasePermission(perm.name, "android", BasePermission.TYPE_BUILTIN); + bp = new BasePermission(perm.name, "android", BasePermission.TYPE_CONFIG); mSettings.putPermissionLocked(perm.name, bp); } if (perm.gids != null) { @@ -3300,7 +3300,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { PackageParser.SigningDetails.CertCapabilities.PERMISSION); final boolean isVendorPrivilegedPermission = bp.isVendorPrivileged(); final boolean isPrivilegedPermission = bp.isPrivileged() || isVendorPrivilegedPermission; - final boolean isOemPermission = bp.isOEM(); + final boolean isOemPermission = bp.isOem(); if (!allowed && (isPrivilegedPermission || isOemPermission) && pkg.isSystem()) { final String permissionName = bp.getName(); // For updated system applications, a privileged/oem permission