Fix Move handler queuing jobs that will fail if account is suspended ()

Don't put Move handler on cooldown if it didn't run. Skip unmerging
from timelines to save unnecessary work.
signup-info-prompt
Eugen Rochko 2019-09-17 08:44:45 +02:00 committed by GitHub
parent c21386cff5
commit 38dc51b2d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 5 deletions
app
lib/activitypub/activity

View File

@ -10,10 +10,13 @@ class ActivityPub::Activity::Move < ActivityPub::Activity
target_account = ActivityPub::FetchRemoteAccountService.new.call(target_uri) 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 # 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 # Initiate a re-follow for each follower
origin_account.followers.local.select(:id).find_in_batches do |follower_accounts| origin_account.followers.local.select(:id).find_in_batches do |follower_accounts|
@ -40,4 +43,8 @@ class ActivityPub::Activity::Move < ActivityPub::Activity
def mark_as_processing! def mark_as_processing!
redis.setex("move_in_progress:#{@account.id}", PROCESSING_COOLDOWN, true) redis.setex("move_in_progress:#{@account.id}", PROCESSING_COOLDOWN, true)
end end
def unmark_as_processing!
redis.del("move_in_progress:#{@account.id}")
end
end end

View File

@ -6,9 +6,12 @@ class UnfollowService < BaseService
# Unfollow and notify the remote user # Unfollow and notify the remote user
# @param [Account] source_account Where to unfollow from # @param [Account] source_account Where to unfollow from
# @param [Account] target_account Which to unfollow # @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 @source_account = source_account
@target_account = target_account @target_account = target_account
@options = options
unfollow! || undo_follow_request! unfollow! || undo_follow_request!
end end
@ -21,9 +24,11 @@ class UnfollowService < BaseService
return unless follow return unless follow
follow.destroy! follow.destroy!
create_notification(follow) if !@target_account.local? && @target_account.activitypub? create_notification(follow) if !@target_account.local? && @target_account.activitypub?
create_reject_notification(follow) if @target_account.local? && !@source_account.local? && @source_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 follow
end end
@ -33,7 +38,9 @@ class UnfollowService < BaseService
return unless follow_request return unless follow_request
follow_request.destroy! follow_request.destroy!
create_notification(follow_request) unless @target_account.local? create_notification(follow_request) unless @target_account.local?
follow_request follow_request
end end

View File

@ -11,7 +11,7 @@ class UnfollowFollowWorker
new_target_account = Account.find(new_target_account_id) new_target_account = Account.find(new_target_account_id)
FollowService.new.call(follower_account, new_target_account) 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 rescue ActiveRecord::RecordNotFound, Mastodon::NotPermittedError
true true
end end