Merge "Set correct attribution==featureId and message for broadcasts"

This commit is contained in:
Philip P. Moltmann
2020-08-07 22:03:11 +00:00
committed by Android (Google) Code Review
6 changed files with 30 additions and 21 deletions

View File

@@ -2657,8 +2657,10 @@ public class AppOpsManager {
* @hide
*/
// TODO: this should probably be @SystemApi as well
public static @NonNull String toReceiverId(@NonNull Object obj) {
if (obj instanceof PendingIntent) {
public static @NonNull String toReceiverId(@Nullable Object obj) {
if (obj == null) {
return "null";
} else if (obj instanceof PendingIntent) {
return toReceiverId((PendingIntent) obj);
} else {
return obj.getClass().getName() + "@" + System.identityHashCode(obj);

View File

@@ -1624,8 +1624,9 @@ class ContextImpl extends Context {
}
try {
final Intent intent = ActivityManager.getService().registerReceiverWithFeature(
mMainThread.getApplicationThread(), mBasePackageName, getAttributionTag(), rd,
filter, broadcastPermission, userId, flags);
mMainThread.getApplicationThread(), mBasePackageName, getAttributionTag(),
AppOpsManager.toReceiverId(receiver), rd, filter, broadcastPermission, userId,
flags);
if (intent != null) {
intent.setExtrasClassLoader(getClassLoader());
intent.prepareToEnterProcess();

View File

@@ -123,8 +123,8 @@ interface IActivityManager {
in IIntentReceiver receiver, in IntentFilter filter,
in String requiredPermission, int userId, int flags);
Intent registerReceiverWithFeature(in IApplicationThread caller, in String callerPackage,
in String callingFeatureId, in IIntentReceiver receiver, in IntentFilter filter,
in String requiredPermission, int userId, int flags);
in String callingFeatureId, in String receiverId, in IIntentReceiver receiver,
in IntentFilter filter, in String requiredPermission, int userId, int flags);
@UnsupportedAppUsage
void unregisterReceiver(in IIntentReceiver receiver);
/** @deprecated Use {@link #broadcastIntentWithFeature} instead */

View File

@@ -14055,13 +14055,13 @@ public class ActivityManagerService extends IActivityManager.Stub
public Intent registerReceiver(IApplicationThread caller, String callerPackage,
IIntentReceiver receiver, IntentFilter filter, String permission, int userId,
int flags) {
return registerReceiverWithFeature(caller, callerPackage, null, receiver, filter,
permission, userId, flags);
return registerReceiverWithFeature(caller, callerPackage, null, null,
receiver, filter, permission, userId, flags);
}
public Intent registerReceiverWithFeature(IApplicationThread caller, String callerPackage,
String callerFeatureId, IIntentReceiver receiver, IntentFilter filter,
String permission, int userId, int flags) {
String callerFeatureId, String receiverId, IIntentReceiver receiver,
IntentFilter filter, String permission, int userId, int flags) {
enforceNotIsolatedCaller("registerReceiver");
ArrayList<Intent> stickyIntents = null;
ProcessRecord callerApp = null;
@@ -14198,7 +14198,7 @@ public class ActivityManagerService extends IActivityManager.Stub
+ " callerPackage is " + callerPackage);
}
BroadcastFilter bf = new BroadcastFilter(filter, rl, callerPackage, callerFeatureId,
permission, callingUid, userId, instantApp, visibleToInstantApps);
receiverId, permission, callingUid, userId, instantApp, visibleToInstantApps);
if (rl.containsFilter(filter)) {
Slog.w(TAG, "Receiver with filter " + filter
+ " already registered for pid " + rl.pid

View File

@@ -28,6 +28,7 @@ final class BroadcastFilter extends IntentFilter {
final ReceiverList receiverList;
final String packageName;
final String featureId;
final String receiverId;
final String requiredPermission;
final int owningUid;
final int owningUserId;
@@ -35,12 +36,13 @@ final class BroadcastFilter extends IntentFilter {
final boolean visibleToInstantApp;
BroadcastFilter(IntentFilter _filter, ReceiverList _receiverList,
String _packageName, String _featureId, String _requiredPermission, int _owningUid, int _userId,
boolean _instantApp, boolean _visibleToInstantApp) {
String _packageName, String _featureId, String _receiverId, String _requiredPermission,
int _owningUid, int _userId, boolean _instantApp, boolean _visibleToInstantApp) {
super(_filter);
receiverList = _receiverList;
packageName = _packageName;
featureId = _featureId;
receiverId = _receiverId;
requiredPermission = _requiredPermission;
owningUid = _owningUid;
owningUserId = _userId;

View File

@@ -639,7 +639,7 @@ public final class BroadcastQueue {
final int opCode = AppOpsManager.permissionToOpCode(filter.requiredPermission);
if (opCode != AppOpsManager.OP_NONE
&& mService.getAppOpsManager().noteOpNoThrow(opCode, r.callingUid,
r.callerPackage, r.callerFeatureId, "")
r.callerPackage, r.callerFeatureId, "Broadcast sent to protected receiver")
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: broadcasting "
+ r.intent.toString()
@@ -672,7 +672,8 @@ public final class BroadcastQueue {
int appOp = AppOpsManager.permissionToOpCode(requiredPermission);
if (appOp != AppOpsManager.OP_NONE && appOp != r.appOp
&& mService.getAppOpsManager().noteOpNoThrow(appOp,
filter.receiverList.uid, filter.packageName, filter.featureId, "")
filter.receiverList.uid, filter.packageName, filter.featureId,
"Broadcast delivered to registered receiver " + filter.receiverId)
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: receiving "
+ r.intent.toString()
@@ -704,7 +705,8 @@ public final class BroadcastQueue {
}
if (!skip && r.appOp != AppOpsManager.OP_NONE
&& mService.getAppOpsManager().noteOpNoThrow(r.appOp,
filter.receiverList.uid, filter.packageName, filter.featureId, "")
filter.receiverList.uid, filter.packageName, filter.featureId,
"Broadcast delivered to registered receiver " + filter.receiverId)
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: receiving "
+ r.intent.toString()
@@ -1366,9 +1368,10 @@ public final class BroadcastQueue {
skip = true;
} else if (!skip && info.activityInfo.permission != null) {
final int opCode = AppOpsManager.permissionToOpCode(info.activityInfo.permission);
if (opCode != AppOpsManager.OP_NONE
&& mService.getAppOpsManager().noteOpNoThrow(opCode, r.callingUid, r.callerPackage,
r.callerFeatureId, "") != AppOpsManager.MODE_ALLOWED) {
if (opCode != AppOpsManager.OP_NONE && mService.getAppOpsManager().noteOpNoThrow(opCode,
r.callingUid, r.callerPackage, r.callerFeatureId,
"Broadcast delivered to " + info.activityInfo.name)
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: broadcasting "
+ r.intent.toString()
+ " from " + r.callerPackage + " (pid="
@@ -1407,7 +1410,8 @@ public final class BroadcastQueue {
if (appOp != AppOpsManager.OP_NONE && appOp != r.appOp
&& mService.getAppOpsManager().noteOpNoThrow(appOp,
info.activityInfo.applicationInfo.uid, info.activityInfo.packageName,
null /* default featureId */, "")
null /* default featureId */,
"Broadcast delivered to " + info.activityInfo.name)
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: receiving "
+ r.intent + " to "
@@ -1424,7 +1428,7 @@ public final class BroadcastQueue {
if (!skip && r.appOp != AppOpsManager.OP_NONE
&& mService.getAppOpsManager().noteOpNoThrow(r.appOp,
info.activityInfo.applicationInfo.uid, info.activityInfo.packageName,
null /* default featureId */, "")
null /* default featureId */, "Broadcast delivered to " + info.activityInfo.name)
!= AppOpsManager.MODE_ALLOWED) {
Slog.w(TAG, "Appop Denial: receiving "
+ r.intent + " to "