Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5949deb authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

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
parent 624a7c1c
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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);
+3 −2
Original line number Diff line number Diff line
@@ -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();
+2 −2
Original line number Diff line number Diff line
@@ -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 */
+5 −5
Original line number Diff line number Diff line
@@ -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
+4 −2
Original line number Diff line number Diff line
@@ -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;
Loading