From 5d47340f175884018b3b7168e6cb7044635bb867 Mon Sep 17 00:00:00 2001 From: kholoud mohamed Date: Wed, 23 Feb 2022 14:00:37 +0000 Subject: [PATCH] broadcast profile-relevant intents to DMRH Fixes: 218499300 Test: manual Change-Id: I926646bbf2e8aef5b2571d6edb3a41d248ba1dbe --- .../admin/DevicePolicyManagerInternal.java | 26 +++++--- .../android/server/pm/UserManagerService.java | 4 +- .../DevicePolicyManagerService.java | 65 +++++++++++-------- 3 files changed, 57 insertions(+), 38 deletions(-) diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java index 9045147f4bdd9..b6f09167580f9 100644 --- a/core/java/android/app/admin/DevicePolicyManagerInternal.java +++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java @@ -218,21 +218,27 @@ public abstract class DevicePolicyManagerInternal { public abstract List getDefaultCrossProfilePackages(); /** - * Sends the {@code intent} to the packages with cross profile capabilities. + * Sends the {@code intent} to the package holding the + * {@link android.app.role.RoleManager#ROLE_DEVICE_MANAGER} role and packages with cross + * profile capabilities, meaning the application must have the {@code crossProfile} + * property and at least one of the following permissions: * - *

This means the application must have the {@code crossProfile} property and the - * corresponding permissions, defined by - * {@link - * android.content.pm.CrossProfileAppsInternal#verifyPackageHasInteractAcrossProfilePermission}. + *

* - *

Note: This method doesn't modify {@code intent} but copies it before use. - * - * @param intent Template for the intent sent to the package. + *

Note: The intent itself is not modified but copied before use. + *` + * @param intent Template for the intent sent to the packages. * @param parentHandle Handle of the user that will receive the intents. * @param requiresPermission If false, all packages with the {@code crossProfile} property - * will receive the intent. + * will receive the intent without requiring the additional + * permissions. */ - public abstract void broadcastIntentToCrossProfileManifestReceiversAsUser(Intent intent, + public abstract void broadcastIntentToManifestReceivers(Intent intent, UserHandle parentHandle, boolean requiresPermission); /** diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index fed214fd5ab00..ad0f9a183c435 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1059,7 +1059,7 @@ public class UserManagerService extends IUserManager.Stub { intent.putExtra(Intent.EXTRA_QUIET_MODE, inQuietMode); intent.putExtra(Intent.EXTRA_USER, profileHandle); intent.putExtra(Intent.EXTRA_USER_HANDLE, profileHandle.getIdentifier()); - getDevicePolicyManagerInternal().broadcastIntentToCrossProfileManifestReceiversAsUser( + getDevicePolicyManagerInternal().broadcastIntentToManifestReceivers( intent, parentHandle, /* requiresPermission= */ true); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); mContext.sendBroadcastAsUser(intent, parentHandle); @@ -4766,7 +4766,7 @@ public class UserManagerService extends IUserManager.Stub { managedProfileIntent.putExtra(Intent.EXTRA_USER, new UserHandle(removedUserId)); managedProfileIntent.putExtra(Intent.EXTRA_USER_HANDLE, removedUserId); final UserHandle parentHandle = new UserHandle(parentUserId); - getDevicePolicyManagerInternal().broadcastIntentToCrossProfileManifestReceiversAsUser( + getDevicePolicyManagerInternal().broadcastIntentToManifestReceivers( managedProfileIntent, parentHandle, /* requiresPermission= */ false); managedProfileIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 5cda9ea669992..236f663a9dd0a 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -9304,7 +9304,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Intent intent = new Intent(Intent.ACTION_MANAGED_PROFILE_ADDED); intent.putExtra(Intent.EXTRA_USER, new UserHandle(userId)); UserHandle parentHandle = new UserHandle(parent.id); - mLocalService.broadcastIntentToCrossProfileManifestReceiversAsUser(intent, + mLocalService.broadcastIntentToManifestReceivers(intent, parentHandle, /* requiresPermission= */ true); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); @@ -13311,37 +13311,24 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return DevicePolicyManagerService.this.getDefaultCrossProfilePackages(); } - /** - * Sends the {@code intent} to the packages with cross profile capabilities. - * - *

This means the application must have the {@code crossProfile} property and - * and at least one of the following permissions: - * - *

- * - *

Note: The intent itself is not modified but copied before use. - * - * @param intent Template for the intent sent to the packages. - * @param parentHandle Handle of the user that will receive the intents. - * @param requiresPermission If false, all packages with the {@code crossProfile} property - * will receive the intent. - */ @Override - public void broadcastIntentToCrossProfileManifestReceiversAsUser(Intent intent, - UserHandle parentHandle, boolean requiresPermission) { + public void broadcastIntentToManifestReceivers( + Intent intent, UserHandle parentHandle, boolean requiresPermission) { Objects.requireNonNull(intent); Objects.requireNonNull(parentHandle); - final int userId = parentHandle.getIdentifier(); Slogf.i(LOG_TAG, "Sending %s broadcast to manifest receivers.", intent.getAction()); + broadcastIntentToCrossProfileManifestReceivers( + intent, parentHandle, requiresPermission); + broadcastIntentToDevicePolicyManagerRoleHolder(intent, parentHandle); + } + + private void broadcastIntentToCrossProfileManifestReceivers( + Intent intent, UserHandle userHandle, boolean requiresPermission) { + final int userId = userHandle.getIdentifier(); try { final List receivers = mIPackageManager.queryIntentReceivers( intent, /* resolvedType= */ null, - STOCK_PM_FLAGS, parentHandle.getIdentifier()).getList(); + STOCK_PM_FLAGS, userId).getList(); for (ResolveInfo receiver : receivers) { final String packageName = receiver.getComponentInfo().packageName; if (checkCrossProfilePackagePermissions(packageName, userId, @@ -13352,7 +13339,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final Intent packageIntent = new Intent(intent) .setComponent(receiver.getComponentInfo().getComponentName()) .addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); - mContext.sendBroadcastAsUser(packageIntent, parentHandle); + mContext.sendBroadcastAsUser(packageIntent, userHandle); } } } catch (RemoteException ex) { @@ -13361,6 +13348,32 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } + private void broadcastIntentToDevicePolicyManagerRoleHolder( + Intent intent, UserHandle userHandle) { + final int userId = userHandle.getIdentifier(); + final String packageName = getDevicePolicyManagementRoleHolderPackageName(mContext); + if (packageName == null) { + return; + } + try { + final Intent packageIntent = new Intent(intent) + .setPackage(packageName); + final List receivers = mIPackageManager.queryIntentReceivers( + packageIntent, + /* resolvedType= */ null, + STOCK_PM_FLAGS, + userId).getList(); + if (receivers.isEmpty()) { + return; + } + packageIntent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); + mContext.sendBroadcastAsUser(packageIntent, userHandle); + } catch (RemoteException ex) { + Slogf.w(LOG_TAG, "Cannot get list of broadcast receivers for %s because: %s.", + intent.getAction(), ex); + } + } + /** * Checks whether the package {@code packageName} has the {@code MODIFY_QUIET_MODE} * permission granted for the user {@code userId}.