Set broadcast policy for suspension and quiet mode

These implicit broadcasts aren't protected by permission and can
be abused to keep the app active. With this change cached app won't
be receiving these broadcasts and if several of them are queued, they
will get merged.

Bug: 269595559
Test: manual with TestDPC
Change-Id: I209ab41b618fd9bfdcb1dd2c321cb49fe5197e64
This commit is contained in:
Pavel Grafov
2023-03-20 13:36:53 +00:00
parent a7259ae15a
commit 1d8230474c
2 changed files with 14 additions and 2 deletions

View File

@@ -28,6 +28,7 @@ import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
import android.app.IActivityManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.content.Intent;
@@ -620,12 +621,15 @@ public final class SuspendPackageHelper {
extras.putStringArray(Intent.EXTRA_CHANGED_PACKAGE_LIST, pkgList);
extras.putIntArray(Intent.EXTRA_CHANGED_UID_LIST, uidList);
final int flags = Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND;
final Bundle options = new BroadcastOptions()
.setDeferralPolicy(BroadcastOptions.DEFERRAL_POLICY_UNTIL_ACTIVE)
.toBundle();
handler.post(() -> mBroadcastHelper.sendPackageBroadcast(intent, null /* pkg */,
extras, flags, null /* targetPkg */, null /* finishedReceiver */,
new int[]{userId}, null /* instantUserIds */, null /* broadcastAllowList */,
(callingUid, intentExtras) -> BroadcastHelper.filterExtrasChangedPackageList(
mPm.snapshotComputer(), callingUid, intentExtras),
null /* bOptions */));
options));
}
/**

View File

@@ -1276,7 +1276,15 @@ public class UserManagerService extends IUserManager.Stub {
getDevicePolicyManagerInternal().broadcastIntentToManifestReceivers(
intent, parentHandle, /* requiresPermission= */ true);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
mContext.sendBroadcastAsUser(intent, parentHandle);
final Bundle options = new BroadcastOptions()
.setDeferralPolicy(BroadcastOptions.DEFERRAL_POLICY_UNTIL_ACTIVE)
.setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT)
// Both actions use single namespace because only the final state matters.
.setDeliveryGroupMatchingKey(
Intent.ACTION_MANAGED_PROFILE_AVAILABLE /* namespace */,
String.valueOf(profileHandle.getIdentifier()) /* key */)
.toBundle();
mContext.sendBroadcastAsUser(intent, parentHandle, /* receiverPermission= */ null, options);
}
@Override