Remove Salmon and PubSubHubbub (#11205)
* Remove Salmon and PubSubHubbub endpoints * Add error when trying to follow OStatus accounts * Fix new accounts not being created in ResolveAccountService
This commit is contained in:
parent
c07cca4727
commit
23aeef52cc
102 changed files with 70 additions and 3569 deletions
|
@ -1,59 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe AfterRemoteFollowRequestWorker do
|
||||
subject { described_class.new }
|
||||
let(:follow_request) { Fabricate(:follow_request) }
|
||||
describe 'perform' do
|
||||
context 'when the follow_request does not exist' do
|
||||
it 'catches a raise and returns true' do
|
||||
allow(FollowService).to receive(:new)
|
||||
result = subject.perform('aaa')
|
||||
|
||||
expect(result).to eq(true)
|
||||
expect(FollowService).not_to have_received(:new)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the account cannot be updated' do
|
||||
it 'returns nil and does not call service when account is nil' do
|
||||
allow(FollowService).to receive(:new)
|
||||
service = double(call: nil)
|
||||
allow(FetchRemoteAccountService).to receive(:new).and_return(service)
|
||||
|
||||
result = subject.perform(follow_request.id)
|
||||
|
||||
expect(result).to be_nil
|
||||
expect(FollowService).not_to have_received(:new)
|
||||
end
|
||||
|
||||
it 'returns nil and does not call service when account is locked' do
|
||||
allow(FollowService).to receive(:new)
|
||||
service = double(call: double(locked?: true))
|
||||
allow(FetchRemoteAccountService).to receive(:new).and_return(service)
|
||||
|
||||
result = subject.perform(follow_request.id)
|
||||
|
||||
expect(result).to be_nil
|
||||
expect(FollowService).not_to have_received(:new)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the account is updated' do
|
||||
it 'calls the follow service and destroys the follow' do
|
||||
follow_service = double(call: nil)
|
||||
allow(FollowService).to receive(:new).and_return(follow_service)
|
||||
account = Fabricate(:account, locked: false)
|
||||
service = double(call: account)
|
||||
allow(FetchRemoteAccountService).to receive(:new).and_return(service)
|
||||
|
||||
result = subject.perform(follow_request.id)
|
||||
|
||||
expect(result).to be_nil
|
||||
expect(follow_service).to have_received(:call).with(follow_request.account, account.acct)
|
||||
expect { follow_request.reload }.to raise_error(ActiveRecord::RecordNotFound)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,59 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe AfterRemoteFollowWorker do
|
||||
subject { described_class.new }
|
||||
let(:follow) { Fabricate(:follow) }
|
||||
describe 'perform' do
|
||||
context 'when the follow does not exist' do
|
||||
it 'catches a raise and returns true' do
|
||||
allow(FollowService).to receive(:new)
|
||||
result = subject.perform('aaa')
|
||||
|
||||
expect(result).to eq(true)
|
||||
expect(FollowService).not_to have_received(:new)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the account cannot be updated' do
|
||||
it 'returns nil and does not call service when account is nil' do
|
||||
allow(FollowService).to receive(:new)
|
||||
service = double(call: nil)
|
||||
allow(FetchRemoteAccountService).to receive(:new).and_return(service)
|
||||
|
||||
result = subject.perform(follow.id)
|
||||
|
||||
expect(result).to be_nil
|
||||
expect(FollowService).not_to have_received(:new)
|
||||
end
|
||||
|
||||
it 'returns nil and does not call service when account is not locked' do
|
||||
allow(FollowService).to receive(:new)
|
||||
service = double(call: double(locked?: false))
|
||||
allow(FetchRemoteAccountService).to receive(:new).and_return(service)
|
||||
|
||||
result = subject.perform(follow.id)
|
||||
|
||||
expect(result).to be_nil
|
||||
expect(FollowService).not_to have_received(:new)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the account is updated' do
|
||||
it 'calls the follow service and destroys the follow' do
|
||||
follow_service = double(call: nil)
|
||||
allow(FollowService).to receive(:new).and_return(follow_service)
|
||||
account = Fabricate(:account, locked: true)
|
||||
service = double(call: account)
|
||||
allow(FetchRemoteAccountService).to receive(:new).and_return(service)
|
||||
|
||||
result = subject.perform(follow.id)
|
||||
|
||||
expect(result).to be_nil
|
||||
expect(follow_service).to have_received(:call).with(follow.account, account.acct)
|
||||
expect { follow.reload }.to raise_error(ActiveRecord::RecordNotFound)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,88 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe Pubsubhubbub::ConfirmationWorker do
|
||||
include RoutingHelper
|
||||
|
||||
subject { described_class.new }
|
||||
|
||||
let!(:alice) { Fabricate(:account, username: 'alice') }
|
||||
let!(:subscription) { Fabricate(:subscription, account: alice, callback_url: 'http://example.com/api', confirmed: false, expires_at: 3.days.from_now, secret: nil) }
|
||||
|
||||
describe 'perform' do
|
||||
describe 'with subscribe mode' do
|
||||
it 'confirms and updates subscription when challenge matches' do
|
||||
stub_random_value
|
||||
stub_request(:get, url_for_mode('subscribe'))
|
||||
.with(headers: http_headers)
|
||||
.to_return(status: 200, body: challenge_value, headers: {})
|
||||
|
||||
seconds = 10.days.seconds.to_i
|
||||
subject.perform(subscription.id, 'subscribe', 'asdf', seconds)
|
||||
|
||||
subscription.reload
|
||||
expect(subscription.secret).to eq 'asdf'
|
||||
expect(subscription.confirmed).to eq true
|
||||
expect(subscription.expires_at).to be_within(5).of(10.days.from_now)
|
||||
end
|
||||
|
||||
it 'does not update subscription when challenge does not match' do
|
||||
stub_random_value
|
||||
stub_request(:get, url_for_mode('subscribe'))
|
||||
.with(headers: http_headers)
|
||||
.to_return(status: 200, body: 'wrong value', headers: {})
|
||||
|
||||
seconds = 10.days.seconds.to_i
|
||||
subject.perform(subscription.id, 'subscribe', 'asdf', seconds)
|
||||
|
||||
subscription.reload
|
||||
expect(subscription.secret).to be_blank
|
||||
expect(subscription.confirmed).to eq false
|
||||
expect(subscription.expires_at).to be_within(5).of(3.days.from_now)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'with unsubscribe mode' do
|
||||
it 'confirms and destroys subscription when challenge matches' do
|
||||
stub_random_value
|
||||
stub_request(:get, url_for_mode('unsubscribe'))
|
||||
.with(headers: http_headers)
|
||||
.to_return(status: 200, body: challenge_value, headers: {})
|
||||
|
||||
seconds = 10.days.seconds.to_i
|
||||
subject.perform(subscription.id, 'unsubscribe', 'asdf', seconds)
|
||||
|
||||
expect { subscription.reload }.to raise_error(ActiveRecord::RecordNotFound)
|
||||
end
|
||||
|
||||
it 'does not destroy subscription when challenge does not match' do
|
||||
stub_random_value
|
||||
stub_request(:get, url_for_mode('unsubscribe'))
|
||||
.with(headers: http_headers)
|
||||
.to_return(status: 200, body: 'wrong value', headers: {})
|
||||
|
||||
seconds = 10.days.seconds.to_i
|
||||
subject.perform(subscription.id, 'unsubscribe', 'asdf', seconds)
|
||||
|
||||
expect { subscription.reload }.not_to raise_error
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def url_for_mode(mode)
|
||||
"http://example.com/api?hub.challenge=#{challenge_value}&hub.lease_seconds=863999&hub.mode=#{mode}&hub.topic=https://#{Rails.configuration.x.local_domain}/users/alice.atom"
|
||||
end
|
||||
|
||||
def stub_random_value
|
||||
allow(SecureRandom).to receive(:hex).and_return(challenge_value)
|
||||
end
|
||||
|
||||
def challenge_value
|
||||
'1a2s3d4f'
|
||||
end
|
||||
|
||||
def http_headers
|
||||
{ 'Connection' => 'close', 'Host' => 'example.com' }
|
||||
end
|
||||
end
|
|
@ -1,68 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe Pubsubhubbub::DeliveryWorker do
|
||||
include RoutingHelper
|
||||
subject { described_class.new }
|
||||
|
||||
let(:payload) { 'test' }
|
||||
|
||||
describe 'perform' do
|
||||
it 'raises when subscription does not exist' do
|
||||
expect { subject.perform 123, payload }.to raise_error(ActiveRecord::RecordNotFound)
|
||||
end
|
||||
|
||||
it 'does not attempt to deliver when domain blocked' do
|
||||
_domain_block = Fabricate(:domain_block, domain: 'example.com', severity: :suspend)
|
||||
subscription = Fabricate(:subscription, callback_url: 'https://example.com/api', last_successful_delivery_at: 2.days.ago)
|
||||
|
||||
subject.perform(subscription.id, payload)
|
||||
|
||||
expect(subscription.reload.last_successful_delivery_at).to be_within(2).of(2.days.ago)
|
||||
end
|
||||
|
||||
it 'raises when request fails' do
|
||||
subscription = Fabricate(:subscription)
|
||||
|
||||
stub_request_to_respond_with(subscription, 500)
|
||||
expect { subject.perform(subscription.id, payload) }.to raise_error Mastodon::UnexpectedResponseError
|
||||
end
|
||||
|
||||
it 'updates subscriptions when delivery succeeds' do
|
||||
subscription = Fabricate(:subscription)
|
||||
|
||||
stub_request_to_respond_with(subscription, 200)
|
||||
subject.perform(subscription.id, payload)
|
||||
|
||||
expect(subscription.reload.last_successful_delivery_at).to be_within(2).of(Time.now.utc)
|
||||
end
|
||||
|
||||
it 'updates subscription without a secret when delivery succeeds' do
|
||||
subscription = Fabricate(:subscription, secret: nil)
|
||||
|
||||
stub_request_to_respond_with(subscription, 200)
|
||||
subject.perform(subscription.id, payload)
|
||||
|
||||
expect(subscription.reload.last_successful_delivery_at).to be_within(2).of(Time.now.utc)
|
||||
end
|
||||
|
||||
def stub_request_to_respond_with(subscription, code)
|
||||
stub_request(:post, 'http://example.com/callback')
|
||||
.with(body: payload, headers: expected_headers(subscription))
|
||||
.to_return(status: code, body: '', headers: {})
|
||||
end
|
||||
|
||||
def expected_headers(subscription)
|
||||
{
|
||||
'Connection' => 'close',
|
||||
'Content-Type' => 'application/atom+xml',
|
||||
'Host' => 'example.com',
|
||||
'Link' => "<https://#{Rails.configuration.x.local_domain}/api/push>; rel=\"hub\", <https://#{Rails.configuration.x.local_domain}/users/#{subscription.account.username}.atom>; rel=\"self\"",
|
||||
}.tap do |basic|
|
||||
known_digest = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), subscription.secret.to_s, payload)
|
||||
basic.merge('X-Hub-Signature' => "sha1=#{known_digest}") if subscription.secret?
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,46 +0,0 @@
|
|||
require 'rails_helper'
|
||||
|
||||
describe Pubsubhubbub::DistributionWorker do
|
||||
subject { Pubsubhubbub::DistributionWorker.new }
|
||||
|
||||
let!(:alice) { Fabricate(:account, username: 'alice') }
|
||||
let!(:bob) { Fabricate(:account, username: 'bob', domain: 'example2.com') }
|
||||
let!(:anonymous_subscription) { Fabricate(:subscription, account: alice, callback_url: 'http://example1.com', confirmed: true, lease_seconds: 3600) }
|
||||
let!(:subscription_with_follower) { Fabricate(:subscription, account: alice, callback_url: 'http://example2.com', confirmed: true, lease_seconds: 3600) }
|
||||
|
||||
before do
|
||||
bob.follow!(alice)
|
||||
end
|
||||
|
||||
describe 'with public status' do
|
||||
let(:status) { Fabricate(:status, account: alice, text: 'Hello', visibility: :public) }
|
||||
|
||||
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.id, subscription_with_follower.id])
|
||||
end
|
||||
end
|
||||
|
||||
context 'when OStatus privacy is not used' do
|
||||
describe 'with private status' do
|
||||
let(:status) { Fabricate(:status, account: alice, text: 'Hello', visibility: :private) }
|
||||
|
||||
it 'does not deliver anything' do
|
||||
allow(Pubsubhubbub::DeliveryWorker).to receive(:push_bulk)
|
||||
subject.perform(status.stream_entry.id)
|
||||
expect(Pubsubhubbub::DeliveryWorker).to_not have_received(:push_bulk)
|
||||
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
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,19 +0,0 @@
|
|||
require 'rails_helper'
|
||||
|
||||
describe Scheduler::SubscriptionsScheduler do
|
||||
subject { Scheduler::SubscriptionsScheduler.new }
|
||||
|
||||
let!(:expiring_account1) { Fabricate(:account, subscription_expires_at: 20.minutes.from_now, domain: 'example.com', followers_count: 1, hub_url: 'http://hub.example.com') }
|
||||
let!(:expiring_account2) { Fabricate(:account, subscription_expires_at: 4.hours.from_now, domain: 'example.org', followers_count: 1, hub_url: 'http://hub.example.org') }
|
||||
|
||||
before do
|
||||
stub_request(:post, 'http://hub.example.com/').to_return(status: 202)
|
||||
stub_request(:post, 'http://hub.example.org/').to_return(status: 202)
|
||||
end
|
||||
|
||||
it 're-subscribes for all expiring accounts' do
|
||||
subject.perform
|
||||
expect(a_request(:post, 'http://hub.example.com/')).to have_been_made.once
|
||||
expect(a_request(:post, 'http://hub.example.org/')).to have_been_made.once
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue