From 3d474807bf05f8da351bf1118c586811532c88ab Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 5 Jun 2025 15:53:57 +0200 Subject: [PATCH] =?UTF-8?q?Change=20=E2=80=9Clegacy=E2=80=9D=20non-fast-tr?= =?UTF-8?q?acked=20quote=20posts=20to=20not=20be=20displayed=20as=20such?= =?UTF-8?q?=20(#34945)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/lib/activitypub/activity/create.rb | 2 +- app/lib/activitypub/parser/status_parser.rb | 4 ++++ app/models/quote.rb | 5 +++++ app/serializers/rest/status_serializer.rb | 4 ++++ app/services/activitypub/process_status_update_service.rb | 6 +++--- db/migrate/20250605110215_add_legacy_to_quotes.rb | 7 +++++++ db/schema.rb | 3 ++- 7 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20250605110215_add_legacy_to_quotes.rb diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 06bc940949..52b2285ff5 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -233,7 +233,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity approval_uri = @status_parser.quote_approval_uri approval_uri = nil if unsupported_uri_scheme?(approval_uri) - @quote = Quote.new(account: @account, approval_uri: approval_uri) + @quote = Quote.new(account: @account, approval_uri: approval_uri, legacy: @status_parser.legacy_quote?) end def process_hashtag(tag) diff --git a/app/lib/activitypub/parser/status_parser.rb b/app/lib/activitypub/parser/status_parser.rb index 9258482bc0..ad3ef72be8 100644 --- a/app/lib/activitypub/parser/status_parser.rb +++ b/app/lib/activitypub/parser/status_parser.rb @@ -123,6 +123,10 @@ class ActivityPub::Parser::StatusParser end.first end + def legacy_quote? + !@object.key?('quote') + end + # The inlined quote; out of the attributes we support, only `https://w3id.org/fep/044f#quote` explicitly supports inlined objects def quoted_object as_array(@object['quote']).first diff --git a/app/models/quote.rb b/app/models/quote.rb index 8e21d9b481..c981591e17 100644 --- a/app/models/quote.rb +++ b/app/models/quote.rb @@ -7,6 +7,7 @@ # id :bigint(8) not null, primary key # activity_uri :string # approval_uri :string +# legacy :boolean default(FALSE), not null # state :integer default("pending"), not null # created_at :datetime not null # updated_at :datetime not null @@ -46,6 +47,10 @@ class Quote < ApplicationRecord end end + def acceptable? + accepted? || !legacy? + end + def schedule_refresh_if_stale! return unless quoted_status_id.present? && approval_uri.present? && updated_at <= BACKGROUND_REFRESH_INTERVAL.ago diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index e0761af7f2..29e77e7d5b 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -33,6 +33,10 @@ class REST::StatusSerializer < ActiveModel::Serializer has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer + def quote + object.quote if object.quote&.acceptable? + end + def id object.id.to_s end diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index aceb17f2d1..fd3e900433 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -283,14 +283,14 @@ class ActivityPub::ProcessStatusUpdateService < BaseService # If the quoted post has changed, discard the old object and create a new one if @status.quote.quoted_status.present? && ActivityPub::TagManager.instance.uri_for(@status.quote.quoted_status) != quote_uri @status.quote.destroy - quote = Quote.create(status: @status, approval_uri: approval_uri) + quote = Quote.create(status: @status, approval_uri: approval_uri, legacy: @status_parser.legacy_quote?) @quote_changed = true else quote = @status.quote - quote.update(approval_uri: approval_uri, state: :pending) if quote.approval_uri != @status_parser.quote_approval_uri + quote.update(approval_uri: approval_uri, state: :pending, legacy: @status_parser.legacy_quote?) if quote.approval_uri != @status_parser.quote_approval_uri end else - quote = Quote.create(status: @status, approval_uri: approval_uri) + quote = Quote.create(status: @status, approval_uri: approval_uri, legacy: @status_parser.legacy_quote?) @quote_changed = true end diff --git a/db/migrate/20250605110215_add_legacy_to_quotes.rb b/db/migrate/20250605110215_add_legacy_to_quotes.rb new file mode 100644 index 0000000000..65a23dab8f --- /dev/null +++ b/db/migrate/20250605110215_add_legacy_to_quotes.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddLegacyToQuotes < ActiveRecord::Migration[8.0] + def change + add_column :quotes, :legacy, :boolean, null: false, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 6c97151bb9..b7a8154f9a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_05_20_204643) do +ActiveRecord::Schema[8.0].define(version: 2025_06_05_110215) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -906,6 +906,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_05_20_204643) do t.string "activity_uri" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.boolean "legacy", default: false, null: false t.index ["account_id", "quoted_account_id"], name: "index_quotes_on_account_id_and_quoted_account_id" t.index ["activity_uri"], name: "index_quotes_on_activity_uri", unique: true, where: "(activity_uri IS NOT NULL)" t.index ["approval_uri"], name: "index_quotes_on_approval_uri", where: "(approval_uri IS NOT NULL)"