Fix permalink redirects continuing to work for suspended accounts (#36453)

This commit is contained in:
Eugen Rochko 2025-10-13 17:18:01 +02:00 committed by GitHub
parent 254fff93ca
commit 33f739da44
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 71 additions and 33 deletions

View File

@ -12,15 +12,15 @@ class PermalinkRedirector
@object ||= begin
if at_username_status_request? || statuses_status_request?
status = Status.find_by(id: second_segment)
status if status&.distributable? && !status&.local?
status if status&.distributable? && !status&.local? && !status&.account&.suspended?
elsif at_username_request?
username, domain = first_segment.delete_prefix('@').split('@')
domain = nil if TagManager.instance.local_domain?(domain)
account = Account.find_remote(username, domain)
account unless account&.local?
account if !account&.local? && !account&.suspended?
elsif accounts_request? && record_integer_id_request?
account = Account.find_by(id: second_segment)
account unless account&.local?
account if !account&.local? && !account&.suspended?
end
end
end

View File

@ -10,39 +10,77 @@ RSpec.describe PermalinkRedirector do
Fabricate(:status, account: remote_account, id: 123, url: 'https://example.com/status-123')
end
it 'returns path for legacy account links' do
redirector = described_class.new('accounts/2')
expect(redirector.redirect_path).to eq 'https://example.com/@alice'
end
it 'returns path for legacy status links' do
redirector = described_class.new('statuses/123')
expect(redirector.redirect_path).to eq 'https://example.com/status-123'
end
it 'returns path for pretty account links' do
redirector = described_class.new('@alice@example.com')
expect(redirector.redirect_path).to eq 'https://example.com/@alice'
end
it 'returns path for pretty status links' do
redirector = described_class.new('@alice/123')
expect(redirector.redirect_path).to eq 'https://example.com/status-123'
end
it 'returns path for legacy status links with a query param' do
redirector = described_class.new('statuses/123?foo=bar')
expect(redirector.redirect_path).to eq 'https://example.com/status-123'
end
it 'returns path for pretty status links with a query param' do
redirector = described_class.new('@alice/123?foo=bar')
expect(redirector.redirect_path).to eq 'https://example.com/status-123'
end
it 'returns path for deck URLs with query params' do
redirector = described_class.new('/deck/directory?local=true')
expect(redirector.redirect_path).to eq '/directory?local=true'
end
context 'when account is not suspended' do
it 'returns path for legacy account links' do
redirector = described_class.new('accounts/2')
expect(redirector.redirect_path).to eq 'https://example.com/@alice'
end
it 'returns path for legacy status links' do
redirector = described_class.new('statuses/123')
expect(redirector.redirect_path).to eq 'https://example.com/status-123'
end
it 'returns path for pretty account links' do
redirector = described_class.new('@alice@example.com')
expect(redirector.redirect_path).to eq 'https://example.com/@alice'
end
it 'returns path for pretty status links' do
redirector = described_class.new('@alice/123')
expect(redirector.redirect_path).to eq 'https://example.com/status-123'
end
it 'returns path for legacy status links with a query param' do
redirector = described_class.new('statuses/123?foo=bar')
expect(redirector.redirect_path).to eq 'https://example.com/status-123'
end
it 'returns path for pretty status links with a query param' do
redirector = described_class.new('@alice/123?foo=bar')
expect(redirector.redirect_path).to eq 'https://example.com/status-123'
end
end
context 'when account is suspended' do
before do
remote_account.suspend!
end
it 'returns nil for legacy account links' do
redirector = described_class.new('accounts/2')
expect(redirector.redirect_path).to be_nil
end
it 'returns nil for legacy status links' do
redirector = described_class.new('statuses/123')
expect(redirector.redirect_path).to be_nil
end
it 'returns nil for pretty account links' do
redirector = described_class.new('@alice@example.com')
expect(redirector.redirect_path).to be_nil
end
it 'returns nil for pretty status links' do
redirector = described_class.new('@alice/123')
expect(redirector.redirect_path).to be_nil
end
it 'returns nil for legacy status links with a query param' do
redirector = described_class.new('statuses/123?foo=bar')
expect(redirector.redirect_path).to be_nil
end
it 'returns nil for pretty status links with a query param' do
redirector = described_class.new('@alice/123?foo=bar')
expect(redirector.redirect_path).to be_nil
end
end
end
end