diff options
| author | 2017-07-28 16:42:09 +0000 | |
|---|---|---|
| committer | 2017-07-28 16:42:09 +0000 | |
| commit | fc862c9f86d6a5fd946d3f58818f9a9ee194304f (patch) | |
| tree | 06f5d06c9917a552cb959f253ef1ff12b22bce6b | |
| parent | 1a5a9be9ad2a362ee3ab1490717cca73e9303abd (diff) | |
| parent | adb8c522a84b5c7531b009b7a8d4c854ca7dee08 (diff) | |
Report permission flags for all protections based on SDK
am: adb8c522a8
Change-Id: I259df147b8345f6bdba5a1ed31d01d3c42e90518
4 files changed, 54 insertions, 9 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index e5c420876c8a..4df633fabf3c 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -281,7 +281,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 e8e0eb350623..126a7759bb4a 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -71,7 +71,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 b3a2c291760c..2142c9467293 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 9f518c392803..41cfc0ac8c62 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3996,18 +3996,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 |