From 93b7ee4fce01df52a6607f0b1965cbafdfeaf1a6 Mon Sep 17 00:00:00 2001 From: Justin Klaassen Date: Tue, 10 Oct 2017 15:20:13 -0400 Subject: Import Android SDK Platform P [4386628] /google/data/ro/projects/android/fetch_artifact \ --bid 4386628 \ --target sdk_phone_armv7-win_sdk \ sdk-repo-linux-sources-4386628.zip AndroidVersion.ApiLevel has been modified to appear as 28 Change-Id: I9b8400ac92116cae4f033d173f7a5682b26ccba9 --- com/android/server/pm/Settings.java | 238 +++++++----------------------------- 1 file changed, 42 insertions(+), 196 deletions(-) (limited to 'com/android/server/pm/Settings.java') diff --git a/com/android/server/pm/Settings.java b/com/android/server/pm/Settings.java index 51d3e102..00844114 100644 --- a/com/android/server/pm/Settings.java +++ b/com/android/server/pm/Settings.java @@ -16,7 +16,6 @@ package com.android.server.pm; -import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; @@ -64,7 +63,6 @@ import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; -import android.os.storage.VolumeInfo; import android.service.pm.PackageServiceDumpProto; import android.text.TextUtils; import android.util.ArrayMap; @@ -87,10 +85,11 @@ import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.JournaledFile; import com.android.internal.util.XmlUtils; -import com.android.server.backup.PreferredActivityBackupHelper; import com.android.server.pm.Installer.InstallerException; -import com.android.server.pm.PackageManagerService.DumpState; -import com.android.server.pm.PermissionsState.PermissionState; +import com.android.server.pm.permission.BasePermission; +import com.android.server.pm.permission.PermissionSettings; +import com.android.server.pm.permission.PermissionsState; +import com.android.server.pm.permission.PermissionsState.PermissionState; import libcore.io.IoUtils; @@ -127,7 +126,7 @@ import java.util.Set; /** * Holds information about dynamic settings. */ -final class Settings { +public final class Settings { private static final String TAG = "PackageSettings"; /** @@ -176,7 +175,7 @@ final class Settings { private static final String TAG_READ_EXTERNAL_STORAGE = "read-external-storage"; private static final String ATTR_ENFORCEMENT = "enforcement"; - private static final String TAG_ITEM = "item"; + public static final String TAG_ITEM = "item"; private static final String TAG_DISABLED_COMPONENTS = "disabled-components"; private static final String TAG_ENABLED_COMPONENTS = "enabled-components"; private static final String TAG_PACKAGE_RESTRICTIONS = "package-restrictions"; @@ -201,7 +200,8 @@ final class Settings { private static final String TAG_DEFAULT_DIALER = "default-dialer"; private static final String TAG_VERSION = "version"; - private static final String ATTR_NAME = "name"; + public static final String ATTR_NAME = "name"; + public static final String ATTR_PACKAGE = "package"; private static final String ATTR_USER = "user"; private static final String ATTR_CODE = "code"; private static final String ATTR_GRANTED = "granted"; @@ -233,7 +233,6 @@ final class Settings { private static final String ATTR_VOLUME_UUID = "volumeUuid"; private static final String ATTR_SDK_VERSION = "sdkVersion"; private static final String ATTR_DATABASE_VERSION = "databaseVersion"; - private static final String ATTR_DONE = "done"; // Bookkeeping for restored permission grants private static final String TAG_RESTORED_RUNTIME_PERMISSIONS = "restored-perms"; @@ -379,10 +378,6 @@ final class Settings { private final ArrayMap mKeySetRefs = new ArrayMap(); - // Mapping from permission names to info about them. - final ArrayMap mPermissions = - new ArrayMap(); - // Mapping from permission tree names to info about them. final ArrayMap mPermissionTrees = new ArrayMap(); @@ -420,14 +415,16 @@ final class Settings { private final File mSystemDir; public final KeySetManagerService mKeySetManagerService = new KeySetManagerService(mPackages); + /** Settings and other information about permissions */ + private final PermissionSettings mPermissions; - Settings(Object lock) { - this(Environment.getDataDirectory(), lock); + Settings(PermissionSettings permissions, Object lock) { + this(Environment.getDataDirectory(), permissions, lock); } - Settings(File dataDir, Object lock) { + Settings(File dataDir, PermissionSettings permission, Object lock) { mLock = lock; - + mPermissions = permission; mRuntimePermissionsPersistence = new RuntimePermissionPersistence(mLock); mSystemDir = new File(dataDir, "system"); @@ -490,7 +487,7 @@ final class Settings { final PermissionsState perms = ps.getPermissionsState(); for (RestoredPermissionGrant grant : grants) { - BasePermission bp = mPermissions.get(grant.permissionName); + BasePermission bp = mPermissions.getPermission(grant.permissionName); if (bp != null) { if (grant.granted) { perms.grantRuntimePermission(bp, userId); @@ -507,6 +504,10 @@ final class Settings { writeRuntimePermissionsForUserLPr(userId, false); } + public boolean canPropagatePermissionToInstantApp(String permName) { + return mPermissions.canPropagatePermissionToInstantApp(permName); + } + void setInstallerPackageName(String pkgName, String installerPkgName) { PackageSetting p = mPackages.get(pkgName); if (p != null) { @@ -664,29 +665,11 @@ final class Settings { } } - // Transfer ownership of permissions from one package to another. - void transferPermissionsLPw(String origPkg, String newPkg) { - // Transfer ownership of permissions to the new package. - for (int i=0; i<2; i++) { - ArrayMap permissions = - i == 0 ? mPermissionTrees : mPermissions; - for (BasePermission bp : permissions.values()) { - if (origPkg.equals(bp.sourcePackage)) { - if (PackageManagerService.DEBUG_UPGRADE) Log.v(PackageManagerService.TAG, - "Moving permission " + bp.name - + " from pkg " + bp.sourcePackage - + " to " + newPkg); - bp.sourcePackage = newPkg; - bp.packageSetting = null; - bp.perm = null; - if (bp.pendingInfo != null) { - bp.pendingInfo.packageName = newPkg; - } - bp.uid = 0; - bp.setGids(null, false); - } - } - } + /** + * Transfers ownership of permissions from one package to another. + */ + void transferPermissionsLPw(String origPackageName, String newPackageName) { + mPermissions.transferPermissions(origPackageName, newPackageName, mPermissionTrees); } /** @@ -1074,7 +1057,7 @@ final class Settings { // Update permissions for (String eachPerm : deletedPs.pkg.requestedPermissions) { - BasePermission bp = mPermissions.get(eachPerm); + BasePermission bp = mPermissions.getPermission(eachPerm); if (bp == null) { continue; } @@ -2022,8 +2005,7 @@ final class Settings { // Specifically for backup/restore public void processRestoredPermissionGrantLPr(String pkgName, String permission, - boolean isGranted, int restoredFlagSet, int userId) - throws IOException, XmlPullParserException { + boolean isGranted, int restoredFlagSet, int userId) { mRuntimePermissionsPersistence.rememberRestoredUserGrantLPr( pkgName, permission, isGranted, restoredFlagSet, userId); } @@ -2225,7 +2207,7 @@ final class Settings { if (tagName.equals(TAG_ITEM)) { String name = parser.getAttributeValue(null, ATTR_NAME); - BasePermission bp = mPermissions.get(name); + BasePermission bp = mPermissions.getPermission(name); if (bp == null) { Slog.w(PackageManagerService.TAG, "Unknown permission: " + name); XmlUtils.skipCurrentTag(parser); @@ -2520,9 +2502,7 @@ final class Settings { serializer.endTag(null, "permission-trees"); serializer.startTag(null, "permissions"); - for (BasePermission bp : mPermissions.values()) { - writePermissionLPr(serializer, bp); - } + mPermissions.writePermissions(serializer); serializer.endTag(null, "permissions"); for (final PackageSetting pkg : mPackages.values()) { @@ -2605,9 +2585,6 @@ final class Settings { writeAllRuntimePermissionsLPr(); return; - } catch(XmlPullParserException e) { - Slog.wtf(PackageManagerService.TAG, "Unable to write package manager settings, " - + "current changes will be lost at reboot", e); } catch(java.io.IOException e) { Slog.wtf(PackageManagerService.TAG, "Unable to write package manager settings, " + "current changes will be lost at reboot", e); @@ -2951,7 +2928,6 @@ final class Settings { void writeUpgradeKeySetsLPr(XmlSerializer serializer, PackageKeySetData data) throws IOException { - long properSigning = data.getProperSigningKeySet(); if (data.isUsingUpgradeKeySets()) { for (long id : data.getUpgradeKeySets()) { serializer.startTag(null, "upgrade-keyset"); @@ -2971,32 +2947,8 @@ final class Settings { } } - void writePermissionLPr(XmlSerializer serializer, BasePermission bp) - throws XmlPullParserException, java.io.IOException { - if (bp.sourcePackage != null) { - serializer.startTag(null, TAG_ITEM); - serializer.attribute(null, ATTR_NAME, bp.name); - serializer.attribute(null, "package", bp.sourcePackage); - if (bp.protectionLevel != PermissionInfo.PROTECTION_NORMAL) { - serializer.attribute(null, "protection", Integer.toString(bp.protectionLevel)); - } - if (PackageManagerService.DEBUG_SETTINGS) - Log.v(PackageManagerService.TAG, "Writing perm: name=" + bp.name + " type=" - + bp.type); - if (bp.type == BasePermission.TYPE_DYNAMIC) { - final PermissionInfo pi = bp.perm != null ? bp.perm.info : bp.pendingInfo; - if (pi != null) { - serializer.attribute(null, "type", "dynamic"); - if (pi.icon != 0) { - serializer.attribute(null, "icon", Integer.toString(pi.icon)); - } - if (pi.nonLocalizedLabel != null) { - serializer.attribute(null, "label", pi.nonLocalizedLabel.toString()); - } - } - } - serializer.endTag(null, TAG_ITEM); - } + void writePermissionLPr(XmlSerializer serializer, BasePermission bp) throws IOException { + bp.writeLPr(serializer); } ArrayList getListOfIncompleteInstallPackagesLPr() { @@ -3088,9 +3040,9 @@ final class Settings { if (tagName.equals("package")) { readPackageLPw(parser); } else if (tagName.equals("permissions")) { - readPermissionsLPw(mPermissions, parser); + mPermissions.readPermissions(parser); } else if (tagName.equals("permission-trees")) { - readPermissionsLPw(mPermissionTrees, parser); + PermissionSettings.readPermissions(mPermissionTrees, parser); } else if (tagName.equals("shared-user")) { readSharedUserLPw(parser); } else if (tagName.equals("preferred-packages")) { @@ -3169,7 +3121,8 @@ final class Settings { } } else if (TAG_READ_EXTERNAL_STORAGE.equals(tagName)) { final String enforcement = parser.getAttributeValue(null, ATTR_ENFORCEMENT); - mReadExternalStorageEnforced = "1".equals(enforcement); + mReadExternalStorageEnforced = + "1".equals(enforcement) ? Boolean.TRUE : Boolean.FALSE; } else if (tagName.equals("keyset-settings")) { mKeySetManagerService.readKeySetsLPw(parser, mKeySetRefs); } else if (TAG_VERSION.equals(tagName)) { @@ -3593,72 +3546,6 @@ final class Settings { } } - private int readInt(XmlPullParser parser, String ns, String name, int defValue) { - String v = parser.getAttributeValue(ns, name); - try { - if (v == null) { - return defValue; - } - return Integer.parseInt(v); - } catch (NumberFormatException e) { - PackageManagerService.reportSettingsProblem(Log.WARN, - "Error in package manager settings: attribute " + name - + " has bad integer value " + v + " at " - + parser.getPositionDescription()); - } - return defValue; - } - - private void readPermissionsLPw(ArrayMap out, XmlPullParser parser) - throws IOException, XmlPullParserException { - int outerDepth = parser.getDepth(); - int type; - while ((type = parser.next()) != XmlPullParser.END_DOCUMENT - && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { - if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { - continue; - } - - final String tagName = parser.getName(); - if (tagName.equals(TAG_ITEM)) { - final String name = parser.getAttributeValue(null, ATTR_NAME); - final String sourcePackage = parser.getAttributeValue(null, "package"); - final String ptype = parser.getAttributeValue(null, "type"); - if (name != null && sourcePackage != null) { - final boolean dynamic = "dynamic".equals(ptype); - BasePermission bp = out.get(name); - // If the permission is builtin, do not clobber it. - if (bp == null || bp.type != BasePermission.TYPE_BUILTIN) { - bp = new BasePermission(name.intern(), sourcePackage, - dynamic ? BasePermission.TYPE_DYNAMIC : BasePermission.TYPE_NORMAL); - } - bp.protectionLevel = readInt(parser, null, "protection", - PermissionInfo.PROTECTION_NORMAL); - bp.protectionLevel = PermissionInfo.fixProtectionLevel(bp.protectionLevel); - if (dynamic) { - 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.protectionLevel; - bp.pendingInfo = pi; - } - out.put(bp.name, bp); - } else { - PackageManagerService.reportSettingsProblem(Log.WARN, - "Error in package manager settings: permissions has" + " no name at " - + parser.getPositionDescription()); - } - } else { - PackageManagerService.reportSettingsProblem(Log.WARN, - "Unknown element reading permissions: " + parser.getName() + " at " - + parser.getPositionDescription()); - } - XmlUtils.skipCurrentTag(parser); - } - } - private void readDisabledSysPackageLPw(XmlPullParser parser) throws XmlPullParserException, IOException { String name = parser.getAttributeValue(null, ATTR_NAME); @@ -4385,10 +4272,6 @@ final class Settings { return ps; } - private String compToString(ArraySet cmp) { - return cmp != null ? Arrays.toString(cmp.toArray()) : "[]"; - } - boolean isEnabledAndMatchLPr(ComponentInfo componentInfo, int flags, int userId) { final PackageSetting ps = mPackages.get(componentInfo.packageName); if (ps == null) return false; @@ -5001,45 +4884,8 @@ final class Settings { void dumpPermissionsLPr(PrintWriter pw, String packageName, ArraySet permissionNames, DumpState dumpState) { - boolean printedSomething = false; - for (BasePermission p : mPermissions.values()) { - if (packageName != null && !packageName.equals(p.sourcePackage)) { - continue; - } - if (permissionNames != null && !permissionNames.contains(p.name)) { - continue; - } - if (!printedSomething) { - if (dumpState.onTitlePrinted()) - pw.println(); - pw.println("Permissions:"); - printedSomething = true; - } - pw.print(" Permission ["); pw.print(p.name); pw.print("] ("); - pw.print(Integer.toHexString(System.identityHashCode(p))); - pw.println("):"); - pw.print(" sourcePackage="); pw.println(p.sourcePackage); - pw.print(" uid="); pw.print(p.uid); - pw.print(" gids="); pw.print(Arrays.toString( - p.computeGids(UserHandle.USER_SYSTEM))); - pw.print(" type="); pw.print(p.type); - pw.print(" prot="); - pw.println(PermissionInfo.protectionToString(p.protectionLevel)); - if (p.perm != null) { - pw.print(" perm="); pw.println(p.perm); - if ((p.perm.info.flags & PermissionInfo.FLAG_INSTALLED) == 0 - || (p.perm.info.flags & PermissionInfo.FLAG_REMOVED) != 0) { - pw.print(" flags=0x"); pw.println(Integer.toHexString(p.perm.info.flags)); - } - } - if (p.packageSetting != null) { - pw.print(" packageSetting="); pw.println(p.packageSetting); - } - if (READ_EXTERNAL_STORAGE.equals(p.name)) { - pw.print(" enforced="); - pw.println(mReadExternalStorageEnforced); - } - } + mPermissions.dumpPermissions(pw, packageName, permissionNames, + (mReadExternalStorageEnforced == Boolean.TRUE), dumpState); } void dumpSharedUsersLPr(PrintWriter pw, String packageName, ArraySet permissionNames, @@ -5248,7 +5094,7 @@ final class Settings { private final Handler mHandler = new MyHandler(); - private final Object mLock; + private final Object mPersistenceLock; @GuardedBy("mLock") private final SparseBooleanArray mWriteScheduled = new SparseBooleanArray(); @@ -5265,8 +5111,8 @@ final class Settings { // The mapping keys are user ids. private final SparseBooleanArray mDefaultPermissionsGranted = new SparseBooleanArray(); - public RuntimePermissionPersistence(Object lock) { - mLock = lock; + public RuntimePermissionPersistence(Object persistenceLock) { + mPersistenceLock = persistenceLock; } public boolean areDefaultRuntimPermissionsGrantedLPr(int userId) { @@ -5321,7 +5167,7 @@ final class Settings { ArrayMap> permissionsForPackage = new ArrayMap<>(); ArrayMap> permissionsForSharedUser = new ArrayMap<>(); - synchronized (mLock) { + synchronized (mPersistenceLock) { mWriteScheduled.delete(userId); final int packageCount = mPackages.size(); @@ -5470,7 +5316,7 @@ final class Settings { PermissionsState permissionsState = sb.getPermissionsState(); for (PermissionState permissionState : permissionsState.getRuntimePermissionStates(userId)) { - BasePermission bp = mPermissions.get(permissionState.getName()); + BasePermission bp = mPermissions.getPermission(permissionState.getName()); if (bp != null) { permissionsState.revokeRuntimePermission(bp, userId); permissionsState.updatePermissionFlags(bp, userId, @@ -5631,7 +5477,7 @@ final class Settings { switch (parser.getName()) { case TAG_ITEM: { String name = parser.getAttributeValue(null, ATTR_NAME); - BasePermission bp = mPermissions.get(name); + BasePermission bp = mPermissions.getPermission(name); if (bp == null) { Slog.w(PackageManagerService.TAG, "Unknown permission:" + name); XmlUtils.skipCurrentTag(parser); -- cgit v1.2.3