Skip to content

Commit

Permalink
Fix Undo Announce activity is not sent, when not followed by the rebl…
Browse files Browse the repository at this point in the history
…ogged post author (mastodon#18482)

Co-authored-by: Claire <claire.github-309c@sitedethib.com>
  • Loading branch information
2 people authored and atsu1125 committed Feb 2, 2024
1 parent ede3416 commit 2acfbb9
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 26 deletions.
34 changes: 17 additions & 17 deletions app/lib/status_reach_finder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,28 @@ def inboxes
private

def reached_account_inboxes
Account.where(id: reached_account_ids).inboxes
end

def reached_account_ids
# When the status is a reblog, there are no interactions with it
# directly, we assume all interactions are with the original one

if @status.reblog?
[]
[reblog_of_account_id]
else
Account.where(id: reached_account_ids).inboxes
end
end

def reached_account_ids
[
replied_to_account_id,
reblog_of_account_id,
mentioned_account_ids,
reblogs_account_ids,
favourites_account_ids,
replies_account_ids,
].tap do |arr|
arr.flatten!
arr.compact!
arr.uniq!
[
replied_to_account_id,
reblog_of_account_id,
mentioned_account_ids,
reblogs_account_ids,
favourites_account_ids,
replies_account_ids,
].tap do |arr|
arr.flatten!
arr.compact!
arr.uniq!
end
end
end

Expand Down
6 changes: 1 addition & 5 deletions app/services/reblog_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,7 @@ def call(account, reblogged_status, options = {})
def create_notification(reblog)
reblogged_status = reblog.reblog

if reblogged_status.account.local?
LocalNotificationWorker.perform_async(reblogged_status.account_id, reblog.id, reblog.class.name, 'reblog')
elsif reblogged_status.account.activitypub? && !reblogged_status.account.following?(reblog.account)
ActivityPub::DeliveryWorker.perform_async(build_json(reblog), reblog.account_id, reblogged_status.account.inbox_url)
end
LocalNotificationWorker.perform_async(reblogged_status.account_id, reblog.id, reblog.class.name, 'reblog') if reblogged_status.account.local?
end

def bump_potential_friendship(account, reblog)
Expand Down
8 changes: 8 additions & 0 deletions spec/lib/activitypub/tag_manager_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,14 @@
expect(subject.cc(status)).to include(subject.uri_for(foo))
expect(subject.cc(status)).to_not include(subject.uri_for(alice))
end

it 'returns poster of reblogged post, if reblog' do
bob = Fabricate(:account, username: 'bob', domain: 'example.com', inbox_url: 'http://example.com/bob')
alice = Fabricate(:account, username: 'alice')
status = Fabricate(:status, visibility: :public, account: bob)
reblog = Fabricate(:status, visibility: :public, account: alice, reblog: status)
expect(subject.cc(reblog)).to include(subject.uri_for(bob))
end
end

describe '#local_uri?' do
Expand Down
4 changes: 0 additions & 4 deletions spec/services/reblog_service_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,5 @@
it 'distributes to followers' do
expect(ActivityPub::DistributionWorker).to have_received(:perform_async)
end

it 'sends an announce activity to the author' do
expect(a_request(:post, bob.inbox_url)).to have_been_made.once
end
end
end
18 changes: 18 additions & 0 deletions spec/services/remove_status_service_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -108,4 +108,22 @@
)).to have_been_made.once
end
end

context 'when removed status is a reblog of a non-follower' do
let!(:original_status) { Fabricate(:status, account: bill, text: 'Hello ThisIsASecret', visibility: :public) }
let!(:status) { ReblogService.new.call(alice, original_status) }

it 'sends Undo activity to followers' do
subject.call(status)
expect(a_request(:post, bill.inbox_url).with(
body: hash_including({
'type' => 'Undo',
'object' => hash_including({
'type' => 'Announce',
'object' => ActivityPub::TagManager.instance.uri_for(original_status),
}),
})
)).to have_been_made.once
end
end
end

0 comments on commit 2acfbb9

Please sign in to comment.