diff options
| author | 2022-12-15 03:17:08 +0000 | |
|---|---|---|
| committer | 2022-12-15 03:17:08 +0000 | |
| commit | 42ea363e429314d051ce5e53d3ce62f66f61d2cb (patch) | |
| tree | 010038e2ecb0a0a84f8828166f7bcc9bf51a57d7 | |
| parent | 3d43d701243f8bc99a2a6355541eaa318e3d7ce8 (diff) | |
| parent | 1ad63a316796ef97a4f4a4a307a0d53da343c938 (diff) | |
Merge "Add an api to query the visibility list of target packages"
7 files changed, 72 insertions, 22 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 566ac4535b0d..aacb4024ff93 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3609,6 +3609,7 @@ package android.content.pm { public abstract class PackageManager { method @RequiresPermission("android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS") public abstract void addOnPermissionsChangeListener(@NonNull android.content.pm.PackageManager.OnPermissionsChangedListener); method public abstract boolean arePermissionsIndividuallyControlled(); + method @NonNull public boolean[] canPackageQuery(@NonNull String, @NonNull String[]) throws android.content.pm.PackageManager.NameNotFoundException; method @NonNull public abstract java.util.List<android.content.IntentFilter> getAllIntentFilters(@NonNull String); method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.pm.ApplicationInfo getApplicationInfoAsUser(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException; method @NonNull @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) public android.content.pm.ApplicationInfo getApplicationInfoAsUser(@NonNull String, @NonNull android.content.pm.PackageManager.ApplicationInfoFlags, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException; diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 569f4dd8328c..4d3f9e457ae3 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -3816,8 +3816,17 @@ public class ApplicationPackageManager extends PackageManager { @NonNull String targetPackageName) throws NameNotFoundException { Objects.requireNonNull(sourcePackageName); Objects.requireNonNull(targetPackageName); + return canPackageQuery(sourcePackageName, new String[]{targetPackageName})[0]; + } + + @Override + @NonNull + public boolean[] canPackageQuery(@NonNull String sourcePackageName, + @NonNull String[] targetPackageNames) throws NameNotFoundException { + Objects.requireNonNull(sourcePackageName); + Objects.requireNonNull(targetPackageNames); try { - return mPM.canPackageQuery(sourcePackageName, targetPackageName, getUserId()); + return mPM.canPackageQuery(sourcePackageName, targetPackageNames, getUserId()); } catch (ParcelableException e) { e.maybeRethrow(PackageManager.NameNotFoundException.class); throw new RuntimeException(e); diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 35afe9f727db..81bea2e3573f 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -797,5 +797,5 @@ interface IPackageManager { void setKeepUninstalledPackages(in List<String> packageList); - boolean canPackageQuery(String sourcePackageName, String targetPackageName, int userId); + boolean[] canPackageQuery(String sourcePackageName, in String[] targetPackageNames, int userId); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index ec490d10d45e..8ae53100d4d5 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -10388,6 +10388,30 @@ public abstract class PackageManager { } /** + * Same as {@link #canPackageQuery(String, String)} but accepts an array of target packages to + * be queried. + * + * @param sourcePackageName The source package that would receive details about the + * target package. + * @param targetPackageNames An array of target packages whose details would be shared with the + * source package. + * @return An array of booleans where each member specifies whether the source package is able + * to query for details about the target package given by the corresponding value at the same + * index in the array of target packages. + * @throws NameNotFoundException if either a given package can not be found on the + * system, or if the caller is not able to query for details about the source or + * target packages. + * @hide + */ + @SystemApi + @NonNull + public boolean[] canPackageQuery(@NonNull String sourcePackageName, + @NonNull String[] targetPackageNames) throws NameNotFoundException { + throw new UnsupportedOperationException( + "canPackageQuery not implemented in subclass"); + } + + /** * Makes a package that provides an authority {@code visibleAuthority} become visible to the * application {@code recipientUid}. * diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java index 60621a0eaaef..ea8428351a81 100644 --- a/services/core/java/com/android/server/pm/Computer.java +++ b/services/core/java/com/android/server/pm/Computer.java @@ -570,8 +570,9 @@ public interface Computer extends PackageDataSnapshot { @PackageManager.InstallReason int getInstallReason(@NonNull String packageName, @UserIdInt int userId); - boolean canPackageQuery(@NonNull String sourcePackageName, @NonNull String targetPackageName, - @UserIdInt int userId); + @NonNull + boolean[] canPackageQuery(@NonNull String sourcePackageName, + @NonNull String[] targetPackageNames, @UserIdInt int userId); boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, @UserIdInt int sourceUserId, @UserIdInt int targetUserId); diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index b8fba51c4d60..06aadd92dd51 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -159,6 +159,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -5337,29 +5338,42 @@ public class ComputerEngine implements Computer { } @Override - public boolean canPackageQuery(@NonNull String sourcePackageName, - @NonNull String targetPackageName, @UserIdInt int userId) { - if (!mUserManager.exists(userId)) return false; + @NonNull + public boolean[] canPackageQuery(@NonNull String sourcePackageName, + @NonNull String[] targetPackageNames, @UserIdInt int userId) { + final int targetSize = targetPackageNames.length; + final boolean[] results = new boolean[targetSize]; + if (!mUserManager.exists(userId)) { + return results; + } final int callingUid = Binder.getCallingUid(); enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, - false /*checkShell*/, "may package query"); + false /*checkShell*/, "can package query"); + final PackageStateInternal sourceSetting = getPackageStateInternal(sourcePackageName); - final PackageStateInternal targetSetting = getPackageStateInternal(targetPackageName); - boolean throwException = sourceSetting == null || targetSetting == null; - if (!throwException) { - final boolean filterSource = - shouldFilterApplicationIncludingUninstalled(sourceSetting, callingUid, userId); - final boolean filterTarget = - shouldFilterApplicationIncludingUninstalled(targetSetting, callingUid, userId); - // The caller must have visibility of the both packages - throwException = filterSource || filterTarget; + final PackageStateInternal[] targetSettings = new PackageStateInternal[targetSize]; + // Throw exception if the caller without the visibility of source package + boolean throwException = + (sourceSetting == null || shouldFilterApplicationIncludingUninstalled( + sourceSetting, callingUid, userId)); + for (int i = 0; !throwException && i < targetSize; i++) { + targetSettings[i] = getPackageStateInternal(targetPackageNames[i]); + // Throw exception if the caller without the visibility of target package + throwException = + (targetSettings[i] == null || shouldFilterApplicationIncludingUninstalled( + targetSettings[i], callingUid, userId)); } if (throwException) { throw new ParcelableException(new PackageManager.NameNotFoundException("Package(s) " - + sourcePackageName + " and/or " + targetPackageName + " not found.")); + + sourcePackageName + " and/or " + Arrays.toString(targetPackageNames) + + " not found.")); } + final int sourcePackageUid = UserHandle.getUid(userId, sourceSetting.getAppId()); - return !shouldFilterApplication(targetSetting, sourcePackageUid, userId); + for (int i = 0; i < targetSize; i++) { + results[i] = !shouldFilterApplication(targetSettings[i], sourcePackageUid, userId); + } + return results; } /* diff --git a/services/core/java/com/android/server/pm/IPackageManagerBase.java b/services/core/java/com/android/server/pm/IPackageManagerBase.java index 5c3890c192dd..38efc104bdf9 100644 --- a/services/core/java/com/android/server/pm/IPackageManagerBase.java +++ b/services/core/java/com/android/server/pm/IPackageManagerBase.java @@ -1153,9 +1153,10 @@ public abstract class IPackageManagerBase extends IPackageManager.Stub { @Override @Deprecated - public final boolean canPackageQuery(@NonNull String sourcePackageName, - @NonNull String targetPackageName, @UserIdInt int userId) { - return snapshot().canPackageQuery(sourcePackageName, targetPackageName, userId); + @NonNull + public final boolean[] canPackageQuery(@NonNull String sourcePackageName, + @NonNull String[] targetPackageNames, @UserIdInt int userId) { + return snapshot().canPackageQuery(sourcePackageName, targetPackageNames, userId); } @Override |