Skip to content

Commit

Permalink
Fix Move handler queuing jobs that will fail if account is suspended
Browse files Browse the repository at this point in the history
Don't put Move handler on cooldown if it didn't run. Skip unmerging
from timelines to save unnecessary work.
  • Loading branch information
Gargron committed Sep 16, 2019
1 parent 576377a commit 669372b
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 5 deletions.
11 changes: 9 additions & 2 deletions app/lib/activitypub/activity/move.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@ def perform

target_account = ActivityPub::FetchRemoteAccountService.new.call(target_uri)

return if target_account.nil? || !target_account.also_known_as.include?(origin_account.uri)
if target_account.nil? || target_account.suspended? || !target_account.also_known_as.include?(origin_account.uri)
unmark_as_processing!
return
end

# In case for some reason we didn't have a redirect for the profile already, set it
origin_account.update(moved_to_account: target_account) if origin_account.moved_to_account_id.nil?
origin_account.update(moved_to_account: target_account)

# Initiate a re-follow for each follower
origin_account.followers.local.select(:id).find_in_batches do |follower_accounts|
Expand All @@ -40,4 +43,8 @@ def processed?
def mark_as_processing!
redis.setex("move_in_progress:#{@account.id}", PROCESSING_COOLDOWN, true)
end

def unmark_as_processing!
redis.del("move_in_progress:#{@account.id}")
end
end
11 changes: 9 additions & 2 deletions app/services/unfollow_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@ class UnfollowService < BaseService
# Unfollow and notify the remote user
# @param [Account] source_account Where to unfollow from
# @param [Account] target_account Which to unfollow
def call(source_account, target_account)
# @param [Hash] options
# @option [Boolean] :skip_unmerge
def call(source_account, target_account, options = {})
@source_account = source_account
@target_account = target_account
@options = options

unfollow! || undo_follow_request!
end
Expand All @@ -21,9 +24,11 @@ def unfollow!
return unless follow

follow.destroy!

create_notification(follow) if !@target_account.local? && @target_account.activitypub?
create_reject_notification(follow) if @target_account.local? && !@source_account.local? && @source_account.activitypub?
UnmergeWorker.perform_async(@target_account.id, @source_account.id)
UnmergeWorker.perform_async(@target_account.id, @source_account.id) unless @options[:skip_unmerge]

follow
end

Expand All @@ -33,7 +38,9 @@ def undo_follow_request!
return unless follow_request

follow_request.destroy!

create_notification(follow_request) unless @target_account.local?

follow_request
end

Expand Down
2 changes: 1 addition & 1 deletion app/workers/unfollow_follow_worker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def perform(follower_account_id, old_target_account_id, new_target_account_id)
new_target_account = Account.find(new_target_account_id)

FollowService.new.call(follower_account, new_target_account)
UnfollowService.new.call(follower_account, old_target_account)
UnfollowService.new.call(follower_account, old_target_account, skip_unmerge: true)
rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
true
end
Expand Down

0 comments on commit 669372b

Please sign in to comment.