summaryrefslogtreecommitdiffstats
path: root/app/lib/activitypub/activity/announce.rb
diff options
context:
space:
mode:
authorClaire <claire.github-309c@sitedethib.com>2021-04-21 04:46:09 +0200
committerGitHub <noreply@github.com>2021-04-21 04:46:09 +0200
commit0b36e3419d4c4ce175f9db266ef5b3a49a9b3974 (patch)
tree2aa9992c320c0bb23c493e6d1ee84d9bc2589bb4 /app/lib/activitypub/activity/announce.rb
parent2c322addf378d17b3962b545572a43cc9d36e526 (diff)
Fix processing of remote Delete activities (#16084)
* Add tests * Ensure deleted statuses are marked as such * Save some redis memory by not storing URIs in delete_upon_arrival values * Avoid possible race condition when processing incoming Deletes * Avoid potential duplicate Delete forwards * Lower lock durations to reduce issues in case of hard crash of the Rails process * Check for `lock.aquired?` and improve comment * Refactor RedisLock usage in app/lib/activitypub * Fix using incorrect or non-existent sender for relaying Deletes
Diffstat (limited to 'app/lib/activitypub/activity/announce.rb')
-rw-r--r--app/lib/activitypub/activity/announce.rb36
1 files changed, 14 insertions, 22 deletions
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index ae8b2db754e..a1081522eb1 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -4,29 +4,25 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
def perform
return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity?
- RedisLock.acquire(lock_options) do |lock|
- if lock.acquired?
- original_status = status_from_object
+ lock_or_fail("announce:#{@object['id']}") do
+ original_status = status_from_object
- return reject_payload! if original_status.nil? || !announceable?(original_status)
+ return reject_payload! if original_status.nil? || !announceable?(original_status)
- @status = Status.find_by(account: @account, reblog: original_status)
+ @status = Status.find_by(account: @account, reblog: original_status)
- return @status unless @status.nil?
+ return @status unless @status.nil?
- @status = Status.create!(
- account: @account,
- reblog: original_status,
- uri: @json['id'],
- created_at: @json['published'],
- override_timestamps: @options[:override_timestamps],
- visibility: visibility_from_audience
- )
+ @status = Status.create!(
+ account: @account,
+ reblog: original_status,
+ uri: @json['id'],
+ created_at: @json['published'],
+ override_timestamps: @options[:override_timestamps],
+ visibility: visibility_from_audience
+ )
- distribute(@status)
- else
- raise Mastodon::RaceConditionError
- end
+ distribute(@status)
end
@status
@@ -69,8 +65,4 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
def reblog_of_local_status?
status_from_uri(object_uri)&.account&.local?
end
-
- def lock_options
- { redis: Redis.current, key: "announce:#{@object['id']}" }
- end
end