diff options
Diffstat (limited to 'app/workers')
-rw-r--r-- | app/workers/activitypub/delivery_worker.rb | 2 | ||||
-rw-r--r-- | app/workers/activitypub/reply_distribution_worker.rb | 4 | ||||
-rw-r--r-- | app/workers/pubsubhubbub/delivery_worker.rb | 2 | ||||
-rw-r--r-- | app/workers/pubsubhubbub/distribution_worker.rb | 28 | ||||
-rw-r--r-- | app/workers/pubsubhubbub/subscribe_worker.rb | 4 | ||||
-rw-r--r-- | app/workers/refollow_worker.rb | 24 | ||||
-rw-r--r-- | app/workers/scheduler/ip_cleanup_scheduler.rb | 12 |
7 files changed, 47 insertions, 29 deletions
diff --git a/app/workers/activitypub/delivery_worker.rb b/app/workers/activitypub/delivery_worker.rb index cd67b6710..a4e829343 100644 --- a/app/workers/activitypub/delivery_worker.rb +++ b/app/workers/activitypub/delivery_worker.rb @@ -16,7 +16,7 @@ class ActivityPub::DeliveryWorker raise Mastodon::UnexpectedResponseError, @response unless response_successful? rescue => e - raise e.class, "Delivery failed for #{inbox_url}: #{e.message}" + raise e.class, "Delivery failed for #{inbox_url}: #{e.message}", e.backtrace[0] end private diff --git a/app/workers/activitypub/reply_distribution_worker.rb b/app/workers/activitypub/reply_distribution_worker.rb index f9127340f..fe99fc05f 100644 --- a/app/workers/activitypub/reply_distribution_worker.rb +++ b/app/workers/activitypub/reply_distribution_worker.rb @@ -7,9 +7,9 @@ class ActivityPub::ReplyDistributionWorker def perform(status_id) @status = Status.find(status_id) - @account = @status.thread.account + @account = @status.thread&.account - return if skip_distribution? + return if @account.nil? || skip_distribution? ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| [signed_payload, @status.account_id, inbox_url] diff --git a/app/workers/pubsubhubbub/delivery_worker.rb b/app/workers/pubsubhubbub/delivery_worker.rb index 88645cf33..110b8bf16 100644 --- a/app/workers/pubsubhubbub/delivery_worker.rb +++ b/app/workers/pubsubhubbub/delivery_worker.rb @@ -17,7 +17,7 @@ class Pubsubhubbub::DeliveryWorker @payload = payload process_delivery unless blocked_domain? rescue => e - raise e.class, "Delivery failed for #{subscription&.callback_url}: #{e.message}" + raise e.class, "Delivery failed for #{subscription&.callback_url}: #{e.message}", e.backtrace[0] end private diff --git a/app/workers/pubsubhubbub/distribution_worker.rb b/app/workers/pubsubhubbub/distribution_worker.rb index 524f6849f..fed5e917d 100644 --- a/app/workers/pubsubhubbub/distribution_worker.rb +++ b/app/workers/pubsubhubbub/distribution_worker.rb @@ -6,45 +6,27 @@ class Pubsubhubbub::DistributionWorker sidekiq_options queue: 'push' def perform(stream_entry_ids) - stream_entries = StreamEntry.where(id: stream_entry_ids).includes(:status).reject { |e| e.status.nil? || e.status.direct_visibility? } + stream_entries = StreamEntry.where(id: stream_entry_ids).includes(:status).reject { |e| e.status.nil? || e.status.hidden? } return if stream_entries.empty? @account = stream_entries.first.account @subscriptions = active_subscriptions.to_a - distribute_public!(stream_entries.reject(&:hidden?)) - distribute_hidden!(stream_entries.select(&:hidden?)) if Rails.configuration.x.use_ostatus_privacy + distribute_public!(stream_entries) end private def distribute_public!(stream_entries) - return if stream_entries.empty? - @payload = OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.feed(@account, stream_entries)) - Pubsubhubbub::DeliveryWorker.push_bulk(@subscriptions) do |subscription| - [subscription.id, @payload] - end - end - - def distribute_hidden!(stream_entries) - return if stream_entries.empty? - - @payload = OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.feed(@account, stream_entries)) - @domains = @account.followers.domains - - Pubsubhubbub::DeliveryWorker.push_bulk(@subscriptions.select { |s| allowed_to_receive?(s.callback_url, s.domain) }) do |subscription| - [subscription.id, @payload] + Pubsubhubbub::DeliveryWorker.push_bulk(@subscriptions) do |subscription_id| + [subscription_id, @payload] end end def active_subscriptions - Subscription.where(account: @account).active.select('id, callback_url, domain') - end - - def allowed_to_receive?(callback_url, domain) - (!domain.nil? && @domains.include?(domain)) || @domains.include?(Addressable::URI.parse(callback_url).host) + Subscription.where(account: @account).active.pluck(:id) end end diff --git a/app/workers/pubsubhubbub/subscribe_worker.rb b/app/workers/pubsubhubbub/subscribe_worker.rb index 130c967e0..e350973e1 100644 --- a/app/workers/pubsubhubbub/subscribe_worker.rb +++ b/app/workers/pubsubhubbub/subscribe_worker.rb @@ -3,7 +3,7 @@ class Pubsubhubbub::SubscribeWorker include Sidekiq::Worker - sidekiq_options queue: 'push', retry: 10, unique: :until_executed, dead: false, unique_retry: true + sidekiq_options queue: 'push', retry: 10, unique: :until_executed, dead: false sidekiq_retry_in do |count| case count @@ -29,6 +29,6 @@ class Pubsubhubbub::SubscribeWorker logger.debug "PuSH re-subscribing to #{account.acct}" ::SubscribeService.new.call(account) rescue => e - raise e.class, "Subscribe failed for #{account&.acct}: #{e.message}" + raise e.class, "Subscribe failed for #{account&.acct}: #{e.message}", e.backtrace[0] end end diff --git a/app/workers/refollow_worker.rb b/app/workers/refollow_worker.rb new file mode 100644 index 000000000..66bcd27c3 --- /dev/null +++ b/app/workers/refollow_worker.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class RefollowWorker + include Sidekiq::Worker + + sidekiq_options queue: 'pull', retry: false + + def perform(target_account_id) + target_account = Account.find(target_account_id) + return unless target_account.protocol == :activitypub + + target_account.followers.where(domain: nil).find_each do |follower| + # Locally unfollow remote account + follower.unfollow!(target_account) + + # Schedule re-follow + begin + FollowService.new.call(follower, target_account) + rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, HTTP::Error, OpenSSL::SSL::SSLError + next + end + end + end +end diff --git a/app/workers/scheduler/ip_cleanup_scheduler.rb b/app/workers/scheduler/ip_cleanup_scheduler.rb new file mode 100644 index 000000000..9f1593c91 --- /dev/null +++ b/app/workers/scheduler/ip_cleanup_scheduler.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true +require 'sidekiq-scheduler' + +class Scheduler::IpCleanupScheduler + include Sidekiq::Worker + + def perform + time_ago = 5.years.ago + SessionActivation.where('updated_at < ?', time_ago).destroy_all + User.where('last_sign_in_at < ?', time_ago).update_all(last_sign_in_ip: nil) + end +end |