From 09aafada132c3e2b811e7aae61543705bb8e240e Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Mon, 3 Aug 2020 18:53:22 -0700 Subject: [PATCH] Move more methods accessing PermissionsState into PermissionManagerService. This time the methods accessing granted permissions and GIDs are moved. Bug: 158736025 Test: presubmit Change-Id: I048de0916970d5f5931ef683e34481f8d5d6f545 --- .../android/server/pm/InstantAppRegistry.java | 9 +++- .../server/pm/PackageManagerService.java | 27 +++-------- .../permission/PermissionManagerService.java | 46 +++++++++++++++++++ .../PermissionManagerServiceInternal.java | 20 ++++++++ 4 files changed, 80 insertions(+), 22 deletions(-) diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java index 0eaac4140c14b..9646b9ce8edfd 100644 --- a/services/core/java/com/android/server/pm/InstantAppRegistry.java +++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java @@ -52,6 +52,7 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.XmlUtils; import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.permission.PermissionManagerServiceInternal; import libcore.io.IoUtils; import libcore.util.HexEncoding; @@ -112,6 +113,7 @@ class InstantAppRegistry { private static final String ATTR_GRANTED = "granted"; private final PackageManagerService mService; + private final PermissionManagerServiceInternal mPermissionManager; private final CookiePersistence mCookiePersistence; /** State for uninstalled instant apps */ @@ -131,8 +133,10 @@ class InstantAppRegistry { @GuardedBy("mService.mLock") private SparseArray mInstalledInstantAppUids; - public InstantAppRegistry(PackageManagerService service) { + public InstantAppRegistry(PackageManagerService service, + PermissionManagerServiceInternal permissionManager) { mService = service; + mPermissionManager = permissionManager; mCookiePersistence = new CookiePersistence(BackgroundThread.getHandler().getLooper()); } @@ -861,7 +865,8 @@ class InstantAppRegistry { String[] requestedPermissions = new String[pkg.getRequestedPermissions().size()]; pkg.getRequestedPermissions().toArray(requestedPermissions); - Set permissions = ps.getPermissionsState().getPermissions(userId); + Set permissions = mPermissionManager.getGrantedPermissions( + pkg.getPackageName(), userId); String[] grantedPermissions = new String[permissions.size()]; permissions.toArray(grantedPermissions); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 1ef4c1e9cd23c..31bf239fc6d82 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2966,7 +2966,7 @@ public class PackageManagerService extends IPackageManager.Stub mHandler = new PackageHandler(mHandlerThread.getLooper()); mProcessLoggingHandler = new ProcessLoggingHandler(); Watchdog.getInstance().addThread(mHandler, WATCHDOG_TIMEOUT); - mInstantAppRegistry = new InstantAppRegistry(this); + mInstantAppRegistry = new InstantAppRegistry(this, mPermissionManager); ArrayMap libConfig = systemConfig.getSharedLibraries(); @@ -4380,14 +4380,13 @@ public class PackageManagerService extends IPackageManager.Stub final PackageUserState state = ps.readUserState(userId); AndroidPackage p = ps.pkg; if (p != null) { - final PermissionsState permissionsState = ps.getPermissionsState(); - // Compute GIDs only if requested final int[] gids = (flags & PackageManager.GET_GIDS) == 0 - ? EMPTY_INT_ARRAY : permissionsState.computeGids(userId); + ? EMPTY_INT_ARRAY : mPermissionManager.getPackageGids(ps.name, userId); // Compute granted permissions only if package has requested permissions final Set permissions = ArrayUtils.isEmpty(p.getRequestedPermissions()) - ? Collections.emptySet() : permissionsState.getPermissions(userId); + ? Collections.emptySet() + : mPermissionManager.getGrantedPermissions(ps.name, userId); PackageInfo packageInfo = PackageInfoUtils.generate(p, gids, flags, ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId, ps); @@ -4858,13 +4857,13 @@ public class PackageManagerService extends IPackageManager.Stub } // TODO: Shouldn't this be checking for package installed state for userId and // return null? - return ps.getPermissionsState().computeGids(userId); + return mPermissionManager.getPackageGids(packageName, userId); } if ((flags & MATCH_KNOWN_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null && ps.isMatch(flags) && !shouldFilterApplicationLocked(ps, callingUid, userId)) { - return ps.getPermissionsState().computeGids(userId); + return mPermissionManager.getPackageGids(packageName, userId); } } } @@ -24917,9 +24916,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int[] getPermissionGids(String permissionName, int userId) { - synchronized (mLock) { - return getPermissionGidsLocked(permissionName, userId); - } + return mPermissionManager.getPermissionGids(permissionName, userId); } @Override @@ -25240,16 +25237,6 @@ public class PackageManagerService extends IPackageManager.Stub return null; } - @GuardedBy("mLock") - public int[] getPermissionGidsLocked(String permissionName, int userId) { - BasePermission perm - = mPermissionManager.getPermissionSettings().getPermission(permissionName); - if (perm != null) { - return perm.computeGids(userId); - } - return null; - } - @Override public int getRuntimePermissionsVersion(@UserIdInt int userId) { Preconditions.checkArgumentNonnegative(userId); diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 6e0efb09aff33..00fee0d147739 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -2465,6 +2465,36 @@ public class PermissionManagerService extends IPermissionManager.Stub { } } + @NonNull + private Set getGrantedPermissions(@NonNull String packageName, + @UserIdInt int userId) { + final PackageSetting ps = mPackageManagerInt.getPackageSetting(packageName); + if (ps == null) { + return null; + } + final PermissionsState permissionsState = ps.getPermissionsState(); + return permissionsState.getPermissions(userId); + } + + @Nullable + private int[] getPermissionGids(@NonNull String permissionName, @UserIdInt int userId) { + BasePermission permission = mSettings.getPermission(permissionName); + if (permission == null) { + return null; + } + return permission.computeGids(userId); + } + + @Nullable + private int[] getPackageGids(@NonNull String packageName, @UserIdInt int userId) { + final PackageSetting ps = mPackageManagerInt.getPackageSetting(packageName); + if (ps == null) { + return null; + } + final PermissionsState permissionsState = ps.getPermissionsState(); + return permissionsState.computeGids(userId); + } + /** * Restore the permission state for a package. * @@ -4674,6 +4704,22 @@ public class PermissionManagerService extends IPermissionManager.Stub { public void removeAllPermissions(AndroidPackage pkg, boolean chatty) { PermissionManagerService.this.removeAllPermissions(pkg, chatty); } + @NonNull + @Override + public Set getGrantedPermissions(@NonNull String packageName, + @UserIdInt int userId) { + return PermissionManagerService.this.getGrantedPermissions(packageName, userId); + } + @Nullable + @Override + public int[] getPermissionGids(@NonNull String permissionName, @UserIdInt int userId) { + return PermissionManagerService.this.getPermissionGids(permissionName, userId); + } + @Nullable + @Override + public int[] getPackageGids(@NonNull String packageName, @UserIdInt int userId) { + return PermissionManagerService.this.getPackageGids(packageName, userId); + } @Override public void grantRequestedRuntimePermissions(AndroidPackage pkg, int[] userIds, String[] grantedPermissions, int callingUid) { diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index 2e83b23f57d88..cfa371ddbad3f 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -28,6 +28,7 @@ import com.android.server.pm.parsing.pkg.AndroidPackage; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.function.Consumer; /** @@ -263,6 +264,25 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager public abstract void addAllPermissionGroups(@NonNull AndroidPackage pkg, boolean chatty); public abstract void removeAllPermissions(@NonNull AndroidPackage pkg, boolean chatty); + /** + * Get all the permissions granted to a package. + */ + @NonNull + public abstract Set getGrantedPermissions(@NonNull String packageName, + @UserIdInt int userId); + + /** + * Get the GIDs of a permission. + */ + @Nullable + public abstract int[] getPermissionGids(@NonNull String permissionName, @UserIdInt int userId); + + /** + * Get the GIDs computed from the permission state of a package. + */ + @Nullable + public abstract int[] getPackageGids(@NonNull String packageName, @UserIdInt int userId); + /** Retrieve the packages that have requested the given app op permission */ public abstract @Nullable String[] getAppOpPermissionPackages( @NonNull String permName, int callingUid);