From 9f52188a624d8f5b0007aecdeb57ded5027b99b0 Mon Sep 17 00:00:00 2001 From: Pierre Barbier de Reuille Date: Mon, 8 Jun 2020 16:16:32 +0100 Subject: Send MANAGED_PROFILE_* broadcasts to apps with MODIFY_QUIET_MODE. Allow apps with MODIFY_QUIET_MODE permission to register broadcast receivers for MANAGED_PROFILE_* in their manifest. Fixes: 158870146 Test: atest 'com.android.cts.devicepolicy.QuietModeHostsideTest#testBroadcastManagedProfileAvailable_withCrossProfileAppsOp' Test: atest 'com.android.cts.devicepolicy.QuietModeHostsideTest#testBroadcastManagedProfileAvailable_withoutCrossProfileAppsOp' Change-Id: I39746c5b3ff3c49f8a903fc52091fcb8d3607c84 (cherry picked from commit cc8b51873bbdd5c1815e58f1c95b478ff7310a88) --- .../devicepolicy/DevicePolicyManagerService.java | 24 +++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 7b624cae8141..401649a2e522 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -12712,7 +12712,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { for (ResolveInfo receiver : receivers) { final String packageName = receiver.getComponentInfo().packageName; if (checkCrossProfilePackagePermissions(packageName, userId, - requiresPermission)) { + requiresPermission) + || checkModifyQuietModePermission(packageName, userId)) { Slog.i(LOG_TAG, String.format("Sending %s broadcast to %s.", intent.getAction(), packageName)); @@ -12729,6 +12730,27 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } + /** + * Checks whether the package {@code packageName} has the {@code MODIFY_QUIET_MODE} + * permission granted for the user {@code userId}. + */ + private boolean checkModifyQuietModePermission(String packageName, @UserIdInt int userId) { + try { + final int uid = Objects.requireNonNull( + mInjector.getPackageManager().getApplicationInfoAsUser( + Objects.requireNonNull(packageName), /* flags= */ 0, userId)).uid; + return PackageManager.PERMISSION_GRANTED + == ActivityManager.checkComponentPermission( + android.Manifest.permission.MODIFY_QUIET_MODE, uid, /* owningUid= */ + -1, /* exported= */ true); + } catch (NameNotFoundException ex) { + Slog.w(LOG_TAG, + String.format("Cannot find the package %s to check for permissions.", + packageName)); + return false; + } + } + /** * Checks whether the package {@code packageName} has the required permissions to receive * cross-profile broadcasts on behalf of the user {@code userId}. -- cgit v1.2.3-59-g8ed1b