mirror of
https://github.com/mastodon/mastodon.git
synced 2025-10-05 16:42:47 +00:00
Fix quote posts with CW and no text being rejected
Some checks failed
Check i18n / check-i18n (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (ruby) (push) Has been cancelled
Check formatting / lint (push) Has been cancelled
JavaScript Linting / lint (push) Has been cancelled
Ruby Linting / lint (push) Has been cancelled
JavaScript Testing / test (push) Has been cancelled
Historical data migration test / test (14-alpine) (push) Has been cancelled
Historical data migration test / test (15-alpine) (push) Has been cancelled
Historical data migration test / test (16-alpine) (push) Has been cancelled
Historical data migration test / test (17-alpine) (push) Has been cancelled
Ruby Testing / build (production) (push) Has been cancelled
Ruby Testing / build (test) (push) Has been cancelled
Ruby Testing / test (.ruby-version) (push) Has been cancelled
Ruby Testing / test (3.2) (push) Has been cancelled
Ruby Testing / test (3.3) (push) Has been cancelled
Ruby Testing / ImageMagick tests (.ruby-version) (push) Has been cancelled
Ruby Testing / ImageMagick tests (3.2) (push) Has been cancelled
Ruby Testing / ImageMagick tests (3.3) (push) Has been cancelled
Ruby Testing / End to End testing (.ruby-version) (push) Has been cancelled
Ruby Testing / End to End testing (3.2) (push) Has been cancelled
Ruby Testing / End to End testing (3.3) (push) Has been cancelled
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Has been cancelled
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Has been cancelled
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Has been cancelled
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Has been cancelled
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Has been cancelled
Some checks failed
Check i18n / check-i18n (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
CodeQL / Analyze (ruby) (push) Has been cancelled
Check formatting / lint (push) Has been cancelled
JavaScript Linting / lint (push) Has been cancelled
Ruby Linting / lint (push) Has been cancelled
JavaScript Testing / test (push) Has been cancelled
Historical data migration test / test (14-alpine) (push) Has been cancelled
Historical data migration test / test (15-alpine) (push) Has been cancelled
Historical data migration test / test (16-alpine) (push) Has been cancelled
Historical data migration test / test (17-alpine) (push) Has been cancelled
Ruby Testing / build (production) (push) Has been cancelled
Ruby Testing / build (test) (push) Has been cancelled
Ruby Testing / test (.ruby-version) (push) Has been cancelled
Ruby Testing / test (3.2) (push) Has been cancelled
Ruby Testing / test (3.3) (push) Has been cancelled
Ruby Testing / ImageMagick tests (.ruby-version) (push) Has been cancelled
Ruby Testing / ImageMagick tests (3.2) (push) Has been cancelled
Ruby Testing / ImageMagick tests (3.3) (push) Has been cancelled
Ruby Testing / End to End testing (.ruby-version) (push) Has been cancelled
Ruby Testing / End to End testing (3.2) (push) Has been cancelled
Ruby Testing / End to End testing (3.3) (push) Has been cancelled
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Has been cancelled
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Has been cancelled
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Has been cancelled
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Has been cancelled
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Has been cancelled
Fixes #36077
This commit is contained in:
parent
6044270d69
commit
48f55e3224
|
@ -56,11 +56,10 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
|
||||||
process_audience
|
process_audience
|
||||||
|
|
||||||
ApplicationRecord.transaction do
|
ApplicationRecord.transaction do
|
||||||
@status = Status.create!(@params)
|
@status = Status.create!(@params.merge(quote: @quote))
|
||||||
attach_tags(@status)
|
attach_tags(@status)
|
||||||
attach_mentions(@status)
|
attach_mentions(@status)
|
||||||
attach_counts(@status)
|
attach_counts(@status)
|
||||||
attach_quote(@status)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
resolve_thread(@status)
|
resolve_thread(@status)
|
||||||
|
@ -202,13 +201,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def attach_quote(status)
|
|
||||||
return if @quote.nil?
|
|
||||||
|
|
||||||
@quote.status = status
|
|
||||||
@quote.save
|
|
||||||
end
|
|
||||||
|
|
||||||
def process_tags
|
def process_tags
|
||||||
return if @object['tag'].nil?
|
return if @object['tag'].nil?
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ class Status < ApplicationRecord
|
||||||
has_one :quote, inverse_of: :status, dependent: :destroy
|
has_one :quote, inverse_of: :status, dependent: :destroy
|
||||||
|
|
||||||
validates :uri, uniqueness: true, presence: true, unless: :local?
|
validates :uri, uniqueness: true, presence: true, unless: :local?
|
||||||
validates :text, presence: true, unless: -> { with_media? || reblog? }
|
validates :text, presence: true, unless: -> { with_media? || reblog? || with_quote? }
|
||||||
validates_with StatusLengthValidator
|
validates_with StatusLengthValidator
|
||||||
validates_with DisallowedHashtagsValidator
|
validates_with DisallowedHashtagsValidator
|
||||||
validates :reblog, uniqueness: { scope: :account }, if: :reblog?
|
validates :reblog, uniqueness: { scope: :account }, if: :reblog?
|
||||||
|
@ -256,6 +256,10 @@ class Status < ApplicationRecord
|
||||||
ordered_media_attachments.any?
|
ordered_media_attachments.any?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def with_quote?
|
||||||
|
quote.present?
|
||||||
|
end
|
||||||
|
|
||||||
def with_preview_card?
|
def with_preview_card?
|
||||||
preview_cards_status.present?
|
preview_cards_status.present?
|
||||||
end
|
end
|
||||||
|
|
|
@ -887,6 +887,33 @@ RSpec.describe ActivityPub::Activity::Create do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with an unverifiable quote of a known post, with summary (CW) but no text' do
|
||||||
|
let(:quoted_status) { Fabricate(:status, account: Fabricate(:account, domain: 'example.com')) }
|
||||||
|
|
||||||
|
let(:object_json) do
|
||||||
|
build_object(
|
||||||
|
type: 'Note',
|
||||||
|
summary: 'beware of what she said',
|
||||||
|
content: nil,
|
||||||
|
quote: ActivityPub::TagManager.instance.uri_for(quoted_status)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'creates a status with an unverified quote' do
|
||||||
|
expect { subject.perform }.to change(sender.statuses, :count).by(1)
|
||||||
|
|
||||||
|
status = sender.statuses.first
|
||||||
|
expect(status).to_not be_nil
|
||||||
|
expect(status.spoiler_text).to eq 'beware of what she said'
|
||||||
|
expect(status.content).to eq ''
|
||||||
|
expect(status.quote).to_not be_nil
|
||||||
|
expect(status.quote).to have_attributes(
|
||||||
|
state: 'pending',
|
||||||
|
approval_uri: nil
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'with an unverifiable quote of a known post' do
|
context 'with an unverifiable quote of a known post' do
|
||||||
let(:quoted_status) { Fabricate(:status) }
|
let(:quoted_status) { Fabricate(:status) }
|
||||||
|
|
||||||
|
|
|
@ -600,6 +600,39 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when the status keeps an unverifiable quote and removes text through an explicit update' do
|
||||||
|
let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') }
|
||||||
|
let(:quoted_status) { Fabricate(:status, account: quoted_account) }
|
||||||
|
let!(:quote) { Fabricate(:quote, status: status, quoted_status: quoted_status) }
|
||||||
|
|
||||||
|
let(:payload) do
|
||||||
|
{
|
||||||
|
'@context': [
|
||||||
|
'https://www.w3.org/ns/activitystreams',
|
||||||
|
{
|
||||||
|
'@id': 'https://w3id.org/fep/044f#quote',
|
||||||
|
'@type': '@id',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'@id': 'https://w3id.org/fep/044f#quoteAuthorization',
|
||||||
|
'@type': '@id',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
id: 'foo',
|
||||||
|
type: 'Note',
|
||||||
|
summary: 'Show more',
|
||||||
|
updated: '2021-09-08T22:39:25Z',
|
||||||
|
quote: ActivityPub::TagManager.instance.uri_for(quoted_status),
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'updates the approval URI but does not verify the quote' do
|
||||||
|
expect { subject.call(status, json, json) }
|
||||||
|
.to change(status, :text).to('')
|
||||||
|
.and not_change(quote, :state).from('pending')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when the status has an existing verified quote and removes an approval link through an explicit update' do
|
context 'when the status has an existing verified quote and removes an approval link through an explicit update' do
|
||||||
let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') }
|
let(:quoted_account) { Fabricate(:account, domain: 'quoted.example.com') }
|
||||||
let(:quoted_status) { Fabricate(:status, account: quoted_account) }
|
let(:quoted_status) { Fabricate(:status, account: quoted_account) }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user