Change quote verification to not bypass authorization flow for mentions (#35528)
Some checks failed
Bundler Audit / security (push) Waiting to run
Check i18n / check-i18n (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Check formatting / lint (push) Waiting to run
Haml Linting / lint (push) Waiting to run
Ruby Linting / lint (push) Waiting to run
Historical data migration test / test (14-alpine) (push) Waiting to run
Historical data migration test / test (15-alpine) (push) Waiting to run
Historical data migration test / test (16-alpine) (push) Waiting to run
Historical data migration test / test (17-alpine) (push) Waiting to run
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.2) (push) Blocked by required conditions
Ruby Testing / test (3.3) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (.ruby-version) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.2) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.3) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.2) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.3) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Crowdin / Upload translations / upload-translations (push) Has been cancelled

This commit is contained in:
Claire 2025-07-31 09:39:53 +02:00 committed by GitHub
parent 2131d1ff23
commit 572a0e128d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 13 additions and 31 deletions

View File

@ -152,9 +152,6 @@ class ActivityPub::Parser::StatusParser
# Remove the special-meaning actor URI
allowed_actors.delete(@options[:actor_uri])
# Tagged users are always allowed, so remove them
allowed_actors -= as_array(@object['tag']).filter_map { |tag| tag['href'] if equals_or_includes?(tag['type'], 'Mention') }
# Any unrecognized actor is marked as unknown
flags |= Status::QUOTE_APPROVAL_POLICY_FLAGS[:unknown] unless allowed_actors.empty?

View File

@ -33,16 +33,8 @@ module Status::InteractionPolicyConcern
automatic_policy = quote_approval_policy >> 16
manual_policy = quote_approval_policy & 0xFFFF
# Checking for public policy first because it's less expensive than looking at mentions
return :automatic if automatic_policy.anybits?(QUOTE_APPROVAL_POLICY_FLAGS[:public])
# Mentioned users are always allowed to quote
if active_mentions.loaded?
return :automatic if active_mentions.any? { |mention| mention.account_id == other_account.id }
elsif active_mentions.exists?(account: other_account)
return :automatic
end
if automatic_policy.anybits?(QUOTE_APPROVAL_POLICY_FLAGS[:followers])
following_author = preloaded_relations[:following] ? preloaded_relations[:following][account_id] : other_account.following?(account) if following_author.nil?
return :automatic if following_author

View File

@ -45,14 +45,7 @@ class ActivityPub::VerifyQuoteService < BaseService
true
end
# Always allow someone to quote posts in which they are mentioned
if @quote.quoted_status.active_mentions.exists?(mentions: { account_id: @quote.account_id })
@quote.accept!
true
else
false
end
false
end
def fetch_approval_object(uri, prefetched_body: nil)

View File

@ -1906,8 +1906,8 @@ en:
ownership: Someone else's post cannot be pinned
reblog: A boost cannot be pinned
quote_policies:
followers: Followers and mentioned users
nobody: Only mentioned users
followers: Only your followers
nobody: Nobody
public: Everyone
title: '%{name}: "%{quote}"'
visibilities:

View File

@ -56,7 +56,7 @@ en:
scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones.
setting_aggregate_reblogs: Do not show new boosts for posts that have been recently boosted (only affects newly-received boosts)
setting_always_send_emails: Normally e-mail notifications won't be sent when you are actively using Mastodon
setting_default_quote_policy: Mentioned users are always allowed to quote. This setting will only take effect for posts created with the next Mastodon version, but you can select your preference in preparation
setting_default_quote_policy: This setting will only take effect for posts created with the next Mastodon version, but you can select your preference in preparation.
setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click
setting_display_media_default: Hide media marked as sensitive
setting_display_media_hide_all: Always hide media

View File

@ -94,19 +94,19 @@ RSpec.describe StatusPolicy, type: :model do
expect(subject).to permit(status.account, status)
end
it 'grants access when direct and viewer is mentioned' do
it 'does not grant access access when direct and viewer is mentioned but not explicitly allowed' do
status.visibility = :direct
status.mentions = [Fabricate(:mention, account: alice)]
status.mentions = [Fabricate(:mention, account: bob)]
expect(subject).to permit(alice, status)
expect(subject).to_not permit(bob, status)
end
it 'grants access when direct and non-owner viewer is mentioned and mentions are loaded' do
it 'does not grant access access when direct and viewer is mentioned but not explicitly allowed and mentions are loaded' do
status.visibility = :direct
status.mentions = [Fabricate(:mention, account: bob)]
status.active_mentions.load
expect(subject).to permit(bob, status)
expect(subject).to_not permit(bob, status)
end
it 'denies access when direct and viewer is not mentioned' do
@ -123,11 +123,11 @@ RSpec.describe StatusPolicy, type: :model do
expect(subject).to_not permit(viewer, status)
end
it 'grants access when private and viewer is mentioned' do
it 'grants access when private and viewer is mentioned but not otherwise allowed' do
status.visibility = :private
status.mentions = [Fabricate(:mention, account: bob)]
expect(subject).to permit(bob, status)
expect(subject).to_not permit(bob, status)
end
it 'denies access when private and non-viewer is mentioned' do

View File

@ -267,9 +267,9 @@ RSpec.describe ActivityPub::VerifyQuoteService do
quoted_status.mentions << Mention.new(account: account)
end
it 'updates the status' do
it 'does not the status' do
expect { subject.call(quote) }
.to change(quote, :state).to('accepted')
.to_not change(quote, :state).from('pending')
end
end
end