Skip to content
Snippets Groups Projects
Commit 446aad4c authored by Eugen Rochko's avatar Eugen Rochko
Browse files

Make PuSH only distribute to subscriptions that match follower domains

Allow PuSH to distribute private toots with that condition
parent dc851c92
No related branches found
No related tags found
No related merge requests found
...@@ -95,6 +95,10 @@ class Account < ApplicationRecord ...@@ -95,6 +95,10 @@ class Account < ApplicationRecord
follow_requests.where(target_account: other_account).exists? follow_requests.where(target_account: other_account).exists?
end end
def followers_domains
followers.reorder('').select('DISTINCT accounts.domain').map(&:domain)
end
def local? def local?
domain.nil? domain.nil?
end end
......
...@@ -8,13 +8,18 @@ class Pubsubhubbub::DistributionWorker ...@@ -8,13 +8,18 @@ class Pubsubhubbub::DistributionWorker
def perform(stream_entry_id) def perform(stream_entry_id)
stream_entry = StreamEntry.find(stream_entry_id) stream_entry = StreamEntry.find(stream_entry_id)
return if stream_entry.hidden? # Most hidden stream entries should not be PuSHed,
# but statuses need to be distributed to trusted
# followers even when they are hidden
return if stream_entry.hidden? && stream_entry.activity_type != 'Status'
account = stream_entry.account account = stream_entry.account
renderer = AccountsController.renderer.new(method: 'get', http_host: Rails.configuration.x.local_domain, https: Rails.configuration.x.use_https) renderer = AccountsController.renderer.new(method: 'get', http_host: Rails.configuration.x.local_domain, https: Rails.configuration.x.use_https)
payload = renderer.render(:show, assigns: { account: account, entries: [stream_entry] }, formats: [:atom]) payload = renderer.render(:show, assigns: { account: account, entries: [stream_entry] }, formats: [:atom])
domains = account.followers_domains
Subscription.where(account: account).active.select('id').find_each do |subscription| Subscription.where(account: account).active.select('id, callback_url').find_each do |subscription|
next unless domains.include?(Addressable::URI.parse(subscription.callback_url).host)
Pubsubhubbub::DeliveryWorker.perform_async(subscription.id, payload) Pubsubhubbub::DeliveryWorker.perform_async(subscription.id, payload)
end end
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment