Mastodon: If Alice is muted, I still see her posts when Bob boosts them.

Created on 15 Nov 2017  ·  5Comments  ·  Source: tootsuite/mastodon

I muted user Alice to avoid seeing their posts.
Bob (who I haven't muted) boosted one of Alice's posts.
Aside from blocking Alice (which I'd rather not do), how can I ensure I don't see her posts unless I specifically ask for them?


  • [x] I searched or browsed the repo’s other issues to ensure this is not a duplicate.
  • [?] This bug happens on a tagged release and not on master (If you're a user, don't worry about this).
accessibility bug work in progress

Most helpful comment

Use-case for this.

Alice is at an event and is love-tooting the event. I don't want spoilers about the event so I mute her for the time being (I still want to interact with Alice, just not right now while she's spoiling the event).

Bob decides he really likes that Alice is live-tooting this event and decides to boost all of Alice's toots about the event. As it stands now I have to block Alice (which I don't want to do as she will then be unable to follow me) or somehow mute Bob as well (which I don't want to do because Bob has other interesting things to say in the interim).

I'd like to mute Alice for the duration but Bob is making that difficult. Bob's boosts are circumventing the mute for Alice.

LMK if this use-case needs further elaboration. Thanks!

All 5 comments

As far as fixing:
The actual request and read filter happens in app/lib/feed_manager.rb filter_from_home? and filter_from_mentions?, which _look_ like they contain relevant code here:

    check_for_mutes = [status.account_id]
    check_for_mutes.concat([status.reblog.account_id]) if status.reblog?

This might be broken, I'll look for relevant tests.

Javascript live updates at app/javascript/mastodon/reducers/statuses.js fn filterStatuses (and the similar filterNotifications):

const filterStatuses = (state, relationship) => {
  state.forEach(status => {
    if (status.get('account') !== relationship.id) {
      return;
    }

    state = deleteStatus(state, status.get('id'), state.filter(item => item.get('reblog') === status.get('id')));
  });

  return state;
};

The status.get('account') will get the booster's account, and the boosted's account doesn't get examined.

Similar code in timelines.js: filterTimelines

Use-case for this.

Alice is at an event and is love-tooting the event. I don't want spoilers about the event so I mute her for the time being (I still want to interact with Alice, just not right now while she's spoiling the event).

Bob decides he really likes that Alice is live-tooting this event and decides to boost all of Alice's toots about the event. As it stands now I have to block Alice (which I don't want to do as she will then be unable to follow me) or somehow mute Bob as well (which I don't want to do because Bob has other interesting things to say in the interim).

I'd like to mute Alice for the duration but Bob is making that difficult. Bob's boosts are circumventing the mute for Alice.

LMK if this use-case needs further elaboration. Thanks!

Hm. Tests include this case (feed_manager_spec.rb):

      it 'returns true for reblog by followee of muted account' do
        status = Fabricate(:status, text: 'Hello world', account: jeff)
        reblog = Fabricate(:status, reblog: status, account: alice)
        bob.follow!(alice)
        bob.mute!(jeff)
        expect(FeedManager.instance.filter?(:home, reblog, bob.id)).to be true
      end

One possibility here is that the test is fabricating status objects with nested information (the reblog's account) that isn't actually available to the FeedManager for some reason.

Aside from blocking Alice (which I'd rather not do), how can I ensure I don't see her posts unless I specifically ask for them?

Seems like even this doesn't work; I'm still seeing toots in my home feed that were written by someone I've muted _and_ blocked, but boosted by someone I follow.

Was this page helpful?
0 / 5 - 0 ratings