From c8e8440dc6cfe9a59afa20fc2fd97c50ea3f742f Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 8 Apr 2026 14:22:29 +0930 Subject: [PATCH 01/12] Update status_quoted.tsx --- .../mastodon/components/status_quoted.tsx | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/app/javascript/mastodon/components/status_quoted.tsx b/app/javascript/mastodon/components/status_quoted.tsx index 5c9804fb40e..fcf641a60e1 100644 --- a/app/javascript/mastodon/components/status_quoted.tsx +++ b/app/javascript/mastodon/components/status_quoted.tsx @@ -290,6 +290,40 @@ export const QuotedStatus: React.FC = ({ quotedAccountId={accountId} /> ); + } else if (quoteState === 'pending_delayed') { + quoteError = ( + <> + + +

+ +

+
+ + ); + } else if (quoteState === 'verification_failed') { + quoteError = ( + <> + + +

+ +

+
+ + ); } else if ( !status || !quotedStatusId || From 8c6e9cab61007e711ec13185d792b601f37826db Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 8 Apr 2026 14:24:10 +0930 Subject: [PATCH 02/12] Update en.json --- app/javascript/mastodon/locales/en.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index bb643d8e32a..9dc312768e9 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -1232,7 +1232,11 @@ "status.quote_error.not_available": "Post unavailable", "status.quote_error.pending_approval": "Post pending", "status.quote_error.pending_approval_popout.body": "On Mastodon, you can control whether someone can quote you. This post is pending while we're getting the original author's approval.", + "status.quote_error.pending_delayed": "Post pending - Delayed", + "status.quote_error.pending_delayed_popout": "We're retrying verification of this quote in the background. This usually resolves on its own.", "status.quote_error.revoked": "Post removed by author", + "status.quote_error.verification_failed": "Quote verification failed", + "status.quote_error.verification_failed_popout": "We're failed to verify this quote. This quote will never be shown due to this failure.", "status.quote_followers_only": "Only followers can quote this post", "status.quote_manual_review": "Author will manually review", "status.quote_noun": "Quote", From 07b3dcd67fe29bd476d56817db14c10752958c9f Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 8 Apr 2026 14:24:42 +0930 Subject: [PATCH 03/12] Update create.rb --- app/lib/activitypub/activity/create.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 3b86d561c4c..10b626bf034 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -397,6 +397,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity embedded_quote = safe_prefetched_embed(@account, @status_parser.quoted_object, @json['context']) ActivityPub::VerifyQuoteService.new.call(@quote, @quote_approval_uri, fetchable_quoted_uri: @quote_uri, prefetched_quoted_object: embedded_quote, request_id: @options[:request_id], depth: @options[:depth]) rescue Mastodon::RecursionLimitExceededError, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS + @quote.update!(state: :pending_delayed) ActivityPub::RefetchAndVerifyQuoteWorker.perform_in(rand(PROCESSING_DELAY), @quote.id, @quote_uri, { 'request_id' => @options[:request_id], 'approval_uri' => @quote_approval_uri }) end From dae636fb91b0a0d438c0a84f1cac55ad7a36047b Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 8 Apr 2026 14:25:26 +0930 Subject: [PATCH 04/12] Update quote.rb --- app/models/quote.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/quote.rb b/app/models/quote.rb index 44c3599a7b6..930c996d385 100644 --- a/app/models/quote.rb +++ b/app/models/quote.rb @@ -25,7 +25,7 @@ class Quote < ApplicationRecord REFRESH_DEADLINE = 6.hours enum :state, - { pending: 0, accepted: 1, rejected: 2, revoked: 3, deleted: 4 }, + { pending: 0, accepted: 1, rejected: 2, revoked: 3, deleted: 4, pending_delayed: 5, verification_failed: 6 }, validate: true belongs_to :status From b7436ad136738b44d734f83b4be28e9e4cbd1585 Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 8 Apr 2026 14:25:54 +0930 Subject: [PATCH 05/12] Update refetch_and_verify_quote_worker.rb --- .../activitypub/refetch_and_verify_quote_worker.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/workers/activitypub/refetch_and_verify_quote_worker.rb b/app/workers/activitypub/refetch_and_verify_quote_worker.rb index 762d55e1bee..7f1222b08d9 100644 --- a/app/workers/activitypub/refetch_and_verify_quote_worker.rb +++ b/app/workers/activitypub/refetch_and_verify_quote_worker.rb @@ -5,7 +5,18 @@ class ActivityPub::RefetchAndVerifyQuoteWorker include ExponentialBackoff include JsonLdHelper - sidekiq_options queue: 'pull', retry: 5 + sidekiq_options queue: 'ingress', retry: 5 + + sidekiq_retries_exhausted do |msg| + quote_id = msg['args'].first + + ActiveRecord::Base.connection_pool.with_connection do + quote = Quote.find(quote_id) + quote.update!(state: :verification_failed) + rescue ActiveRecord::RecordNotFound + true + end + end def perform(quote_id, quoted_uri, options = {}) quote = Quote.find(quote_id) From 63d8a444ecb63701fde0f258e8f5d1f9b59ef125 Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 8 Apr 2026 14:31:34 +0930 Subject: [PATCH 06/12] Update refetch_and_verify_quote_worker.rb --- app/workers/activitypub/refetch_and_verify_quote_worker.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/workers/activitypub/refetch_and_verify_quote_worker.rb b/app/workers/activitypub/refetch_and_verify_quote_worker.rb index 7f1222b08d9..c81bba37fe3 100644 --- a/app/workers/activitypub/refetch_and_verify_quote_worker.rb +++ b/app/workers/activitypub/refetch_and_verify_quote_worker.rb @@ -5,7 +5,7 @@ class ActivityPub::RefetchAndVerifyQuoteWorker include ExponentialBackoff include JsonLdHelper - sidekiq_options queue: 'ingress', retry: 5 + sidekiq_options queue: 'pull', retry: 5 sidekiq_retries_exhausted do |msg| quote_id = msg['args'].first From 13be47170497a6c97709f99d9ebb98c8fc9f91c7 Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 8 Apr 2026 14:37:10 +0930 Subject: [PATCH 07/12] Update status_quoted.tsx --- app/javascript/mastodon/components/status_quoted.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/components/status_quoted.tsx b/app/javascript/mastodon/components/status_quoted.tsx index fcf641a60e1..c03d8c34bdf 100644 --- a/app/javascript/mastodon/components/status_quoted.tsx +++ b/app/javascript/mastodon/components/status_quoted.tsx @@ -300,7 +300,7 @@ export const QuotedStatus: React.FC = ({

@@ -317,7 +317,7 @@ export const QuotedStatus: React.FC = ({

From 5e78e13f87c5482734df3f281e8b27d4cea8f831 Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 8 Apr 2026 14:37:42 +0930 Subject: [PATCH 08/12] Update en.json --- app/javascript/mastodon/locales/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 9dc312768e9..e6a7dd6bf77 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -1233,10 +1233,10 @@ "status.quote_error.pending_approval": "Post pending", "status.quote_error.pending_approval_popout.body": "On Mastodon, you can control whether someone can quote you. This post is pending while we're getting the original author's approval.", "status.quote_error.pending_delayed": "Post pending - Delayed", - "status.quote_error.pending_delayed_popout": "We're retrying verification of this quote in the background. This usually resolves on its own.", + "status.quote_error.pending_delayed_popout.body": "We're retrying verification of this quote in the background. This usually resolves on its own.", "status.quote_error.revoked": "Post removed by author", "status.quote_error.verification_failed": "Quote verification failed", - "status.quote_error.verification_failed_popout": "We're failed to verify this quote. This quote will never be shown due to this failure.", + "status.quote_error.verification_failed_popout.body": "We're failed to verify this quote. This quote will never be shown due to this failure.", "status.quote_followers_only": "Only followers can quote this post", "status.quote_manual_review": "Author will manually review", "status.quote_noun": "Quote", From 6467faf2e456c8d846de5b9285b33329c5083715 Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 8 Apr 2026 14:41:45 +0930 Subject: [PATCH 09/12] Update status_quoted.tsx --- .../mastodon/components/status_quoted.tsx | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/app/javascript/mastodon/components/status_quoted.tsx b/app/javascript/mastodon/components/status_quoted.tsx index c03d8c34bdf..aa727042855 100644 --- a/app/javascript/mastodon/components/status_quoted.tsx +++ b/app/javascript/mastodon/components/status_quoted.tsx @@ -269,27 +269,6 @@ export const QuotedStatus: React.FC = ({
); - } else if (quoteState === 'revoked') { - quoteError = ( - - ); - } else if ( - (quoteState === 'blocked_account' || - quoteState === 'blocked_domain' || - quoteState === 'muted_account') && - !revealed && - accountId - ) { - quoteError = ( - - ); } else if (quoteState === 'pending_delayed') { quoteError = ( <> @@ -324,6 +303,28 @@ export const QuotedStatus: React.FC = ({
); + + } else if (quoteState === 'revoked') { + quoteError = ( + + ); + } else if ( + (quoteState === 'blocked_account' || + quoteState === 'blocked_domain' || + quoteState === 'muted_account') && + !revealed && + accountId + ) { + quoteError = ( + + ); } else if ( !status || !quotedStatusId || From c58de92de172faf09a1278d989eb50da83d6d355 Mon Sep 17 00:00:00 2001 From: Shlee Date: Wed, 8 Apr 2026 14:52:26 +0930 Subject: [PATCH 10/12] Update refetch_and_verify_quote_worker.rb --- app/workers/activitypub/refetch_and_verify_quote_worker.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/workers/activitypub/refetch_and_verify_quote_worker.rb b/app/workers/activitypub/refetch_and_verify_quote_worker.rb index c81bba37fe3..40f30a35896 100644 --- a/app/workers/activitypub/refetch_and_verify_quote_worker.rb +++ b/app/workers/activitypub/refetch_and_verify_quote_worker.rb @@ -11,8 +11,7 @@ class ActivityPub::RefetchAndVerifyQuoteWorker quote_id = msg['args'].first ActiveRecord::Base.connection_pool.with_connection do - quote = Quote.find(quote_id) - quote.update!(state: :verification_failed) + Quote.find(quote_id).update!(state: :verification_failed) rescue ActiveRecord::RecordNotFound true end From 37e9aecf601cc0406b38b9a3745c63f6581f164c Mon Sep 17 00:00:00 2001 From: Shlee Date: Fri, 10 Apr 2026 00:57:52 +0930 Subject: [PATCH 11/12] Update en.json --- app/javascript/mastodon/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index e6a7dd6bf77..73b3b986a31 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -1236,7 +1236,7 @@ "status.quote_error.pending_delayed_popout.body": "We're retrying verification of this quote in the background. This usually resolves on its own.", "status.quote_error.revoked": "Post removed by author", "status.quote_error.verification_failed": "Quote verification failed", - "status.quote_error.verification_failed_popout.body": "We're failed to verify this quote. This quote will never be shown due to this failure.", + "status.quote_error.verification_failed_popout.body": "We're failed to verify this quote. This quote is unlikely to be shown due to this failure.", "status.quote_followers_only": "Only followers can quote this post", "status.quote_manual_review": "Author will manually review", "status.quote_noun": "Quote", From 6c78789e82b232d88bf86aa061aa9f3a53601311 Mon Sep 17 00:00:00 2001 From: Shlee Date: Fri, 10 Apr 2026 01:03:07 +0930 Subject: [PATCH 12/12] Update status_quoted.tsx --- app/javascript/mastodon/components/status_quoted.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/status_quoted.tsx b/app/javascript/mastodon/components/status_quoted.tsx index aa727042855..337989fbfd1 100644 --- a/app/javascript/mastodon/components/status_quoted.tsx +++ b/app/javascript/mastodon/components/status_quoted.tsx @@ -297,7 +297,7 @@ export const QuotedStatus: React.FC = ({