From 37389f61c18b455d8882165fbf597fb045a6c8bd Mon Sep 17 00:00:00 2001 From: Andrei Onea Date: Thu, 10 Mar 2022 11:41:21 +0000 Subject: [PATCH] Use apex name when querying privapp allowlists Per-apex allowlists are stored based on their path, which corresponds to the apex name and *not* the apex package name. These are the same for AOSP targets, but for Google specific ones, the apex package name *typically* is of the form com.google.android.* instead of com.android.*. Test: m Bug: 190375768 Change-Id: Iba36509285bd75db294e369088a23b73458f3a8b --- core/java/com/android/server/SystemConfig.java | 12 ++++++------ .../server/pm/PackageManagerShellCommand.java | 8 ++++++-- .../pm/permission/PermissionManagerServiceImpl.java | 5 ++++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java index b1846d2402ddd..cc7e9d95b4f87 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/core/java/com/android/server/SystemConfig.java @@ -435,15 +435,15 @@ public class SystemConfig { } /** Get privapp permission allowlist for an apk-in-apex. */ - public ArraySet getApexPrivAppPermissions(String module, String packageName) { - return mApexPrivAppPermissions.getOrDefault(module, EMPTY_PERMISSIONS) - .get(packageName); + public ArraySet getApexPrivAppPermissions(String apexName, String apkPackageName) { + return mApexPrivAppPermissions.getOrDefault(apexName, EMPTY_PERMISSIONS) + .get(apkPackageName); } /** Get privapp permissions denylist for an apk-in-apex. */ - public ArraySet getApexPrivAppDenyPermissions(String module, String packageName) { - return mApexPrivAppDenyPermissions.getOrDefault(module, EMPTY_PERMISSIONS) - .get(packageName); + public ArraySet getApexPrivAppDenyPermissions(String apexName, String apkPackageName) { + return mApexPrivAppDenyPermissions.getOrDefault(apexName, EMPTY_PERMISSIONS) + .get(apkPackageName); } public ArraySet getVendorPrivAppPermissions(String packageName) { diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index b92f51b392f92..16b0f4dbd2091 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -2535,8 +2535,10 @@ class PackageManagerShellCommand extends ShellCommand { privAppPermissions = SystemConfig.getInstance() .getSystemExtPrivAppPermissions(pkg); } else if (isApexApp(pkg)) { + final String apexName = ApexManager.getInstance().getApexModuleNameForPackageName( + getApexPackageNameContainingPackage(pkg)); privAppPermissions = SystemConfig.getInstance() - .getApexPrivAppPermissions(getApexPackageNameContainingPackage(pkg), pkg); + .getApexPrivAppPermissions(apexName, pkg); } else { privAppPermissions = SystemConfig.getInstance().getPrivAppPermissions(pkg); } @@ -2562,8 +2564,10 @@ class PackageManagerShellCommand extends ShellCommand { privAppPermissions = SystemConfig.getInstance() .getSystemExtPrivAppDenyPermissions(pkg); } else if (isApexApp(pkg)) { + final String apexName = ApexManager.getInstance().getApexModuleNameForPackageName( + getApexPackageNameContainingPackage(pkg)); privAppPermissions = SystemConfig.getInstance() - .getApexPrivAppDenyPermissions(getApexPackageNameContainingPackage(pkg), pkg); + .getApexPrivAppDenyPermissions(apexName, pkg); } else { privAppPermissions = SystemConfig.getInstance().getPrivAppDenyPermissions(pkg); } diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java index 90842619c31ec..d0609307e6a84 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java @@ -3291,10 +3291,13 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt } else if (pkg.isSystemExt()) { permissions = systemConfig.getSystemExtPrivAppPermissions(pkg.getPackageName()); } else if (containingApexPackageName != null) { + final ApexManager apexManager = ApexManager.getInstance(); + final String apexName = apexManager.getApexModuleNameForPackageName( + containingApexPackageName); final Set privAppPermissions = systemConfig.getPrivAppPermissions( pkg.getPackageName()); final Set apexPermissions = systemConfig.getApexPrivAppPermissions( - containingApexPackageName, pkg.getPackageName()); + apexName, pkg.getPackageName()); if (privAppPermissions != null) { // TODO(andreionea): Remove check as soon as all apk-in-apex // permission allowlists are migrated.