if mentioned_account.local?
NotifyService.new.call(mentioned_account, mention)
- elsif mentioned_account.ostatus? && (Rails.configuration.x.use_ostatus_privacy || !status.stream_entry.hidden?)
+ elsif mentioned_account.ostatus? && !status.stream_entry.hidden?
NotificationWorker.perform_async(stream_entry_to_xml(status.stream_entry), status.account_id, mentioned_account.id)
elsif mentioned_account.activitypub?
ActivityPub::DeliveryWorker.perform_async(build_json(mention.status), mention.status.account_id, mentioned_account.inbox_url)
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
config.action_mailer.default_url_options = { host: web_host, protocol: https ? 'https://' : 'http://', trailing_slash: false }
config.x.streaming_api_base_url = 'ws://localhost:4000'
- config.x.use_ostatus_privacy = false
if Rails.env.production?
config.x.streaming_api_base_url = ENV.fetch('STREAMING_API_BASE_URL') { "ws#{https ? 's' : ''}://#{web_host}" }
it 'delivers payload to all subscriptions' do
allow(Pubsubhubbub::DeliveryWorker).to receive(:push_bulk)
subject.perform(status.stream_entry.id)
- expect(Pubsubhubbub::DeliveryWorker).to have_received(:push_bulk).with([anonymous_subscription, subscription_with_follower])
- end
- end
-
- context 'when OStatus privacy is used' do
- around do |example|
- before_val = Rails.configuration.x.use_ostatus_privacy
- Rails.configuration.x.use_ostatus_privacy = true
- example.run
- Rails.configuration.x.use_ostatus_privacy = before_val
- end
-
- describe 'with private status' do
- let(:status) { Fabricate(:status, account: alice, text: 'Hello', visibility: :private) }
-
- it 'delivers payload only to subscriptions with followers' do
- allow(Pubsubhubbub::DeliveryWorker).to receive(:push_bulk)
- subject.perform(status.stream_entry.id)
- expect(Pubsubhubbub::DeliveryWorker).to have_received(:push_bulk).with([subscription_with_follower])
- expect(Pubsubhubbub::DeliveryWorker).to_not have_received(:push_bulk).with([anonymous_subscription])
- end
- end
-
- describe 'with direct status' do
- let(:status) { Fabricate(:status, account: alice, text: 'Hello', visibility: :direct) }
-
- it 'does not deliver payload' do
- allow(Pubsubhubbub::DeliveryWorker).to receive(:push_bulk)
- subject.perform(status.stream_entry.id)
- expect(Pubsubhubbub::DeliveryWorker).to_not have_received(:push_bulk)
- end
+ expect(Pubsubhubbub::DeliveryWorker).to have_received(:push_bulk).with([anonymous_subscription.id, subscription_with_follower.id])
end
end
context 'when OStatus privacy is not used' do
- around do |example|
- before_val = Rails.configuration.x.use_ostatus_privacy
- Rails.configuration.x.use_ostatus_privacy = false
- example.run
- Rails.configuration.x.use_ostatus_privacy = before_val
- end
-
describe 'with private status' do
let(:status) { Fabricate(:status, account: alice, text: 'Hello', visibility: :private) }