Set correct attribution==featureId and message for broadcasts
These fields will be delivered to the app that it is checked. This will allow the app to record which private data access it is blamed for. Fixes: 162317145 Test: atest AppOpsLoggingTest (now with tests added for these paths.) Change-Id: Icf796452c4df39b32e8dc385f6a2c65a2257512f
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -14051,13 +14051,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;
|
||||
@@ -14194,7 +14194,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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 "
|
||||
|
||||
Reference in New Issue
Block a user