diff options
| author | 2017-07-28 17:03:00 +0000 | |
|---|---|---|
| committer | 2017-07-28 17:03:00 +0000 | |
| commit | ac718ee66bacf16baf859b51de39ce443d68b496 (patch) | |
| tree | 38a7d978c93b197d1276fa83712053a91016d642 | |
| parent | aa6f03639a3cfbcdc0ea9849c6dac2ae58d2c529 (diff) | |
| parent | 899f54da720011d02c802958c232e1baa2941378 (diff) | |
Merge "Report permission flags for all protections based on SDK am: adb8c522a8 am: 436b901dbb" into oc-mr1-dev
4 files changed, 54 insertions, 9 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index acceed05943c..7fc9a69a1f92 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -285,7 +285,8 @@ public class ApplicationPackageManager extends PackageManager { public PermissionInfo getPermissionInfo(String name, int flags) throws NameNotFoundException { try { - PermissionInfo pi = mPM.getPermissionInfo(name, flags); + PermissionInfo pi = mPM.getPermissionInfo(name, + mContext.getOpPackageName(), flags); if (pi != null) { return pi; } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 9b795aa58a26..64d687e9d3de 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -72,7 +72,7 @@ interface IPackageManager { String[] currentToCanonicalPackageNames(in String[] names); String[] canonicalToCurrentPackageNames(in String[] names); - PermissionInfo getPermissionInfo(String name, int flags); + PermissionInfo getPermissionInfo(String name, String packageName, int flags); ParceledListSlice queryPermissionsByGroup(String group, int flags); diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 739497b771aa..7c7eda7a3efe 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -802,7 +802,7 @@ public final class BroadcastQueue { IPackageManager pm = AppGlobals.getPackageManager(); for (int i = perms.length-1; i >= 0; i--) { try { - PermissionInfo pi = pm.getPermissionInfo(perms[i], 0); + PermissionInfo pi = pm.getPermissionInfo(perms[i], "android", 0); if ((pi.protectionLevel & (PermissionInfo.PROTECTION_MASK_BASE | PermissionInfo.PROTECTION_FLAG_PRIVILEGED)) != PermissionInfo.PROTECTION_SIGNATURE) { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index b74f1832b8fa..66e6f5e91500 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4223,18 +4223,62 @@ public class PackageManagerService extends IPackageManager.Stub } @Override - public PermissionInfo getPermissionInfo(String name, int flags) { - if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + public PermissionInfo getPermissionInfo(String name, String packageName, int flags) { + final int callingUid = Binder.getCallingUid(); + if (getInstantAppPackageName(callingUid) != null) { return null; } // reader synchronized (mPackages) { final BasePermission p = mSettings.mPermissions.get(name); - if (p != null) { - return generatePermissionInfo(p, flags); - } - return null; + // If the caller is an app that targets pre 26 SDK drop protection flags. + final PermissionInfo permissionInfo = generatePermissionInfo(p, flags); + permissionInfo.protectionLevel = adjustPermissionProtectionFlagsLPr( + permissionInfo.protectionLevel, packageName, callingUid); + return permissionInfo; + } + } + + private int adjustPermissionProtectionFlagsLPr(int protectionLevel, + String packageName, int uid) { + // Signature permission flags area always reported + final int protectionLevelMasked = protectionLevel + & (PermissionInfo.PROTECTION_NORMAL + | PermissionInfo.PROTECTION_DANGEROUS + | PermissionInfo.PROTECTION_SIGNATURE); + if (protectionLevelMasked == PermissionInfo.PROTECTION_SIGNATURE) { + return protectionLevel; + } + + // System sees all flags. + final int appId = UserHandle.getAppId(uid); + if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID + || appId == Process.SHELL_UID) { + return protectionLevel; } + + // Normalize package name to handle renamed packages and static libs + packageName = resolveInternalPackageNameLPr(packageName, + PackageManager.VERSION_CODE_HIGHEST); + + // Apps that target O see flags for all protection levels. + final PackageSetting ps = mSettings.mPackages.get(packageName); + if (ps == null) { + return protectionLevel; + } + if (ps.appId != appId) { + return protectionLevel; + } + + final PackageParser.Package pkg = mPackages.get(packageName); + if (pkg == null) { + return protectionLevel; + } + if (pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.O) { + return protectionLevelMasked; + } + + return protectionLevel; } @Override |